2021-01-20

十年內(nèi)自學編程

彼得·諾維格

為什么大家都這么著急?

走進任何一家書店前方,您將看到如何在24小時內(nèi)教會自己Java,以及提供在幾天或幾小時內(nèi)教授C廉油、SQL惠险、Ruby、算法等的無休止的變體抒线。亞馬遜高級搜索[標題:教學班巩,你自己,小時嘶炭,自2000年以來抱慌,發(fā)現(xiàn)512這樣的書。在前十名中眨猎,有九本是編程書(另一本是關(guān)于簿記的)抑进。類似的結(jié)果來自于將“自學”改為“學習”,或?qū)ⅰ靶r”替換為“天”睡陪。

結(jié)論是寺渗,要么人們急于學習編程,要么編程比其他任何東西都容易得多兰迫。費萊森等人在他們的“如何設計程序”(How To Design Program)一書中信殊,他們表示:“糟糕的編程很容易,白癡可以在21天內(nèi)學會它汁果,即使他們是假人涡拘。”這位狂暴的鵝漫畫也有自己的想法须鼎。

讓我們分析24小時內(nèi)自學C++這樣的標題可能意味著什么:

自學:在24小時內(nèi)鲸伴,你就沒有時間寫幾個重要的程序,從你的成功和失敗中吸取教訓晋控。您將沒有時間與有經(jīng)驗的程序員一起工作,并了解在C++環(huán)境中生活是什么感覺姓赤∩囊耄總之,你沒有時間學到很多東西不铆。因此蝌焚,這本書只能談論一種膚淺的熟悉裹唆,而不是一種深刻的理解。正如亞歷山大·波普所說只洒,一點點學習是一件危險的事情许帐。

C++:在24小時內(nèi),您可能可以學習C++的一些語法(如果您已經(jīng)知道另一種語言)毕谴,但您無法了解如何使用該語言成畦。簡單地說,如果你是一個基本程序員涝开,你可以學習用C++語法以Basic的方式編寫程序循帐,但是你不能知道C++實際上是好的(和壞的)什么。那有什么意義舀武?AlanPerlis曾經(jīng)說過:“一種不影響你對編程的思考方式的語言是不值得知道的”拄养。一個可能的問題是,您必須學習一點C++(或者更可能的是银舱,類似JavaScript或處理的東西)瘪匿,因為您需要與現(xiàn)有工具接口來完成特定的任務。但是你不是在學習如何編程寻馏,而是在學習如何完成這個任務棋弥。

在24小時內(nèi):不幸的是,這還不夠操软,正如下一節(jié)所示嘁锯。

十年內(nèi)自學編程

研究人員(Bloom(1985)、Bryan&Harter(1899年)聂薪、Hayes(1989)家乘、Simmon&Chase(1973))已經(jīng)證明,在包括國際象棋藏澳、音樂創(chuàng)作仁锯、電報運算、繪畫翔悠、鋼琴演奏业崖、游泳、網(wǎng)球以及神經(jīng)心理學和拓撲學研究在內(nèi)的任何廣泛領(lǐng)域蓄愁,都需要十年的時間才能發(fā)展出專門知識双炕。關(guān)鍵在于深思熟慮的練習:不只是一次又一次地去做,而是用一項超出你目前能力范圍的任務來挑戰(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·安德斯·愛立信教授所言:“在大多數(shù)領(lǐng)域甲雅,即使是最有才華的人也需要多少時間才能達到最高水平的業(yè)績解孙,這是非常了不起的。10,000小時的數(shù)字讓你感覺到抛人,我們說的是每周10到20小時弛姜,有些人會認為這些人是最有天賦的人,但他們?nèi)匀恍枰_到最高水平妖枚⊥⒕剩“

所以你想成為一名程序員

下面是我編程成功的秘訣:

對編程感興趣,并做一些绝页,因為它是有趣的荠商。一定要保持足夠的樂趣,這樣你就會愿意投入你的10年/10,000小時续誉。

節(jié)目莱没。最好的學習方式是邊做邊學。更嚴格地說酷鸦,“在某一領(lǐng)域饰躲,個人的最高業(yè)績水平并不是隨著經(jīng)驗的擴展而自動達到的,但即使是經(jīng)驗豐富的個人臼隔,也可以通過刻意改進而提高業(yè)績水平嘹裂。”(第366頁)和“最有效的學習需要一個明確的任務躬翁,適當?shù)碾y度水平焦蘑,為特定的個人,信息反饋盒发,并有機會重復和糾正錯誤例嘱。”(第20-21頁)“實踐中的認知:日常生活中的思想宁舰、數(shù)學和文化”是這一觀點的有趣參考拼卵。

與其他程序員交談;閱讀其他程序蛮艰。這比任何書籍或培訓課程都更重要腋腮。

如果你愿意,在一所大學(或更多的研究生院)待四年。這會讓你獲得一些需要資格證書的工作即寡,也會讓你對這個領(lǐng)域有更深入的了解徊哑,但如果你不喜歡上學,你可以(用一些奉獻精神)獨自或在工作中獲得類似的經(jīng)驗聪富。無論如何莺丑,光靠書本學習是不夠的《章“計算機科學教育不能使任何人成為專業(yè)程序員梢莽,就像研究畫筆和顏料可以使人成為專業(yè)畫家一樣”,“新黑客詞典”的作者埃里克·雷蒙德說奸披。我雇過的最好的程序員之一只有高中學位昏名,他制作了很多很棒的軟件,有自己的新聞組阵面,并且有足夠的股票期權(quán)來購買自己的夜總會轻局。

與其他程序員一起完成項目。在某些項目中做最好的程序員膜钓;在其他項目上做最差的程序員嗽交。當你是最好的,你可以測試你的能力來領(lǐng)導一個項目颂斜,并用你的遠見激勵別人夫壁。當你是最壞的時候,你學會了主人做什么沃疮,你學會了他們不喜歡做什么(因為他們讓你為他們做)盒让。

工作項目后,其他程序員司蔬。理解別人寫的程序邑茄。看看當原來的程序員不在的時候俊啼,需要什么才能理解和修復它肺缕。想一想如何設計你的程序,讓那些在你之后維護它們的人更容易授帕。

至少學習六種編程語言同木。包括一種強調(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個空間縮進水平。不管是哪種方式内狸,你都可以了解到其他人在一種語言中喜歡什么,他們有多深厘擂,也許還有一點是關(guān)于為什么他們會這樣想的昆淡。

有良好的判斷力,盡快擺脫語言標準化的努力刽严。

考慮到所有這些昂灵,僅僅通過書本學習,你能走多遠是值得懷疑的舞萄。在我的第一個孩子出生之前眨补,我讀了所有的書,仍然覺得自己是一個無知的新手倒脓。30個月后撑螺,當我的第二個孩子即將出生時,我是否又回到書本上復習了一下崎弃?沒有甘晤。相反,我依靠的是我個人的經(jīng)驗饲做,這比專家們寫的幾千頁更有用线婚,也更讓我放心。

弗雷德·布魯克斯(FredBrooks)在他的文章“沒有銀彈”中指出了一個尋找優(yōu)秀軟件設計師的三部分計劃:

系統(tǒng)地盡早確定頂級設計師盆均。

指派一位職業(yè)導師負責前景的發(fā)展塞弊,并仔細保存一份職業(yè)檔案。

為不斷成長的設計師提供互動和相互激勵的機會泪姨。

這假設有些人已經(jīng)具備了成為一名偉大設計師所必需的素質(zhì)游沿,其工作就是恰當?shù)匾龑麄儓猿窒氯ァ0瑐悺づ謇?AlanPerlis)更簡潔地說:“每個人都可以學會雕刻:米開朗基羅(Michelangelo)必須學會如何不去做驴娃,偉大的程序員也是如此奏候。”佩利斯說唇敞,偉大的球員有一些超越他們訓練的內(nèi)在素質(zhì)蔗草。但是質(zhì)量是從哪里來的呢咒彤?是天生的嗎?或者他們是通過勤奮來發(fā)展的呢咒精?正如奧古斯特·古斯托(Ratatouille中虛構(gòu)的廚師)所言:“任何人都能做飯镶柱,但只有無畏的人才能做得很好∧P穑”我認為它更多的是愿意把一個人一生中的大部分時間花在深思熟慮的實踐上歇拆。但也許無畏是總結(jié)這一點的一種方式》蹲桑或者故觅,正如古斯托的批評家安東·伊戈所說:“不是每個人都能成為偉大的藝術(shù)家,但偉大的藝術(shù)家可以來自任何地方渠啊∈淅簦”

因此,繼續(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)驗豐富的程序員組成轩端,他們關(guān)心代碼的運行時效率。因此逝变,這些語言具有為這些情況設計的復雜部分基茵。你關(guān)心的是學習編程奋构。你不需要那種并發(fā)癥。你想要一種語言耿导,它被設計成一個簡單易學的語言声怔,并被一個新的程序員記住。

玩舱呻。你更愿意學習彈鋼琴的哪一種方式:普通的醋火,交互式的,在你一按下鍵就聽到每個音符的方式箱吕,還是“分批”模式芥驳,只有在你唱完整首歌之后才能聽到音符?顯然茬高,交互模式使鋼琴和編程更容易學習兆旬。堅持一種互動的語言,并使用它怎栽。

考慮到這些標準丽猬,我對第一種編程語言的建議將是Python或Scheme。另一個選擇是Javascript熏瞄,并不是因為它為初學者設計得非常好脚祟,而是因為它有很多在線教程,比如Khan Academy的教程强饮。但你的情況可能會有所不同由桌,還有其他好的選擇。如果你的年齡是個位數(shù)邮丰,你可能更喜歡愛麗絲行您、斯奎克或布洛克里(年長的學習者也會喜歡這些)。重要的是你選擇并開始剪廉。

附錄:書籍和其他資源

有幾個人問他們應該從哪些書籍和網(wǎng)頁中學習娃循。我再說一遍,“光靠書本學習是不夠的”妈经,但我可以推薦以下幾點:

方案:計算機程序的結(jié)構(gòu)和解釋(Abelson&Sussman)可能是計算機科學的最佳入門淮野,它確實教授編程作為理解計算機科學的一種方式。你可以在這本書上看到講座的在線視頻吹泡,也可以在網(wǎng)上看到完整的文本骤星。這本書具有挑戰(zhàn)性,并將淘汰出一些可能通過另一種方法獲得成功的人爆哑。

方案:如何設計程序(Felleisen等人)是關(guān)于如何以優(yōu)雅和實用的方式實際設計程序的最好的書籍之一洞难。

Python:PythonProgramming:IntrotoCS(Zelle)是使用Python的一個很好的介紹。

Python:幾個在線教程可以在Python.org上找到揭朝。

奧茲:計算機編程的概念队贱、技術(shù)和模型(VanRoy&Haridi)被一些人視為現(xiàn)代阿貝爾森和蘇斯曼的繼承者色冀。它是一個關(guān)于編程的偉大思想的旅行,涵蓋的范圍比Abelson&Sussman更廣泛柱嫌,而且可能更容易閱讀和跟蹤锋恬。它使用的一種語言,Oz编丘,并不廣為人知与学,但作為學習其他語言的基礎(chǔ)。<

注記

T.Capey指出嘉抓,亞馬遜上的完整問題解決方案頁面現(xiàn)在有“21天內(nèi)教你自己孟加拉語”和“教你自己語法和風格”的書索守,在“為這個項目購物的顧客也在購買這些物品”部分下。我想看那本書的人中有很大一部分是從這一頁來的抑片。感謝羅斯·科恩幫助希波克拉底卵佛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市敞斋,隨后出現(xiàn)的幾起案子截汪,更是在濱河造成了極大的恐慌,老刑警劉巖植捎,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挫鸽,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸥跟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門盔沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來医咨,“玉大人,你說我怎么就攤上這事架诞∧饣矗” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵谴忧,是天一觀的道長很泊。 經(jīng)常有香客問我,道長沾谓,這世上最難降的妖魔是什么委造? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮均驶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己懒鉴,他們只是感情好,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布隶债。 她就那樣靜靜地躺著,像睡著了一般跑筝。 火紅的嫁衣襯著肌膚如雪死讹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天曲梗,我揣著相機與錄音赞警,去河邊找鬼。 笑死稀并,一個胖子當著我的面吹牛仅颇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碘举,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼忘瓦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了引颈?” 一聲冷哼從身側(cè)響起耕皮,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝙场,沒想到半個月后凌停,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡售滤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年罚拟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片完箩。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡赐俗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弊知,到底是詐尸還是另有隱情阻逮,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布秩彤,位于F島的核電站叔扼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漫雷。R本人自食惡果不足惜瓜富,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珊拼。 院中可真熱鬧食呻,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至干旧,卻和暖如春渠欺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椎眯。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工挠将, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人编整。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓舔稀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掌测。 傳聞我的和親對象是個殘疾皇子内贮,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 十年內(nèi)自學編程 彼得·諾維格 為什么大家都這么著急? 走進任何一家書店汞斧,您將看到如何在24小時內(nèi)教會自己Java夜郁,...
    見背閱讀 130評論 0 1
  • 十年內(nèi)自學編程 彼得·諾維格 為什么大家都這么著急? 走進任何一家書店粘勒,您將看到如何在24小時內(nèi)教會自己Java竞端,...
    Chinawmj閱讀 333評論 0 0
  • 十年內(nèi)自學編程 彼得·諾維格 為什么大家都這么著急? 走進任何一家書店庙睡,您將看到如何在24小時內(nèi)教會自己Java事富,...
    張小龍_aba0閱讀 87評論 0 1
  • 為什么大家都這么著急? 走進任何一家書店乘陪,您將看到如何在24小時內(nèi)教會自己Java赵颅,以及提供在幾天或幾小時內(nèi)教授C...
    康嘉富閱讀 299評論 0 1
  • 彼得·諾維格 為什么大家都這么著急? 走進任何一家書店暂刘,您將了解如何在 24 小時內(nèi)自學 Java,同時在幾天或幾...
    longlongKing閱讀 169評論 0 0