作者:Peter NorviG 翻譯:劉延棟 ,公眾號“軟件那些事兒” 這篇文章已經(jīng)有很多人翻譯過了,我之所以再搞一次,首先是我覺得這文章真的很好,值得一搞再搞,其次,幾乎所有的版本都漏掉了一些語句,我猜可能是英文版更新過,但是,中文版沒有與時俱進(jìn)。 如果再有人在我的公眾號里問我如何學(xué)習(xí)編程的話,我就可以把這個發(fā)給他了。 為何每個人都急于求成? 隨便走進(jìn)一家書店,都會看到類似《24小時學(xué)會Java》這樣的書,旁邊擺著的是大量諸如在幾天,幾小時之內(nèi)學(xué)會C語言,SQL,Ruby以及算法這樣的書。 如果使用Amazon上的高級搜索,使用title: teach, yourself, hours, since: 2000這個關(guān)鍵字來搜索,將會返回512本書。最靠前的10本書中,有9本是編程的書(唯一的例外是一本記賬的書)。如果把關(guān)鍵字”teach yourself”替換成”learn”,或者將”hours”替換成”days”,返回的結(jié)果大同小異。 很明顯,人們在學(xué)習(xí)編程的時候喜歡大躍進(jìn),或者認(rèn)為編程比起其它事情來,是小菜一碟的事。Felleisen在他的書《How to Design Program》里說:“編寫爛程序一點(diǎn)也不難。傻瓜也可以在21天內(nèi)學(xué)會,即使他們是傻逼?!痹诟阈β嬀W(wǎng)站Abtruse Goose也在這個漫畫中表達(dá)了同樣的看法。 我們來看看類似《24小時自學(xué)C++》這種標(biāo)題黨,到底說的什么鬼東西:
十年學(xué)會編程 研究表明,想在任何領(lǐng)域成為專家,大概需要10年的時間,這些領(lǐng)域包括下棋,作曲,發(fā)電報(bào),彈鋼琴,游泳,打網(wǎng)球,研究神經(jīng)心理學(xué)和拓?fù)鋵W(xué)。 關(guān)鍵在于有針對性的訓(xùn)練,而不是漫無目的重復(fù),訓(xùn)練的內(nèi)容要剛好超過你現(xiàn)有的水平,練習(xí)以后要分析你的表現(xiàn),改正發(fā)現(xiàn)的錯誤,然后重復(fù),再重復(fù)。 沒有什么捷徑可走,即使是Mozart,一個4歲就能彈琴的音樂天才,也是用了13年的時間,才真正的寫出世界級的音樂作品。在流行音樂上,Beatles好像是在1964年訪美期間一夜成名的。實(shí)際上,他們從1957年就已經(jīng)開始在利物浦和漢堡的小酒館里唱歌了,他們組建樂隊(duì)的時間就更早了,他們第一張取得巨大成功的專輯《佩帕軍士》,是在1967年發(fā)行的。 馬爾科姆·格拉德威爾讓這個理論廣為人知,雖然他說的是另一個說法,10000個小時而不是10年(這本書有中文翻譯版《異類 : 不一樣的成功啟示錄》)。 法國現(xiàn)實(shí)主義攝影大師亨利·卡蒂埃-布列松有另外一個標(biāo)準(zhǔn),他說你的前10000張照片是你最差的。(當(dāng)然,這個攝影大師沒有意識到數(shù)碼相機(jī)的出現(xiàn),很多人能在一周內(nèi)就可以拍10,000張照片) 真正的大師要用一生來完成,英國作家,文學(xué)評論家和詩人塞繆爾·約翰遜說過:“在任何領(lǐng)域取得卓越的成就都要用一生的努力,不要妄想可以投機(jī)取巧?!庇脑娙藛疼乓苍?jīng)說過:”吾生也有涯 而知也無涯?!?/p> 同樣,公元前400年的希波克拉底也表達(dá)過類似的意思,他也認(rèn)為藝術(shù)沒有止境,生命卻有盡頭。他說的這句話有個更長的版本,翻譯成英語的意思是:“生命有盡頭,藝術(shù)無止境,機(jī)遇轉(zhuǎn)瞬即逝,練功走火入魔,決定優(yōu)柔寡斷?!?/p> 當(dāng)然,不會有一個確定的答案告訴你需要多長時間,畢竟,假設(shè)掌握所有的技能(比如編程,下棋,跳棋和音樂)需要相同的時間也不合適,不同的人也會用不同的時間。 K.Anders Ericsson教授說過:“值得注意的是,在大多數(shù)領(lǐng)域,即使你是個天才,要達(dá)到專家級別的高水平仍然需要時間。10000個小時只是給你一個概念,一個天才,如果每周練習(xí)10到20個小時的時間,仍然需要數(shù)年時間才能達(dá)到專家級別的水平?!?/p> 所以你想成為一個程序員 這是我編程成功的秘笈: 要對編程感興趣,要從中能獲得快樂。保證編程足夠有趣,這樣才能讓你花10年的時間或者10,000個小時在上面也不覺得枯燥無味。 動手編程。最好的學(xué)習(xí)方法是邊學(xué)邊做。常言道:“人的最高功力并不能通過做一天和尚撞一天鐘這樣的重復(fù)經(jīng)驗(yàn)獲得,但是,最高的功力可以通過有針對性的日復(fù)一日年復(fù)一年的訓(xùn)練來獲得?!辈⑶遥白钣行Ч膶W(xué)習(xí)需要有針對性的任務(wù),這些任務(wù)的難度還要因人而異,并且有合理的反饋渠道,并能夠根據(jù)這些反饋?zhàn)鞒鱿鄳?yīng)的改進(jìn)。”這些觀點(diǎn)引用自《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》這本書里。 和其他的程序員交流,閱讀別人的代碼。這比看書或者參加培訓(xùn)課程要重要。 如果你愿意,在大學(xué)里花上四年時間(或者再讀個研)。這能讓你獲得一些工作機(jī)會,也能讓你在這個領(lǐng)域有更深入的了解。但是,如果你一上學(xué)就頭痛,直接去工作也能獲得相同的經(jīng)驗(yàn)。無論是什么情況,讀死書肯定是不行的。計(jì)算機(jī)科學(xué)不會讓你成為編程專家,就像學(xué)習(xí)畫筆和顏料不可能讓你成為畫家一樣。這是Eric Raymond說的,他是New Hacker’s Dictionary字典的作者。我雇傭過的最好的程序員是個高中畢業(yè)的學(xué)生,他創(chuàng)造了偉大的軟件,Mozilla,他擁有自己的新聞組,賺到了足夠多的錢買了自己的酒吧。 和其他的程序員一起參與一些項(xiàng)目。在一些項(xiàng)目中成為最出色的程序員;在另一些項(xiàng)目中當(dāng)最差勁的程序員。在當(dāng)最出色的程序員的時候,要測試你領(lǐng)導(dǎo)項(xiàng)目的能力,用你的視野來啟發(fā)別人。如果你是項(xiàng)目中最差的那個,要學(xué)習(xí)牛人們在做什么,如果他們不喜歡做的,你要拿來做。 接手并推進(jìn)別人的項(xiàng)目。理解其他人寫的代碼。如果有別人沒有考慮到的問題,你能理解并修復(fù)它們。思考并設(shè)計(jì)你的軟件,讓這些軟件也容易被他人維護(hù)。 學(xué)習(xí)至少6種(我不太清楚英語中的half dozen是什么意思,是虛指還是就是6種)編程語言。這6種語言中,包括一種支持抽象類的(例如Java或者C++),一種支持函數(shù)的(Lisp, ML或者Haskell),一種支持語義抽象的(Lisp),一種支持聲明規(guī)范的(Prolog或者C++模板),還有一種支持并發(fā)的(Clojure或Go)。 記住,在“計(jì)算機(jī)科學(xué)”中在“計(jì)算機(jī)”這個詞語。理解執(zhí)行一條指令要花多長時間,從內(nèi)存中取一個字(要考慮緩存有沒有命中的情況)要多久,從硬盤中連續(xù)讀字節(jié)要多久,在硬盤中尋址定位要多久? 參加語言的標(biāo)準(zhǔn)化工作。這可能是有關(guān) ANSI C++ 委員會,也可能是縮進(jìn)的風(fēng)格是兩格縮進(jìn)或四格縮進(jìn)。無論如何,你能從中學(xué)到其他人對語言的喜好,也能了解到他們熱愛的程度,甚至也許能知道一點(diǎn)他們?yōu)槭裁此麄儠@樣認(rèn)為? 知道何時能從標(biāo)準(zhǔn)化語言的工作中脫身,越快越好。 很難說能從書本中學(xué)到多少東西。我第一個小孩出生的時候,我讀了所有的“如何做”系列的書,但是,沒有什么頭緒。30個月以后,當(dāng)我的第二個孩子出生,我還要重溫一下那些書么?當(dāng)然不用了!我都已經(jīng)是老司機(jī)了,我完全靠我自己的經(jīng)驗(yàn),事實(shí)也證明我自己的經(jīng)驗(yàn)要勝過那些專家們寫的上千頁的書。 弗雷德·布魯克斯在他的書《沒有銀彈》中給出了三條建議:
此處的假設(shè)是有一些人天生有成為偉大設(shè)計(jì)師的潛質(zhì),然后,就是正確的去引導(dǎo)他們。艾倫·佩里斯一針見血地說:”假如每個人都可以學(xué)會雕刻,那就得教米開朗基羅哪些事不要去做。對于偉大程序員,也是如此?!?/p> Perlis認(rèn)為,偉大的人有一種內(nèi)在的特質(zhì),這種特質(zhì)往往比接受訓(xùn)練更重要。但是,這些特質(zhì)是從哪里來的呢?與生俱來的?還是通過后天勤奮而來的? 正如動畫片《料理鼠王》里的幻象大廚Auguste Gusteau說的那樣:“誰都能做飯,但只有那些無所畏懼的人才能成為大廚!”我認(rèn)為“把你生命中的大部分時間花在有針對性的練習(xí)上”這種精神,看作一種自愿奉獻(xiàn)的精神!但或許“無所畏懼”才是體現(xiàn)這種精神的真諦?;蛘?,就像是《料理鼠王》里那個與 Gusteau 作對的刻薄的美食評論家 Anton Ego 說的那樣:“不是任何人都能成為偉大的藝術(shù)家,不過,偉大的藝術(shù)家可以來自任何地方。” 所以,盡管買本 Java/Ruby/Javascript/PHP 的書吧。你可能會從中學(xué)到點(diǎn)兒有用的東西。但作為一個程序員,在 21 天內(nèi)或 24 小時內(nèi)改變你的人生,或者提高你實(shí)際的編程水平,這是不可能的。你嘗試過連續(xù) 24 個月不間斷的努力提高自己么?好吧,好吧,你該上路了…… 特別提醒: 本文還有中英文對照版 |
|