十年学会程序设计
這里分享一篇 Peter Norvig的 《十年學(xué)會(huì)程序設(shè)計(jì)》 (Peter Norvig? 系Google研究院主任、美國計(jì)算機(jī)協(xié)會(huì)(ACM)資深會(huì)員(Fellow))。全文如下:
十年學(xué)會(huì)程序設(shè)計(jì)
Peter Norvig (Copyright 2001) 原文網(wǎng)址
為何大家如此匆忙?
走進(jìn)任何一家書店,你會(huì)看到書架上一排不見盡頭的放著如 <7天自學(xué)Java語言> 以及幾天或者幾小時(shí)學(xué)會(huì)Windows, 因特網(wǎng)或者Visual Basic 這類書。我在Amazon 網(wǎng)上書店用一下的方式進(jìn)行高級搜索:
出版年份: 1992以后 書名包括:“天” 和 “學(xué)習(xí)” 或 “自學(xué)”
得到了268條搜索結(jié)果,其中前78條都是計(jì)算機(jī)書(第79條是 30天學(xué)會(huì)孟加拉語)。 我用 “小時(shí)” 代替“天” 作為關(guān)鍵字,得到了神奇般類似的結(jié)果:這次有253本書,前77本是計(jì)算機(jī)書, 第78本是 24小時(shí)自學(xué)語法和寫作風(fēng)格。排名前200的書中有96%是計(jì)算機(jī)書。
由此可見,人們要不就是急著想學(xué)會(huì)計(jì)算機(jī),要不就是計(jì)算機(jī)相比于其他事情太容易學(xué)會(huì)了。比如說把,沒有書是寫在幾天彈奏貝多芬或幾天學(xué)會(huì)量子物理,甚至也沒有幾天學(xué)會(huì)幫小狗打扮這樣的書。
讓我們分析一下 三天學(xué)會(huì)Pascal語言 [英文網(wǎng)頁] 這樣的標(biāo)題表達(dá)了什么意思:
- 學(xué)會(huì):
在 三天內(nèi),你沒有時(shí)間去寫幾個(gè)有意義的程序,或者從成功和失敗中學(xué)到東西。你也沒時(shí)間跟有經(jīng)驗(yàn)的程序員一起工作,所以也無法了解在真正編程是什么樣子。簡短 的說,就學(xué)會(huì)而言,時(shí)間顯然不夠。所以這些書只是浮于表面的熟悉,而不是深刻的理解。如同Alexander Pope 所說,一知半解是危險(xiǎn)的。
- Pascal 語言:
三 天內(nèi)你可能學(xué)會(huì)Pasacl語言的語法(如果你已經(jīng)掌握一個(gè)類似的編程語言),但你無法學(xué)會(huì)如何合理運(yùn)用這些語法。簡言之,如果你是個(gè)Basic 程序員,你可以用Pascal 語言寫出類似Basic 風(fēng)格的程序,但你學(xué)不到Pascal語言的優(yōu)點(diǎn)(還有缺點(diǎn))到底在哪。重點(diǎn)是什么呢? Alan Perlis 曾說: “如果編程語言不能影響你的編程思維,那就不值得去學(xué).” 另一個(gè)可能是,你必須學(xué)會(huì)一點(diǎn)點(diǎn)Pascal語言(或是像VB語言、JavaScript等),因?yàn)槟阈枰F(xiàn)成的工具組合完成特定的工作。不過這個(gè)時(shí)候,你實(shí)際上學(xué)的不是怎么寫程序,而是要學(xué)著如何完成工作。
- 三天
不幸的是三天根本不夠;下面的章節(jié)會(huì)告訴你為什么
十年學(xué)會(huì)程序設(shè)計(jì)
研究者 Hayes, Bloom 的研究表明,在幾乎所有的各種領(lǐng)域,大約要十年才能培養(yǎng)出專業(yè)技能。這些領(lǐng)域包括下西洋棋、音樂作曲、繪畫、鋼琴、游泳、網(wǎng)球,及神經(jīng)心理學(xué)和數(shù)學(xué)拓?fù)鋵W(xué)。似乎沒有真正的捷徑--即便是莫扎特在四歲就展露出音樂天才,在他寫出世界級的音樂之前仍然用了超過十三年的時(shí)間。
再看另一種類型的領(lǐng)域。披頭士樂團(tuán)似乎是在1964年的Ed Sullivan 劇場表演突然地火起來并成為第一樂隊(duì)的。但其實(shí)他們從 1957 年開始,就在利物浦、漢堡等地的小型俱樂部表演。雖然他們很早就顯現(xiàn)強(qiáng)大的吸引力,但他們決定性的成功作品 Sgt Pepper 也到1967年才發(fā)行。Samuel Johnson 則認(rèn)為或許還不止十年才行,他說:任何領(lǐng)域的卓越成就都必須用一生的努力才能取得; 稍微低一點(diǎn)的代價(jià)都是換不到的。Chaucer 則感嘆道: “生命如此短促,學(xué)習(xí)技藝卻要這么地長”
以下是我在編程上成功的秘訣:
- 對編程產(chǎn)生感興趣并因?yàn)闃啡ざ鴮懗绦?。確信你自始至終都能樂在其中,這樣你才愿意將十年光陰投入編程事業(yè).
- 與其他程序員交流;閱讀別人的代碼。這比任何書任何培訓(xùn)都重要。
- 不斷地編寫。 最好的學(xué)習(xí)方法是在實(shí)踐中學(xué)習(xí) 。從技術(shù)角度說,”在特定領(lǐng)域的個(gè)人最高效率并不因?yàn)榻?jīng)驗(yàn)夠多就會(huì)自動(dòng)獲得;但若有意識的通過努力去提升經(jīng)驗(yàn),個(gè)人效率會(huì)變高”(第336頁)而 “高效的學(xué)習(xí)一般需要明確的任務(wù)和因人而異的適當(dāng)難度,以及及時(shí)的反饋和重復(fù)或者修正錯(cuò)誤的機(jī)會(huì)”(20~21頁)Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (實(shí)踐中認(rèn)知:心智、數(shù)學(xué)與日常文化) 是這個(gè)觀點(diǎn)的一本有趣參考書籍。
- 如 果你愿意,你可以去讀四年大學(xué)(或再讀研究生)。這可以讓你滿足一些工作的學(xué)歷要求,同時(shí)也可讓你對這個(gè)領(lǐng)域有更深的認(rèn)識。但如你不喜歡上學(xué),你也能(得 有犧牲)通過工作獲得類似的經(jīng)驗(yàn)。無論如何,只讀書是不夠的?!禢ew Hacker’s Dictionary》的作者Eric Raymond 曾經(jīng)說過: “計(jì)算機(jī)的教育無法讓人成為編程的專家,正如研究畫筆與顏料不能讓人成為專業(yè)畫家一樣.” 一個(gè)在我所有招聘過的人中屬于最優(yōu)秀之一的程序員只有高中畢業(yè),但他寫出很多很棒 的程序,他甚至有自己的新聞組。他獲得的股票期權(quán)使得他可以擁有自己的午夜酒吧.
- 跟其他程序員一起完成項(xiàng)目。在一些項(xiàng)目中成為最好的程序員;在一些中則充當(dāng)最差的一個(gè)。當(dāng)你是最佳的,你要測試自己領(lǐng)導(dǎo)項(xiàng)目的能力,并以你的能力鼓勵(lì)他人。當(dāng)你是最差的,要看看高手做些什么,他們不喜歡做什么 (因?yàn)樗麄儠?huì)叫你去幫他們做).
- 接手別的程序員完成項(xiàng)目。全心投入并理解別人的程序。當(dāng)原作者不在的時(shí)候,看看在理解與修改時(shí)有什么要注意的。想想如何設(shè)計(jì)你的程序使得后來維護(hù)的人容易上手。
- 至 少學(xué)會(huì)六門編程語言。一種要支持類/對象(class abstractions)的語言, 如Java或C++; 一種函數(shù)式(functional abstraction)語言, 如 LISP 或 ML; 一種支持語法抽象(syntactic abstraction) 的語言 如 LISP; 一種聲明式語言, 如Prolog或 C++模版; 一種支持協(xié)同式(coroutines)編程, 如 Icon 或 Scheme; 還有一種支持并行(parallelism)的語言, 如 Sisal.
- 記住在 “計(jì)算機(jī)科學(xué)” 中包括”計(jì)算機(jī)” 這個(gè)詞。要知道你的計(jì)算機(jī)執(zhí)行一條指令需要多久,到內(nèi)存中取一個(gè)字需要多久(緩存是否擊中), 到磁盤讀取連續(xù)的字需要多久,而磁盤的定位又需要多久. (解答見文末)
- 進(jìn)行語言標(biāo)準(zhǔn)化的工作??梢韵袷怯葾NSI C++ 委員會(huì),或由你自己的團(tuán)隊(duì),來決定你們的編碼風(fēng)格,譬如說縮排是2或4個(gè)空格。不管怎樣,你都能學(xué)到別人到底喜歡什么,對語言的感受有多深,甚至能了解到一點(diǎn)他們?yōu)槭裁从羞@樣的感覺。
- 并具備良好的判斷力,也別老糾纏在語言標(biāo)準(zhǔn)化上.
談 了上面所有的想法后,我不禁要問究竟能從書上學(xué)到多少。在第一個(gè)孩子出生前,我讀完了所有的 “怎樣…” 的書,仍覺得自己是個(gè)一無所知的(照顧孩子的)菜鳥。30個(gè)月后,第二個(gè)孩子出世,我要重回這些書好好復(fù)習(xí)么? 不! 取而代之的是,我開始相信自己的個(gè)人經(jīng)驗(yàn)。這些難得的經(jīng)驗(yàn),比專家寫的幾千頁手冊還要有用,而且讓我重新找到了自信.
Fred Brooks (譯注: <人月神話>作者) 在他的文章 沒有銀彈 中指出,發(fā)掘卓越軟體設(shè)計(jì)者的三部曲:
1.盡早盡可能地以系統(tǒng)化的方式發(fā)掘最佳設(shè)計(jì)人員。
2.給有潛力者指派生涯規(guī)劃師,并謹(jǐn)慎地規(guī)劃他們的職業(yè)生涯。
3.提供機(jī)會(huì)給正在成長的程序員,讓他們能相互影響,彼此激勵(lì)。
這里假定了某些人已具備成為卓越設(shè)計(jì)師的必要潛能;工作只是誘導(dǎo)他們前進(jìn)。Alan Perlis 說得更簡潔了,你可以教任何人學(xué)雕塑,但對米開朗基羅而言,要教他的
反倒是有哪些事不要做, 卓越的程序員也一樣。
所以,盡管買那些 Java 書吧!你或許能從中找到點(diǎn)有用的,但是在24小時(shí),幾天或者幾個(gè)月中,這些都不會(huì)改變你的人生,你也不能掌握一個(gè)真正的程序員應(yīng)該具備的真正的綜合的技能。
參考文獻(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.
________________________________
解答:
各種操作的時(shí)間,以2001年夏季,典型配置的 1GHz 個(gè)人計(jì)算機(jī)為標(biāo)準(zhǔn):
| 執(zhí)行單一指令 | 1 納秒 |
| 從L1 高速緩存取一個(gè)字 | 2 納秒 |
| 從內(nèi)存取一個(gè)字 | 10 納秒 |
| 從磁盤取連續(xù)存放的一個(gè)字 | 200 納秒 |
| 磁盤尋址并取字 | 8 毫秒 |
| ? | ? |
________________________________
附錄 I: 語言的選擇
好幾個(gè)人問過我一開始應(yīng)該先學(xué)哪個(gè)計(jì)算機(jī)編程語言,這個(gè)問題沒有唯一的答案,不過選擇的時(shí)候可以從以下的幾個(gè)方面考慮:
- 朋友在用的. 當(dāng) 人們問我:”我該用什么操作系統(tǒng)的時(shí)候”, 我通常的回答是:“用你朋友用的”. 這樣的好處是從朋友那兒學(xué)習(xí)可以彌補(bǔ)復(fù)雜的操作系統(tǒng)差異或者編程語言差異(給你造成的困惑)。這里也要考慮你未來的朋友:如果你一直使用的話,開發(fā)社區(qū)會(huì) 是你的朋友。你選擇了一個(gè)具有有巨大的增長的開發(fā)社區(qū)還是一個(gè)小的快消失的開發(fā)社區(qū)的語言? 它有相關(guān)的書,網(wǎng)站和論壇可以獲取解答么? 你喜歡那些論壇上的人么?
- 保持簡單. 諸如C++和Java 是為那些關(guān)心代碼執(zhí)行效率的有經(jīng)驗(yàn)的大型團(tuán)隊(duì)的開發(fā)人員設(shè)計(jì)的。因此這些語言中有些為這些特殊場合設(shè)計(jì)的部件。你只是關(guān)心編程而不需要關(guān)心復(fù)雜情況。你需要一個(gè)為新學(xué)編程的人設(shè)計(jì)的容易學(xué)習(xí)和理解的語言。
- 實(shí)踐. 什么是學(xué)習(xí)鋼琴的好方法呢? 是一邊聽音一邊彈奏的“交互式” 的方法呢,還是全聽完整首歌然后再彈奏的那種“批處理”方式呢? 很顯然, 交互學(xué)習(xí)的方式能夠讓學(xué)鋼琴變得簡單–這也適用于編程. 選取一種交互式的編程語言并且堅(jiān)持使用.
基于以上的這些標(biāo)準(zhǔn),我對于第一次接觸編程的人推薦 Python 或 Scheme. 但是情況各有不同,或許也有其他的選擇. 如果你不滿10歲,你可能會(huì)喜歡Alice 或者Squeak(年齡大的人或許也喜歡這些). 重要的是在選擇后, 立即開始學(xué)習(xí)和使用.
附錄II: 書和其他資源:
很多人問我該從什么書或者什么網(wǎng)頁開始看起。我重申一句:“僅僅看書是不夠的”,不過我也推薦一下的一些:
- Scheme: 計(jì)算機(jī)程序的結(jié)構(gòu)和釋義 (Abelson & Sussman) 可能是計(jì)算機(jī)科學(xué)最好的導(dǎo)論了, 他還告訴程序員怎么理解計(jì)算機(jī)科學(xué), 你可以訪問這本書的 在線視頻講座 和 全文在線. 這本書也很有挑戰(zhàn)性,可能會(huì)排除掉一些可能在其他領(lǐng)域成功的人.
- Scheme: 怎樣設(shè)計(jì)程序(Felleisen 等) 是講解怎樣設(shè)計(jì)優(yōu)雅的函數(shù)式語言的最好的書之一.
- Python: Python 編程,面向計(jì)算機(jī)科學(xué)的導(dǎo)論 (Zelle) 是用Python 介紹計(jì)算機(jī)科學(xué)的好書.
- Python: 一些關(guān)于Python的 入門教程 可以在 Python.org 上找到.
- Oz: 計(jì)算機(jī)編程的概念,技術(shù)和模型(Van Roy & Haridi) 可以視為第一本書的現(xiàn)代版. 他是關(guān)于編程的一些總攬,包含了比第一本書更加廣泛也更加容易閱讀和理解的領(lǐng)域。這本書使用了一個(gè)不太為人所知的編程語言叫 Oz, 不過這個(gè)可以作為學(xué)習(xí)其他編程語言的一個(gè)基礎(chǔ)。
________________________________
注: T. Capey 指出,在Amazon 的 問題徹底解決者 的頁面上購買了這本書的人還買了: “21天學(xué)孟加拉語” 和 “自學(xué)語法和寫作風(fēng)格” 這兩本書,我估計(jì)大部分是我這個(gè)頁面帶過去的用戶.
Peter Norvig (Copyright 2001)
Eric You XU 翻譯,2007年4月
from:?http://blog.csdn.net/shanyou/article/details/5375706
總結(jié)
- 上一篇: 50个网络安全工具
- 下一篇: 160家优秀国外技术公司博客