如何學習一門編程語言-零基礎愛好者篇
目標決定方法,如果是想轉行做職業程序員,那還是老老實實把基礎概念搞清楚,系統的學一門語言一個平台,雖然風口來時只會點皮毛也能唬住一些外行、混到一個不錯的收入,不過即使努力邊學邊乾熬過去了,有這樣心態的人也很難有長遠的發展,風口總是會過去的,一直在程序員底層混著,不會比其它行業愉快的。
不過,也未必要把四大基礎課程(計算機原理、數據結構與演算法、操作系統原理、編譯原理)都深入學完才算有基礎概念了,基礎不好的程序員剛工作時,挺容易陷進這個坑裡。這些東西遲早是要補回來的,不過開始只要有個最粗略的概念也夠幹活的了。嚴格說來,系統學習與快速出活的矛盾是一個永遠需要面對的問題,需要根據具體情況和個人興趣找到適當的平衡點。在碰到問題時,作為深入系統的學習的契機是很好的,假以時日就會變得非常專業。總是解決過眼前需求就算,出活比較快,但是對個人的長期發展是很不利的,因為水平總是很淺。
對於沒有基礎的初學者來說,學習編程最重要的是保持初心。當初怎麼想起來學編程的呢?是想把自己理想里的網站、移動 App 或者工具應用做出來,還是要求解專業方向上的問題,或者完成一個遊戲、製作一個交互動畫效果,還是別的什麼。學習時,編程語言的諸多規定要記,開發平台的許多細節要熟悉,上手時debug的各種沒頭緒,如果陷到裡邊又沒有搞出什麼成果,太容易上演從入門到放棄。時時記得自己是為什麼來學習編程的,學會一點,就用一用,明明白白感受到每天進步一點點,堅持下來的概率就大很多了。
把一門編程語言的細節都學透了,會是一個漫長的征程,你並不需要成為人肉編譯器或解釋器才能運用它,學會流程式控制制語句和基本的程序結構算是入門了,之後就可以開始給自己的項目添磚加瓦了。這樣比較能保持長久的熱情。昔年我還在上大學的時候,有很多同學抱著譚浩強版《C語言程序設計》學編程,基本上都從入門到放棄了。固然有書寫得不好的因素,缺少目的性也是一個很關鍵的因素。
那麼語言本身怎麼入門呢?對初學者,我喜歡推薦 https://www.codeschool.com 的教程,這些教程貫徹了小步前進、動手練習的原則,同時又省去了配置環境麻煩。別小看最後一點,軟體開發的環境配置實在是一個比較煩人的事兒,非常容易掉坑裡。所以,零基礎的愛好者盡量選擇解釋型語言學起,用好的集成開發環境( IDE )工作,比如學習 Windows 應用開發用 Visual Studio,學習 PHP 考慮 Zend Studio 或者 PHPStorm,學 web 開發的 WebStorm/Sublime/Visual Studio Code 等。另一個選擇是越來越多的在線編程環境, @路人甲 整理了一個很不錯的清單:https://zhuanlan.zhihu.com/p/21808087 。對於 JavaScript 的話,http://codepen.io(國內略慢)、http://jsbin.com/、http://jsfiddle.net(國內略慢) 也比較流行。
語言選擇是由學習的目的決定的,比如做 Android 應用開發就得學 Java ,iOS 則是 Objective-C 或者 Swift,做網頁當然是 JavaScript,大數據考慮 Python 或者 R,做遊戲 C/C++,所以並不一定由得自己。對於零基礎的愛好者,隨大流才是明智的,聽說 Rust 好或者 haskell 牛就去學,基本上是找虐。程序語言的流行情況隨便在哪個社區論壇逛逛都很容易知道,搞不清楚可以參考 TIOBE 。如果只有泛泛的興趣,我現在一律推薦學 JavaScript,純考慮語言的話 Java 其實更好,學習起來簡單,能儘快上手寫東西才是好語言,不過 JavaScript 拿來做頁面效果,比較容易有成就感,環境依賴也比較小。另外,對於泛興趣的學習者,強烈推薦去 https://www.codewars.com 刷題。
小步前進就是每步不要學太多東西,練習編寫儘可能簡單的程序;除了個別天賦異稟的,上來就寫個實用大程序那是給自己挖坑,出了問題都不知道從哪下手解決,老老實實從 hello world 開始逐漸寫長一點的程序才是正道。
編程是個手藝活,手熟是一切的基礎,所以抱著一本書或者一套視頻啃完是非常不可取的,學一點就要寫寫練手的程序。視頻教程特別具有欺騙性,看老師行雲流水地演示,對著暫停的屏幕自己抄一遍順利出了正確結果,就以為自己也會了;關上視頻看還記得多少?自己出個題目寫一下試試?立即就發現記憶里缺很多細節。所以哪新學的語言元素寫練習程序是學會編程的唯一途徑。對於心急的初學者,學到能夠自己不查書寫出在字元串數組裡找到輸入的字元串,基本就有足夠的表達能力去書寫所需要的邏輯了。
語言入門之後,就可以試著寫點自己感興趣的東西,語言肯定還不夠熟,所以手邊準備一本語言參考書隨時備查吧。要自己寫點東西,難免碰到一大堆平台、系統相關的背景知識,有時間找本入門本書或者課程系統學一下基本概念最好,比如 O』Reilly 的 up and running 系列就挺好,Lynda 有很多編程方面的入門視頻非常適合建感性認識。有條件報個短期培訓班也是不錯的,未必培訓班能講得多好,有人帶的話,入門比自己亂撞還是容易點兒。
剛開始實際寫程序,必然各種出錯,碰到問題不要怕,要學會看出錯信息,看不明白拿著完整的出錯信息去網上查,問別人的時候儘可能提供詳細的信息,盡最大努力不要讓別人猜,這樣得到幫助的可能性會大很多。順便說一聲,查技術問題還是 Google 比較好使。
直接上網查你想要實現的代碼抄過來用可能也不錯。最後就是要多交朋友,身邊有高手可以請教是最好的,到網上論壇里混個臉熟也是不錯的,國內的 csdn、v2ex、segmentfault 都不錯,國外的 stackoverflow 找問題很不錯但是對初學者提問非常不友好。
總結一下,學編程是為了解決問題,把你的問題分解細化,讓它一步一步驅動你的學習過程,學起來就沒那麼難啦。
推薦閱讀:
※Nemo 的 三門編程語言之旅
※用 Python 將歌單里的歌詞保存成圖片
※給編程初學者的幾點建議
※【新手向】從零開始配置Windows下Rust開發環境圖解