著者: Peter Norvig
翻譯: Dai Yuwen
為何人人都這么著急?
信步走進(jìn)任何一家書店,你會(huì)看到名為《如何在7天內(nèi)學(xué)會(huì)Java》的書矢否,還有各種各樣類似的書:在幾天內(nèi)或幾小時(shí)內(nèi)學(xué)會(huì)Visual Basic, Windows, Internet等等尝蠕,一眼望不到盡頭橄唬。我在Amazon 上做了如下的 強(qiáng)力檢索 :
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
得到了248個(gè)結(jié)果。前78個(gè)都是計(jì)算機(jī)類書籍(第79個(gè)是 Learn Bengali in 30 days)夏漱。我用”hours”替換”days”淑掌,得到了類似的結(jié)果:更多的253書呈昔。前77本是計(jì)算機(jī)類書籍挥等,第78本是 Teach Yourself Grammar and Style in 24 Hours。在前200本書中堤尾,有96% 是計(jì)算機(jī)類書籍肝劲。
結(jié)論是:要么人們都在忙忙地學(xué)習(xí)計(jì)算機(jī),要么計(jì)算機(jī)比其它任何東西都容易學(xué)哀峻。沒(méi)有書籍教你在幾天內(nèi)學(xué)會(huì)古典音樂(lè)涡相、量子物理哲泊,或者是養(yǎng)狗剩蟀。
讓我們分析一下,象一本名為《三天內(nèi)學(xué)會(huì)Pascal》的書意味著什么:
學(xué)習(xí): 在三天里切威,你沒(méi)有時(shí)間寫一些重大的程序育特,并從成功或失敗中得益。你沒(méi)有時(shí)間與有經(jīng)驗(yàn)的程序員合作先朦,并理解在那樣的環(huán)境下工作是怎么回事缰冤。一句話,你不會(huì)有時(shí)間學(xué)到太多東西喳魏。因此他們只能談?wù)撘恍┠w淺的東西棉浸,而不是深入的理解。正如亞力山大教皇所說(shuō)刺彩,淺嘗輒止是危險(xiǎn)的事情迷郑。
Pascal: 在三天時(shí)間里,你可能學(xué)會(huì)Pascal的語(yǔ)法(如果你已經(jīng)學(xué)過(guò)類似的語(yǔ)言)创倔,但你學(xué)不到更多的如何使用這些語(yǔ)法的知識(shí)嗡害。也就是說(shuō),假如你曾是個(gè)BASIC 程序員畦攘,你可以學(xué)著用Pascal語(yǔ)法寫出BASIC風(fēng)格的程序霸妹,但你不可能了解Pascal真正的好處(和壞處)。那么關(guān)鍵是什么知押? Alan Perlis 說(shuō)過(guò):“一種不改變你編程的思維方式的語(yǔ)言叹螟,不值得去學(xué)√ǘⅲ” 一種可能的情況是:你必須學(xué)一點(diǎn)兒Pascal(或可能性更大的象Visual Basic 或 JavaScript之類)首妖,因?yàn)槟銥榱送瓿赡撤N特定的任務(wù),需要與一個(gè)現(xiàn)存的工具建立接口爷恳。不過(guò)那不是學(xué)習(xí)如何編程有缆,而是在學(xué)習(xí)如何完成那個(gè)任務(wù)。
三天內(nèi): 很不幸,這不夠棚壁,原因由下一節(jié)告訴我們杯矩。
在十年里學(xué)會(huì)編程
研究表明 (Hayes,Bloom) 在任何一種領(lǐng)域內(nèi)袖外,象下棋史隆、作曲、繪畫曼验、鋼琴演奏泌射、游泳、網(wǎng)球鬓照、以及原子物理學(xué)和拓?fù)鋵W(xué)熔酷,等等,要達(dá)到專家水平大約都要化十年時(shí)間豺裆。沒(méi)有真正的捷徑:即使是莫扎特拒秘,4歲時(shí)就是音樂(lè)神童,13年后才開始寫出世界級(jí)的作品臭猜。在另一方面躺酒,披頭士似乎在1964年的Ed Sullivan表演上一炮走紅。但他們從1957年就開始表演蔑歌,在獲得大眾青睞后羹应,他們的第一個(gè)重大成功,Sgt. Peppers次屠,是1967年發(fā)行的园匹。Samuel Johnson (塞繆爾·約翰遜,英國(guó)辭典編纂家及作家)認(rèn)為要花比十年更長(zhǎng)的時(shí)間:“在任何領(lǐng)域中出類拔萃都要用畢生的勞作來(lái)取得帅矗;它不可能用較低的代價(jià)獲得偎肃。” 而Chaucer(喬叟浑此,英國(guó)詩(shī)人)感嘆到:“人生短暫累颂,學(xué)海無(wú)涯×菥悖”
這是我為編程成功開出的方子:
設(shè)法對(duì)編程感興趣紊馏,并且因?yàn)樗腥ざ幰恍┏绦颉4_保編程一直充滿足夠樂(lè)趣蒲犬,這樣你才愿意投入十年寶貴時(shí)間朱监。
與其他程序員交流; 閱讀其它程序原叮。這比任何書本或訓(xùn)練課程都重要赫编。
寫程序巡蘸。 最好的學(xué)習(xí)方式是 從實(shí)踐中學(xué)習(xí)。 用更技術(shù)性的話說(shuō)擂送,“在一個(gè)給定的領(lǐng)域內(nèi)悦荒,個(gè)人的最大能力不是自動(dòng)地由擴(kuò)展了的經(jīng)驗(yàn)取得的,但即使是高度有經(jīng)驗(yàn)的人也可以通過(guò)有意識(shí)的努力來(lái)提高自己的能力” (p. 366) 和 “最有效的學(xué)習(xí)需要因人而異的適當(dāng)難度嘹吨,目標(biāo)明確的任務(wù)搬味,豐富的信息反饋,以及重復(fù)的機(jī)會(huì)和錯(cuò)誤修正蟀拷∨鑫常” (p. 20-21) 此書 Cognition in Practice: Mind,Mathematics问芬,and Culture in Everyday Life 是闡明此觀點(diǎn)的令人感興趣的參考文獻(xiàn)悦析。
如果愿意,在大學(xué)里呆上4年或更長(zhǎng)(在研究生院里)愈诚。你會(huì)接觸到一些需要學(xué)歷證明的工作她按,你會(huì)對(duì)此領(lǐng)域有更深的理解牛隅。如果你不喜歡學(xué)校炕柔,你可以(通過(guò)一些貢獻(xiàn))在工作中獲得相似的經(jīng)驗(yàn)。在任何情況下媒佣,光啃書本是不夠的匕累。Eric Raymond,The New Hacker’s Dictionary一書的作者默伍,說(shuō)過(guò)欢嘿,“計(jì)算機(jī)科學(xué)不能把任何人變成編程專家,就象光研究刷子和顏料不會(huì)使人變成畫家一樣也糊×侗模” 我雇傭過(guò)的最好的程序員之一僅有高中程度;他做出了許多優(yōu)秀的 軟件狸剃,有他自己的新聞組掐隐,而且通過(guò)股票期權(quán),他無(wú)疑比我富有的多钞馁。
和其他程序員一起做項(xiàng)目虑省。在其中的一些項(xiàng)目中作為最好的程序員; 而在另一些項(xiàng)目中是最差的僧凰。當(dāng)你是最好的探颈,你能測(cè)試領(lǐng)導(dǎo)項(xiàng)目的能力,用你的觀點(diǎn)激發(fā)別人训措。當(dāng)你是最差的伪节,你學(xué)習(xí)杰出者是怎么做的光羞,了解他們不喜歡做什么(因?yàn)樗麄兎愿滥阕鍪拢?/p>
在其他程序員 之后接手項(xiàng)目。使自己理解別人寫的程序怀大。當(dāng)程序的原作者不在的時(shí)候狞山,研究什么需要理解并且修改它。思考如何設(shè)計(jì)你的程序以便后來(lái)者的維護(hù)叉寂。
學(xué)習(xí)至少半打的編程語(yǔ)言萍启。包括一種支持類抽象的語(yǔ)言(象Java 或C++),一種支持函數(shù)化抽象的語(yǔ)言(象Lisp或ML)屏鳍,一種支持語(yǔ)法抽象的語(yǔ)言(象 Lisp)勘纯,一種支持聲明規(guī)格說(shuō)明的語(yǔ)言(象Prolog或C++ 的模板),一種支持共行程序(coroutine)的語(yǔ)言(象Icon或Scheme)钓瞭,一種支持并行的語(yǔ)言(象Sisal)驳遵。
請(qǐng)記住“計(jì)算機(jī)科學(xué)”中有“計(jì)算機(jī)”一詞。了解你的計(jì)算機(jī)要花多長(zhǎng)時(shí)間執(zhí)行一條指令山涡,從內(nèi)存中取一個(gè)字(有cache)堤结,從磁盤中讀取連續(xù)的字,和在磁盤中找到新的位置鸭丛。(答案)
參與一種語(yǔ)言標(biāo)準(zhǔn)化的工作竞穷。它可以是ANSI C++委員會(huì),也可以是決定你周圍小范圍內(nèi)的編程風(fēng)格是應(yīng)該兩個(gè)還是四個(gè)空格縮進(jìn)鳞溉。通過(guò)任何一種方式瘾带,你了解到其他人在某種語(yǔ)言中的想法,他們的理解深度熟菲,甚至一些他們這樣想的原因看政。
找到適當(dāng)?shù)睦碛杀M快地從語(yǔ)言標(biāo)準(zhǔn)化的努力中脫身。
明白了這些抄罕,僅從書本中你能得到多少就成了一個(gè)問(wèn)題允蚣。在我第一個(gè)孩子出生前,我讀了所有的(關(guān)于育兒的)How to 書籍呆贿,仍然感覺(jué)是個(gè)手足無(wú)措的新手嚷兔。30個(gè)月以后,我的第二個(gè)孩子快要出生了榨崩,我回頭溫習(xí)這些書了嗎谴垫? 沒(méi)有。相反母蛛,我依靠我的個(gè)人經(jīng)驗(yàn)翩剪,它比專家寫的數(shù)千頁(yè)書更有用和可靠。
Fred Brooks在他的隨筆 《沒(méi)有銀彈》 中定出了一個(gè)尋找優(yōu)秀軟件設(shè)計(jì)者的三步計(jì)劃:
盡可能早地彩郊,有系統(tǒng)地識(shí)別頂級(jí)的設(shè)計(jì)人員前弯。
為設(shè)計(jì)人員指派一位職業(yè)導(dǎo)師蚪缀,負(fù)責(zé)他們技術(shù)方面的成長(zhǎng),仔細(xì)地為他們規(guī)劃職業(yè)生涯恕出。
為成長(zhǎng)中的設(shè)計(jì)人員提供相互交流和學(xué)習(xí)的機(jī)會(huì)询枚。
此計(jì)劃假設(shè)某些人已經(jīng)具備了杰出設(shè)計(jì)者的必要才能; 要做的只是如何恰當(dāng)?shù)卣T導(dǎo)他們浙巫。 Alan Perlis 說(shuō)得更簡(jiǎn)明扼要:“每個(gè)人都能被教會(huì)雕刻:對(duì)米開朗其羅而言金蜀,反倒是告訴他哪些事不要做。同樣的道理也適用于優(yōu)秀的程序員的畴≡ǔ”
所以盡管買那本Java的書吧。你可能會(huì)從中學(xué)到點(diǎn)兒東西丧裁。但作為一個(gè)程序員护桦,你不會(huì)在幾天內(nèi)或24小時(shí)內(nèi),哪怕是幾個(gè)月內(nèi)改變你的人生煎娇,或你實(shí)際的水平隔箍。
參考文獻(xiàn)
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine , 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988. 2001年夏天典型的1GHz PC的各種操作要花的時(shí)間
答案
各種操作的計(jì)時(shí)缸血,2001年夏天在一臺(tái)典型的1GHz PC上完成:
執(zhí)行單條指令 1 納秒 = (1/1,000,000,000) 秒
從L1緩存中取一個(gè)word 2 納秒
從主內(nèi)存中取一個(gè)word 10 納秒
從連續(xù)的磁盤位置中取一個(gè)word 200 納秒
從新的磁盤位置中取一個(gè)word(尋址) 8,000,000納秒 = 8毫秒
不少人問(wèn)我涂乌,他們首先該學(xué)哪種編程語(yǔ)言靠欢。沒(méi)有絕對(duì)的答案,不過(guò)請(qǐng)考慮以下幾點(diǎn):
- 用你的朋友的强经。當(dāng)被問(wèn)起“我該用哪種操作系統(tǒng)睡陪,Windows寺渗,Unix匿情,還是Mac?”信殊,我總是回答:“你朋友用什么炬称,你就用什么∥芯校” 你從朋友那能學(xué)到知識(shí)玲躯,這種優(yōu)勢(shì)可以抵銷不同操作系統(tǒng)或語(yǔ)言之間本質(zhì)的差異。也考慮你將來(lái)的朋友:程序員社區(qū) — 你將成為它的一部分如果你繼續(xù)往前走的話鳄乏。你選擇的語(yǔ)言是否有一個(gè)成長(zhǎng)中的社區(qū)跷车,還是人數(shù)不多、即將消亡橱野? 有沒(méi)有書籍朽缴、網(wǎng)站、在線論壇回答你的問(wèn)題水援?你喜歡論壇里的那些人嗎密强?
- Keep it simple, stupid. 象C++和Java這樣的語(yǔ)言是為經(jīng)驗(yàn)豐富的程序員組成的團(tuán)隊(duì)進(jìn)行專業(yè)開發(fā)而設(shè)計(jì)的茅郎,他們專注于代碼運(yùn)行時(shí)的效率。因此或渤,這些語(yǔ)言有些部分非常復(fù)雜系冗。 而你關(guān)注的是如何編程,不需要那些復(fù)雜性薪鹦。你需要的是這樣的語(yǔ)言: 對(duì)單個(gè)的編程新手來(lái)說(shuō)掌敬,它易學(xué)易記。
- 練習(xí)池磁。你偏愛(ài)哪種學(xué)彈鋼琴的方式:通常的交互式的方式涝开,你一按下琴鍵就能聽到音符;還是“批量”模式框仔,你只有彈完整首曲子才能聽到音符舀武?顯然,用交互模式學(xué)習(xí)彈鋼琴更容易些离斩,編程也一樣银舱。堅(jiān)持用交互模式學(xué)習(xí)并使用一種語(yǔ)言。
有了上面的準(zhǔn)則跛梗,我推薦的第一個(gè)編程語(yǔ)言是Python或Scheme寻馏。因人而異,還有其它好的選擇核偿。如果你的年紀(jì)是10歲以下诚欠,你可能更喜歡Alice。關(guān)鍵是你要選擇并開始實(shí)踐漾岳。
附錄:書籍和其它資源
不少人問(wèn)我轰绵,他們?cè)搹氖裁磿蚓W(wǎng)頁(yè)開始學(xué)起。我重申“僅從書本里學(xué)習(xí)是不夠的尼荆∽笄唬” 但我還是推薦:
Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman)可能是最好的計(jì)算機(jī)科學(xué)的入門書,而且它的確把講授編程作為理解計(jì)算機(jī)科學(xué)的一種方法捅儒。但它具有挑戰(zhàn)性液样,會(huì)讓許多通過(guò)其它方式可能成功的人望而卻步。
Scheme: How to Design Programs (Felleisen et al.)是關(guān)于如何用一種優(yōu)美的巧还、函數(shù)化的方式設(shè)計(jì)程序的最好的書之一鞭莽。
Python: Python Programming: An Intro to CS (Zelle)是優(yōu)秀的Python入門指導(dǎo)。
Python: Python.org上有許多在線指導(dǎo)麸祷。
Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) 被視為Abelson & Sussman的當(dāng)代繼承者澎怒。它是對(duì)編程的高層次概念的巡視。涉及的范圍比Abelson & Sussman更廣摇锋,同時(shí)可能更容易學(xué)習(xí)和跟進(jìn)丹拯。 它用了叫做Oz的語(yǔ)言站超,不太知名,卻可以作為學(xué)習(xí)其它語(yǔ)言的基礎(chǔ)乖酬。
腳注
This page also available in Japanese translation thanks to Yasushi Murakawa, in Spanish translation thanks to Carlos Rueda and in German translation thanks to Stefan Ram.
T. Capey points out that the Complete Problem Solver page on Amazon now has the “Teach Yourself Bengali in 21 days” and “Teach Yourself Grammar and Style” books under the “Customers who shopped for this item also shopped for these items” section. I guess that a large portion of the people who look at that book are coming from this page.