原文:Teach?Yourself?Programming?in?Ten?Years 作者:Peter?Norvig 翻譯:郭曉剛(foosleeper@163.net) 最后修訂日期:2004-3-19 2005-01-12增加了新的譯本鏈接。
本中文譯本得到了Peter?Norvig的許可。
為什么每個(gè)人都急不可耐? 走進(jìn)任何一家書(shū)店,你會(huì)看見(jiàn)《Teach?Yourself?Java?in?7?Days》(7天Java無(wú)師自通)的旁邊是一長(zhǎng)排看不到盡頭的類(lèi)似書(shū)籍,它們要教會(huì)你Visual?Basic、Windows、Internet等等,而只需要幾天甚至幾小時(shí)。我在Amazon.com上進(jìn)行了如下搜索: pubdate:?after?1992?and?title:?days?and?(title:?learn?or?title:?teach?yourself) (出版日期:1992年后?and?書(shū)名:天?and?(書(shū)名:學(xué)會(huì)?or?書(shū)名:無(wú)師自通)) 我一共得到了248個(gè)搜索結(jié)果。前面的78個(gè)是計(jì)算機(jī)書(shū)籍(第79個(gè)是《Learn?Bengali?in?30?days》,30天學(xué)會(huì)孟加拉語(yǔ))。我把關(guān)鍵詞“days”換成“hours”,得到了非常相似的結(jié)果:這次有253本書(shū),頭77本是計(jì)算機(jī)書(shū)籍,第78本是《Teach?Yourself?Grammar?and?Style?in?24?Hours》(24小時(shí)學(xué)會(huì)文法和文體)。頭200本書(shū)中,有96%是計(jì)算機(jī)書(shū)籍。 結(jié)論是,要么是人們非常急于學(xué)會(huì)計(jì)算機(jī),要么就是不知道為什么計(jì)算機(jī)驚人地簡(jiǎn)單,比任何東西都容易學(xué)會(huì)。沒(méi)有一本書(shū)是要在幾天里教會(huì)人們欣賞貝多芬或者量子物理學(xué),甚至怎樣給狗打扮。 讓我們來(lái)分析一下像《Learn?Pascal?in?Three?Days》(3天學(xué)會(huì)Pascal)這樣的題目到底是什么意思:
- 學(xué)會(huì):在3天時(shí)間里,你不夠時(shí)間寫(xiě)一些有意義的程序,并從它們的失敗與成功中學(xué)習(xí)。你不夠時(shí)間跟一些有經(jīng)驗(yàn)的程序員一起工作,你不會(huì)知道在那樣的環(huán)境中是什么滋味。簡(jiǎn)而言之,沒(méi)有足夠的時(shí)間讓你學(xué)到很多東西。所以這些書(shū)談?wù)摰闹皇潜砻嫔系木ǎ巧钊氲睦斫狻H鏏lexander?Pope(譯注:英國(guó)詩(shī)人、作家,1688-1744)所言,一知半解是危險(xiǎn)的(a?little?learning?is?a?dangerous?thing)。
- Pascal:在3天時(shí)間里你可以學(xué)會(huì)Pascal的語(yǔ)法(如果你已經(jīng)會(huì)一門(mén)類(lèi)似的語(yǔ)言),但你無(wú)法學(xué)到多少如何運(yùn)用這些語(yǔ)法。簡(jiǎn)而言之,如果你是,比如說(shuō)一個(gè)Basic程序員,你可以學(xué)會(huì)用Pascal語(yǔ)法寫(xiě)出Basic風(fēng)格的程序,但你學(xué)不到Pascal真正的優(yōu)點(diǎn)(和缺點(diǎn))。那關(guān)鍵在哪里?Alan?Perlis(譯注:ACM第一任主席,圖靈獎(jiǎng)得主,1922-1990)曾經(jīng)說(shuō)過(guò):“如果一門(mén)語(yǔ)言不能影響你對(duì)編程的想法,那它就不值得去學(xué)”。另一種觀點(diǎn)是,有時(shí)候你不得不學(xué)一點(diǎn)Pascal(更可能是Visual?Basic和JavaScript之類(lèi))的皮毛,因?yàn)槟阈枰佑|現(xiàn)有的工具,用來(lái)完成特定的任務(wù)。但此時(shí)你不是在學(xué)習(xí)如何編程,你是在學(xué)習(xí)如何完成任務(wù)。
- 3天:不幸的是,這是不夠的,正如下一節(jié)所言。
10年編程無(wú)師自通 一些研究者(Hayes、Bloom)的研究表明,在許多領(lǐng)域,都需要大約10?年時(shí)間才能培養(yǎng)出專(zhuān)業(yè)技能,包括國(guó)際象棋、作曲、繪畫(huà)、鋼琴、游泳、網(wǎng)球,以及神經(jīng)心理學(xué)和拓?fù)鋵W(xué)的研究。似乎并不存在真正的捷徑:即使是莫扎特,他4?歲就顯露出音樂(lè)天才,在他寫(xiě)出世界級(jí)的音樂(lè)之前仍然用了超過(guò)13年時(shí)間。再看另一種音樂(lè)類(lèi)型的代表--披頭士,他們似乎是在1964年的Ed?Sullivan節(jié)目中突然冒頭的。但其實(shí)他們從1957年就開(kāi)始表演了,即使他們很早就顯示出了巨大的吸引力,他們第一次真正的成功之作《Sgt.?Peppers》也要到1967年才發(fā)行。Samuel?Johnson(譯注:英國(guó)詩(shī)人)認(rèn)為10?年還是不夠的:“任何領(lǐng)域的卓越成就都只能通過(guò)一生的努力來(lái)獲得;稍低一點(diǎn)的代價(jià)也換不來(lái)。”(Excellence?in?any?department?can?be?attained?only?by?the?labor?of?a?lifetime;?it?is?not?to?be?purchased?at?a?lesser?price.)?喬叟(譯注:Chaucer,英國(guó)詩(shī)人,1340-1400)也抱怨說(shuō):“生命如此短暫,掌握技藝卻要如此長(zhǎng)久。”(the?lyf?so?short,?the?craft?so?long?to?lerne.) 下面是我在編程這個(gè)行當(dāng)里獲得成功的處方:
- 對(duì)編程感興趣,因?yàn)闃?lè)趣而去編程。確定始終都能保持足夠的樂(lè)趣,以致你能夠?qū)?0年時(shí)間投入其中。
- 跟其他程序員交談;閱讀其他程序。這比任何書(shū)籍或訓(xùn)練課程都更重要。
- 編程。最好的學(xué)習(xí)是從實(shí)踐中學(xué)習(xí)。用更加技術(shù)性的語(yǔ)言來(lái)講,“個(gè)體在特定領(lǐng)域最高水平的表現(xiàn)不是作為長(zhǎng)期的經(jīng)驗(yàn)的結(jié)果而自動(dòng)獲得的,但即使是非常富有經(jīng)驗(yàn)的個(gè)體也可以通過(guò)刻意的努力而提高其表現(xiàn)水平。”(p.?366),而且“最有效的學(xué)習(xí)要求為特定個(gè)體制定適當(dāng)難度的任務(wù),有意義的反饋,以及重復(fù)及改正錯(cuò)誤的機(jī)會(huì)。”(p.?20-21)《Cognition?in?Practice:?Mind,?Mathematics,?and?Culture?in?Everyday?Life》(在實(shí)踐中認(rèn)知:心智、數(shù)學(xué)和日常生活的文化)是關(guān)于這個(gè)觀點(diǎn)的一本有趣的參考書(shū)。
- 如果你愿意,在大學(xué)里花上4年時(shí)間(或者再花幾年讀研究生)。這能讓你獲得一些工作的入門(mén)資格,還能讓你對(duì)此領(lǐng)域有更深入的理解,但如果你不喜歡進(jìn)學(xué)校,(作出一點(diǎn)犧牲)你在工作中也同樣能獲得類(lèi)似的經(jīng)驗(yàn)。在任何情況下,單從書(shū)本上學(xué)習(xí)都是不夠的。“計(jì)算機(jī)科學(xué)的教育不會(huì)讓任何人成為內(nèi)行的程序員,正如研究畫(huà)筆和顏料不會(huì)讓任何人成為內(nèi)行的畫(huà)家”,Eric?Raymond,《The?New?Hacker's?Dictionary》(新黑客字典)的作者如是說(shuō)。我曾經(jīng)雇用過(guò)的最優(yōu)秀的程序員之一僅有高中學(xué)歷;但他創(chuàng)造出了許多偉大的軟件,甚至有討論他本人的新聞組,而且股票期權(quán)讓他達(dá)到我無(wú)法企及的富有程度(譯注:指Jamie?Zawinski,XEmacs和Netscape?Navigator的作者)。
- 跟別的程序員一起完成項(xiàng)目。在一些項(xiàng)目中成為最好的程序員;在其他一些項(xiàng)目中當(dāng)最差的一個(gè)。當(dāng)你是最好的程序員時(shí),你要測(cè)試自己領(lǐng)導(dǎo)項(xiàng)目的能力,并通過(guò)你的洞見(jiàn)鼓舞其他人。當(dāng)你是最差的時(shí)候,你學(xué)習(xí)高手們?cè)谧鲂┦裁矗约八麄儾幌矚g做什么(因?yàn)樗麄冏屇銕退麄冏瞿切┦拢?br />
- 接手別的程序員完成項(xiàng)目。用心理解別人編寫(xiě)的程序。看看在沒(méi)有最初的程序員在場(chǎng)的時(shí)候理解和修改程序需要些什么。想一想怎樣設(shè)計(jì)你的程序才能讓別人接手維護(hù)你的程序時(shí)更容易一些。
- 學(xué)會(huì)至少半打編程語(yǔ)言。包括一門(mén)支持類(lèi)抽象(class?abstraction)的語(yǔ)言(如Java或C++),一門(mén)支持函數(shù)抽象(functional?abstraction)的語(yǔ)言(如Lisp或ML),一門(mén)支持句法抽象(syntactic?abstraction)的語(yǔ)言(如Lisp),一門(mén)支持說(shuō)明性規(guī)約(declarative?specification)的語(yǔ)言(如Prolog或C++模版),一門(mén)支持協(xié)程(coroutine)的語(yǔ)言(如Icon或Scheme),以及一門(mén)支持并行處理(parallelism)的語(yǔ)言(如Sisal)。
- 記住在“計(jì)算機(jī)科學(xué)”這個(gè)詞組里包含“計(jì)算機(jī)”這個(gè)詞。了解你的計(jì)算機(jī)執(zhí)行一條指令要多長(zhǎng)時(shí)間,從內(nèi)存中取一個(gè)word要多長(zhǎng)時(shí)間(包括緩存命中和未命中的情況),從磁盤(pán)上讀取連續(xù)的數(shù)據(jù)要多長(zhǎng)時(shí)間,定位到磁盤(pán)上的新位置又要多長(zhǎng)時(shí)間。(答案在這里。)
- 嘗試參與到一項(xiàng)語(yǔ)言標(biāo)準(zhǔn)化工作中。可以是ANSI?C++委員會(huì),也可以是決定自己團(tuán)隊(duì)的編碼風(fēng)格到底采用2個(gè)空格的縮進(jìn)還是4個(gè)。不論是哪一種,你都可以學(xué)到在這門(mén)語(yǔ)言中到底人們喜歡些什么,他們有多喜歡,甚至有可能稍微了解為什么他們會(huì)有這樣的感覺(jué)。
- 擁有盡快從語(yǔ)言標(biāo)準(zhǔn)化工作中抽身的良好判斷力。
抱著這些想法,我很懷疑從書(shū)上到底能學(xué)到多少東西。在我第一個(gè)孩子出生前,我讀完了所有“怎樣……”的書(shū),卻仍然感到自己是個(gè)茫無(wú)頭緒的新手。30個(gè)月后,我第二個(gè)孩子出生的時(shí)候,我重新拿起那些書(shū)來(lái)復(fù)習(xí)了嗎?不。相反,我依靠我自己的經(jīng)驗(yàn),結(jié)果比專(zhuān)家寫(xiě)的幾千頁(yè)東西更有用更靠得住。 Fred?Brooks在他的短文《No?Silver?Bullets》(沒(méi)有銀彈)中確立了如何發(fā)現(xiàn)杰出的軟件設(shè)計(jì)者的三步規(guī)劃:
- 盡早系統(tǒng)地識(shí)別出最好的設(shè)計(jì)者群體。
- 指派一個(gè)事業(yè)上的導(dǎo)師負(fù)責(zé)有潛質(zhì)的對(duì)象的發(fā)展,小心地幫他保持職業(yè)生涯的履歷。
- 讓成長(zhǎng)中的設(shè)計(jì)師們有機(jī)會(huì)互相影響,互相激勵(lì)。
這實(shí)際上是假定了有些人本身就具有成為杰出設(shè)計(jì)師的必要潛質(zhì);要做的只是引導(dǎo)他們前進(jìn)。Alan?Perlis說(shuō)得更簡(jiǎn)潔:“每個(gè)人都可以被教授如何雕塑;而對(duì)米開(kāi)朗基羅來(lái)說(shuō),能教給他的倒是怎樣能夠不去雕塑。杰出的程序員也一樣”。 所以盡管去買(mǎi)那些Java書(shū);你很可能會(huì)從中找到些用處。但你的生活,或者你作為程序員的真正的專(zhuān)業(yè)技術(shù),并不會(huì)因此在24小時(shí)、24天甚至24個(gè)月內(nèi)發(fā)生真正的變化。
參考文獻(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.?
答案 各種操作的計(jì)時(shí),2001年夏天在一臺(tái)典型的1GHz?PC上完成: 執(zhí)行單條指令 1?納秒?=?(1/1,000,000,000)?秒 從L1緩存中取一個(gè)word 2?納秒 從主內(nèi)存中取一個(gè)word 10?納秒 從連續(xù)的磁盤(pán)位置中取一個(gè)word 200?納秒 從新的磁盤(pán)位置中取一個(gè)word(尋址) 8,000,000納秒?=?8毫秒
腳注 T.?Capey指出Amazon上面《Complete?Problem?Solver》的頁(yè)面中,《Teach?Yourself?Bengali?in?21?days》和《Teach?Yourself?Grammar?and?Style》被列在了“購(gòu)買(mǎi)此書(shū)的顧客還買(mǎi)了以下書(shū)籍”欄目里面。我猜其中一大部分察看這兩本書(shū)的人都是從我這里過(guò)去的。
譯本 感謝以下作者將本文翻譯成其他語(yǔ)言: 日文(Yasushi?Murakawa),中文(郭曉剛),繁體中文(Jason?Chen),西班牙文(Carlos?Rueda),德文(Stefan?Ram),法文(P.?E.?Allary),土耳其文(?a??l?Ulu?ahin)。
Peter?Norvig?(Copyright?2001)
|
|