十年學會程序設計

轉自徐宥博客:http://blog.youxu.info/fyi/21-days/

十年學會程序設計

Peter Norvig (Copyright 2001) 原文網址


爲何大家如此匆忙?

走進任何一家書店,你會看到書架上一排不見盡頭的放着如 <7天自學Java語言> 以及幾天或者幾小時學會Windows, 因特網或者Visual Basic 這類書。我在Amazon 網上書店用一下的方式進行高級搜索 :

出版年份: 1992以後 書名包括:“天” 和 “學習” 或 “自學”

得到了268條搜索結果,其中前78條都是計算機書(第79條是 30天學會孟加拉語 )。 我用 “小時 ” 代替“天” 作爲關鍵字,得到了神奇般類似的結果:這次有253本書,前77本是計算機書, 第78本是 24小時自學語法和寫作風格 。排名前200的書中有96%是計算機書。

由此可見,人們要不就是急着想學會計算機,要不就是計算機相比於其他事情太容易學會了。比如說把,沒有書是寫在幾天彈奏貝多芬或幾天學會量子物理, 甚至也沒有幾天學會幫小狗打扮這樣的書。

讓我們分析一下 三天學會Pascal語言 [英文網頁] 這樣的標題表達了什麼意思:

  • 學會:

在 三天內,你沒有時間去寫幾個有意義的程序,或者從成功和失敗中學到東西。你也沒時間跟有經驗的程序員一起工作,所以也無法瞭解在真正編程是什麼樣子。簡短 的說,就學會而言,時間顯然不夠。所以這些書只是浮於表面的熟悉,而不是深刻的理解。如同Alexander Pope 所說,一知半解是危險的

  • Pascal 語言:

三 天內你可能學會Pasacl語言的語法(如果你已經掌握一個類似的編程語言),但你無法學會如何合理運用這些語法。簡言之,如果你是個Basic 程序員,你可以用Pascal 語言寫出類似Basic 風格的程序,但你學不到Pascal語言的優點(還有缺點)到底在哪。重點是什麼呢? Alan Perlis 曾說: “如果編程語言不能影響你的編程思維,那就不值得去學 .” 另一個可能是,你必須學會一點點Pascal語言(或是像VB語言、Javascript等),因爲你需要跟現成的工具組合完成特定的工作。不過這個時 候,你實際上學的不是怎麼寫程序,而是要學着如何完成工作。

  • 三天

不幸的是三天根本不夠;下面的章節會告訴你爲什麼

十年學會程序設計

研究者 Hayes , Bloom 的研究表明,在幾乎所有的各種領域,大約要十年 才能培養出專業技能。這些領域包括下西洋棋、音樂作曲、繪畫、鋼琴、游泳、網球,及神經心理學和數學拓撲 學。似乎沒有真正的捷徑--即便是莫扎特在四歲就展露出音樂天才,在他寫出世界級的音樂之前仍然用了超過十三年的時間。

再看另一種類型的領域。披頭士樂團似乎是在1964年的Ed Sullivan 劇場表演突然地火起來併成爲第一樂隊的。但其實他們從 1957 年開始,就在利物浦、漢堡等地的小型俱樂部表演。雖然他們很早就顯現強大的吸引力,但他們決定性的成功作品 Sgt Pepper 也到1967年才發行。Samuel Johnson 則認爲或許還不止十年才行,他說:任何領域的卓越成就都必須用一生的努力才能取得; 稍微低一點的代價都是換不到的。Chaucer 則感嘆道: “生命如此短促,學習技藝卻要這麼地長”

以下是我在編程上成功的祕訣:

  • 對編程產生興趣並因爲樂趣而寫程序 。確信你自始至終都能樂在其中,這樣你才願意將十年光陰投入編程事業.
  • 與其他程序員交流;閱讀別人的代碼 。這比任何書任何培訓都重要。
  • 不斷地編寫。 最好的學習方法是在實踐中學習 。從技術角度說,”在特定領域的個人最高效率並不因爲經驗夠多就會自動獲得;但若有意識的通過努力去提升經驗,個人效率會變高”(第336頁 )而 “高效的學習一般需要明確的任務和因人而異的適當難度,以及及時的反饋和重複或者修正錯誤的機會”(20~21頁)Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life實踐中認知:心智、數學與日常文化 ) 是這個觀點的一本有趣參考書籍。
  • 如果你願意,你可以去讀四年大學(或再讀研究生)。這可以讓你滿足一些工作的學歷要求,同時也可讓你對這個領域有更深的認識。但如你不喜歡上學,你也能(得 有犧牲)通過工作獲得類似的經驗。無論如何,只讀書是不夠的。《New Hacker’s Dictionary》的作者Eric Raymond 曾經說過: “計算機的教育無法讓人成爲編程的專家,正如研究畫筆與顏料不能讓人成爲專業畫家一樣.” 一個在我所有招聘過的人中屬於最優秀之一的程序員只有高中畢業,但他寫出很多很棒程序 ,他 甚至有自己的新聞組 。他獲得的股票期權使得他可以擁有自己的午夜酒吧 .
  • 跟其他程序員一起完成項目。在一些項目中成爲最好的程序員;在一些中則充當最差的一個。當你是最佳的,你要測試自己領導項目的能力,並以你的能力 鼓勵他人。當你是最差的,要看看高手做些什麼,他們不喜歡做什麼 (因爲他們會叫你去幫他們做).
  • 接手別的程序員完成項目。全心投入並理解別人的程序。當原作者不在的時候,看看在理解與修改時有什麼要注意的。想想如何設計你的程序使得後來維護 的人容易上手。
  • 至少學會六門編程語言。一種要支持類/對象(class abstractions)的語言, 如Java或C++; 一種函數式(functional abstraction)語言, 如 LISP 或 ML; 一種支持語法抽象(syntactic abstraction) 的語言 如 LISP; 一種聲明式語言, 如Prolog或 C++模版; 一種支持協同式(coroutines)編程, 如 Icon 或 Scheme; 還有一種支持並行(parallelism)的語言, 如 Sisal.
  • 記住在 “計算機科學” 中包括”計算機” 這個詞。要知道你的計算機執行一條指令需要多久,到內存中取一個字需要多久(緩存是否擊中), 到磁盤讀取連續的字需要多久,而磁盤的定位又需要多久. (解答見文末)
  • 進行語言標準化的工作。可以像是由ANSI C++ 委員會,或由你自己的團隊,來決定你們的編碼風格,譬如說縮排是2或4個空格。不管怎樣,你都能學到別人到底喜歡什麼,對語言的感受有多深,甚至能瞭解到 一點他們爲什麼有這樣的感覺。
  • 並具備良好的判斷力,也別老糾纏在語言標準化上.

談 了上面所有的想法後,我不禁要問究竟能從書上學到多少。在第一個孩子出生前,我讀完了所有的 “怎樣…” 的書,仍覺得自己是個一無所知的(照顧孩子的)菜鳥。30個月後,第二個孩子出世,我要重回這些書好好複習麼? 不! 取而代之的是,我開始相信自己的個人經驗。這些難得的經驗,比專家寫的幾千頁手冊還要有用,而且讓我重新找到了自信.

Fred Brooks (譯註: <人月神話>作者) 在他的文章 沒有銀彈 中指出,發掘卓越軟體設計者的三部曲:

1.儘早儘可能地以系統化的方式發掘最佳設計人員。
2.給有潛力者指派生涯規劃師,並謹慎地規劃他們的職業生涯。
3.提供機會給正在成長的程序員,讓他們能相互影響,彼此激勵。

這裏假定了某些人已具備成爲卓越設計師的必要潛能;工作只是誘導他們前進。Alan Perlis 說得更簡潔了,你可以教任何人學雕塑,但對米開朗基羅而言,要教他的反倒是有哪些事不要做, 卓越的程序員也一樣。

所以,儘管買那些 Java 書吧!你或許能從中找到點有用的,但是在24小時,幾天或者幾個月中,這些都不會改變你的人生,你也不能掌握一個真正的程序員應該具備的真正的綜合的技 能。


參考文獻:

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 個人計算機爲標準:

執行單一指令 1 納秒
從L1 高速緩存取一個字 2 納秒
從內存取一個字 10 納秒
從磁盤取連續存放的一個字 200 納秒
磁盤尋址並取字 8 毫秒

________________________________

附錄 I: 語言的選擇

好幾個人問過我一開始應該先學哪個計算機編程語言,這個問題沒有唯一的答案,不過選擇的時候可以從以下的幾個方面考慮:

  • 朋友在用的. 當 人們問我:”我該用什麼操作系統的時候”, 我通常的回答是:“用你朋友用的”. 這樣的好處是從朋友那兒學習可以彌補複雜的操作系統差異或者編程語言差異(給你造成的困惑)。這裏也要考慮你未來的朋友:如果你一直使用的話,開發社區會是你的朋友。你選擇了一個具有有巨大的增長的開發社區還是一個小的快消失的開發社區的語言? 它有相關的書,網站和論壇可以獲取解答麼? 你喜歡那些論壇上的人麼?
  • 保持簡單 . 諸如C++和Java 是爲那些關心代碼執行效率的有經驗的大型團隊的開發人員設計的。因此這些語言中有些爲這些特殊場合設計的部件。你只是關心編程而不需要關心複雜情況。你需要一個爲新學編程的人設計的容易學習和理解的語言
  • 實踐 . 什麼是學習鋼琴的好方法呢? 是一邊聽音一邊彈奏的“交互式” 的方法呢,還是全聽完整首歌然後再彈奏的那種“批處理”方式呢? 很顯然, 交互學習的方式能夠讓學鋼琴變得簡單–這也適用於編程. 選取一種交互式的編程語言並且堅持使用.

基於以上的這些標準,我對於第一次接觸編程的人推薦 Python 或 Scheme . 但是情況各有不同,或許也有其他的選擇. 如果你不滿10歲,你可能會喜歡Alice 或者Squeak(年齡大的人或許也喜歡這些). 重要的是在選擇後, 立即開始學習和使用 .

附錄II: 書和其他資源:

很多人問我該從什麼書或者什麼網頁開始看起。我重申一句:“僅僅看書是不夠的”,不過我也推薦一下的一些:

  • Oz: 計算機編程的概念,技術和模型(Van Roy & Haridi) 可以視爲第一本書的現代版. 他是關於編程的一些總攬,包含了比第一本書更加廣泛也更加容易閱讀和理解的領域。這本書使用了一個不太爲人所知的編程語言叫 Oz, 不過這個可以作爲學習其他編程語言的一個基礎。

________________________________

注: T. Capey 指出,在Amazon 的 問題徹底解決者 的頁面上購買了這本書的人還買了: “21天學孟加拉語” 和 “自學語法和寫作風格” 這兩本書,我估計大部分是我這個頁面帶過去的用戶.

Peter Norvig (Copyright 2001)

Eric You XU 翻譯,2007年4月


譯者附記:

這是一篇經典的揭示計算機學習和計算機編程領域浮躁苗頭的文章。原有的中文翻譯鏈接已經失效,因此特此重新翻譯一次。在翻譯的過程中,我參考了臺灣網友 的 部分遣詞造句以及個別我不能理解的句子的含義,特此向他表示感謝.

如果有什麼地方因爲個人水平疏漏翻譯不到或者打字錯誤的地方,懇請網友不吝指出。 我的郵件地址是 youxu A@T wustl.edu, 把 A@T 換成 @, 我叫Eric You XU, 你可以直接叫我Eric.

發佈了51 篇原創文章 · 獲贊 0 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章