業餘愛好者如何學習編程

  因為 Aaron Swartz 的自殺,這兩天看了不少關於他的報道以及他自己的博客,對我觸動最大的是儘管他一直在做技術相關的事情,但眼光和理想卻遠遠超越了技術。他把技術當作推動自由和社會變革的工具,所以 Twitter 簽名也是 "Applied sociologist", 而不是經常可以在程序員那裡看到的 "Geek" 和 "Hacker" 等。我非常欽佩他的社會理想和為之做出的努力,然後開始思考自己可以做些什麼,於是就有了這篇文章。

  現在有關編程的書籍非常多,網上也有很多教程,但大多都是針對職業程序員或者計算機專業的學生,對那些只想實現一些自己想要的東西的業餘愛好者幫助不大。業餘愛好者並不想以編程為職業,也不想花太多時間去學習基礎,他們只是想儘快做出自己想要的東西。這樣的東西在專業程序員看來可能很爛,但我覺得非常有意義。會編程的人越多,信息流動的渠道就越多,做出好玩的東西的機率也越大。

  我的技術水平一直不怎麼樣,而且越來越業餘,不過正因為如此,我非常能體會初學者的痛苦,或許寫這樣的東西正合適。本文的目的是幫助業餘愛好者掃清一些思想上的障礙,分享一些我的經驗,並不會涉及太多技術細節,畢竟每個人想做的東西和想學的編程語言都不同,不過後面會給出一些學習資料。

  重要聲明:本文只針對那些不想以編程為職業,只想學習編程以便自己做東西的業餘愛好者。想要成為一個優秀程序員的同學請看這篇經典的《十年學會程序設計》。

  思想準備:

  1. 編程不難,至少做出一個能用的東西不難。別把它當回事兒。很多人之所以覺得編程很難是被專業術語和趾高氣揚的程序員嚇到了。別擔心,業餘愛好者不需要對自己要求那麼高。

  2. 編程不需要數學基礎。沒錯,就算你數學很爛也能做出東西。大部分演算法都已經有成熟的解決方案,可以直接拿來用,完全不用擔心。我們的目的是做東西,不是研究演算法和數學。

  3. 編程不會改變你的生活方式。你完全可以學習編程而不接受和它有關的文化。不一定要崇拜某位大神、閱讀技術新聞或者參與社區,也不一定要不修邊幅、熬夜工作。如果願意的話,精裝打扮穿上最漂亮的衣服去編程也可以。反正不想成為職業程序員,不用擔心因為「不像程序員」而被鄙視。

  4. 有很多友善的程序員。程序員給很多人的印象要麼是邋遢、木訥、害羞的書獃子,要麼是性格怪異、智商極高的大神,其實大部分程序員並不是那樣,只不過媒體和大眾更偏愛怪異的東西。以 Linus 為例,在他的自傳 《Just for Fun》 中提到:

  「Linux 不是靠犧牲寶貴的睡眠時間換來的。事實上,如果你想聽真話,那我就要說,我更喜歡睡覺。」「在那個時候,只要一想到姑娘,Linux 系統就變得不再重要了。在某種程度上,今天也還是這樣。」

  瞧,這位大神其實大部分時間和普通男性差不多,更喜歡「睡覺」和「姑娘」。所以,如果真的遇到了無法解決的問題,完全可以大膽地去請教專業程序員們,一般都可以得到答覆。

  5. 習慣無知。無論學習什麼東西,往往越深入就越覺得自己無知。這樣的無知本身並不是壞事,它可以讓你保持謙虛,但千萬不要被它嚇得不敢繼續前進。及早適應無知的感覺,你並不需要全知全能才能做出東西,如果覺得困難,可以試著假裝自己擅長編程 。

  如何開始:

  首先,完整閱讀這篇文章:《你第一要做的是開始去做》(這篇文中翻譯自 The first step is to start )。

  如文中說的那樣,不要以「基礎不夠」、「知識不全」等借口停下來,一開始甚至可以先在紙上勾勒出想要的東西。當然,完全不懂編程肯定無法開始真正的創造,但學習的時候不要抱著「先專心學習,學好本領再回來做」的念頭。正確的做法是:只學那些最基礎的東西,然後立刻著手去做,遇到不會的地方再去學。

  沒有技術背景的人學習編程很容易被錯綜複雜的技術體系嚇到,網上的教程中也經常會出現「一定要讀這本書,非常經典」、「最好先有 XX 基礎再看這篇教程」之類的警告,結果有時候會出現這樣的情況:本來你只打算學習編寫網頁 ,結果幾天後莫名其妙地開始苦讀《精通正則表達式》。為了能夠專註於自己想做的東西,要十分警惕「學習」這件事情。盡量學習最少的東西,然後把時間都花在創造上。當想要學習的時候,慎重考慮它是否會讓你偏離目標,或者繞太遠的路。這樣做肯定會導致基礎不夠好,但我們是業餘愛好者嘛,能儘快做出東西就行了。如果你真的非常在意基礎,說明你可能更想成為職業程序員,請返回參考前面的重要聲明。

  沒有人天生就會編程,在做東西的過程中會不斷學到新的知識,然後就會發現自己之前的代碼很愚蠢。這個時候你可能會很想推倒重來,或者從頭改進之前的代碼。要抑制住這種衝動,不然就會掉入代碼優化的無底洞。事實上,幾乎所有的專業程序員都會對半年前自己的代碼感到不滿,而且一開始代碼質量不好完全沒有問題。舉個例子,假如要在網頁上顯示 10 次 "I love you.",你並不知道如何使用循環,於是就複製粘貼了 10 次 "I love you"。這樣的做法或許很笨,但是你做出了想要的效果,對於業餘愛好者來說,完成一個東西要比代碼質量重要得多,不要為了這種笨方法而感到羞愧。

  如何解決問題:

  在創造的過程中肯定會遇到很多問題,對於初學者來說,大部分的問題都是語法或者拼寫問題,只要仔細檢查代碼就可以解決,少數摸不著頭腦的問題也可以用 Google 找到答案。很多非 IT 行業的人平時都只是搜索中文,可能並不覺得 Google 比百度要好,但當你開始學習編程,就會立刻發現 Google 比百度好用得多,一般都可以在搜索結果第一頁找到想要的東西。使用 Google 搜索的時候,請嘗試用英文描述問題,或者直接把出錯信息直接粘貼到搜索框。

  如果實在搜索不到解決辦法(這種情況對業餘愛好者來說極為少見,請善用 Google),可以去 Stack Overflow 提問。提問的時候請注意描述好自己的問題,把錯誤信息以及相關的代碼都寫進去。 Stack Overflow 的氛圍相當好,應該很快就會有人回答你的問題。比較不方便的地方是你必須使用英文提問,沒辦法,因為類似的中文社區並不存在。如果執意要去中文社區提問,那麼我真誠地建議你使用女生頭像和昵稱,可以有效提高回復率,呵呵。

  有關編程的一個惱人的地方是,就算看書之後覺得自己掌握了,真正寫的時候還是經常會出錯。它只能通過實踐來掌握,所以需要很多耐心。當你被折磨得想要放棄的時候,或許可以換一種角度,以此為契機掙脫過去那麼多年的學院派教育。想一想吧,我們在學校里待了那麼長時間,幾乎所有的學習路徑都是「先閱讀,再應用」或者「只閱讀,不應用」,是時候體驗一下如何在應用中學習了。

  面對批評:

  有些人做出想要的東西之後就已經很滿足,但有些人可能會想要展示一下自己的作品並獲取一些意見。因為業餘,所以當專業程序員看到這樣的作品之後可能會非常不屑,甚至大肆批評。這個時候不要自卑或害怕,因為他們對作品的了解都是片面的。他們只是一味拿專業的技術標準來衡量,不清楚你只是想做出一個東西,不清楚你只是業餘時間在做,不清楚你在整體上的考量和妥協。作為這個作品的創造者,你才是專家,如果按照他們的要求,你可能永遠都做不完。

  之所以提到這一點,是覺得業餘愛好者大都是自己一個人慢慢自學,被打擊一下說不定就完全放棄了,那樣實在可惜。對於專業程序員的批評,如果有用就記下來,下次不要再犯就好,沒有必要氣餒或者把之前的東西重寫一遍。從無到有實現了自己的創意已經很了不起,不需要對專業程序員有什麼交代。

  注意事項:

  1. 不要過度關注編程語言的優劣。很多編程語言都可以達到相同的目的,選中一個之後把它用好就是了。和別人爭辯哪個編程語言更好是很多職業程序員的一大愛好,是他們生活的一部分。我們是業餘愛好者,只要求工具夠用,不需要像他們那樣一定要用「最好的」語言。

  2. 用不著關注國內的 IT 紅人和八卦。對學習編程和做東西沒有任何益處。(補充:這條可能帶了個人情緒,請自行判斷,但我關注了那麼久覺得確實沒有任何益處。。。 >_<)

  3. 不要自稱 "Geek","Hacker" 或其它什麼東西。當開始給自己貼標籤的時候,就會試圖表現得像那類人,束縛自己的同時還會做出許多愚蠢的事情。我們要做的事情很簡單,就是掌握技術並做出能用的東西,沒有必要給自己貼任何標籤。事實上,能做出東西的人比自稱 "Geek" 或 "Hacker" 的人稀有得多。

  4. 利用開源代碼。感謝開源事業的蓬勃發展和無數程序員的無私奉獻,使我們可以學習和使用別人的代碼。當需要一些功能時,可以先去找一下是否已經有開源的實現,沒有必要自己從頭寫。

  5. 先找到自己想做的東西。不要為了學習編程而學習,那樣就算記住了很快也會忘掉。如果實在找不到什麼想做的,可以考慮給一些公益組織義務做一個網站,鍛煉技能的同時還可以關心一下社會。

  6. 保持初心。業餘愛好者擁有的最寶貴的財富就是初學者的心,也正是因為這份初心,才讓代碼質量問題變得並不那麼重要。可惜的是,隨著技術越來越熟練,初心會漸漸消失,做東西的時候首先考慮的不是結果而是實現方式,當初那個滿腦子想法苦於不能用技術實現的人不見了,取而代之的是一個精通技術卻乏味的人。所以,作為業餘愛好者,應該把「完成作品」和「保持業餘」作為首要目標,如果精通技術的代價是失去初心,那就不要精通好了,反正並不想以此為生。

  學習資料:

  由於我的工作大部分是 web develop, 所以這裡給出一些不錯的相關資料。如果你想要做一個簡單的網站或者 app, 那麼這些知識夠用了。也歡迎補充好的入門資料,我會不斷更新。(之所以沒有推薦其它方面的資料,是因為我並沒有相關的經驗,不知道其中優劣。編程可做的東西非常多,比如 Arduino 硬體編程,有興趣的可以去找一下資料,也歡迎補充。)

  1. Head First HTML 與 CSS、XHTML 。在大學圖書館偶爾看到過這本書的英文版,很喜歡。本書非常適合初學者,裡面很多插圖,寫得也很有趣。

  2. A Beginner』s Guide to HTML & CSS 一個很好的在線學習 HTML & CSS 基礎的網站。

  3. An Advanced Guide to HTML & CSS HTML & CSS 進階,裡面還包含了 jQuery 的學習。

  4. 笨方法學 Ruby. 這本在線電子書是 Learn Ruby The Hard Way 的繁體中文翻譯,也是 Zed Shaw 寫的 Learn XXX The Hard Way 系列中的一本,之所以推薦 Ruby 是因為我很喜歡這門語言。本書非常注重實踐,全書由 52 個習題構成,當你完成這些習題的時候就已經寫了很多代碼了。我覺得書中後面的一些習題(比如讀寫文件)可以先跳過,用到的時候再去學習。

  5. Codecademy 備受推崇的在線學習編程網站,而且有中文界面,非常推薦。

  6. Code School 和 Codecademy 類似的在線學習網站,評價不錯。

  最後再次提醒一下,如果你選擇了學習編程,以後很長一段時期內業餘時間都會被佔據,而且期間會體會到很多痛苦。但是當完成第一個作品的時候,你就會發現之前的痛苦都是值得的,它們是創造不可或缺的一部分。

  後記:想要寫這篇文章的時候激情滿滿,覺得自己在做好事,但寫的過程中一直誠惶誠恐,非常擔心文中業餘愛好者可能面臨的問題都是自己臆想出來的。畢竟在這個行業待的時間不算短,早就變成了一個乏味的職業人士。如果你是一個想學習編程的業餘愛好者,歡迎留言告訴我哪些擔心是不必要的,以及漏掉了哪些東西,我會及時修正或補充。

推薦閱讀:

發展完善自我 理智學習日本 ——《南京,南京》觀後感
如何高效學習 (豆瓣)5
如何用1部Kindle省去10000元的英語學習費?(附免費下載正版經濟學人)
msi技巧教程?
學習自我管理血糖

TAG:編程 | 學習 | 愛好 | 業餘愛好 | 業餘 |