作者:彼得·諾維格
為什么大家都這么著急?
走進任何一家書店吓歇,你就會看到教自己Java24小時內除了提供無窮無盡的變體來教C,幾天或幾個小時內票腰,SQL城看、Ruby、算法等等丧慈。亞馬遜高級搜索標題:教書析命,你自己,小時數逃默,自2000年起找到512本這樣的書鹃愤。在前十名中,有九本是編程書(另一本是關于簿記的)完域。類似的結果來自于將“自學”改為“學習”软吐,或將“小時”替換為“天”。
結論是吟税,這兩個人中的任何一個人都急于學習凹耙。關于編程,或者說編程在某種程度上更容易學習比其他任何東西都重要肠仪。費萊森等人他們在書中對這一趨勢表示贊同肖抱。如何設計程序,當他們說“糟糕的編程很容易异旧。白癡可以在21天意述,即使他們是假人“瘋狂的鵝漫畫也有他們的觀點.
讓我們分析一下標題是什么樣子的24小時內自學C++可能意味著:
自學:再過24小時,你就沒有時間寫幾篇了重要的程序吮蛹,并從您的成功和失敗中學習他們荤崇。你沒有時間和一個有經驗的程序員一起工作了解在C++環(huán)境中生活是什么感覺〕闭耄總之术荤,你不會有時間學到很多東西。所以這本書只能說膚淺的熟悉每篷,不是深刻的理解瓣戚。正如亞歷山大·波普所說端圈,小小的學習是一件危險的事情。
C++:在24小時內带兜,您就可以學習到C++(如果你已經知道另一種語言)枫笛,但你不能學習更多關于如何使用這種語言的知識「照眨總之,如果你是喧兄,比如說无畔,基本程序員,您可以學習用基本使用C++語法吠冤,但你無法了解C++是什么實際上是好的(也有壞的)浑彰。那有什么意義?阿蘭佩利斯曾經說過:“一種不影響你的方式的語言想一想編程是不值得知道的“拯辙。你必須學習一點C++(或者更有可能郭变,(比如JavaScript或處理),因為您需要與完成特定任務的現有工具涯保。但你不是學習如何編程诉濒,你正在學習如何完成這一任務。
在24小時內:不幸的是夕春,這還不夠未荒,因為部分顯示。
十年內自學編程
研究人員(布盧姆(1985年), 布賴恩和哈特(1899年), 海耶斯(1989年), Simmon&Chase(1973年))已經顯示出來了要花大約十年的時間及志,才能在各種不同的領域中發(fā)展出專門知識片排。領域,包括下棋速侈,音樂創(chuàng)作率寡,電報。操作倚搬,繪畫冶共,鋼琴演奏,游泳潭枣,網球和研究神經心理學和拓撲學比默。關鍵是審議練習:不只是一次又一次地做,但是挑戰(zhàn)自己一項超出你目前能力范圍的任務盆犁,分析你在做的時候和之后的表現命咐,并改正。任何錯誤谐岁。那就重復一遍醋奠。再重復一遍榛臼。似乎沒有真正的捷徑:即使是莫扎特,他在4歲時是一個音樂天才窜司,采取了13年后沛善,他開始創(chuàng)作世界級的音樂。在……里面另一種類型塞祈,披頭士樂隊似乎以一種在1964年的埃德·沙利文秀上出現了一系列的第一樂章金刁。但從那時起,他們就一直在利物浦和漢堡打小俱樂部议薪。1957年尤蛮,雖然他們很早就有了群眾訴求,但他們的第一次偉大關鍵的成功斯议,胡椒中士于1967年獲釋产捞。
馬爾科姆格拉德威爾雖然他專注于10,000小時,而不是10年哼御,但他推廣了這一理念坯临。HenriCartier-Bresson(1908-2004)有另一個指標:“你的前10,000張照片是你最差的×抵纾”(他沒有預計使用數碼相機看靠,一些人可以在一周內達到這一目標。)真正的專門知識可能需要一輩子:塞繆爾約翰遜(1709-1784)說過:“任何部門都可以做到卓越焰雕。只有畢生的勞動才能獲得衷笋;不能在喬叟(1340-1400)抱怨道:“這艘船太短了【仄ǎ”“希波克拉底”(公元前400年)以摘錄“阿爾斯·隆加”而聞名辟宗,“Vita brevis”,這是較長的引文“Ars Longa吝秕,vita”的一部分短肢泊脐、偶爾頭肌、周圍神經實驗“艱難”烁峭,在英語中被描繪成“生命是短暫的容客,[技術]”長時間,機會轉瞬即逝约郁,實驗變幻莫測缩挑,判斷力困難△廾罚“當然供置,沒有一個數字是最終的答案:這似乎不合理。假設所有技能(例如編程绽快、下棋芥丧、跳棋和音樂演奏)所有的人都需要完全相同的時間去掌握紧阔,也不可能所有的人會花同樣的時間。如羅氏K.安德斯·愛立信他說:“在大多數領域续担,即使是最多的時間擅耽,也有多少時間是值得注意的。有才能的人需要達到最高的績效水平物遇。10,000小時的數字讓你感覺到乖仇,我們說的是每周10到20小時,有些人會認為這些人是最有天賦的人询兴,但他們仍然需要達到最高水平这敬。“
所以你想成為一名程序員
下面是我編程成功的秘訣:
到達感興趣在編程中蕉朵,并做一些,因為它是有趣的阳掐。確保它一直是足夠的樂趣始衅,所以你會愿意投入你的十年/10,000小時。
程序缭保。最好的學習方式是學習通過做汛闸。更嚴格地說,“未達到給定域中個人的性能艺骂。自動作為一個功能擴展的經驗诸老,但水平即使是經驗豐富的個人,績效也可以提高钳恕。這是有意改進的結果别伏。“(p.366)“最有效的學習需要一個定義明確的任務特定個人的適當難度忧额,信息反饋以及重復和糾正的機會“(第20至21頁)這本書 實踐中的認知:思想厘肮、數學與日常文化生命很有趣這一觀點的參考。
與人交談其他程序員睦番;閱讀其他程序类茂。這更重要比任何一本書或培訓課程都要好。
如果你愿意托嚣,把四年學院(或更多在研究生院)巩检。這將使您能夠獲得一些需要的工作。證書示启,它會讓你更深入地了解這個領域兢哭,但是如果你不喜歡上學,你可以(用一些奉獻精神)得到類似的經驗丑搔,你自己或在工作中厦瓢。無論如何廊谓,單靠書本學習是不可能的夠了〔埔欤“計算機科學教育不能使任何人成為專家观腊。程序員就像學習畫筆和顏料一樣作者埃里克·雷蒙德(Eric Raymond)說。新黑客詞典浙垫。我雇的最好的程序員之一只有高中學位刨仑,他產生了很多太棒了 軟件,有他自己的新聞組夹姥,并有足夠的股票期權購買他自己的股票杉武。夜總會.
研究項目其他程序員。做最好的程序員在某些項目上辙售;在另一些項目上最差轻抱。當你是最好的,你可以測試你領導一個項目的能力旦部,以及激勵你的能力祈搜。其他和你有遠見的人。當你是最壞的時候士八,你會學到大師們這樣做容燕,而你卻學到了他們不喜歡做的事情(因為他們讓你為他們做這件事)。
研究項目后其他程序員婚度。理解別人寫的程序蘸秘。看看要做什么當最初的程序員不是四處轉轉蝗茁〈茁玻考慮如何設計程序,使其更容易那些在你身后維護他們的人评甜。
至少學半打編程語言灰粮。包括一個強調類抽象的語言(如Java或C++)強調函數抽象(如Lisp、ML或Haskell)忍坷,支持語法抽象(比如Lisp)支持聲明性規(guī)范(如Prolog或C++)粘舟。),以及強調并行性的人(如Clojure或Go)佩研。
請記住柑肴,有一個“電腦在“計算機科學”中。知道嗎旬薯?您的計算機執(zhí)行指令所需的時間晰骑,獲取內存中的單詞(有或沒有緩存錯誤),從磁盤讀取連續(xù)單詞,并尋求磁盤上的新位置硕舆。(答案在這里秽荞。)
卷入一種語言標準化努力「Ч伲可能是ANSI C++委員會扬跋,或者可能決定您的本地編碼樣式是否有2或4個空格。壓痕水平不管是哪種方式凌节,你都會了解到其他人就像在一種語言中钦听,他們有多深的感覺,甚至一點點倍奢。他們?yōu)槭裁催@么覺得朴上。
有很好的判斷力下語言標準化工作越快越好。
考慮到這一切卒煞,你能走多遠就成問題了讀書學習痪宰。在我的第一個孩子出生之前,我讀了所有的多么到還覺得自己是個無知的新手畔裕。30個月后酵镜,當我的第二個孩子出生時,我是否回到書本上復習柴钻?沒有。相反垢粮,我依靠我的個人經驗被證明是更有用和更令人安心的給我的比成千上萬頁寫的專家贴届。
弗雷德·布魯克斯,在他的文章中沒有銀彈確定了一個發(fā)現偉大的三部分計劃軟件設計者:
系統(tǒng)地盡早確定頂級設計師蜡吧。
指派一位職業(yè)導師負責前景的發(fā)展毫蚓,并仔細保存一份職業(yè)檔案。
為不斷成長的設計師提供互動和相互激勵的機會昔善。
這假設有些人已經具備了必要的素質元潘。做一個偉大的設計師;工作是適當地哄他們君仆。阿蘭佩利斯更簡潔地說:“每個人都可以學會雕刻:米開朗基羅必須學會如何不去做翩概。也是如此“偉大的程序員”。佩利斯說返咱,偉大的人有一些超越訓練的內在品質钥庇。但是在哪里質量來自于?是天生的嗎咖摹?或者他們是通過勤奮评姨?作為奧古斯特·古斯托(小說中的廚師)拉塔托維爾)說:“任何人都會做飯,但只有無畏的人才會做飯萤晴⊥戮洌“我認為這更像是愿意奉獻一大筆錢胁后。一生中的一部分用于深思熟慮的實踐。但也許無畏是總結這一點的一種方式嗦枢∨市荆或者,作為古斯托的批評家净宵,安東·伊戈說:“不是每個人都能成為偉大的藝術家敲才,而是一個偉大的藝術家。藝術家可以來自任何地方择葡〗粑洌“
因此,繼續(xù)購買Java/Ruby/Javascript/PHP書籍敏储;您將可能會從中得到一些利用阻星。但你不會改變你的生活,或者在24小時或21天內已添,作為一名程序員妥箕,你真正的專業(yè)知識。在過去的24個月里更舞,努力工作畦幢,不斷提高,怎么樣缆蝉?現在你開始有進展了..宇葱。
參考文獻
布盧姆,本杰明(編輯)培養(yǎng)青年人才刊头,巴蘭汀黍瞧,1985年。
布魯克斯弗雷德沒有銀子彈原杂,IEEE Computer印颤,第20卷,第4號穿肄,1987年年局,第10-19頁。
Bryan咸产,W.L.&Harter某宪,N.“電報語言研究:養(yǎng)成一種習慣的等級。心理學評論, 1899, 8, 345-375
海斯锐朴,約翰·R.完全問題求解器Lawrence Erlbaum兴喂,1989年。
放大圖片作者:William G.&Simon,Herbert A.“國際象棋中的知覺” 認知心理學, 1973, 4, 55-81.
拉維簡實踐中的認知:思想衣迷、數學與日常文化生命畏鼓,劍橋大學出版社,1988年壶谒。
答案
典型PC上各種操作的大致時間:
執(zhí)行典型指令 1/1 000 000 000秒=1納塞克
從L1高速緩存存儲器中提取 0.5納米
分支誤判 5納米級
從L2緩存存儲器中提取 7納米
互斥鎖/解鎖 25納米
從主記憶 100納米
在1 Gbps網絡上發(fā)送2K字節(jié) 20 000納塞克
從內存中順序讀取1MB 25萬納塞克
從新磁盤位置獲取(查找) 8,000,000納塞c
從磁盤順序讀取1MB 20,000,000納塞c
把美國包裹寄回歐洲 150毫秒=150 000 000納塞克
附錄:語言選擇
有幾個人問他們應該先學哪種編程語言云矫。沒有一個答案,但請考慮以下幾點:
利用你的朋友汗菜。當被問到“什么操作系統(tǒng)應該我使用Windows让禀、Unix還是Mac?“陨界,我的回答通常是:”什么都用你的朋友說:“你從你的朋友那里學到的優(yōu)勢朋友將抵消操作系統(tǒng)之間的任何內在差異巡揍,或在編程語言之間。同時也要考慮你未來的朋友:您將成為程序員社區(qū)的一員菌瘪,如果您繼續(xù)腮敌。你所選擇的語言是否有一個不斷增長的群體?還是一個小的垂死的俏扩?有書籍糜工,網站和在線論壇嗎?才能得到答案录淡?你喜歡那些論壇上的人嗎捌木?
保持簡單。C++等編程語言的大型團隊為專業(yè)開發(fā)而設計的有經驗的程序員嫉戚,他們關心的是運行時的效率钮莲。他們的密碼。因此彼水,這些語言具有為這些情況設計的復雜部分。你關心的是學習編程极舔。你不需要那種并發(fā)癥凤覆。您需要一種設計為易于學習和記憶的語言。一個新程序員拆魏。
玩盯桦。你更愿意學習彈鋼琴嗎?正常的互動方式渤刃,你一按下鍵就能聽到每一個音符拥峦,還是“批處理”模式,只有在你唱完整首歌后才能聽到音符卖子?顯然略号,交互模式使鋼琴學習更容易,同時也使學習更容易。編程玄柠。堅持一種互動的語言突梦,并使用它。
考慮到這些標準羽利,我對第一次編程的建議語言Python或方案宫患。另一個選擇是Javascript,并不是因為它是為初學者設計的这弧,但是因為有那么多的在線教程娃闲,比如汗學院教程。但是你的情況可能會有所不同匾浪,還有其他好的選擇皇帮。如果你年齡是個位數,你可能更喜歡愛麗絲或吱吱聲或布洛克(年長的學習者也可能喜歡這些)户矢。重要問題是你選擇并開始玲献。
附錄:書籍和其他資源
有幾個人問他們應該學習哪些書籍和網頁?從…梯浪。我再說一遍捌年,“光靠書本學習是不夠的”,但我可以建議如下:
計劃: 結構和計算機程序的解釋(Abelson&Sussman)是也許是對計算機科學最好的介紹挂洛,而且確實如此礼预。教授編程作為理解計算機科學的一種方式。你可以看到網上講座錄像在這本書上虏劲,以及在線全文托酸。這本書是挑戰(zhàn)并將淘汰出一些可能是用另一種方法成功。
計劃: 如何設計程序(Felleisen)等人)是最好的書之一如何以優(yōu)雅和實用的方式設計程序柒巫。
Python: Python編程:CS簡介(Zelle)是一個很好的介紹使用Python励堡。
Python:幾個在線教程可在Python.org.
奧茲: 概念,計算機編程技術和模型(Van Roy&Haridi)被一些人視為現代阿伯爾森和蘇斯曼的繼承者堡掏。它是一次關于編程的偉大思想的旅行应结,涵蓋范圍更廣。比Abelson和Sussman更容易讀懂跟著泉唁。它使用的是一種語言鹅龄,Oz,它并不廣為人知亭畜,但它的作用是學習其他語言的基礎扮休。<
注記
T.Capey指出完全問題解決器亞馬遜的網頁現在有了“自己教自己”“21天里的孟加拉語”和“自學語法和風格”的書下購買這種商品的顧客也購買這些商品部分。我想很大一部分人看過這本書是從這一頁來的拴鸵。感謝羅斯·科恩幫助希波克拉底玷坠。