如何學習一門編程語言-零基礎愛好者篇

所謂的零基礎愛好者,指的是沒有系統學習過、基本根本沒有學習過編製程序所需要的機器與操作系統原理方面的知識,但是有至少高中程度的數學修養和邏輯推理能力。不知道為什麼,最近經常有人問我這種情況怎麼想學會編程,就寫一篇吧。

目標決定方法,如果是想轉行做職業程序員,那還是老老實實把基礎概念搞清楚,系統的學一門語言一個平台,雖然風口來時只會點皮毛也能唬住一些外行、混到一個不錯的收入,不過即使努力邊學邊乾熬過去了,有這樣心態的人也很難有長遠的發展,風口總是會過去的,一直在程序員底層混著,不會比其它行業愉快的。

不過,也未必要把四大基礎課程(計算機原理、數據結構與演算法、操作系統原理、編譯原理)都深入學完才算有基礎概念了,基礎不好的程序員剛工作時,挺容易陷進這個坑裡。這些東西遲早是要補回來的,不過開始只要有個最粗略的概念也夠幹活的了。嚴格說來,系統學習與快速出活的矛盾是一個永遠需要面對的問題,需要根據具體情況和個人興趣找到適當的平衡點。在碰到問題時,作為深入系統的學習的契機是很好的,假以時日就會變得非常專業。總是解決過眼前需求就算,出活比較快,但是對個人的長期發展是很不利的,因為水平總是很淺。

對於沒有基礎的初學者來說,學習編程最重要的是保持初心。當初怎麼想起來學編程的呢?是想把自己理想里的網站、移動 App 或者工具應用做出來,還是要求解專業方向上的問題,或者完成一個遊戲、製作一個交互動畫效果,還是別的什麼。學習時,編程語言的諸多規定要記,開發平台的許多細節要熟悉,上手時debug的各種沒頭緒,如果陷到裡邊又沒有搞出什麼成果,太容易上演從入門到放棄。時時記得自己是為什麼來學習編程的,學會一點,就用一用,明明白白感受到每天進步一點點,堅持下來的概率就大很多了。

把一門編程語言的細節都學透了,會是一個漫長的征程,你並不需要成為人肉編譯器或解釋器才能運用它,學會流程式控制制語句和基本的程序結構算是入門了,之後就可以開始給自己的項目添磚加瓦了。這樣比較能保持長久的熱情。昔年我還在上大學的時候,有很多同學抱著譚浩強版《C語言程序設計》學編程,基本上都從入門到放棄了。固然有書寫得不好的因素,缺少目的性也是一個很關鍵的因素。

那麼語言本身怎麼入門呢?對初學者,我喜歡推薦 codeschool.com 的教程,這些教程貫徹了小步前進、動手練習的原則,同時又省去了配置環境麻煩。別小看最後一點,軟體開發的環境配置實在是一個比較煩人的事兒,非常容易掉坑裡。所以,零基礎的愛好者盡量選擇解釋型語言學起,用好的集成開發環境( IDE )工作,比如學習 Windows 應用開發用 Visual Studio,學習 PHP 考慮 Zend Studio 或者 PHPStorm,學 web 開發的 WebStorm/Sublime/Visual Studio Code 等。另一個選擇是越來越多的在線編程環境, @路人甲 整理了一個很不錯的清單:zhuanlan.zhihu.com/p/21 。對於 JavaScript 的話,codepen.io(國內略慢)、http://jsbin.com/、jsfiddle.net(國內略慢) 也比較流行。

語言選擇是由學習的目的決定的,比如做 Android 應用開發就得學 Java ,iOS 則是 Objective-C 或者 Swift,做網頁當然是 JavaScript,大數據考慮 Python 或者 R,做遊戲 C/C++,所以並不一定由得自己。對於零基礎的愛好者,隨大流才是明智的,聽說 Rust 好或者 haskell 牛就去學,基本上是找虐。程序語言的流行情況隨便在哪個社區論壇逛逛都很容易知道,搞不清楚可以參考 TIOBE 。如果只有泛泛的興趣,我現在一律推薦學 JavaScript,純考慮語言的話 Java 其實更好,學習起來簡單,能儘快上手寫東西才是好語言,不過 JavaScript 拿來做頁面效果,比較容易有成就感,環境依賴也比較小。另外,對於泛興趣的學習者,強烈推薦去 codewars.com 刷題。

小步前進就是每步不要學太多東西,練習編寫儘可能簡單的程序;除了個別天賦異稟的,上來就寫個實用大程序那是給自己挖坑,出了問題都不知道從哪下手解決,老老實實從 hello world 開始逐漸寫長一點的程序才是正道。

編程是個手藝活,手熟是一切的基礎,所以抱著一本書或者一套視頻啃完是非常不可取的,學一點就要寫寫練手的程序。視頻教程特別具有欺騙性,看老師行雲流水地演示,對著暫停的屏幕自己抄一遍順利出了正確結果,就以為自己也會了;關上視頻看還記得多少?自己出個題目寫一下試試?立即就發現記憶里缺很多細節。所以哪新學的語言元素寫練習程序是學會編程的唯一途徑。對於心急的初學者,學到能夠自己不查書寫出在字元串數組裡找到輸入的字元串,基本就有足夠的表達能力去書寫所需要的邏輯了。

語言入門之後,就可以試著寫點自己感興趣的東西,語言肯定還不夠熟,所以手邊準備一本語言參考書隨時備查吧。要自己寫點東西,難免碰到一大堆平台、系統相關的背景知識,有時間找本入門本書或者課程系統學一下基本概念最好,比如 O』Reilly 的 up and running 系列就挺好,Lynda 有很多編程方面的入門視頻非常適合建感性認識。有條件報個短期培訓班也是不錯的,未必培訓班能講得多好,有人帶的話,入門比自己亂撞還是容易點兒。

剛開始實際寫程序,必然各種出錯,碰到問題不要怕,要學會看出錯信息,看不明白拿著完整的出錯信息去網上查,問別人的時候儘可能提供詳細的信息,盡最大努力不要讓別人猜,這樣得到幫助的可能性會大很多。順便說一聲,查技術問題還是 Google 比較好使。

直接上網查你想要實現的代碼抄過來用可能也不錯。最後就是要多交朋友,身邊有高手可以請教是最好的,到網上論壇里混個臉熟也是不錯的,國內的 csdn、v2ex、segmentfault 都不錯,國外的 stackoverflow 找問題很不錯但是對初學者提問非常不友好。

總結一下,學編程是為了解決問題,把你的問題分解細化,讓它一步一步驅動你的學習過程,學起來就沒那麼難啦。

推薦閱讀:

Nemo 的 三門編程語言之旅
用 Python 將歌單里的歌詞保存成圖片
給編程初學者的幾點建議
【新手向】從零開始配置Windows下Rust開發環境圖解

TAG:编程入门 | 自学编程 | 编程学习 |