Web開發:我希望得到的編程學習路線圖
英文原文:Learning to Code: The Roadmap I Wish I Had Been Given
對于一些沒有編程經驗的人來說,一開始就學習 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)
大致地說,版本控制系統使程序員能夠在任何時間點及時的保存(正式命名為“提交”)他們的代碼。當一個項目結束時,一個程序員可能已經積累了數百或數千份這樣的代碼備份。
我之前并沒有意識到版本控制的重要性。當我在寫一篇文章時,我并沒有把我對文章做的每一次修改保存到 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 開發的人同時也在學習如何編程。