對於一些沒有程式設計經驗的人來說,一開始就學習web開發會讓人覺得非常困難。因為你的能力處於初始階段(你根本不知道你缺少哪方面的知識),所以在你能夠建立一個任意複雜的網站之前,你可能會認為你需要大概幾個月的時間來夯實計算機方面的基礎知識。
其實並非如此!web開發和CS是不同的,你完全可以在沒有太多計算機基礎的情況下開發學習web開發。我這樣說,完全是根據我自己的經驗。
六個月前,當我開始學習web開發時,我還是一個法律學校的在讀學生,而且幾乎不懂任何關於程式設計的東西—僅僅在開始學習的前幾個小時瞭解過一些基本知識。四個月後,我收到了來自Pivotal Labs的offer,接著我離開了法律學校,搬到了舊金山。我非常的幸運地遇到了一位極為優秀導師(從黑客學校獲得的收穫絕對不能忽視),所以我不認為我的故事非常具有代表性。但是我認為這很清楚的表明那些沒有計算機背景的人同樣可以成為web開發者,而且它所花費的時間可能比你想像的要少。
這篇博文是為了嘗試幫助那些剛開始學習web開發的人們。這裡展示了一個大概流程,這個路線圖會“告訴你在最初的幾月裡需要做什麼”,它也是我最開始編碼所遵循的路線。
寫這樣一篇博文的想法已經在我腦海裡有一段時間了,只是我認為自己知之甚少,所以始終沒有提筆。在寫這篇文章時我還是覺得自己知道的不限,所以如果你在下面的文章中發現任何錯誤與不正確的地方,請一定幫我指正。
四個部分
這裡大致列出了長短不一的四個部分知識要點,在你學習的前幾個月裡你需要掌握這些要點。
1) web框架的基礎知識(如Ruby on Rails),又名“包含網站模組及它們之間連線結構”。
2) 前端開發,又名“如何使內容出現在正確的位置上,而且在瀏覽器中表現得好看”。
3) 版本控制,又名“如何使用免費易用的軟體,使程式設計師能夠有組織地儲存他們的程式版本。這樣他們就不用擔心修改程式碼所帶來的版本混亂,同時也能夠很好地與其它程式設計師協同開發”。
4) 部署,又名“如何真正地將你的網站放到網際網路上”。
我把這幾個部分標記為1到4,但這並不意味著它們之間存在任何特定的順序。你可以同時學習這些東西。
第一部分:選擇一種web框架,並開始學習它
在這個部分所需要花費的時間很像這種模式,即“選擇一種web框架”=>“大概10分鐘之內”。“學習這種框架”=>“很多很多個(快樂的)小時”。
現在有很多的web框架可供選擇。而我要討論的是Ruby on Rails,它是我所知道的最好的框架,因為到處都有關於它的優秀的資源。
那麼,什麼是web框架?我的理解是這樣的:有框架之前,人們在決定做一個新的網站時,往往每次都需要新增一些相同的東西到新的網站。由於這些都是一些重複無聊的工作,所以程式設計師開發出了框架(例如Rails),這些框架能夠把很多重複性的工作移到web開發之外。人們喜歡說,Rails代表“約定優於配置”。它的意思是,假如你想按照約定的方式開發,那麼Rails會使web開發變得簡單。
相關的資源:
我刻意只選擇了無數Rails/Ruby資源的一小部分來說,因為可選擇的資源實在太多了。
I、閱讀 Michael Hartl’s精彩且免費的確Rails教程。一個提示:Hartl的教程雖然非常的清晰全面,但你也不可能輕鬆的完全理解裡面的所有內容。細細地去品味它,一旦你發現一些不能理解的東西時,你一定要弄清楚。如果你發現自己只是盲目地去複製/貼上它的程式碼,只是為了完成而完成教程,那麼請你停下來。當遇到不懂的知識點時,立即去下面的資源中查詢:
● Google。有些人在部落格或論壇上寫的內容可能正是你想知道的東西。當你遇到任何問題時首先去查詢Google。
● Stack Overflow。在那裡程式設計師回答問題的速度絕對讓人吃驚(我的問題往往都在一個小時內得到答案)。
● Railscasts。Ryan Bates擁有超過300與Rails相關的線上直播主題。非常驚人的資源。
● Rails Guides。這些真正的專業指南是由Rails的核心團隊成員所寫。這些裡面的東西需要時間去消化理解(因為裡面的大多數內容都是給有經驗的程式設計師準備的),但是還是有一些介紹性的東西可以拿來學習。
II、在進行I學習的同時,Hartl將告訴你Rails的工作原理。但是如果你不懂Ruby,那麼太多的Rails會讓你覺得像在變魔術。這裡列出了你在學習Ruby時應該用到的一些資源,你應該按照資源列出的順序來學習它們:
● 前往Codecademy學習程式設計的基本元素(迴圈,資料結構)。目前Codecademy教程是用Javascript講的,不過沒關係—反正無論如何你也是要學Javascript的,況且現在的重點主要是熟悉編碼的基本要素。(強烈建議:如果你想讓學習更有挑戰,登入projecteuler.net,然後用自己所學的東西來解決上面的一些問題)。
● 閱讀瀏覽這個優秀的Ruby教程。當你閱讀它時,開啟你的終端(如Mac上的iterm),開啟irb(the interactive ruby shell),並立即開始實踐你正在學習的語法。(搜尋“terminal”和“irb”,如果你壓根不知道它們是什麼。)
● 在做上述工作的同時,下載並閱讀Ruby Koas。它是一系列豐富有趣的練習,這些練習涵蓋了大多數Ruby的基礎知識。
● 最後,閱讀Eloquent Ruby。Eloquent Ruby適合那些對程式設計已經達到某種程度的人,所以在你讀完Koans和Ruby教程之前不要去讀它。Eloquent Ruby將不僅告訴你Ruby的工作原理,還會告訴你應該如何使用Ruby(例如,Ruby程式設計師決定的方式就是最好的實踐方式)。
第二部分:學習前端的東西
對於“前端”和“後端”不完整/不準確的定義可能會是這樣的:web開發中的“後端”是指你儲存和組織網站資料的地方。例如Yelp這樣的網站要儲存很多東西:它的使用者和使用者的個人資料、大量的餐廳資訊、哪個使用者對一個特別的餐廳做了什麼評價,等等。
Yelp把這些資訊儲存在伺服器上,這些伺服器就是分佈在不同地方的大型計算機。當你搜尋“Pizza in San Francisco”,你的計算機會傳送一個請求到Yelp的伺服器,Yelp伺服器收到後回發HTML形式的請求資訊(Yelp每次都以這種方式來指示伺服器的行為方式)到你的瀏覽器,瀏覽器會被渲染(例如:將HTML分離成文字和圖片,然後讓這些圖片和文字在瀏覽器視窗中以正確的方式顯示出來)。這後面的一部分—有關資料應該如何出現在使用者視窗的指令(而不是什麼資料應該被回送)—就是“前端”。
相關的資源:
● 在w3schools上學習HTML和CSS。編注:謝謝下面的一些評論者指出了w3schools的不足。大家可以轉到w3Fools獲取一些更好的資源列表。HTML是一種標記語言,用來管理頁面的結構。例如,需要有一個頁頭,後面要跟一個段落。CSS則決定這個頁面顯示出來的樣式。例如,頁頭的字型大小為18,跟著的段落中文字內容為藍色。
● 學習Javascript。Javascript決定了頁面上的元素如何表現。例如,頁頭開始時會被隱藏,但當使用者點選某個按鈕時又會漸漸地顯示在頁面上。這裡有一個非常優秀的Javascript框架稱之為jQuery,它基本上適合每個人使用,而且學習起來有趣直觀。這裡有一個小型的教程,你可以從這裡開始學習:http://docs.jquery.com/Tutorials。
第三部分:學習版本控制(如:Git)
大致地說,版本控制系統使程式設計師能夠在任何時間點及時的儲存(正式說法是“commit”)他們的程式碼。當一個專案結束時,一個程式設計師可能已經積累了數百或數千份這樣的程式碼備份。
我之前並沒有意識到版本控制的重要性。當我在寫一篇文章時,我並沒有把我對文章做的每一次修改儲存到Word文件中。當我寫程式碼時,情況會有所不同嗎?
事實證明,答案至少是兩方面的。首先,程式設計師寫程式碼時往往會導致意想不到的問題。當問題發生時,我們可以很輕鬆地回滾到上一個正常工作的程式碼版本。然後,程式設計師經常工作於同一個專案中。在這種情況下,他們需要能夠很輕鬆地合併他們的程式碼。類似Git這樣的版本控制系統(目前最流行的)可以很容易地做到以上兩點。
相關的資源:
Hartl會向你介紹Git,但他不會解釋得太多。要了解更多,去這裡:
● Git介紹:由Github的人員建立(這是一個了不起的網站,它讓程式設計師很容易地共享程式碼並協同工作—你應該最先訪問Github去學習)。
● Git進階:感謝評論者Polygonchorus提供的這個網站,看起來真的很棒。
● Git指南:新穎且簡單。在這裡可以學習基本的命令。
● Git的社群圖書:一個很好的參考資料,你可能不需要從頭到尾的通篇閱讀它。
第四部分:學習如何部署(如Heroku)
當你開發網站時,絕大多數時間你都會在你的開發環境中去驗證檢查—換句話說,就是在你自己的電腦上,而不是在網際網路上。
擁有這樣一個開發環境的理由很簡單:將你的程式碼上載到一個遠端伺服器需要一定的時間(例如,上載到網際網路中一個實際的伺服器上)。由於你的網站正處於開發階段,你需要不斷地檢查你的網站,而每次當你上載新的程式碼時,你都需要20-30秒去等待伺服器的響應,然後才能看到新程式碼執行的效果,這確實很煩人。
當你覺得準備好了,你可以很容易地使用Heroku來部署你的程式碼(Hartl說明了怎樣去部署)。這裡是在Rails3環境下設定Heroku的相關資訊:http://devcenter.heroku.com/articles/rails3。如果你想建立一個自定義的域名,Heroku也提供了一個延伸的教程:http://devcenter.heroku.com/articles/custom-domains。
關於此路線圖的一些重要想法
以上的這個資源足夠你學習幾個月的,但它們不會帶你走得更遠。我只是希望,在學習過那麼多知識之後,你能夠從自己建立的專案中學習提高。下面是一些離別的想法:
選擇一個能激發你興趣的想法,並在你覺得準備好之前就付諸於實踐。我甚至建議你在完成Hartl教程之前就開始你自己的專案。工作於自己的專案,是讓你迷上web開發最容易的方法。
我在這裡提到了一些優秀的學習資源,當你要建立一個自己的網站時,這些資源只涵蓋了很小一部分知識。時刻保持查閱未知知識點的習慣,不用擔心—即使是最好的程式設計師也需要這樣做。
你會經常地遇到bug和其它一些問題。這可能會讓人沮喪,但你要儘量保持冷靜,並系統地去思考。記住實踐是解決問題的最佳方法,同時記錄下那些經常出現的bug。當問題出現時,思考問題出現的可能路徑(類似這樣的推理過程:OK,我的使用者無法正確登入。這可能由什麼原因造成?嗯…這可能是A、B或C造成的。如果是A,我可能會想到…)。寫出來或者大聲說出來,如果這樣有幫助的話。千萬不要只是坐在那裡,盯著程式碼,並希望能夠頓悟。
與其它程式設計師一起工作,並向他們學習。與其他人一起編碼並討論程式碼,我覺得這是最快最有趣的學習方式(我非常推薦結對程式設計)。當然,你能夠做的對自己最好的事情可能是去黑客學校。
祝你好運!
—————————————-
有些評論指出,由於web開發只是程式設計的一個子集,本文標題用“學習web開發”取代“學習程式設計”可能更好。他們的觀點非常對,所以我希望本文的標題不會誤導人們認為web開發就是程式設計的全部(其實還有很多,很多我們不懂的東西)。這麼理解吧,web開發仍然是程式設計的一個子集,所以那些學習web開發的人同時也在學習如何程式設計。