十年自學(xué)編程
彼得·諾維格
為什么每個人都這么著急风科?
走進任何書店撒轮,您將看到如何在24小時內(nèi)自學(xué)Java,以及無窮無盡的變體贼穆,可以在幾天或幾小時內(nèi)教授C题山,SQL,Ruby故痊,算法等顶瞳。亞馬遜高級搜索[標題:自學(xué),自學(xué)愕秫,自學(xué)慨菱,自2000年以來,共發(fā)現(xiàn)512本書戴甩。在前十名中符喝,有九本是編程書籍(另一本是關(guān)于簿記的)。通過將“自學(xué)”替換為“學(xué)習”或?qū)ⅰ靶r”替換為“天”甜孤,可以得到類似的結(jié)果协饲。
結(jié)論是要么人們急于學(xué)習編程,要么編程比其他任何事物都更容易學(xué)習缴川。Felleisen等囱稽。?在他們的書《如何設(shè)計程序》中對這種趨勢表示贊同,當他們說“錯誤的編程很容易二跋。白癡可以在21天內(nèi)學(xué)習它战惊,即使他們是傻瓜。”?Abtruse Goose漫畫也受到了歡迎吞获。
讓我們分析一下“?24小時自學(xué)C ++”這樣的標題的?含義:
自學(xué):在24小時內(nèi)况凉,您將沒有時間編寫幾個重要的程序,并從中學(xué)習成功和失敗的原因各拷。您將沒有時間與經(jīng)驗豐富的程序員一起工作刁绒,也不了解在C ++環(huán)境中生活的感覺。簡而言之烤黍,您將沒有時間學(xué)習很多東西知市。因此,這本書只能說是膚淺的熟悉速蕊,而不是深刻的理解嫂丙。正如亞歷山大·波普(Alexander Pope)所說,學(xué)一點東西是危險的规哲。
C ++:在24小時內(nèi)跟啤,您可能可以學(xué)習C ++的某些語法(如果您已經(jīng)知道另一種語言),但是您對如何使用該語言的了解卻不多唉锌。簡而言之隅肥,如果您是一名Basic程序員,則可以學(xué)習使用C ++語法以Basic風格編寫程序袄简,但是您將無法了解C ++的優(yōu)點(或缺點)腥放。那有什么意義呢??艾倫·珀利斯(Alan Perlis)曾經(jīng)說過:“不影響您對編程的思考方式的語言是不值得了解的”绿语。一個可能的觀點是秃症,您必須學(xué)習一小部分C ++(或更可能是JavaScript或Processing之類的東西),因為您需要與現(xiàn)有工具交互以完成特定任務(wù)汞舱。但是伍纫,那時您不會學(xué)習編程宗雇。您正在學(xué)習完成該任務(wù)昂芜。
在24小時內(nèi):不幸的是,這還不夠赔蒲,如下一節(jié)所示泌神。
十年自學(xué)編程
研究人員(Bloom(1985),Bryan&Harter(1899)舞虱,Hayes(1989)欢际,Simmon&Chase(1973))顯示,在下棋矾兜,音樂等眾多領(lǐng)域中發(fā)展專業(yè)知識大約需要十年時間寫作损趋,電報操作,繪畫椅寺,彈鋼琴浑槽,游泳蒋失,網(wǎng)球以及神經(jīng)心理學(xué)和拓撲學(xué)研究。關(guān)鍵是商議?練習:不僅要一遍又一遍地做桐玻,還要挑戰(zhàn)一項超越您當前能力的任務(wù)來挑戰(zhàn)自己篙挽,嘗試一下,分析執(zhí)行前后的表現(xiàn)镊靴,并糾正任何錯誤铣卡。然后重復(fù)。再重復(fù)一次偏竟。似乎沒有真正的捷徑:即使是4歲的音樂天才莫扎特煮落,也花了13年的時間才開始創(chuàng)作世界一流的音樂。在另一種類型中苫耸,甲殼蟲樂隊似乎爆出一連串的#1熱門歌曲州邢,并在1964年的埃德·沙利文(Ed Sullivan)演出中露面。但是褪子,自1957年以來量淌,他們一直在利物浦和漢堡的小型俱樂部打球,盡管如此嫌褪,他們?nèi)匀痪哂芯薮蟮奈υ谠缙谘绞啵麄兊牡谝粋€重大成功就是Sgt。Peppers于1967年發(fā)行笼痛。
馬爾科姆·格拉德威爾盡管他專注于10,000小時(而不是10年)裙秋,但他已經(jīng)推廣了這個想法。亨利·卡蒂坝б粒·布雷森(Henri Cartier-Bresson摘刑,1908-2004年)還有另一個度量標準:“您的前10,000張照片是最糟糕的】谭唬”?(他沒想到數(shù)碼相機會在一個星期內(nèi)達到這一目標枷恕。)真正的專業(yè)知識可能需要一輩子:塞繆爾·約翰遜(Samuel Johnson(1709-1784))說:“任何部門的出色表現(xiàn)都只能靠他的勞動來實現(xiàn)。一輩子谭胚;不要以較低的價格購買徐块。”?喬uc(1340-1400)抱怨說:“ lyf太短了灾而,工藝太長了胡控。”?希波克拉底(約公元前400年)以“ ars longa旁趟,vita brevis”的摘錄而聞名昼激,它是“ Ars longa,vita brevis,occasio praeceps橙困,experimentum perculosum敛劝,iudicium difficile”較長引語的一部分,英語中用“ Life”表示是短纷宇,?當然夸盟,沒有一個數(shù)字可以作為最終答案:假設(shè)所有技能(例如編程,下棋像捶,下棋和玩音樂)可能都需要完全相同的時間來掌握上陕,這似乎是不合理的,也不會所有人都花費完全相同的時間拓春。正如?K. Anders Ericsson教授所說:“在大多數(shù)領(lǐng)域释簿,即使是最有才華的個人也需要多少時間才能達到最高水平。令人難以置信的是硼莽,10,000小時的工作時間使您感覺我們正在談?wù)摱嗄昴承┤藭f庶溶,那些天生才華橫溢的人每周必須花費10到20個小時才能達到最高水平《遥”
所以你想成為一名程序員
這是我編程成功的秘訣:
獲取感興趣的節(jié)目偏螺,并做一些,因為它很有趣匆光。確保它保持足夠的樂趣套像,以便您愿意投入十年/ 10,000小時的時間。
程序终息。最好的學(xué)習是邊做邊學(xué)夺巩。從技術(shù)上來說,“在一定范圍內(nèi)周崭,個人的最高績效不會根據(jù)擴展經(jīng)驗而自動獲得柳譬,但是即使是經(jīng)驗豐富的個人,由于有意改進也可以提高績效水平续镇。 美澳。”?(p磨取。366)?和“最有效的學(xué)習需要對特定個體具有適當難度級別的明確定義的任務(wù)人柿,信息反饋以及重復(fù)和糾正錯誤的機會柴墩∶ρ幔”?(第20-21頁)《實踐中的認知:日常生活中的思維,數(shù)學(xué)和文化》是對此觀點的有趣參考江咳。
與其他程序員交談逢净;閱讀其他程序。這比任何書籍或培訓(xùn)課程都重要。
如果需要爹土,可以在大學(xué)學(xué)習四年(或者在研究生院學(xué)習四年)甥雕。這將使您能夠訪問一些需要證書的工作宪赶,并且可以使您對該領(lǐng)域有更深入的了解帕翻,但是叶堆,如果您不喜歡學(xué)校僚焦,則可以(有一定的奉獻精神)獨自或在工作中獲得類似的經(jīng)驗详恼。 预侯。無論如何朗伶,僅靠書籍學(xué)習是不夠的屯断⊥哑矗《新黑客詞典》的作者埃里克·雷蒙德(Eric Raymond)表示:“計算機科學(xué)教育不能像學(xué)習畫筆和顏料那樣使任何人成為專家程序員瞒瘸。”?我曾經(jīng)雇用過的最好的程序員之一只有高中學(xué)位熄浓。他制作了很多很棒的?軟件情臭,并擁有自己的新聞組并且擁有足夠的股票期權(quán)購買自己的夜店。
與其他程序員一起從事項目赌蔑。在某些項目中成為最好的程序員俯在;在其他人身上最糟糕。當您處于最佳狀態(tài)時娃惯,就可以測試自己領(lǐng)導(dǎo)項目的能力朝巫,并用自己的遠見激發(fā)他人的才能。在最壞的情況下石景,您將學(xué)習大師的所作所為劈猿,并了解他們不喜歡做的事情(因為他們讓您為他們做)。
在其他程序員之后從事項目潮孽。了解別人編寫的程序揪荣。看看當原始程序員不在時需要理解和修復(fù)它的過程往史≌叹保考慮如何設(shè)計您的程序,使那些在您之后維護它們的人更輕松椎例。
學(xué)習至少六種編程語言挨决。包括一種強調(diào)類抽象的語言(例如Java或C ++),一種強調(diào)功能抽象的語言(例如Lisp或ML或Haskell)订歪,一種支持語法抽象的語言(例如Lisp)脖祈,一種支持聲明性規(guī)范的語言(例如Prolog或C ++模板)。 刷晋,并且強調(diào)并行性(例如Clojure或Go)盖高。
請記住慎陵,“計算機科學(xué)”中有一個“計算機”。知道您的計算機執(zhí)行一條指令喻奥,從內(nèi)存中獲取一個單詞(有或沒有緩存未命中)席纽,從磁盤讀取連續(xù)的單詞以及在磁盤上尋找新位置花了多長時間。(在這里回答撞蚕。)
參與語言?標準化工作润梯。它可以是ANSI C ++委員會,也可以確定您的本地編碼樣式是否具有2或4個空格縮進級別甥厦。無論哪種方式仆救,您都可以了解其他人在某種語言中的喜好,他們的感受有多深矫渔,甚至可能很少了解他們?yōu)槭裁慈绱恕?/p>
具有良好的意識彤蔽,可以盡快開始語言標準化工作。
考慮到所有這些庙洼,僅通過學(xué)習書籍就能獲得多大的成績值得懷疑顿痪。在我的第一個孩子出生之前,我閱讀了所有“如何做”書油够,仍然覺得自己是一個笨手笨手的新手蚁袭。30個月后,當我的第二個孩子到期時石咬,我是否又回到書店復(fù)習了揩悄?否。相反鬼悠,我依靠自己的個人經(jīng)歷删性,事實證明,與專家撰寫的成千上萬頁相比焕窝,這對我來說更加有用和令人放心蹬挺。
弗雷德·布魯克斯(Fred Brooks)在他的論文《無銀子彈》中?確定了一個由三部分組成的計劃,以尋找優(yōu)秀的軟件設(shè)計師:
盡早系統(tǒng)地確定頂級設(shè)計師它掂。
指派職業(yè)指導(dǎo)者負責潛在客戶的發(fā)展巴帮,并仔細保存職業(yè)檔案。
為成長中的設(shè)計師提供互動和相互刺激的機會虐秋。
假設(shè)某些人已經(jīng)具備成為優(yōu)秀設(shè)計師所需的素質(zhì)榕茧;工作是適當?shù)睾弪_他們。?艾倫·佩里斯(Alan Perlis)更簡潔地說:“每個人都可以被雕刻而成:米開朗基羅必須被教導(dǎo)如何不做客给。偉大的程序員也是如此用押。”?佩利斯(Perlis)說起愈,偉人的內(nèi)在素質(zhì)超越了他們的訓(xùn)練只恨。但是質(zhì)量從何而來?是天生的嗎抬虽?還是他們通過勤奮發(fā)展官觅?正如奧古斯特·古斯托(Ratatouille的虛構(gòu)廚師?)所說,“任何人都可以做飯阐污,但只有無所畏懼的人才能做得好休涤。”?我將其更多地看作是愿意將一生的大部分時間投入到思考實踐中笛辟。但也許?無所畏懼是一種總結(jié)的方式功氨。或者手幢,正如古斯托(Gusteau)的批評家安東·埃戈(Anton Ego)所說:“并非每個人都能成為一位偉大的藝術(shù)家捷凄,但是一位偉大的藝術(shù)家可以來自任何地方∥Ю矗”
因此跺涤,繼續(xù)購買那本Java / Ruby / Javascript / PHP書;您可能會從中受益匪淺监透。但是您不會在24小時或21天之內(nèi)改變自己的生活桶错,也不會改變自己真正的整體專業(yè)知識。如何努力在24個月內(nèi)不斷改進胀蛮?好吧院刁,現(xiàn)在您開始有所建樹...
參考文獻
本杰明·布魯姆(ed。)粪狼,《年輕人的發(fā)展才能》退腥,巴蘭廷,1985年再榄。
布魯克斯阅虫,弗雷德,《無銀子彈》不跟,IEEE計算機颓帝,第一卷。20號?1987年第4期窝革,第4頁购城。10-19。
Bryan虐译,WL&Harter瘪板,N.“關(guān)于電報語言的研究:習性等級的獲得。Psychology?Review漆诽,1899侮攀,8锣枝,345-375
海耶斯(John Hayes),《完全問題解決者》勞倫斯·艾爾鮑姆(Lawrence Erlbaum)兰英,1989年撇叁。
Chase,William G.&Simon畦贸,Herbert A.?“國際象棋的?認知”認知心理學(xué)陨闹,1973,4薄坏,55-81趋厉。
Lave,Jean胶坠,《實踐中的認知:日常生活中的思維君账,數(shù)學(xué)和文化》,劍橋大學(xué)出版社沈善,1988年杈绸。
答案典型PC上各種操作的大概時間:
執(zhí)行典型的指令1 / 1,000,000,000秒= 1納秒
從L1緩存中獲取0.5納秒
分支預(yù)測錯誤5納秒
從二級緩存中獲取7納秒
互斥鎖鎖定/解鎖25納秒
從主內(nèi)存中獲取100納秒
通過1Gbps網(wǎng)絡(luò)發(fā)送2K字節(jié)20,000納秒
從內(nèi)存順序讀取1MB250,000納秒
從新磁盤位置獲取(查找)8,000,000納秒
從磁盤順序讀取1MB20,000,000納秒
將小包美國發(fā)送到歐洲并返回150毫秒= 150,000,000納秒
附錄:語言選擇
一些人問他們應(yīng)該首先學(xué)習哪種編程語言矮瘟。沒有答案瞳脓,但是請考慮以下幾點:
使用你的朋友。當被問及“我應(yīng)該使用哪種操作系統(tǒng)澈侠,Windows劫侧,Unix或Mac?”時哨啃,我的回答通常是:“使用您的朋友使用的任何軟件”烧栋。從朋友那里學(xué)習的好處將抵消操作系統(tǒng)之間或編程語言之間的任何內(nèi)在差異。還請考慮您的未來朋友:如果繼續(xù)拳球,您將成為程序員社區(qū)的一部分审姓。您選擇的語言是一個正在成長的大型社區(qū)還是一個瀕臨滅絕的社區(qū)?是否有書籍祝峻,網(wǎng)站和在線論壇可提供答案魔吐?你喜歡那些論壇里的人嗎?
保持簡單莱找。諸如C ++和Java之類的編程語言是由經(jīng)驗豐富的程序員組成的大型團隊設(shè)計的酬姆,這些團隊關(guān)心其代碼的運行時效率。結(jié)果奥溺,這些語言具有針對這些情況設(shè)計的復(fù)雜部分辞色。您擔心要學(xué)習編程。您不需要那種麻煩浮定。您需要一種被設(shè)計為易于由單個新程序員學(xué)習和記住的語言相满。
玩层亿。您寧愿學(xué)習彈鋼琴的方式:正常的互動方式,即敲擊琴鍵后便會聽到每個音符立美,也就是“批量”模式匿又,即在整首歌結(jié)束后才聽到音符。 悯辙?顯然琳省,交互模式使鋼琴和編程學(xué)習變得更加容易迎吵。堅持使用交互式模式的語言并使用它躲撰。
給定這些條件,我對第一種編程語言的建議是Python或?Scheme击费。另一個選擇是Javascript拢蛋,不是因為它是為初學(xué)者精心設(shè)計的,而是因為有很多在線教程供您使用蔫巩,例如?Khan Academy的教程谆棱。但是您的情況可能會有所不同,還有其他不錯的選擇圆仔。如果您的年齡是個位數(shù)垃瞧,則您可能更喜歡?Alice或Squeak?或Blockly(年齡較大的學(xué)習者可能會喜歡)。重要的是您選擇并開始坪郭。
附錄:書籍和其他資源
有幾個人問他們應(yīng)該從中學(xué)到什么書和網(wǎng)頁个从。我重申“僅靠書本學(xué)習是不夠的”,但我可以推薦以下內(nèi)容:
方案:?計算機程序的結(jié)構(gòu)和解釋(Abelson和Sussman)可能是計算機科學(xué)的最好入門歪沃,它確實教授編程作為理解計算機科學(xué)的一種方式嗦锐。您可以在本書上在線觀看講座視頻,以及在線全文沪曙。這本書極具挑戰(zhàn)性奕污,將淘汰一些可能通過其他方法成功的人。
方案:?如何設(shè)計程序(Felleisen等人)是一本有關(guān)如何以一種優(yōu)雅而實用的方式實際設(shè)計程序的最佳書籍之一液走。
Python:?Python編程:CS入門(Zelle)是使用Python的不錯的入門碳默。
Python:Python.org?上提供了一些在線教程。
Oz:?計算機編程的概念缘眶,技術(shù)和模型(Van Roy和Haridi)?被某些人視為Abelson&Sussman的現(xiàn)代繼任者腻窒。這是一門編程的大創(chuàng)意,涵蓋了比Abelson&Sussman更大的范圍磅崭,同時也許更易于閱讀和遵循儿子。它使用一種不太流行的語言O(shè)z,但它是學(xué)習其他語言的基礎(chǔ)砸喻。<
筆記
T. Capey指出柔逼,亞馬遜上的“完全解決問題”頁面現(xiàn)在在“購買此商品的客戶也購買了這些商品”部分下有“ 21天自學(xué)孟加拉語”和“自學(xué)語法和風格”書蒋譬。我猜想看那本書的人很大一部分來自此頁面。感謝Ross Cohen為希波克拉底提供的幫助愉适。
??????????翻譯
感謝以下作者犯助,該頁面的翻譯版本為:
(Mohamed A. Yahya)
(Boyko Bantchev)
(郭小剛)
(Tvrtko Bedekovic)
(Federico Gobbo)
(Etienne Beauchesne)
(Stefan Ram)
(埃里克·麥凱恩)
(Vikash Tiwari)
(馬頓·麥斯蒂安)
(Tridjito Santoso)
(Fabio Z.Tessitore)
(yomoyomo)
(Mehdi Asgari)
(Kuba Nowak)
(Augusto Radtke)
(?tefanLaz?r)
(Konstantin Ptitsyn)
(Lazar Kovacevic)
(Carlos Rueda)
(Jan Waclawek)
(?a??lUlu?ahin)
(Oleksii Molchanovskyi)