十年自學編程
Peter Norvig
為什么大家都這么著急?
走進任何一家書店概行,你就會知道怎么做24小時自學爪哇除了無止境的變化之外瓣颅,還提供在幾天或幾小時內教授C、SQL唬涧、Ruby疫赎、算法等。亞馬遜高級搜索[標題:自學爵卒,自學虚缎,學時,自2000年起找到了512本這樣的書钓株。在前十名中,有九本是編程書籍(另一本是關于簿記)陌僵。類似的結果來自于用“學習”代替“自學”轴合,或者用“天”代替“小時”
結論是,要么人們急于學習編程碗短,要么編程比其他任何東西都容易得多受葛。費雷森等等在他們的書中對這種趨勢表示贊同如何設計程序,當他們說“糟糕的編程很容易偎谁。白癡可以在21天即使他們是假人“《阿不勒斯鵝》漫畫也有他們的看法?.
我們來分析一下標題是什么樣的24小時自學C可能意味著:
自學:在24小時內总滩,你將沒有時間編寫幾個重要的程序,并從成功和失敗中吸取教訓巡雨。你沒有時間和有經驗的程序員一起工作闰渔,也沒有時間去理解生活在C環(huán)境中的感覺。簡言之铐望,你沒有時間去學習冈涧。所以這本書只能說是一種表面的熟悉茂附,而不是深刻的理解。正如亞歷山大·波普所說督弓,一點點學習是危險的营曼。
C:在24小時內,你也許能學會一些of c的語法(如果你已經知道另一種語言的話)愚隧,但你卻無法學到很多關于如何使用這種語言的知識。簡而言之狂塘,如果你是一個基礎程序員录煤,你可以學習用C語法以basic的風格編寫程序,但是你不能學習C實際上的優(yōu)點(和缺點)睹耐。那么有什么意義呢辐赞?AlanPerlis曾經說過:“一種不影響你思考編程方式的語言是不值得知道的”。一個可能的觀點是你必須學習一點C語言(或者更可能是JavaScript或處理之類的東西)硝训,因為你需要與一個現(xiàn)有的工具交互來完成特定的任務响委。但你并不是在學習如何編程,而是在學習如何完成這項任務窖梁。
24小時內:不幸的是赘风,這還不夠,正如下一節(jié)所示纵刘。
十年自學編程
研究人員(布魯姆(1985)?,Bryan & Harter (1899)?,海斯(1989)?,西蒙蔡斯(1973))已經證明了它需要十年的時間來發(fā)展在各個領域的專業(yè)知識邀窃,包括國際象棋、音樂創(chuàng)作假哎、電視廣播瞬捕、繪畫、鋼琴演奏舵抹、游泳肪虎、網球以及歐洲心理學和拓撲學的研究。關鍵是深思熟慮的練習:不只是一次又一次地做惧蛹,而是用一個超出你目前能力的任務來挑戰(zhàn)你自己扇救,嘗試它,分析你在做的時候和之后的表現(xiàn)香嗓,并改正任何錯誤迅腔。然后重復。再重復一遍靠娱。似乎有諾雷亞爾的捷徑:即使是莫扎特沧烈,他在4歲時是一個音樂天才,也比他開始創(chuàng)作世界級的音樂多了13年饱岸。在另一個流派中掺出,披頭士樂隊似乎是在1964年的埃德·沙利文秀上以1支流行歌曲的速度出現(xiàn)在現(xiàn)場徽千。但是他們從1957年開始就在利物浦和漢堡的小俱樂部打球,雖然他們很早就受到了大眾的歡迎汤锨,但他們的第一次重大成功双抽,辣椒中士,于1967年被釋放闲礼。
MalcolmGladwell盡管他專注于10000個小時牍汹,而不是10年。Henri Cartier-Bresson(1908-2004)有另一個衡量標準:“你的前10000張照片是你最差的柬泽∩鞣疲”(他沒有想到數碼相機,真正的專業(yè)知識可能需要一輩子的時間:塞繆爾·約翰遜(Samuel Johnson锨并,1709-1784)曾說:“任何部門的卓越都只能靠一生的勞動來獲得露该,而不是以較低的價格買到的〉谥螅”喬叟(1340-1400)抱怨道:“l(fā)yf太短了解幼,希波克拉底(約公元前400年)因節(jié)選“ars longa,vita brevis”而聞名包警,這是較長引語“ars longa撵摆,vita brevis,occasio praeceps害晦,experitum periculosum特铝,iudiciumdifficile”的一部分,在英語中是“生命是短暫的壹瘟,[the]craftlong鲫剿,機會轉瞬即逝,實驗充滿危險稻轨,很難判斷牵素。”當然澄者,沒有一個數字可以作為最終答案:假設所有技能(例如編程、下棋请琳、下棋和玩音樂)都需要完全相同的時間來掌握粱挡,也不認為所有人都需要完全相同的時間來掌握。作為教授俄精。K询筏、 安德斯·愛立信他說:“在大多數領域,即使是最優(yōu)秀的個人也需要多少時間才能達到最高水平的績效竖慧,這一點是值得注意的嫌套。1萬小時的數字讓你感覺到逆屡,我們說的是一周10到20個小時的工作時間,有些人會說踱讨,那些天生最有才華的人魏蔗,仍然需要達到最高水平”陨福”
所以你想成為一名程序員
以下是我編程成功的秘訣:
得到感興趣的在編程方面莺治,做一些因為它很有趣。一定要讓它保持足夠的樂趣帚稠,這樣你才會愿意投入你的10年/10000小時谣旁。
程序. 最好的學習方式是learningby doing. 從技術上講,“個人在某一特定領域的最高績效水平并不是作為經驗擴展的函數自動實現(xiàn)的滋早,但是即使是經驗豐富的個人榄审,通過深思熟慮的努力,績效水平也可以提高杆麸「榻”(第366頁)“最有效的學習需要一個明確的任務,對特定的個體有適當的難度角溃,信息反饋拷获,以及重復和糾正錯誤的機會〖跸福”(p.20-21)實踐中的認知:日常生活中的思維匆瓜、數學與文化是這個觀點的一個有趣的參考。
與…交談其他程序員未蝌;閱讀其他程序驮吱。這比任何書籍或培訓課程都重要。
如果你愿意的話萧吠,在一個學院(在農業(yè)學凶蠖或更多)。這會讓你接觸到一些需要進修的工作纸型,也會讓你對這個領域有更深入的了解拇砰,但如果你不喜歡上學,你可以(帶著一些奉獻精神)在自己或工作中獲得類似的經驗狰腌。無論如何除破,光靠書本學習是不夠的∏砬唬”計算機科學教育不能使任何人成為專業(yè)程序員瑰枫,正如學習畫筆和顏料可以使某人成為專家畫家一樣新黑客詞典. 我雇過的最好的程序員之一只有高中學歷,他已經做了很多工作偉大的軟件丹莲,有他自己的新聞組他賺了足夠的股票期權來買自己的夜總會?.
從事項目其他程序員光坝。在某些項目上做最好的程序員尸诽;在其他項目上做最差的。當你是最好的盯另,你可以測試你的能力性含,領導一個項目,并用你的遠見激勵別人土铺。當你是最差的時候胶滋,你會知道他們做什么,你也會知道他們不喜歡做什么(因為他們讓你為他們做)悲敷。
從事項目之后其他程序員究恤。理解別人寫的程序『蟮拢看看需要什么才能理解并在最初的程序員不在的時候修復它部宿。想想如何設計你的程序,讓那些在你之后維護它們的人更容易瓢湃。
至少學半打程序設計語言. 包括一種強調類抽象的語言(如Java或C)理张,一種強調功能抽象的語言(如Lisp或ML或Haskell),一種支持語法抽象(如Lisp)绵患,一種支持聲明性規(guī)范(如Prolog或C模板)雾叭,以及一種強調并行性的語言(如Clojure或Go)。
記住有一個“計算機在“計算機科學”落蝙。知道您的計算機執(zhí)行一條指令织狐、從內存中獲取一個字(有或沒有緩存未命中)、從磁盤讀取連續(xù)的字以及在磁盤上尋找新位置所需的時間筏勒。(答案在這里?)
學習一門語言標準化努力移迫。它可以是ANSI C委員會,也可以是決定您的本地編碼風格是否有2或4個空格縮進級別管行。無論哪種方式厨埋,你都能了解到其他人喜歡哪種語言,他們的感受有多深捐顷,甚至可能了解他們?yōu)槭裁催@么想荡陷。
有理智下車語言標準化工作盡快進行。
考慮到這些迅涮,你能從書本上學到什么還值得懷疑亲善。在我第一個孩子出生之前,我讀了HowTo書,還是覺得自己是個無知的新手坎藐。30個月后蝇完,當我的第二個孩子出生的時候剿吻,我有沒有為了更新鮮的東西而回去讀書驯遇?沒有涤躲。相反县遣,我依靠的是我的個人經驗旷祸,這比專家寫的幾千頁對我更有用耕拷,更讓我安心。
弗雷德·布魯克斯托享,在他的文章里沒有銀彈確定了尋找優(yōu)秀軟件設計師的三部分計劃:
盡早系統(tǒng)地確定頂尖設計師骚烧。
指派一位職業(yè)導師負責潛在客戶的發(fā)展,并認真保存職業(yè)檔案闰围。
為成長中的設計師提供互動和激勵的機會赃绊。
這是假設有些人已經具備了成為一個偉大的設計師所必需的素質;工作就是適當地說服他們羡榴。AlanPerlis更簡潔地說:“每個人都可以被教導去雕塑:米開朗基羅本應該被教導如何不去雕塑碧查。偉大的程序員也是如此。佩利斯說校仑,偉大的球員有一些超越訓練的內在品質忠售。但質量從何而來?是天生的嗎迄沫?或者他們是通過智力發(fā)展出來的稻扬?就像奧古斯特·古斯特(奧古斯特·古斯托)臘腸)“任何人都會做飯,但只有無畏的人才是偉大的羊瘩√┘眩”我認為這更像是愿意把自己一生的大部分時間投入到深思熟慮的實踐中。但也許吧無所畏懼是一種總結困后。正如古斯特所說:“不管是誰乐纸,也不是每個人都可以成為偉大的批評家∫∮瑁”
所以去買那本Java/Ruby/Javascript/PHP書吧汽绢;你可能會從中得到一些有用的東西。但你不會在24小時或21天內改變你的生活侧戴,也不會改變你作為一個程序員真正的整體專業(yè)知識宁昭。在24個月內努力工作以持續(xù)改進怎么樣?好吧酗宋,現(xiàn)在你開始有所進展了积仗。。蜕猫。
工具書類
布魯姆寂曹,本杰明(編輯)培養(yǎng)青年人才,百齡壇,1985年隆圆。
布魯克斯漱挚,弗雷德,沒有銀彈, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Bryan渺氧,W.L.&Harter旨涝,N.,《電報語言研究:習慣等級的習得》侣背。心理學評論?,1899, 8, 345-375
海斯白华,約翰·R。贩耐,完成問題解決者Lawrence Erlbaum, 1989.
Chase, William G. & Simon, Herbert A.“象棋中的知覺”認知心理學?, 1973, 4, 55-81.
Lave, Jean,實踐中的認知:日常生活中的思維弧腥、數學與文化,劍橋大學出版社憔杨,1988年鸟赫。
答案典型PC上各種操作的大致時間:
執(zhí)行典型指令1/1,000,000,000 sec = 1 nanosec
從一級緩存內存提取0.5 nanosec
分支誤預測5 nanosec
從二級緩存內存提取7 nanosec
互斥鎖/解鎖25 nanosec
從主存取出100 nanosec
通過1Gbps網絡發(fā)送2K字節(jié)20,000 nanosec
從內存中按順序讀取1MB250,000 nanosec
從新磁盤位置獲取(seek)8,000,000 nanosec
從1MB磁盤順序讀取20,000,000 nanosec
把包裹寄到歐洲再寄回來150 milliseconds = 150,000,000 nanosec
附錄:語言選擇
有幾個人問他們應該先學什么編程語言消别。沒有一個答案抛蚤,但請考慮以下幾點:
利用你的朋友. 當被問到“我應該使用什么操作系統(tǒng),Windows寻狂、Unix還是Mac岁经?”,我的回答通常是:“使用你朋友使用的任何東西蛇券∽喝溃”從朋友那里學習所獲得的好處將抵消操作系統(tǒng)之間或編程語言之間的任何內在差異。還要考慮你未來的朋友:如果你繼續(xù)下去纠亚,你將成為程序員社區(qū)的一部分塘慕。你所選擇的語言是有一個正在成長的大社區(qū)還是一個正在消亡的小社區(qū)?有沒有書籍蒂胞、網站和在線論壇可以得到答案图呢?你喜歡那些論壇里的人嗎?
保持簡單. 這些語言的開發(fā)都是為了提高程序員的效率而設計的骗随。你不需要復雜的語言蛤织,你需要的是一個新程序員設計的易于學習和記憶的語言。
玩吧你更愿意用哪種方式來學習彈鋼琴:一種正常的鸿染、互動的方式指蚜,即你一按一個鍵就聽到每一個音符绽媒,或是“批處理”模式掸刊,即只在你完成一整首歌之后才聽到音符?顯然,交互模式使學習鋼琴和編程更容易。堅持一種具有互動模式的語言并加以運用驯击。
考慮到這些標準广辰,我對第一種編程語言的建議是蟒蛇或方案. 另一個選擇是Javascript,這并不是因為它非常適合初學者,而是因為有很多關于它的在線教程,比如可汗學院教程。但你的情況可能會有所不同,還有其他好的選擇。如果你的年齡是個位數,你可能更喜歡愛麗絲或吱吱聲或塊狀的(年長的學習者可能也喜歡這些)蕊程。重要的是你選擇并開始。
附錄:書籍和其他資源
有幾個人問他們應該從哪些書籍和網頁上學習辨赐。我重申“光靠書本學習是不夠的”优俘,但我可以推薦以下幾點:
方案:計算機程序的結構和解釋(Abelson&Sussman)它無疑是計算機科學的最好的入門課程,它把編程作為理解計算機科學的一種方式肖油。你可以看到講座在線視頻在這本書上兼吓,以及在線全文. 這本書很有挑戰(zhàn)性,它將淘汰一些也許可以用另一種方法成功的人森枪。
方案:How toDesign Programs (Felleisen等等?)是一本關于如何以優(yōu)雅而實用的方式設計程序的最好的書之一视搏。
蟒蛇:Python編程:CS簡介(Zelle)是使用Python的一個很好的介紹。
蟒蛇:Severalonline教程可在Python.org網站?.
Oz:計算機程序設計的概念县袱、技術和模型(范羅伊和哈里迪)is seen by some as the modern-day successor to Abelson & Sussman.It is a tour through the big ideas of programming, covering a widerrange than Abelson & Sussman while being perhaps easier to read andfollow. It uses a language, Oz, that is not widely known but serves asa basis for learning other languages.<
筆記