十年內(nèi)自學(xué)編程
彼得·諾維格
為什么大家都這么著急储笑?
走進(jìn)任何一家書店罗侯,您將了解如何在 24 小時(shí)內(nèi)自學(xué) Java完残,同時(shí)在幾天或幾小時(shí)內(nèi)提供無(wú)休止的變體來(lái)教授 C、SQL盗痒、Ruby蚂蕴、算法等。亞馬遜高級(jí)搜索 [標(biāo)題: 教, 你自己骡楼, 小時(shí)熔号, 自: 2000 年以來(lái), 并發(fā)現(xiàn)了 512 這樣的書鸟整。前十名中引镊,有九本是編程書籍(另一本是關(guān)于簿記的)。類似的結(jié)果來(lái)自將"自學(xué)"替換為"學(xué)習(xí)"或"小時(shí)"與"天"篮条。
結(jié)論是弟头,要么人們急于學(xué)習(xí)編程,要么編程比什么都容易學(xué)兑燥。Felleisen等人在《如何設(shè)計(jì)程序》一書中對(duì)這種趨勢(shì)點(diǎn)頭亮瓷,當(dāng)時(shí)他們說(shuō)"糟糕的編程很容易琴拧。白癡可以在21天內(nèi)學(xué)會(huì)降瞳,即使他們是假人。阿布特魯斯鵝漫畫也有他們采取蚓胸。
讓我們分析一下 24 小時(shí)內(nèi)"C++"標(biāo)題可能意味著什么:
教導(dǎo)自己:在24小時(shí)內(nèi)挣饥,你將沒有時(shí)間寫幾個(gè)重要的程序,并學(xué)習(xí)你的成功和失敗與他們沛膳。您沒有時(shí)間與經(jīng)驗(yàn)豐富的程序員合作扔枫,并了解生活在一個(gè)良好的環(huán)境中C++∏掳玻總之短荐,你將沒有時(shí)間學(xué)習(xí)太多。所以這本書只能說(shuō)是膚淺的熟悉叹哭,不能是深刻的理解忍宋。正如亞歷山大·波普說(shuō)的,一點(diǎn)學(xué)習(xí)是危險(xiǎn)的事情风罩。
C++:在24小時(shí)內(nèi)糠排,你也許能夠?qū)W習(xí)C++的一些語(yǔ)法(如果你已經(jīng)知道另一種語(yǔ)言),但你不能學(xué)到很多如何使用的語(yǔ)言超升。簡(jiǎn)言之入宦,如果你是一個(gè)基本程序員,你可以學(xué)會(huì)用C++語(yǔ)法編寫基本風(fēng)格的程序室琢,但是你不能學(xué)習(xí)C++實(shí)際上是好(和壞)什么乾闰。那有什么意義呢?艾倫·佩利斯曾經(jīng)說(shuō)過(guò):"一種不影響你編程方式的語(yǔ)言盈滴,不值得了解涯肩。一個(gè)可能的觀點(diǎn)是,你必須學(xué)習(xí)一點(diǎn)點(diǎn)C++(或者更可能,像JavaScript或處理)宽菜,因?yàn)槟阈枰c現(xiàn)有的工具接口來(lái)完成一個(gè)特定的任務(wù)谣膳。但是,你并沒有學(xué)習(xí)如何編程;你正在學(xué)習(xí)完成那個(gè)任務(wù)
在24小時(shí):不幸的是铅乡,這是不夠的继谚,如下一節(jié)顯示。
十年內(nèi)自學(xué)編程
研究人員(Bloom(1985年)阵幸、布萊恩和哈特(1899年)花履、海耶斯(1989年)、西蒙和蔡斯(1973年))表明挚赊,在象棋诡壁、音樂創(chuàng)作、電報(bào)操作荠割、繪畫妹卿、鋼琴演奏、游泳蔑鹦、網(wǎng)球以及神經(jīng)心理學(xué)和拓?fù)鋵W(xué)研究等許多領(lǐng)域夺克,大約需要10年時(shí)間。關(guān)鍵是審議實(shí)踐:不只是一次又一次地做嚎朽,而是用一個(gè)超出你當(dāng)前能力的任務(wù)來(lái)挑戰(zhàn)自己铺纽,嘗試一下,在做之后分析你的表現(xiàn)哟忍,并糾正任何錯(cuò)誤狡门。然后重復(fù)。再重復(fù)一遍似乎沒有真正的捷徑:即使是4歲時(shí)音樂神童的莫扎特锅很,也花了13年時(shí)間才開始創(chuàng)作世界級(jí)的音樂其馏。在另一種類型中,披頭士樂隊(duì)似乎以一連串的#1和1964年埃德·沙利文的時(shí)裝秀而登上舞臺(tái)粗蔚。但是他們自1957年以來(lái)一直在利物浦和漢堡打小俱樂部尝偎,雖然他們很早就有大眾的吸引力,但他們的第一次重大成功鹏控,佩珀斯中士致扯,在1967年被釋放。
馬爾科姆·格拉德威爾已經(jīng)推廣了這個(gè)想法当辐,盡管他專注于10抖僵,000小時(shí),而不是10年缘揪。亨利·卡蒂埃-布雷森(1908-2004)還有另一個(gè)指標(biāo):"你的前10耍群,000張照片是你們最差的义桂。"(他沒想到,使用數(shù)碼相機(jī)蹈垢,有些人可以在一個(gè)星期內(nèi)達(dá)到這個(gè)目標(biāo)慷吊。真正的專業(yè)知識(shí)可能需要一生的時(shí)間:塞繆爾·約翰遜(Samuel Johnson,1709-1784)說(shuō):"任何部門都只有一生的勞動(dòng)才能取得卓越成就;它不應(yīng)該以較低的價(jià)格購(gòu)買曹抬。喬瑟 (1340 - 1400) 抱怨道: "萊夫這么短溉瓶, 工藝這么久, 對(duì)勒恩來(lái)說(shuō)谤民。Hippocrates (c. 400BC) 以摘錄 "ars longa堰酿, vita brevis" 而廣為人知, 這是較長(zhǎng)語(yǔ)錄 "阿爾斯 · 朗加张足, 維塔 · 布雷維斯触创, 偶爾練習(xí), 實(shí)驗(yàn)腹膜为牍, 膽汁困難" 的一部分哼绑, 在英語(yǔ)中渲染為 "生命是短暫的, [the] 工藝長(zhǎng)吵聪, 機(jī)會(huì)轉(zhuǎn)瞬即逝凌那, 實(shí)驗(yàn)背信棄義, 判斷困難" 吟逝。當(dāng)然,沒有一個(gè)數(shù)字可以是最終的答案:似乎不合理地假設(shè)所有技能(如編程赦肋、棋牌块攒、跳棋和音樂演奏)都需要完全相同的時(shí)間來(lái)掌握,也不認(rèn)為所有人都需要完全相同的時(shí)間佃乘。正如安德斯·愛立信教授所說(shuō)囱井,"在大多數(shù)領(lǐng)域,即使是最有才華的個(gè)人也需要多少時(shí)間才能達(dá)到最高水平趣避,這一點(diǎn)令人矚目庞呕。10,000 小時(shí)的數(shù)字只是讓您感覺到程帕,我們談?wù)摰氖敲恐?10 到 20 小時(shí)住练,有些人會(huì)認(rèn)為這些人是天生的天才人才,仍然需要達(dá)到最高水平愁拭。
所以你想成為一名程序員
以下是我的編程成功秘訣:
對(duì)編程感興趣讲逛,并做一些,因?yàn)樗苡腥ち氩骸4_保它一直足夠有趣盏混,這樣你才愿意投入你的十年/10蔚鸥,000小時(shí)。
程序许赃。最好的學(xué)習(xí)就是通過(guò)做學(xué)習(xí)止喷。更技術(shù)上說(shuō),"給定領(lǐng)域中個(gè)人的最高績(jī)效水平不是作為擴(kuò)展經(jīng)驗(yàn)的函數(shù)自動(dòng)實(shí)現(xiàn)的混聊,但即使經(jīng)驗(yàn)豐富的個(gè)人启盛,由于經(jīng)過(guò)深思熟慮,可以提高績(jī)效水平技羔。羅夫僵闯。(第366)和"最有效的學(xué)習(xí)需要一個(gè)明確界定的任務(wù),對(duì)于特定的個(gè)人藤滥,信息豐富的反饋鳖粟,以及重復(fù)和糾正錯(cuò)誤的機(jī)會(huì),具有適當(dāng)?shù)碾y度級(jí)別拙绊。(第20-21號(hào))《實(shí)踐認(rèn)知:日常生活中的思維向图、數(shù)學(xué)和文化》一書是這一觀點(diǎn)的有趣參考。
與其他程序員交談;閱讀其他程序标沪。這一點(diǎn)比任何書籍或培訓(xùn)課程都重要榄攀。
如果你想的話,在一所大學(xué)里工作四年(或者多在研究生院)金句。這將讓您訪問(wèn)一些需要證書的工作檩赢,并讓您更深入地了解該領(lǐng)域,但如果您不喜歡學(xué)校违寞,您可以(有一些奉獻(xiàn)精神)獲得類似的經(jīng)驗(yàn)贞瞒,自己或工作。無(wú)論如何趁曼,單靠書本學(xué)習(xí)是不夠的军浆。《新黑客詞典》的作者埃里克·雷蒙德(Eric Raymond)說(shuō):"計(jì)算機(jī)科學(xué)教育不能讓任何人成為專家程序員挡闰,更不能讓任何人成為專家程序員乒融,更不能讓任何人成為專家畫家。我雇傭過(guò)的最好的程序員之一只有高中學(xué)位;他制作了很多偉大的軟件摄悯, 有自己的新聞集團(tuán)赞季, 并做了足夠的股票期權(quán), 以購(gòu)買自己的夜總會(huì)射众。
與其他程序員一起處理項(xiàng)目碟摆。成為某些項(xiàng)目的最佳程序員;是其他人最差的。當(dāng)你是最好的叨橱,你可以測(cè)試你的能力典蜕,領(lǐng)導(dǎo)一個(gè)項(xiàng)目断盛,并激勵(lì)別人與你的遠(yuǎn)見。當(dāng)你是最差的時(shí)候愉舔,你學(xué)習(xí)主人做什么钢猛,你學(xué)習(xí)他們不喜歡做什么(因?yàn)樗麄冏屇銥樗麄冏觯?/p>
在其他程序員之后處理項(xiàng)目。了解其他人編寫的程序轩缤∶酰看看當(dāng)原始程序員不在的時(shí)候,需要什么來(lái)理解和修復(fù)它火的『撸考慮如何設(shè)計(jì)程序,使那些在您之后維護(hù)程序的人更容易馏鹤。
學(xué)習(xí)至少六種編程語(yǔ)言征椒。包括一種強(qiáng)調(diào)類抽象的語(yǔ)言(如Java或C++)、一種強(qiáng)調(diào)函數(shù)抽象的語(yǔ)言(如Lisp或ML或哈斯克爾)湃累、一種支持句法抽象的語(yǔ)言(如Lisp)勃救、一種支持聲明性規(guī)范(如Prolog或C++模板)的語(yǔ)言,以及一種強(qiáng)調(diào)并行性的語(yǔ)言(如Cljure或 Go)治力。
請(qǐng)記住蒙秒,"計(jì)算機(jī)科學(xué)"中存在"計(jì)算機(jī)"。了解計(jì)算機(jī)執(zhí)行指令宵统、從內(nèi)存中獲取單詞(有和沒有緩存錯(cuò)過(guò))晕讲、從磁盤讀取連續(xù)單詞以及查找磁盤上的新位置需要多長(zhǎng)時(shí)間。(答案在這里榜田。
參與語(yǔ)言標(biāo)準(zhǔn)化工作益兄。它可能是 ANSI C++,也可以決定您的本地編碼風(fēng)格是否具有 2 或 4 個(gè)空間縮進(jìn)級(jí)別箭券。無(wú)論哪種方式,你都了解別人喜歡的語(yǔ)言疑枯,他們感覺有多深辩块,甚至一點(diǎn)點(diǎn)關(guān)于他們?yōu)槭裁催@樣的感覺。
有好感荆永,盡快擺脫語(yǔ)言標(biāo)準(zhǔn)化工作废亭。
想到這一切, 你只要通過(guò)書本學(xué)習(xí)能多遠(yuǎn)具钥, 就值得懷疑了豆村。在我的第一個(gè)孩子出生之前,我讀了所有的《如何》一書骂删,仍然覺得自己是一個(gè)無(wú)知的新手掌动。30 個(gè)月后四啰, 當(dāng)我的第二個(gè)孩子到期時(shí), 我回到書本上復(fù)習(xí)一下嗎粗恢?不柑晒。相反,我依靠我個(gè)人的經(jīng)驗(yàn)眷射,事實(shí)證明匙赞,這比我有用和放心得多,比專家寫的數(shù)千頁(yè)妖碉。
弗雷德·布魯克斯在他的論文《沒有銀彈》中確定了尋找偉大軟件設(shè)計(jì)師的三部分計(jì)劃:
盡早系統(tǒng)地確定頂級(jí)設(shè)計(jì)師涌庭。
指派一位職業(yè)導(dǎo)師負(fù)責(zé)潛在客戶的發(fā)展,并仔細(xì)保存職業(yè)檔案欧宜。
為成長(zhǎng)的設(shè)計(jì)師提供互動(dòng)和刺激的機(jī)會(huì)坐榆。
這假定有些人已經(jīng)具備成為偉大設(shè)計(jì)師所需的素質(zhì);工作是正確地哄他們一起。艾倫·佩利斯說(shuō)得更簡(jiǎn)潔:"每個(gè)人都可以被教導(dǎo)去雕刻:米開朗基羅必須被教導(dǎo)如何不雕刻鱼鸠。因此猛拴,這是與偉大的程序員"。佩利斯說(shuō)蚀狰,偉大的球員有一些超越他們訓(xùn)練的內(nèi)部素質(zhì)愉昆。但是質(zhì)量從何而來(lái)呢?是天生的嗎麻蹋?還是他們通過(guò)勤奮來(lái)發(fā)展跛溉?正如奧古斯特·古斯托(拉塔圖耶虛構(gòu)的廚師)所說(shuō),"任何人都可以做飯扮授,但只有無(wú)所畏懼的人才能是偉大的芳室。我認(rèn)為更多的是愿意把一生中的很大一部分用于審議實(shí)踐。但也許無(wú)所畏懼是總結(jié)這一點(diǎn)的一種方式刹勃】昂睿或者,正如古斯托的批評(píng)家安東·埃戈所說(shuō):"不是每個(gè)人都能成為一個(gè)偉大的藝術(shù)家荔仁,但一個(gè)偉大的藝術(shù)家可以來(lái)自任何地方伍宦。
因此,繼續(xù)購(gòu)買 Java/Ruby/Javascript/PHP 書籍;你可能會(huì)從中得到一些利用乏梁。但你不會(huì)改變你的生活次洼,或者你作為程序員在24小時(shí)或21天內(nèi)真正的整體專業(yè)知識(shí)。努力在24個(gè)月內(nèi)不斷改進(jìn)怎么樣遇骑?現(xiàn)在你開始找個(gè)地方了...
引用
布魯姆卖毁,本杰明(Ed.)培養(yǎng)年輕人的人才,巴蘭廷落萎,1985年亥啦。
布魯克斯炭剪, 弗雷德, 沒有銀彈禁悠, IEEE 電腦念祭, 第 20 卷, 第 4 號(hào)碍侦, 1987 年粱坤, 第 10 - 19 周。
布萊恩瓷产, W. l. – 哈特站玄, N. "關(guān)于電報(bào)語(yǔ)言的研究: 獲得習(xí)慣的層次。心理學(xué)評(píng)論濒旦, 1899株旷, 8, 345-375
海斯尔邓,約翰R.晾剖,完全問(wèn)題解決者勞倫斯·埃鮑姆,1989年梯嗽。
蔡斯齿尽, 威廉 G. & 西蒙, 赫伯特 A. "國(guó)際象棋感知" 認(rèn)知心理學(xué)灯节, 1973 年循头, 4, 55 - 81 炎疆。
拉夫卡骂,讓,實(shí)踐認(rèn)知:思維形入,數(shù)學(xué)和文化的日常生活全跨,劍橋大學(xué)出版社,1988年亿遂。
答案
典型 PC 上各種操作的大致計(jì)時(shí):
執(zhí)行典型指令 1/1螟蒸,000,000崩掘,000 秒 = 1 納米秒從 L1 緩存內(nèi)存 0。5 nanosec 分網(wǎng)預(yù)測(cè)錯(cuò)誤 5 納米秒從 L2 緩存存儲(chǔ)器 7 nanosecMutex 鎖 / 解鎖 25 nanosecfetch 從主存儲(chǔ)器 100 nanosecsend 2K 字節(jié)超過(guò) 1Gbps 網(wǎng)絡(luò) 20少办,000 nanosecread 1MB 順序從內(nèi)存 250苞慢,000 從新的磁盤位置 (尋求) 8,000英妓,000 nanosecread 1MB 順序從磁盤 20挽放,000绍赛,000 nanosec 發(fā)送數(shù)據(jù)包美國(guó)到歐洲和回 150 毫秒 = 150,000辑畦,000 nanosec
附錄:語(yǔ)言選擇
有幾個(gè)人問(wèn)他們應(yīng)該先學(xué)什么編程語(yǔ)言吗蚌。沒有一個(gè)答案,但請(qǐng)考慮以下幾點(diǎn):
用你的朋友纯出。當(dāng)被問(wèn)及"我應(yīng)該使用什么操作系統(tǒng)蚯妇,Windows,Unix暂筝,還是Mac箩言?從朋友那里學(xué)習(xí)的好處將抵消操作系統(tǒng)之間或編程語(yǔ)言之間的任何內(nèi)在差異。還要考慮你未來(lái)的朋友:如果你繼續(xù)焕襟,你將成為其中一員的程序員社區(qū)陨收。您選擇的語(yǔ)言是有一個(gè)龐大的成長(zhǎng)社區(qū)還是一個(gè)垂死的小社區(qū)?是否有書籍鸵赖、網(wǎng)站和在線論壇可以獲得答案务漩?你喜歡那些論壇里的人嗎?
保持簡(jiǎn)單它褪。編程語(yǔ)言(C++ 和 Java)是由經(jīng)驗(yàn)豐富的程序員團(tuán)隊(duì)為專業(yè)開發(fā)而設(shè)計(jì)的饵骨,他們關(guān)注代碼的運(yùn)行時(shí)效率。因此列赎,這些語(yǔ)言具有專為這些情況設(shè)計(jì)的復(fù)雜部分宏悦。你關(guān)心的是學(xué)習(xí)編程。你不需要這種并發(fā)癥包吝。您想要一種由單個(gè)新程序員設(shè)計(jì)得易于學(xué)習(xí)和記憶的語(yǔ)言饼煞。
玩。你寧愿學(xué)習(xí)哪種方式彈鋼琴:正常的互動(dòng)方式诗越,你一點(diǎn)擊一個(gè)鍵砖瞧,或"批"模式,你只聽到音符后嚷狞,你完成了一整首歌块促?顯然,交互式模式使鋼琴和編程的學(xué)習(xí)更加容易床未。堅(jiān)持使用交互式模式的語(yǔ)言并使用它竭翠。
鑒于這些標(biāo)準(zhǔn),我對(duì)第一種編程語(yǔ)言的建議將是Python或S方案薇搁。另一個(gè)選擇是Javascript斋扰,不是因?yàn)樗菫槌鯇W(xué)者設(shè)計(jì)得完美的,而是因?yàn)橛羞@么多的在線教程,如Khan學(xué)院的教程传货。但是屎鳍,你的情況可能會(huì)有所不同,還有其他不錯(cuò)的選擇问裕。如果你的年齡是一位數(shù)逮壁,你可能更喜歡愛麗絲或吱吱聲或塊(年齡較大的學(xué)習(xí)者也可能喜歡這些)。重要的是你選擇并開始粮宛。
附錄:書籍和其他資源
有幾個(gè)人問(wèn)他們應(yīng)該從哪些書籍和網(wǎng)頁(yè)中學(xué)習(xí)窥淆。我再說(shuō)一遍, "單靠書學(xué)習(xí)是不夠的"窟勃, 但我可以推薦以下內(nèi)容:
方案:計(jì)算機(jī)程序的結(jié)構(gòu)和解釋(Abelson & Sussman)可能是計(jì)算機(jī)科學(xué)的最佳介紹祖乳,它教編程作為理解計(jì)算機(jī)科學(xué)的一種方式。您可以在線查看有關(guān)本書的講座視頻秉氧,以及完整的文本庆猫。這本書很有挑戰(zhàn)性竹习,將一些人從另一種方法中去掉。
方案:如何設(shè)計(jì)程序(Felleisen等人)是有關(guān)如何以優(yōu)雅和實(shí)用的方式實(shí)際設(shè)計(jì)程序的最佳書籍之一。
Python: Python 編程: 使用 Python 的 Cs 簡(jiǎn)介 (Zelle) 是一個(gè)很好的介紹阁苞。
Python:在一些在線教程Python.org尚卫。
奧茲: 計(jì)算機(jī)編程的概念喧伞、技術(shù)和模型 (范羅伊和哈里迪) 被一些人視為阿貝爾森和蘇斯曼的現(xiàn)代接班人窟她。這是一個(gè)通過(guò)編程的大想法之旅, 涵蓋比亞伯森和蘇斯曼更廣泛的范圍漂问, 而也許更容易閱讀和遵循赖瞒。它使用一種語(yǔ)言,Oz蚤假,這是不廣為人知栏饮,但作為學(xué)習(xí)其他語(yǔ)言的基礎(chǔ)。<
筆記
T. Capey指出磷仰,亞馬遜上的"完全問(wèn)題解決者"頁(yè)面現(xiàn)在有"在21天內(nèi)自學(xué)孟加拉語(yǔ)"和"自學(xué)語(yǔ)法和風(fēng)格"的書籍下"為這個(gè)項(xiàng)目購(gòu)物的顧客也為這些物品購(gòu)物"部分袍嬉。我猜看那本書的人很多來(lái)自這個(gè)頁(yè)面。感謝羅斯·科恩對(duì)希波克拉底的幫助