我的 10 年自學(xué)編程之路

作者 |?碼農(nóng)網(wǎng)–小峰翻譯
聲明 |?本文是 碼農(nóng)網(wǎng)–小峰翻譯?原創(chuàng),已獲授權(quán)發(fā)布,未經(jīng)原作者允許請勿轉(zhuǎn)載
為什么每個人都這樣匆忙?
走進任何一家書店,你都能看到諸如《24小時自學(xué)Java》這樣的書,可能書名中的 Java 會變成 C、SQL、Ruby、算法等,然后 24 小時會變成 n 天或 n 小時。在亞馬遜高級搜索[title: teach, yourself, hours, since: 2000 ,你會發(fā)現(xiàn)有 512 種這樣的書籍。排在前 10 位的,9 個是編程類的書(還有一個是關(guān)于財務(wù)會計的)。還有多種變化,例如“學(xué)習(xí)”替換“自學(xué)”,“天”替換“小時”。
結(jié)論:要么大家都特別匆忙地在學(xué)習(xí)編程,要么編程在某種程度上令人難以置信地比其他任何東西都更容易學(xué)習(xí)。Felleisen 等人在他們《How to Design Programs》這本書中對這種趨勢表示了贊同——“寫出不好的程序很容易。傻瓜也可以在 21 天時間內(nèi)學(xué)習(xí)編程。即使他們毫無基礎(chǔ)。”
讓我們來分析一下,類似于《24小時自學(xué)C++》這樣的書意味著:
自學(xué):在這 24 小時內(nèi),你不會有時間寫一些有意義的程序,因此不能從中總結(jié)成功或失敗的經(jīng)驗教訓(xùn)。你不會有時間和有經(jīng)驗的程序員工作,因此不知道生活在一個 C ++ 環(huán)境中是什么樣的。總之,你不會有時間學(xué)到太多東西。這本書只會觸及一些表層的東西,不會讓你有一個深入的理解。正如 Alexander Pope 說的那樣,淺學(xué)誤人。
C ++:在這24小時內(nèi),你也許可以學(xué)到一些 C ++ 的語法(如果你學(xué)過另一種語言的話),但你無法學(xué)到該如何使用這語言。簡而言之,假設(shè)你是一個 Basic 程序員,那么你可能會用 Basic 語言的風(fēng)格去編寫 C ++ 語法程序,也就是說你不會真正明白 C ++ 真正的優(yōu)勢(和劣勢)。那么,這還有什么意義呢?Alan Perlis 曾經(jīng)說過:“如果編程語言不能影響你的編程思維,那就不值得去學(xué)”。一種可能的情況是,你必須學(xué)習(xí)一點 C++(或者更可能的,是 JavaScript 或進程處理),因為你需要用來與現(xiàn)有的工具配合完成特定任務(wù)。但此時你不是在學(xué)習(xí)如何編程:你學(xué)習(xí)的是如何完成任務(wù)。
24小時:不幸的是,這是不夠的,具體原因下面會講到。
10年自學(xué)編程
研究人員(Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) 表明,我們大約需要 10 年的時間來發(fā)展任何一種廣泛領(lǐng)域的專業(yè)知識,例如國際象棋,音樂作曲,電報操作,繪畫,鋼琴,游泳,網(wǎng)球,以及神經(jīng)心理學(xué)和拓?fù)鋵W(xué)等。思考性的實踐是關(guān)鍵:不要只是一遍又一遍地做,而是要用超出你現(xiàn)有能力的任務(wù)挑戰(zhàn)自己,嘗試它,在你做的時候和做完之后分析自己的表現(xiàn),并糾正錯誤。然后重復(fù),再重復(fù)。這里沒有真正的捷徑:即使是 4 歲時就已經(jīng)享譽為音樂神童的莫扎特,也依然花了 13 年的時間才開始做出世界一流的音樂。
Malcolm Gladwell 通俗化了這個思想觀點,雖然他專注編程 10,000小時,而不是 10 年。Henri Cartier-Bresson (1908-2004)還有另外一個指標(biāo):“你的前一萬張照片正是你最糟糕的作品。”(他沒有考慮到數(shù)碼相機,擁有數(shù)碼相機使人在一周內(nèi)達到這一標(biāo)準(zhǔn)。)真正的專業(yè)化可能需要一生的時間:Samuel Johnson (1709-1784)說,“只有通過一生的努力才能在某一學(xué)科取得卓越成就:打了折扣的就學(xué)不到家。”以及 Chaucer (1340-1400) 曾抱怨說:“生之有限,學(xué)也無涯。”Hippocrates (c. 400BC)更是以“生命短暫,藝術(shù)長遠”的語錄而聞名。因此,假設(shè)所有技能(如編程,下棋,玩跳棋,玩音樂)都可以在相同量的時間內(nèi)掌握,是不合理的,而且每個人所需的時間也不會完全相同。正如 K. Anders Ericsson 教授所說的那樣,“在大多數(shù)領(lǐng)域中,表明即使是最有才華的人也需要多少的時間才能達到最高的性能水平的言論,是值得關(guān)注的。10000 個小時這個數(shù)值只是給你一個概念而已,因為每個人的學(xué)習(xí)能力也不盡相同。“
所以,你想成為一個程序員嗎?
下面是我編程成功秘訣:
對編程感興趣,然后因為它有趣而去寫程序。請確保保持足夠的樂趣,這樣你才會心甘情愿地花費 10年/ 10,000 小時在編程上。
編程。最好的學(xué)習(xí)方式是邊做邊學(xué)。用更技術(shù)化的說法就是,“對于個人,在給定領(lǐng)域中最高層次的表現(xiàn),不會因為經(jīng)驗的增加而自動獲得,但是性能水平可以由于經(jīng)驗豐富的個人改善有意識的努力而增加。(p 366)”?還有,“最有效的學(xué)習(xí)需要明確的任務(wù),針對特定個體的適當(dāng)難度水平,信息反饋,以及重復(fù)和改正錯誤的機會。” (p 20-21)。對于這個觀點,可以參考《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》這本書。
與其他程序員交談;閱讀其他程序。這比任何書本和訓(xùn)練課程都更重要。
如果你想的話,可以花四年時間去讀大學(xué)(或更多時間去讀研究生)。上大學(xué)使得你有機會接觸到一些需要學(xué)歷證明的工作,而且能夠更深入地了解這個領(lǐng)域,但如果你不喜歡學(xué)校的話,你也可以(通過一些貢獻)獲得相似的工作經(jīng)歷。在任何情況下,單靠書本知識是遠遠不夠的。“計算機教育并不比學(xué)習(xí)更能造就程序?qū)<遥拖耦伭喜荒苁谷顺蔀槔L畫專家一樣。”Eric Raymond,《The New Hacker’s Dictionary》的作者這樣說道。我曾經(jīng)聘用的最好的程序員之一就只有高中學(xué)歷——他制作了許多優(yōu)秀的軟件,有他自己的新聞組,并且在股票期權(quán)上賺到了足夠多的錢買下屬于他的酒吧。
和其他程序員一起做項目。在一些項目上成為最好的程序員;在一些其他的項目上則是最差的程序員。當(dāng)你是最好的程序員的時候,你需要測試自己的能力來帶領(lǐng)項目,并且用你的觀點激勵他人。當(dāng)你是最差的程序員的時候,你需要向大師學(xué)習(xí),并且學(xué)習(xí)去做那些他們不喜歡的事情(因為他們會讓你為他們做這些事)。
在其他程序員之后接手項目。理解別人寫的程序。知道如何理解和修復(fù)程序,當(dāng)初始程序員不在身邊的時候。思考如何設(shè)計你的程序使其更容易在你之后被人維護。
學(xué)習(xí)至少半打編程語言。包括一種注重類抽象的語言(如 Java或 C ++),一種注重函數(shù)抽象的語言(如 Lisp 或 ML 或Haskell),一種支持語法抽象的語言(如 Lisp),一種支持聲明性規(guī)范的語言(如 Prolog 或 C ++ 模板),以及一種注重并行的語言(如 Clojure 或 Go)。
請記住,“計算機科學(xué)”中包含“計算機”。知道你的計算機需要多長時間才能執(zhí)行一條指令、從內(nèi)存中(有和沒有緩存未命中)讀取一個單詞、從磁盤中讀取連續(xù)的單詞、以及搜尋磁盤上的新位置。(答案在這里。)
涉足一種語言的標(biāo)準(zhǔn)化工作。可以是 ANSI C ++,也可以是決定自己團隊的編碼風(fēng)格是否要有2個或4個空格的縮進。無論哪種方式,你會了解到其他人在某種語言中喜歡什么,程度有多深,甚至一些關(guān)于為什么他們這么覺得的原因。
有良好的意識能夠盡可能快的脫離語言標(biāo)準(zhǔn)化工作。
知道了上面這些,你會質(zhì)疑書本學(xué)習(xí)究竟能幫助我們走多遠。在我第一個孩子出生前,我閱讀了所有《如何……》的書籍,但仍然感覺自己像個手足無措的新手。30 個月后,當(dāng)我第二個孩子出生的時候,我又再次回到書本中復(fù)習(xí)了嗎?不,相反,我依賴的是我的個人經(jīng)驗,而這其實比那些專家撰寫的成千上萬頁的書本更為有用的多,也更讓我放心。
Fred Brooks,在他的隨筆《No Silver Bullet》制定了一個三步走的計劃,用來尋找優(yōu)秀的軟件設(shè)計師:
系統(tǒng)化地盡早識別頂級的設(shè)計師。
分配職業(yè)導(dǎo)師負(fù)責(zé)未來的成長,并認(rèn)真保存其職業(yè)文檔。
為設(shè)計師的互動和相互促進成長提供機會。
這是假定一些人已經(jīng)具備了成為一個偉大的設(shè)計師所需要的品質(zhì);工作不過是引導(dǎo)他們前進。Alan Perlis 說得更簡潔:“我們可以教每一個人去雕刻:米開朗基羅也曾被教導(dǎo)不要怎么樣。偉大的程序員也是如此。”Perlis 的意思是說,偉人所擁有的一些內(nèi)在品質(zhì),超越了訓(xùn)練。但是,這些品質(zhì)從何而來?它是與生俱來的?亦或者是通過勤奮而開發(fā)的?正如 Auguste Gusteau(《Ratatouille》電影中的虛構(gòu)廚師)所說的那樣,“任何人都可以做飯,但只有無畏者才能成就偉大。”我覺得這里的無畏更像是愿意奉獻自己生活中很大的一部分時間到思考實踐中的意思。可能無畏是對此的總結(jié)。或者,正如 Gusteau 的評論員,Anton Ego 說的那樣說:“不是每個人都能成為偉大的藝術(shù)家,但是偉大的藝術(shù)家可以來自任何地方。”
所以盡管去買那些 Java / Ruby/Javascript / PHP 的書;你可能將會從中得到一些用處。但它們改變不了你的生活,你也不可能在 24 小時或 21 天內(nèi)成長為一個真正全面化的專業(yè)程序員。千里之行始于足下,從現(xiàn)在開始努力吧……
經(jīng)驗分享
