我的10年自學編程之路

為什麼每個人都這樣匆忙?

走進任何一家書店,你都能看到諸如《24小時自學Java》這樣的書,可能書名中的Java會變成C、SQL、Ruby、演算法等,然後24小時會變成n天或n小時。在亞馬遜高級搜索[title:teach, yourself, hours, since: 2000,你會發現有512種這樣的書籍。排在前10位的,9個是編程類的書(還有一個是關於財務會計的)。還有多種變化,例如「學習」替換「自學」,「天」替換「小時」。

結論:要麼大家都特別匆忙地在學習編程,要麼編程在某種程度上令人難以置信地比其他任何東西都更容易學習。Felleisen等人在他們《Howto DesignPrograms》這本書中對這種趨勢表示了贊同——「寫出不好的程序很容易。傻瓜也可以在21天時間內學習編程。即使他們毫無基礎。」

Advertisements

讓我們來分析一下,類似於《24小時自學C++》這樣的書意味著:

  • 自學:在這24小時內,你不會有時間寫一些有意義的程序,因此不能從中總結成功或失敗的經驗教訓。你不會有時間和有經驗的程序員工作,因此不知道生活在一個C++環境中是什麼樣的。總之,你不會有時間學到太多東西。這本書只會觸及一些表層的東西,不會讓你有一個深入的理解。正如AlexanderPope說的那樣,淺學誤人。

  • C ++:在這24小時內,你也許可以學到一些C++的語法(如果你學過另一種語言的話),但你無法學到該如何使用這語言。簡而言之,假設你是一個Basic程序員,那麼你可能會用Basic語言的風格去編寫C++語法程序,也就是說你不會真正明白C ++真正的優勢(和劣勢)。那麼,這還有什麼意義呢?AlanPerlis曾經說過:「如果編程語言不能影響你的編程思維,那就不值得去學」。一種可能的情況是,你必須學習一點C++(或者更可能的,是JavaScript或進程處理),因為你需要用來與現有的工具配合完成特定任務。但此時你不是在學習如何編程:你學習的是如何完成任務。

    Advertisements

  • 24小時:不幸的是,這是不夠的,具體原因下面會講到。

10年自學編程

研究人員(Bloom (1985), Bryan & Harter (1899), Hayes (1989),Simmon & Chase (1973))表明,我們大約需要10年的時間來發展任何一種廣泛領域的專業知識,例如國際象棋,音樂作曲,電報操作,繪畫,鋼琴,游泳,網球,以及神經心理學和拓撲學等。思考性的實踐是關鍵:不要只是一遍又一遍地做,而是要用超出你現有能力的任務挑戰自己,嘗試它,在你做的時候和做完之後分析自己的表現,並糾正錯誤。然後重複,再重複。這裡沒有真正的捷徑:即使是4歲時就已經享譽為音樂神童的莫扎特,也依然花了13年的時間才開始做出世界一流的音樂。

Malcolm Gladwell通俗化了這個思想觀點,雖然他專註編程10,000小時,而不是10年。HenriCartier-Bresson(1908-2004)還有另外一個指標:「你的前一萬張照片正是你最糟糕的作品。」(他沒有考慮到數碼相機,擁有數碼相機使人在一周內達到這一標準。)真正的專業化可能需要一生的時間:SamuelJohnson (1709-1784)說,「只有通過一生的努力才能在某一學科取得卓越成就:打了折扣的就學不到家。」以及Chaucer(1340-1400)曾抱怨說:「生之有限,學也無涯。」Hippocrates (c.400BC)更是以「生命短暫,藝術長遠」的語錄而聞名。因此,假設所有技能(如編程,下棋,玩跳棋,玩音樂)都可以在相同量的時間內掌握,是不合理的,而且每個人所需的時間也不會完全相同。正如K. AndersEricsson教授所說的那樣,「在大多數領域中,表明即使是最有才華的人也需要多少的時間才能達到最高的性能水平的言論,是值得關注的。10000個小時這個數值只是給你一個概念而已,因為每個人的學習能力也不盡相同。「

所以,你想成為一個程序員嗎?

下面是我編程成功秘訣:

  • 對編程感興趣,然後因為它有趣而去寫程序。請確保保持足夠的樂趣,這樣你才會心甘情願地花費10年/10,000小時在編程上。

  • 編程。最好的學習方式是邊做邊學。用更技術化的說法就是,「對於個人,在給定領域中最高層次的表現,不會因為經驗的增加而自動獲得,但是性能水平可以由於經驗豐富的個人改善有意識的努力而增加。(p366)」 還有,「最有效的學習需要明確的任務,針對特定個體的適當難度水平,信息反饋,以及重複和改正錯誤的機會。」 (p20-21)。對於這個觀點,可以參考《Cognition in Practice: Mind, Mathematics, andCulture in Everyday Life》這本書。

  • 與其他程序員交談;閱讀其他程序。這比任何書本和訓練課程都更重要。

  • 如果你想的話,可以花四年時間去讀大學(或更多時間去讀研究生)。上大學使得你有機會接觸到一些需要學歷證明的工作,而且能夠更深入地了解這個領域,但如果你不喜歡學校的話,你也可以(通過一些貢獻)獲得相似的工作經歷。在任何情況下,單靠書本知識是遠遠不夠的。「計算機教育並不比學習更能造就程序專家,就像顏料不能使人成為繪畫專家一樣。」EricRaymond,《The New Hacker』sDictionary》的作者這樣說道。我曾經聘用的最好的程序員之一就只有高中學歷——他製作了許多優秀的軟體,有他自己的新聞組,並且在股票期權上賺到了足夠多的錢買下屬於他的酒吧。

  • 和其他程序員一起做項目。在一些項目上成為最好的程序員;在一些其他的項目上則是最差的程序員。當你是最好的程序員的時候,你需要測試自己的能力來帶領項目,並且用你的觀點激勵他人。當你是最差的程序員的時候,你需要向大師學習,並且學習去做那些他們不喜歡的事情(因為他們會讓你為他們做這些事)。

  • 在其他程序員之後接手項目。理解別人寫的程序。知道如何理解和修復程序,當初始程序員不在身邊的時候。思考如何設計你的程序使其更容易在你之後被人維護。

  • 學習至少半打編程語言。包括一種注重類抽象的語言(如Java或C++),一種注重函數抽象的語言(如Lisp或ML或Haskell),一種支持語法抽象的語言(如Lisp),一種支持聲明性規範的語言(如Prolog或C++模板),以及一種注重并行的語言(如Clojure或Go)。

  • 請記住,「計算機科學」中包含「計算機」。知道你的計算機需要多長時間才能執行一條指令、從內存中(有和沒有緩存未命中)讀取一個單詞、從磁碟中讀取連續的單詞、以及搜尋磁碟上的新位置。(答案在這裡。)

  • 涉足一種語言的標準化工作。可以是ANSI C++,也可以是決定自己團隊的編碼風格是否要有2個或4個空格的縮進。無論哪種方式,你會了解到其他人在某種語言中喜歡什麼,程度有多深,甚至一些關於為什麼他們這麼覺得的原因。

  • 有良好的意識能夠儘可能快的脫離語言標準化工作。

知道了上面這些,你會質疑書本學習究竟能幫助我們走多遠。在我第一個孩子出生前,我閱讀了所有《如何……》的書籍,但仍然感覺自己像個手足無措的新手。30個月後,當我第二個孩子出生的時候,我又再次回到書本中複習了嗎?不,相反,我依賴的是我的個人經驗,而這其實比那些專家撰寫的成千上萬頁的書本更為有用的多,也更讓我放心。

Fred Brooks,在他的隨筆《No Silver Bullet》制定了一個三步走的計劃,用來尋找優秀的軟體設計師:

  1. 系統化地儘早識別頂級的設計師。

  2. 分配職業導師負責未來的成長,並認真保存其職業文檔。

  3. 為設計師的互動和相互促進成長提供機會。

這是假定一些人已經具備了成為一個偉大的設計師所需要的品質;工作不過是引導他們前進。AlanPerlis說得更簡潔:「我們可以教每一個人去雕刻:米開朗基羅也曾被教導不要怎麼樣。偉大的程序員也是如此。」Perlis的意思是說,偉人所擁有的一些內在品質,超越了訓練。但是,這些品質從何而來?它是與生俱來的?亦或者是通過勤奮而開發的?正如AugusteGusteau(《Ratatouille》電影中的虛構廚師)所說的那樣,「任何人都可以做飯,但只有無畏者才能成就偉大。」我覺得這裡的無畏更像是願意奉獻自己生活中很大的一部分時間到思考實踐中的意思。可能無畏是對此的總結。或者,正如Gusteau的評論員,AntonEgo說的那樣說:「不是每個人都能成為偉大的藝術家,但是偉大的藝術家可以來自任何地方。」

所以儘管去買那些Java / Ruby/Javascript /PHP的書;你可能將會從中得到一些用處。但它們改變不了你的生活,你也不可能在24小時或21天內成長為一個真正全面化的專業程序員。千里之行始於足下,從現在開始努力吧……

譯文鏈接:http://www.codeceo.com/article/10-years-self-learn-programming.html

英文原文:Teach Yourself Programming in Ten Years

翻譯作者:碼農網 – 小峰

Advertisements

你可能會喜歡