十年內(nèi)自學(xué)編程
彼得·諾維格
為什么大家都這么著急糙置?
走進(jìn)任何一家書店,你就會(huì)看到24小時(shí)內(nèi)自學(xué)Java除了提供在幾天或幾個(gè)小時(shí)內(nèi)教授C是目、nSQL谤饭、Ruby、算法等的無(wú)休止的變體之外懊纳。亞馬遜高級(jí)搜索標(biāo)題:教書揉抵,自學(xué),小時(shí)數(shù)嗤疯,自2000年起找到512本這樣的書冤今。在前十名中,有九本是編程書(另一本是關(guān)于簿記的)茂缚。類似的結(jié)果來(lái)自于將“自學(xué)”改為“學(xué)習(xí)”戏罢,或?qū)ⅰ靶r(shí)”替換為“天”。
結(jié)論是脚囊,要么人們急于學(xué)習(xí)nAbout編程龟糕,要么編程在某種程度上比其他任何東西都容易得多。納費(fèi)萊森等人他們?cè)跁袑?duì)這一趨勢(shì)表示贊同悔耘。如何設(shè)計(jì)程序當(dāng)他們說(shuō)“糟糕的編程很容易”的時(shí)候翩蘸。白癡可以在21天,即使他們是假人淮逊。“瘋狂的鵝漫畫也有他們的觀點(diǎn).
讓我們分析一下標(biāo)題是什么樣子的24小時(shí)內(nèi)自學(xué)C++可能意味著:
自學(xué):在24小時(shí)內(nèi)扶踊,您將沒(méi)有時(shí)間編寫幾個(gè)重要的程序泄鹏,并從您的成功和失敗與nnr學(xué)習(xí)。您將沒(méi)有時(shí)間與有經(jīng)驗(yàn)的程序員一起工作秧耗,也不了解在C++環(huán)境中生活是什么感覺(jué)备籽。總之,你沒(méi)有時(shí)間學(xué)到很多東西车猬。因此霉猛,這本書只能談?wù)撘环N膚淺的熟悉,而不是一種深刻的理解珠闰。正如亞歷山大·波普所說(shuō)惜浅,很少學(xué)習(xí)是一件危險(xiǎn)的事情。
C++:在24小時(shí)內(nèi)伏嗜,您可能能夠?qū)W習(xí)nc++的一些語(yǔ)法(如果您已經(jīng)知道另一種語(yǔ)言)坛悉,但是對(duì)于如何使用該語(yǔ)言您不太了解。簡(jiǎn)而言之承绸,如果您是nBasic程序員裸影,您可以學(xué)習(xí)使用C++語(yǔ)法以nBasic的風(fēng)格編寫程序,但是您無(wú)法了解C++實(shí)際上是好的(和不好的)什么军熏。那有什么意義轩猩?艾倫·恩佩利斯曾經(jīng)說(shuō)過(guò):“一種不影響你對(duì)編程的思考方式的語(yǔ)言是不值得知道的”。一個(gè)可能的問(wèn)題是荡澎,您必須學(xué)習(xí)一點(diǎn)C++(或者更有可能是一些類似于JavaScript或處理的東西)均践,因?yàn)槟枰cn現(xiàn)有工具接口來(lái)完成特定的任務(wù)。但是你不是在學(xué)習(xí)如何編程衔瓮,而是在學(xué)習(xí)如何完成這個(gè)任務(wù)浊猾。
在24小時(shí)內(nèi):不幸的是,正如下一節(jié)所示热鞍,這還不夠葫慎。
十年內(nèi)自學(xué)編程
研究人員(布魯姆·n(1985), 布賴恩和哈特(1899年), Hayes n(1989), Simmon&Chase(1973年))已經(jīng)證明,在各種領(lǐng)域薇宠,包括國(guó)際象棋偷办、音樂(lè)創(chuàng)作、電報(bào)操作澄港、繪畫椒涯、鋼琴演奏、游泳回梧、網(wǎng)球以及神經(jīng)心理學(xué)和拓?fù)鋵W(xué)的研究废岂,都需要大約十年的時(shí)間才能發(fā)展出專業(yè)知識(shí)。關(guān)鍵是審議練習(xí):不只是一次又一次地去做狱意,而是挑戰(zhàn)自己--一項(xiàng)超出你當(dāng)前能力范圍的任務(wù)湖苞,嘗試它,分析你在做的時(shí)候和之后的表現(xiàn)详囤,并糾正錯(cuò)誤财骨。那就重復(fù)一遍。再重復(fù)一遍。似乎沒(méi)有真正的捷徑:即使是莫扎特隆箩,他在4歲時(shí)是一個(gè)音樂(lè)天才该贾,在他開始創(chuàng)作世界一流的音樂(lè)之前,花費(fèi)了13多年的時(shí)間捌臊。在另一種流派中杨蛋,披頭士樂(lè)隊(duì)似乎突然出現(xiàn)在現(xiàn)場(chǎng),出現(xiàn)在1964年的埃德·沙利文秀上娃属。但是他們從1957年起就一直在利物浦和漢堡打小俱樂(lè)部六荒,雖然他們很早就有了群眾的吸引力,這是他們第一個(gè)偉大的成功矾端,胡椒中士于1967年獲釋掏击。
馬爾科姆·格拉德威爾雖然他專注于10,000小時(shí),而不是10年秩铆,但他推廣了這一理念砚亭。NHenriCartier-Bresson(1908-2004)有另一個(gè)指標(biāo):“你的前10,000張照片是你最差的∨孤辏”(他沒(méi)有預(yù)料到捅膘,使用數(shù)碼相機(jī),一些人可以在一周內(nèi)達(dá)到這一目標(biāo)滚粟。)真正的專業(yè)知識(shí)可能需要一生的時(shí)間:nsamel johnson(1709-1784)說(shuō):“任何部門的卓越只有通過(guò)一生的勞動(dòng)才能達(dá)到寻仗,而不是以更低的價(jià)格購(gòu)買》踩溃”喬叟(1340-1400)抱怨道:“賴夫太短了署尤,工藝太長(zhǎng)了⊙窍溃”Hippocrates(公元前400年)以摘錄“Ars Longa曹体,nvita brevis”而聞名,這是較長(zhǎng)的引語(yǔ)“Ars Longa硝烂,vita nbrevis箕别,equo o precep,試驗(yàn)性周膜滞谢,niudicium n荊棘”的一部分串稀,在英語(yǔ)中,這段摘錄被描述為“生命短暫狮杨,工藝短暫母截,機(jī)會(huì)飛逝,實(shí)驗(yàn)變化無(wú)常禾酱,判斷困難”。當(dāng)然,沒(méi)有一個(gè)數(shù)字是最終的答案:假設(shè)所有技能(例如編程颤陶、下棋颗管、跳棋和音樂(lè)演奏)都需要完全相同的時(shí)間來(lái)掌握,也不認(rèn)為所有的人都需要完全相同的時(shí)間滓走,這似乎是不合理的垦江。作為非教授。K.安德斯·愛(ài)立信他說(shuō):“在大多數(shù)領(lǐng)域搅方,即使是最沒(méi)有天賦的人也需要多少時(shí)間才能達(dá)到最高水平比吭,這是很值得注意的。1萬(wàn)小時(shí)的時(shí)間讓你感覺(jué)到姨涡,我們談?wù)摰氖敲恐?0到20小時(shí)的時(shí)間衩藤,有些人會(huì)認(rèn)為,那些天生最有天賦的人仍然需要達(dá)到最高水平涛漂∩捅恚”
所以你想成為一名程序員
下面是我編程成功的秘訣:
到達(dá)感興趣在編程中,并做一些匈仗,因?yàn)樗怯腥さ钠敖恕4_保它保持足夠的樂(lè)趣,這樣你就會(huì)愿意投入你的十年/10,000小時(shí)悠轩。
程序间狂。最好的學(xué)習(xí)方式是邊做邊學(xué)。更嚴(yán)格地說(shuō)火架,“在特定領(lǐng)域中鉴象,個(gè)人的最高性能水平并不是隨著經(jīng)驗(yàn)的擴(kuò)展而自動(dòng)達(dá)到的,但是距潘,即使是經(jīng)驗(yàn)豐富的個(gè)人炼列,也可以通過(guò)刻意改進(jìn)的努力來(lái)提高nPerformance的水平垮兑』史蓿”(第366頁(yè))“最有效的學(xué)習(xí)需要一個(gè)明確的任務(wù)陵刹,對(duì)于特定的個(gè)體來(lái)說(shuō)本讥,有一個(gè)不合適的難度水平吞瞪,信息反饋骡楼,以及重復(fù)和糾正錯(cuò)誤的機(jī)會(huì)淡喜≡煞”(第20-21頁(yè))書 實(shí)踐中的認(rèn)知:日常生活中的思維骚亿、數(shù)學(xué)與文化是這個(gè)觀點(diǎn)的有趣的參考已亥。
與人交談其他程序員;閱讀其他程序来屠。這比任何書籍或培訓(xùn)課程都更重要虑椎。
如果你愿意震鹉,把四年學(xué)院(或更多在一所研究所)。這會(huì)讓你獲得一些需要國(guó)家職業(yè)證書的工作捆姜,也會(huì)讓你對(duì)這個(gè)領(lǐng)域有更深入的了解传趾,但如果你不喜歡上學(xué),你可以(用一些奉獻(xiàn)精神)獨(dú)自或在工作中獲得類似的經(jīng)驗(yàn)泥技。無(wú)論如何浆兰,單靠書本學(xué)習(xí)是不夠的∩罕“計(jì)算機(jī)科學(xué)教育不能使任何人成為專業(yè)程序員簸呈,就像研究畫筆和顏料可以使某人成為專業(yè)畫家一樣”埃里克·雷蒙德(Eric Raymond)說(shuō)〉瓴瑁“新黑客詞典”蜕便。我雇的最好的程序員之一只有高中學(xué)位,他產(chǎn)生了很多太棒了 軟件忽妒,有他自己的新聞組玩裙,并有足夠的股票期權(quán)購(gòu)買他自己的股票。夜總會(huì).
研究項(xiàng)目其他程序員段直。做最好的程序員吃溅,不做某些項(xiàng)目;在其他項(xiàng)目上做最差的程序員鸯檬。當(dāng)你是最好的决侈,你可以測(cè)試你的能力,領(lǐng)導(dǎo)一個(gè)項(xiàng)目喧务,并以你的遠(yuǎn)見(jiàn)鼓舞他人赖歌。當(dāng)你是最壞的時(shí)候,你學(xué)會(huì)了主人做什么功茴,你學(xué)會(huì)了他們不喜歡做的事情(因?yàn)樗麄儾蛔屇銥樗麄冏?庐冯。
研究項(xiàng)目后其他程序員。理解別人寫的程序坎穿≌垢福看看當(dāng)最初的程序員不在的時(shí)候,需要做些什么來(lái)理解和修復(fù)它玲昧。想一想如何設(shè)計(jì)你的程序栖茉,讓那些在你之后維護(hù)它們的人更容易。
至少學(xué)半打編程語(yǔ)言孵延。包括一種強(qiáng)調(diào)類抽象(比如Java或C++)吕漂、一種強(qiáng)調(diào)函數(shù)抽象(比如Lisp、ML或Haskell)尘应、一種支持語(yǔ)法抽象(比如Lisp)惶凝、一種支持聲明性規(guī)范(比如Prolog或C++nTemplate)吼虎、以及一種強(qiáng)調(diào)并行性(比如Clojure或Go)的nlanguage。
請(qǐng)記住苍鲜,有一個(gè)“電腦在“計(jì)算機(jī)科學(xué)”中鲸睛。知道您的計(jì)算機(jī)執(zhí)行指令、從內(nèi)存中獲取一個(gè)單詞(有或沒(méi)有緩存錯(cuò)誤)坡贺、從磁盤中讀取連續(xù)單詞以及在磁盤上尋找一個(gè)新位置需要多長(zhǎng)時(shí)間。答案在這里箱舞。)
卷入一種語(yǔ)言標(biāo)準(zhǔn)化努力遍坟。它可能是ANSI C++委員會(huì),也可能是nn決定您的本地編碼樣式是否有2或4個(gè)空格縮進(jìn)級(jí)別晴股。不管是哪種方式愿伴,你都會(huì)了解到其他人在一種語(yǔ)言中喜歡什么,他們有多深的感覺(jué)电湘,也許還有一點(diǎn)隔节,他們?yōu)槭裁磿?huì)有這種感覺(jué)。
有很好的判斷力下語(yǔ)言標(biāo)準(zhǔn)化工作越快越好寂呛。
考慮到所有這些怎诫,通過(guò)nbook學(xué)習(xí)你能走多遠(yuǎn),這是值得懷疑的贷痪。在我的第一個(gè)孩子出生之前幻妓,我讀了所有的如何還覺(jué)得自己是個(gè)無(wú)知的新手。30個(gè)月后劫拢,當(dāng)我的第二個(gè)孩子即將出生的時(shí)候肉津,我是否回到書本上去做復(fù)習(xí)?沒(méi)有舱沧。相反妹沙,我依靠的是我的個(gè)人經(jīng)驗(yàn),事實(shí)證明熟吏,比起成千上萬(wàn)頁(yè)的專家撰寫的文章距糖,這些經(jīng)驗(yàn)對(duì)我來(lái)說(shuō)更有用,也更讓我放心分俯。
弗雷德·布魯克斯肾筐,在他的文章中沒(méi)有銀彈為尋找優(yōu)秀的nsoft設(shè)計(jì)人員確定了三部分計(jì)劃:
系統(tǒng)地盡早確定頂級(jí)設(shè)計(jì)師。
指派一位職業(yè)導(dǎo)師負(fù)責(zé)前景的發(fā)展缸剪,并仔細(xì)保存一份職業(yè)檔案吗铐。
為不斷成長(zhǎng)的設(shè)計(jì)師提供互動(dòng)和相互激勵(lì)的機(jī)會(huì)。
這假設(shè)有些人已經(jīng)具備了成為一名偉大設(shè)計(jì)師所必需的素質(zhì)杏节;工作就是適當(dāng)?shù)睾逅麄儓?jiān)持下去唬渗。艾倫·恩佩利斯更簡(jiǎn)潔地說(shuō):“每個(gè)人都可以被教導(dǎo)雕刻:nMichelangelo將不得不被教導(dǎo)如何不這樣做典阵。偉大的程序員也是如此∧魇牛”佩利斯說(shuō)偉大的球員有一些超越訓(xùn)練的內(nèi)在素質(zhì)壮啊。但是質(zhì)量是從哪里來(lái)的呢?是天生的嗎撑蒜?或者他們是通過(guò)勤奮來(lái)發(fā)展它的呢歹啼?作為奧古斯特·古斯托(小說(shuō)中的廚師)拉塔托維爾)說(shuō):“任何人都會(huì)做飯,但只有無(wú)畏的人才能做得好座菠±暄郏”我認(rèn)為它更多的是愿意把一個(gè)人一生中的大部分時(shí)間花在深思熟慮的實(shí)踐上。但也許無(wú)畏是總結(jié)這一點(diǎn)的一種方式浴滴⊥孛龋或者,正如古斯托的批評(píng)家南頓·艾格所說(shuō):“不是每個(gè)人都能成為偉大的藝術(shù)家升略,但偉大的藝術(shù)家可以來(lái)自任何地方微王。”
因此品嚣,繼續(xù)購(gòu)買Java/Ruby/Javascript/PHP書籍炕倘;您可能會(huì)從中得到一些使用。但你不會(huì)在24小時(shí)或21天內(nèi)改變你的生活翰撑,也不會(huì)改變你作為程序員的真正專業(yè)知識(shí)激才。為什么要努力工作,在24個(gè)月內(nèi)不斷提高呢额嘿?現(xiàn)在你開始有進(jìn)展了..瘸恼。
參考文獻(xiàn)
布盧姆,本杰明(編輯)培養(yǎng)青年人才册养,巴蘭汀东帅,1985年。
布魯克斯弗雷德沒(méi)有銀子彈球拦,IEEE Computer靠闭,第20卷,第4號(hào)坎炼,1987年愧膀,第10-19頁(yè)。
Bryan谣光,W.L.&Harter檩淋,N.“關(guān)于電報(bào)語(yǔ)言的研究:n.養(yǎng)成一種習(xí)慣的等級(jí)制度。心理學(xué)評(píng)論, 1899, 8, 345-375
海斯萄金,約翰·R.完全問(wèn)題求解器Lawrence Erlbaum蟀悦,1989年媚朦。
放大圖片作者:William G.&Simon,Herbert A.“國(guó)際象棋中的知覺(jué)” 認(rèn)知心理學(xué), 1973, 4, 55-81.
拉維簡(jiǎn)實(shí)踐中的認(rèn)知:日常生活中的思維日戈、數(shù)學(xué)與文化询张,劍橋大學(xué)出版社,1988年浙炼。
答案
典型PC上各種操作的大致時(shí)間:
執(zhí)行典型指令 1/1 000 000 000秒=1納塞克
從L1高速緩存存儲(chǔ)器中提取 0.5納米
分支誤判 5納米級(jí)
從L2緩存存儲(chǔ)器中提取 7納米
互斥鎖/解鎖 25納米
從主存儲(chǔ)器中取出 100納米
在1 Gbps網(wǎng)絡(luò)上發(fā)送2K字節(jié) 20 000納塞克
從內(nèi)存中順序讀取1MB 25萬(wàn)納塞克
從新磁盤位置獲取(查找) 8,000,000納塞c
從磁盤順序讀取1MB 20,000,000納塞c
把美國(guó)包裹寄回歐洲 150毫秒=150 000 000納塞克
附錄:語(yǔ)言選擇
有幾個(gè)人問(wèn)他們應(yīng)該先學(xué)哪種編程語(yǔ)言份氧。沒(méi)有一個(gè)答案,但請(qǐng)考慮以下幾點(diǎn):
利用你的朋友弯屈。當(dāng)被問(wèn)到“ni應(yīng)該使用什么操作系統(tǒng)半火、Windows、Unix還是Mac季俩?”時(shí),我的回答通常是:“使用朋友使用的任何東西梅掠∽米。”從您的nFriends學(xué)習(xí)中獲得的優(yōu)勢(shì)將抵消操作系統(tǒng)之間或編程語(yǔ)言之間的任何內(nèi)在差異。還要考慮你未來(lái)的朋友:如果你不繼續(xù)的話阎抒,你會(huì)成為程序員社區(qū)的一部分酪我。你所選擇的語(yǔ)言是一個(gè)成長(zhǎng)中的大社區(qū),還是一個(gè)即將消亡的小群體且叁?是否有書籍都哭、網(wǎng)站和在線論壇可以獲得答案?你喜歡那些論壇上的人嗎逞带?
保持簡(jiǎn)單欺矫。像C++NANDJava這樣的編程語(yǔ)言是為專業(yè)開發(fā)而設(shè)計(jì)的,由大量的有經(jīng)驗(yàn)的程序員組成展氓,他們關(guān)心nnd代碼的運(yùn)行時(shí)效率穆趴。因此,這些語(yǔ)言具有為這些情況設(shè)計(jì)的復(fù)雜部分遇汞。你關(guān)心的是學(xué)習(xí)編程未妹。你不需要那種并發(fā)癥。你想要一種設(shè)計(jì)成易于學(xué)習(xí)和記住的語(yǔ)言空入,而不是一個(gè)新的程序員络它。
玩。你更愿意學(xué)習(xí)彈鋼琴的哪一種方式:非常規(guī)的互動(dòng)方式歪赢,在你一按下鍵就能聽(tīng)到每個(gè)音符化戳,而不是“分批”模式,即你只在完成整首歌之后才能聽(tīng)到音符埋凯?交互模式使鋼琴和編程更容易學(xué)習(xí)迂烁。堅(jiān)持一種互動(dòng)的語(yǔ)言看尼,并使用它。
考慮到這些標(biāo)準(zhǔn)盟步,我對(duì)第一種編程語(yǔ)言的建議是:Python或方案藏斩。另一個(gè)選擇是Javascript,不是因?yàn)樗鼮槌鯇W(xué)者設(shè)計(jì)得很好却盘,而是因?yàn)樗泻芏嘣诰€教程狰域,例如汗學(xué)院教程。但你的情況可能會(huì)不同黄橘,還有其他好的選擇兆览。如果你的噸位是個(gè)位數(shù),你可能更喜歡愛(ài)麗絲或吱吱聲或布洛克(年長(zhǎng)的學(xué)習(xí)者也可能喜歡這些)塞关。重要的是你選擇并開始抬探。
附錄:書籍和其他資源
有幾個(gè)人問(wèn)他們應(yīng)該向哪些書籍和網(wǎng)頁(yè)學(xué)習(xí)。我再說(shuō)一遍帆赢,“光靠書本學(xué)習(xí)是不夠的”小压,但我不能推薦以下幾點(diǎn):
計(jì)劃: 計(jì)算機(jī)程序的結(jié)構(gòu)與解釋(Abelson&Sussman)也許是對(duì)計(jì)算機(jī)科學(xué)的最好的介紹,它確實(shí)教編程作為理解計(jì)算機(jī)科學(xué)的一種方式椰于。你可以看到網(wǎng)上講座錄像在這本書上怠益,以及在線全文。這本書不具挑戰(zhàn)性瘾婿,并將淘汰一些人蜻牢,也許他們可能不會(huì)成功的另一種方法。
計(jì)劃: 如何設(shè)計(jì)程序(Felleisen)等人)是最好的書籍之一偏陪,而非如何以優(yōu)雅和實(shí)用的方式實(shí)際設(shè)計(jì)程序抢呆。
Python: Python編程:NaN Introto CS(Zelle)是一個(gè)很好的介紹使用Python。
Python:幾個(gè)nOnline教程可在Python.org.
奧茲: 計(jì)算機(jī)程序設(shè)計(jì)的概念笛谦、技術(shù)和模型(Van Roy&Haridi)被一些人視為現(xiàn)代阿伯爾森和蘇斯曼的繼承者镀娶。Nit是一個(gè)關(guān)于編程的偉大思想的旅行,它涵蓋的范圍比Abelson和Sussman更廣揪罕,而且可能更容易閱讀和理解梯码。它使用的一種語(yǔ)言,Oz好啰,并不廣為人知轩娶,但作為學(xué)習(xí)其他語(yǔ)言的NA基礎(chǔ)。N<
注記
T.Capey指出完全n問(wèn)題求解器亞馬遜的網(wǎng)頁(yè)現(xiàn)在有了“21天內(nèi)教你自己‘孟加拉語(yǔ)’”和“教你自己語(yǔ)法和風(fēng)格”的書框往,在購(gòu)買這一商品的n“顧客”下也有購(gòu)買這些物品的“n”部分鳄抒。我想看這本書的人中有很大一部分是從這一頁(yè)來(lái)的。感謝羅斯·科恩幫助希波克拉底。? ? ? ? ?
翻譯
由于nPosting作者的存在许溅,可以在以下網(wǎng)站中找到next頁(yè)面的翻譯:
阿拉伯語(yǔ)
(Mohamed A.Yahya)
保加利亞語(yǔ)
(Boyko Bantchev)
中國(guó)人
(郭曉剛)
克羅地亞語(yǔ)
(Tvrtko Bedekovic)
世界語(yǔ)
(Federico Gobbo)
法式
(Etienne Beauchesne)
德文
(斯特凡·拉姆)
希伯來(lái)語(yǔ)
(埃里克·麥凱恩)
印地語(yǔ)
(Vikash Tiwari)
匈牙利語(yǔ)
(Marton Mestyan)
印尼語(yǔ)
(Tridjito Santoso)
意大利語(yǔ)
(Fabio Z.Tessitore)
日本語(yǔ)
(約莫莫莫)
韓語(yǔ)n(黃約翰)
波斯語(yǔ)
(Mehdi Asgari)
波蘭人
(Kuba Nowak)
葡萄牙語(yǔ)
(Augusto Radtke)
羅馬尼亞文
(?Tefan Laz?r)
俄文
(Konstantin Ptisyn)
塞爾維亞語(yǔ)
(Lazar Kovacevic)
西班牙語(yǔ)
(卡洛斯·魯達(dá))
斯洛伐克語(yǔ)
(Jan Waclawek)
土耳其語(yǔ)
(圣徒??l Ulu?Ahin)
烏克蘭
(Oleksii Molchanovskyi)
Peter Norvig(Copyright 2001—2014)