研究人員(Bloom(1985)歌焦、Bryan&Harter(1899年)飞几、Hayes(1989)、Simmon&Chase(1973))已經(jīng)證明独撇,在包括國際象棋屑墨、音樂創(chuàng)作躁锁、電報運算、繪畫卵史、鋼琴演奏战转、游泳、網(wǎng)球以及神經(jīng)心理學和拓撲學研究在內(nèi)的任何廣泛領域以躯,都需要十年的時間才能發(fā)展出專門知識槐秧。關鍵在于深思熟慮的練習:不只是一次又一次地去做,而是用一項超出你目前能力范圍的任務來挑戰(zhàn)自己忧设,嘗試它刁标,分析你在做的時候和之后的表現(xiàn),并糾正任何錯誤见转。那就重復一遍命雀。再重復一遍蒜哀。似乎沒有真正的捷徑:即使是莫扎特斩箫,他在4歲時是一個音樂天才,花了13年才開始創(chuàng)作世界級的音樂撵儿。在另一種類型中乘客,披頭士樂隊似乎以一連串的#1熱門和1964年的埃德·沙利文秀出現(xiàn)在現(xiàn)場。但從1957年起淀歇,他們就一直在利物浦和漢堡打小俱樂部易核,雖然他們很早就有了很大的吸引力,但他們的第一個重大成功浪默,佩珀斯中士牡直,在1967年被釋放了。
馬爾科姆·格拉德威爾(Malcolm Gladwell)推廣了這一理念纳决,盡管他專注于1萬小時碰逸,而不是10年。HenriCartier-Bresson(1908-2004)有另一個指標:“你的前10,000張照片是你最差的阔加《罚”(他沒有預料到,使用數(shù)碼相機胜榔,一些人可以在一周內(nèi)達到這一目標胳喷。)真正的專業(yè)知識可能需要一生的時間:塞繆爾·約翰遜(1709-1784)說:“任何部門的卓越都只能靠一生的勞動才能實現(xiàn);不能以較低的價格購買夭织】月叮”喬叟(1340-1400)抱怨道:“萊夫太短了,手藝太長了尊惰〗哺停”Hippocrates(公元前400年)以摘錄“Ars Longa纬向,vita brevis”而聞名,這是較長的引語“Ars Longa戴卜,vita brevis逾条,ocus o precep,實驗性的周膜投剥,艱難的分枝”的一部分师脂,在英語中,它表現(xiàn)為“生命短江锨,工藝長吃警,機會短暫,實驗變化無常啄育,判斷困難”酌心。當然,沒有一個數(shù)字是最終的答案:似乎不合理地假定所有技能(例如編程挑豌、下棋安券、跳棋和音樂演奏)都需要完全相同的時間來掌握,也不認為所有人都需要完全相同的時間氓英。正如K·安德斯·愛立信(K.Anders Ericsson)教授所言侯勉,“在大多數(shù)領域,即便是最有才華的人铝阐,也需要多少時間才能達到最高水平址貌。1萬小時的時間讓你感覺到,我們所說的每周10到20個小時徘键,有些人會認為练对,那些天生最有天賦的人仍然需要達到最高水平〈岛Γ”
所以你想成為一名程序員
下面是我編程成功的秘訣:
對編程感興趣螟凭,并做一些,因為它是有趣的赠制。一定要保持足夠的樂趣赂摆,這樣你就會愿意投入你的10年/10,000小時。
節(jié)目钟些。最好的學習方式是邊做邊學烟号。更嚴格地說,“在某一領域政恍,個人的最高業(yè)績水平并不是隨著經(jīng)驗的擴展而自動達到的汪拥,但即使是經(jīng)驗豐富的個人,也可以通過刻意改進而提高業(yè)績水平篙耗∑戎”(第366頁)和“最有效的學習需要一個明確的任務宪赶,適當?shù)碾y度水平,為特定的個人脯燃,信息反饋搂妻,并有機會重復和糾正錯誤≡铮”(第20-21頁)“實踐中的認知:日常生活中的思想欲主、數(shù)學和文化”是這一觀點的有趣參考。
與其他程序員交談逝嚎;閱讀其他程序扁瓢。這比任何書籍或培訓課程都更重要。
如果你愿意补君,在一所大學(或更多的研究生院)待四年引几。這會讓你獲得一些需要資格證書的工作,也會讓你對這個領域有更深入的了解挽铁,但如果你不喜歡上學伟桅,你可以(用一些奉獻精神)獨自或在工作中獲得類似的經(jīng)驗。無論如何屿储,光靠書本學習是不夠的贿讹〗ヌ樱“計算機科學教育不能使任何人成為專業(yè)程序員够掠,就像研究畫筆和顏料可以使人成為專業(yè)畫家一樣”,“新黑客詞典”的作者埃里克·雷蒙德說茄菊。我雇過的最好的程序員之一只有高中學位疯潭,他制作了很多很棒的軟件,有自己的新聞組面殖,并且有足夠的股票期權來購買自己的夜總會竖哩。
與其他程序員一起完成項目。在某些項目中做最好的程序員脊僚;在其他項目上做最差的程序員相叁。當你是最好的,你可以測試你的能力來領導一個項目辽幌,并用你的遠見激勵別人增淹。當你是最壞的時候,你學會了主人做什么乌企,你學會了他們不喜歡做什么(因為他們讓你為他們做)虑润。
工作項目后,其他程序員加酵。理解別人寫的程序拳喻】薜保看看當原來的程序員不在的時候,需要什么才能理解和修復它冗澈。想一想如何設計你的程序钦勘,讓那些在你之后維護它們的人更容易。
至少學習六種編程語言亚亲。包括一種強調(diào)類抽象的語言(比如Java或C++)个盆、一種強調(diào)函數(shù)抽象(比如Lisp、ML或Haskell)朵栖、一種支持語法抽象(比如Lisp)颊亮、一種支持聲明性規(guī)范(比如Prolog或C++模板)、一種強調(diào)并行性(比如Clojure或Go)陨溅。
記住终惑,在“計算機科學”中有一個“計算機”。知道您的計算機執(zhí)行指令门扇、從內(nèi)存中獲取一個單詞(是否有緩存丟失)雹有、從磁盤中讀取連續(xù)單詞以及尋找磁盤上的新位置需要多長時間。(答案在這里)
參與語言標準化工作臼寄。它可能是ANSI C++委員會霸奕,也可能是決定您的本地編碼風格將有2或4個空間縮進水平。不管是哪種方式吉拳,你都可以了解到其他人在一種語言中喜歡什么质帅,他們有多深,也許還有一點是關于為什么他們會這樣想的留攒。
有良好的判斷力煤惩,盡快擺脫語言標準化的努力。
考慮到所有這些炼邀,僅僅通過書本學習魄揉,你能走多遠是值得懷疑的。在我的第一個孩子出生之前拭宁,我讀了所有的書洛退,仍然覺得自己是一個無知的新手。30個月后杰标,當我的第二個孩子即將出生時兵怯,我是否又回到書本上復習了一下?沒有在旱。相反摇零,我依靠的是我個人的經(jīng)驗,這比專家們寫的幾千頁更有用,也更讓我放心驻仅。
弗雷德·布魯克斯(FredBrooks)在他的文章“沒有銀彈”中指出了一個尋找優(yōu)秀軟件設計師的三部分計劃:
系統(tǒng)地盡早確定頂級設計師谅畅。
指派一位職業(yè)導師負責前景的發(fā)展,并仔細保存一份職業(yè)檔案噪服。
為不斷成長的設計師提供互動和相互激勵的機會毡泻。
這假設有些人已經(jīng)具備了成為一名偉大設計師所必需的素質(zhì),其工作就是恰當?shù)匾龑麄儓猿窒氯フ秤拧0瑐悺づ謇?AlanPerlis)更簡潔地說:“每個人都可以學會雕刻:米開朗基羅(Michelangelo)必須學會如何不去做仇味,偉大的程序員也是如此”⑺常”佩利斯說丹墨,偉大的球員有一些超越他們訓練的內(nèi)在素質(zhì)。但是質(zhì)量是從哪里來的呢嬉愧?是天生的嗎贩挣?或者他們是通過勤奮來發(fā)展的呢?正如奧古斯特·古斯托(Ratatouille中虛構的廚師)所言:“任何人都能做飯没酣,但只有無畏的人才能做得很好王财。”我認為它更多的是愿意把一個人一生中的大部分時間花在深思熟慮的實踐上裕便。但也許無畏是總結這一點的一種方式绒净。或者偿衰,正如古斯托的批評家安東·伊戈所說:“不是每個人都能成為偉大的藝術家挂疆,但偉大的藝術家可以來自任何地方“タ眩”
因此囱嫩,繼續(xù)購買Java/Ruby/Javascript/PHP書籍;您可能會從中得到一些使用漏设。但你不會在24小時或21天內(nèi)改變你的生活,也不會改變你作為程序員的真正專業(yè)知識今妄。在過去的24個月里郑口,努力工作,不斷提高盾鳞,怎么樣犬性?現(xiàn)在你開始有進展了..。
參考文獻
布盧姆腾仅,本杰明(編輯)“發(fā)展青年人才”乒裆,巴蘭汀,1985年推励。
布魯克斯鹤耍,弗雷德肉迫,沒有銀子彈,IEEE計算機稿黄,第20卷喊衫,第4期,1987年杆怕,第10-19頁族购。
Bryan,W.L.&Harter陵珍,N.“電報語言研究:習慣層次的習得”寝杖,“心理學評論”,1899年互纯,8,345-375朝墩。
海斯,約翰R.伟姐,完全問題解決者勞倫斯厄爾鮑姆收苏,1989年。
放大圖片作者:William G.&Simon愤兵,Herbert A.“象棋中的知覺”鹿霸,“認知心理學”,1973秆乳,4懦鼠,55-81。
“實踐中的認知:日常生活中的思想屹堰、數(shù)學和文化”肛冶,劍橋大學出版社,1988年扯键。
答案
典型PC上各種操作的大致時間:
執(zhí)行典型指令1/1,000,000,000秒=1納塞克
從L1高速緩存存儲器0.5納塞克中提取
支路誤判5納秒
從L2高速緩存存儲器7納塞克中提取
互斥鎖/解鎖25納塞克
從主存100納塞克中提取
在1Gbps網(wǎng)絡上發(fā)送2K字節(jié)20,000納秒
從內(nèi)存250,000納塞克中順序讀取1MB
從新磁盤位置(查找)獲取8,000,000納塞克
從磁盤按順序讀取1MB 20,000,000納塞克
將數(shù)據(jù)包US發(fā)送到歐洲睦袖,返回150毫秒=150,000,000納塞克
附錄:語言選擇
有幾個人問他們應該先學哪種編程語言。沒有一個答案荣刑,但請考慮以下幾點:
利用你的朋友馅笙。當被問到“我應該使用什么操作系統(tǒng),Windows厉亏,Unix還是Mac董习?”時,我的回答通常是:“使用任何你的朋友使用的操作系統(tǒng)爱只∶罅埽”你從朋友那里學到的優(yōu)勢將抵消操作系統(tǒng)之間或編程語言之間的任何內(nèi)在差異。還要考慮你未來的朋友:如果你繼續(xù)的話,你會成為程序員社區(qū)的一部分窝趣。你所選擇的語言是有一個龐大的成長社區(qū)疯暑,還是一個正在消亡的小群體?有沒有書籍高帖,網(wǎng)站和在線論壇可以得到答案缰儿?你喜歡那些論壇上的人嗎?
保持簡單散址。編程語言(如C++和Java)是為專業(yè)開發(fā)而設計的乖阵,由大量經(jīng)驗豐富的程序員組成,他們關心代碼的運行時效率预麸。因此瞪浸,這些語言具有為這些情況設計的復雜部分。你關心的是學習編程吏祸。你不需要那種并發(fā)癥对蒲。你想要一種語言,它被設計成一個簡單易學的語言贡翘,并被一個新的程序員記住蹈矮。
玩。你更愿意學習彈鋼琴的哪一種方式:普通的鸣驱,交互式的泛鸟,在你一按下鍵就聽到每個音符的方式,還是“分批”模式踊东,只有在你唱完整首歌之后才能聽到音符北滥?顯然,交互模式使鋼琴和編程更容易學習闸翅。堅持一種互動的語言再芋,并使用它。
考慮到這些標準坚冀,我對第一種編程語言的建議將是Python或Scheme济赎。另一個選擇是Javascript,并不是因為它為初學者設計得非常好遗菠,而是因為它有很多在線教程联喘,比如Khan Academy的教程。但你的情況可能會有所不同辙纬,還有其他好的選擇外驱。如果你的年齡是個位數(shù)糠涛,你可能更喜歡愛麗絲、斯奎克或布洛克里(年長的學習者也會喜歡這些)标锄。重要的是你選擇并開始。
附錄:書籍和其他資源
有幾個人問他們應該從哪些書籍和網(wǎng)頁中學習譬涡。我再說一遍闪幽,“光靠書本學習是不夠的”,但我可以推薦以下幾點:
方案:計算機程序的結構和解釋(Abelson&Sussman)可能是計算機科學的最佳入門涡匀,它確實教授編程作為理解計算機科學的一種方式盯腌。你可以在這本書上看到講座的在線視頻,也可以在網(wǎng)上看到完整的文本陨瘩。這本書具有挑戰(zhàn)性腕够,并將淘汰出一些可能通過另一種方法獲得成功的人。
方案:如何設計程序(Felleisen等人)是關于如何以優(yōu)雅和實用的方式實際設計程序的最好的書籍之一舌劳。
Python:PythonProgramming:IntrotoCS(Zelle)是使用Python的一個很好的介紹帚湘。
Python:幾個在線教程可以在Python.org上找到。
奧茲:計算機編程的概念甚淡、技術和模型(VanRoy&Haridi)被一些人視為現(xiàn)代阿貝爾森和蘇斯曼的繼承者大诸。它是一個關于編程的偉大思想的旅行,涵蓋的范圍比Abelson&Sussman更廣泛贯卦,而且可能更容易閱讀和跟蹤资柔。它使用的一種語言,Oz撵割,并不廣為人知贿堰,但作為學習其他語言的基礎。<
注記
T.Capey指出睁枕,亞馬遜上的完整問題解決方案頁面現(xiàn)在有“21天內(nèi)教你自己孟加拉語”和“教你自己語法和風格”的書官边,在“為這個項目購物的顧客也在購買這些物品”部分下。我想看那本書的人中有很大一部分是從這一頁來的外遇。感謝羅斯·科恩幫助希波克拉底注簿。