星期四, 3月 01, 2007

[carrier] 十年自學程式設計

十年自學程式設計

本文簡介

作者:Peter Norvig (Copyright 2001)
原文:原文網址
譯稿:2005/01

內文
為何人人都如此匆忙?

  走進任何一家書店,你會看到如《7天自學爪哇語言》這類的書,擺了長長一排幾乎看不到盡頭。這些並排的書還有視窗作業系統、網際網路、視覺化培基語言等。有些甚至強調只要幾天甚至幾個小時。我在亞馬遜網路書店,以下列關鍵字,進行條件交叉的強力搜尋:
  出版年限:1992以後 且 書名:天數 且 書名:學習 或 書名:自學

  我找到了248個條件相符的結果。前78個是電腦書(排第79的是《30天學會孟加拉語》)。我把關鍵詞『天數』換成了『小時』,得到近似的結果;這次有253本,前77本是電腦書籍,第78本是《24小時自學文法與風格》。排名前200本書中,有96%是電腦書籍。

  我得到的結論是,人們要不是急著想學會電腦,就是電腦太簡單了,比其他事物都要容易學得會。沒有一本書是要在幾天裏,就教會如何欣賞貝多芬或量子物理學,甚至是幫狗兒打扮。

  讓我們分析像《三天學會巴斯卡語言》這樣書名想傳達什麼意旨:

◎學會
  在三天內,你沒有時間去寫幾支有意義的程式,並從其中領略對與錯。你也沒時間跟有經驗的程式師一塊兒工作,所以你無法瞭解在那種環境下的實際情形。簡單來說,就學習而言,時間根本不夠用。所以這些書只能談談表面的『精通』,而不是深度的認知。如同亞歷山大˙蒲柏所言:「一知半解是件危險的事。」

◎巴斯卡語言
  三天內你或可學會巴斯卡語言的語法(如果你已會一個類似的電腦語言),但你無法學會如何妥善運用。簡言之,如果你是個培基語言程式師,你可以用巴斯卡語言寫出類似培基語言風格的程式,但你學不到巴斯卡語言的優點(還有缺點)。那麼重點宄竟是什麼?艾倫˙柏立士曾說:「如果電腦語言不能影響你寫程式時的思維,那就不值得去學。」

  另一個可能的觀點是,你必須學會一點點巴斯卡語言(或是像視覺化培基語言、爪哇描述語言),因為你需要跟現成的工具配合,用它來完成特定的工作。不過這個時候,你可不是在學怎麼寫程式,而是要學會完成工作。

◎三天
  很不幸,這根本不夠;在下節我會告訴你的。


十年自學程式設計
  研究學者(海斯布盧姆)的研究說明,在許多領域,大約十年才能培養出專業技能;包括下西洋棋、作曲、繪畫、鋼琴演奏、游泳、網球,及神經心理學和數學拓撲的研究。似乎沒有真正的捷徑;即便是莫扎特在四歲就展露出音樂天才,在他寫出世界級的音樂之前仍然用了超過十三年的時間。

  再看另一種類型的代表,披頭四樂團,他們似乎是在1964年的艾德˙蘇利文劇場表演,突然地成為熱門樂團首席。其實他們從1957年開始,就在利物浦、漢堡等地的小型俱樂部表演了。雖然他們很早就顯現強大的吸引力,但他們具決定性的成功作品《胡椒中士》也要到1967年才首次發行。山姆爾˙強森則認為十年根本不夠:「任何領域的卓越成就,只能用一生的努力才能取得;稍微低一點的代價是換不到的。」喬瑟抱怨說:「生命如此短促,學習技藝卻要這麼地長。」

  以下是我在程式設計這個領域獲致成功的秘訣:

˙對程式設計感興趣,因為樂趣而寫程式。確信你自始至終都能樂在其中,這樣你才願意將十年光陰投入。

◎與其他程式師交流;閱讀其他人的程式。這比任何書、任何訓練課程都來得重要。

◎不斷地寫程式。最好的學習方式是做中學。更專業地說,「在特定領域的個人最高績效,並不是經驗夠久就會從天下掉下來;但若個人極具經驗,那麼可以透過有計劃的努力來改進並提昇這種層次的績效。」(第366頁

  而「最有效的學習需要,定義明確的任務,特定人則有其相應難度,能增進知識的回饋,還有重複及修正錯誤的機會。」(第20~21頁)《實踐中認知:心智、數學與日常生活的文化》是這個觀點的一本有趣參考書籍。

◎如果你想,你可以去讀四年大學(或再讀研究所)。這是你找工作時所需的資格,同時也可讓你對這個領域有更深的認識。但如你不喜歡學校,你還是可以(得有犧牲)透過工作獲得類似的經驗。就任何情況來說,只從書本上學是不夠的。「電腦科學的教育無法讓人成為程式設計的專家,正如研究畫筆跟顏料,也不會讓人成為專業畫家。」艾瑞克˙雷蒙,《新駭客辭典》的作者這麼說。

  我曾聘請最優秀的程式師之一,他只有高中畢業;但他寫出一堆很棒軟體,還有他自己的新聞群組。毫無疑問的,股票選擇權讓他變得富有,他的財力令我難以企及。

◎跟其他的程式師一起完成專案。在某些專案成為最佳的程式師;在某些專案中則變成最差的一個。當你是最佳的,你要測試自己領導專案的能力,並以你的真知灼見鼓勵他人。當你是最差的,你要學的是,高手做些什麼,還有他們不喜歡做什麼。(因為他們會叫你去幫他們做。)

◎接手別的程式師完成專案。全心投入並理解別人所寫的程式。當原作者已不在,看看在理解與修改時有什麼要注意的。想想如何設計程式,能讓後來維護的人容易上手。

◎至少學會五、六種程式語言。其中一種要支援類別抽象的語言(如Java或C++),一種支援函數抽象(如Lisp或ML),一種支援語法抽象(如Lisp),一種支援宣告規格(如Prolog或C++樣板),一種支援並行常式(如Icon或Scheme),還有一種支援並行處理(如Sisal)。

◎記住在『電腦科學』中包括電腦這個詞。要知道你的電腦執行一條指令需時多久,到記憶體中取一個字組需時多久(快取內有無資料的情形),到磁碟機讀取邏輯相連的字組需時多久,而磁碟的定位又需要多久。解答在此。

◎參加語言標準化的工作。可以像是ANSI C++委員會,或由你自己的團隊,來決定你們的編碼風格,譬如說縮排是2或4個空格。兩者選一,你都能學到別人到底喜歡什麼,感受有多深,又或許只是稍微瞭解到他們為什麼有這樣的感覺。

◎儘快從語言標準化工作中抽離,並具備良好的判斷力。

  自從有了這些想法,我不禁要問究竟能從書上學到多少。在第一個孩子出生前,我讀完了所有的『怎樣…』的書,仍覺得自己是個一無所知的生手。30個月後,第二個孩子出世,我要重回這些書當個好的複習生嗎?不!相反的,我憑著自己的經驗,重拾自信;這些個人難得的經驗,比專家寫的幾千頁手冊還要有用。

  佛雷德瑞克˙布魯克在他的論說文《沒有銀子彈》中指出,發掘卓越軟體設計者的三
部曲:
  1.儘早儘可能地,以系統化的方式,發掘最佳設計人員。
  2.指派生涯規劃師負責有潛力者的發展,並謹慎地維繫他的生涯規劃。
  3.提供機會,讓設計者能相互影響,彼此激勵,藉以成長。

  這是假定某些人已具備成為卓越設計師的必要潛能;要做的工作只是誘導他們前進。艾倫˙柏立士說得更簡潔了。「你可以教任何人學雕塑,但對米開朗基羅而言,要教他的反倒是有那些事不要做。卓越的程式師也一樣。」

  Java那些書儘管買吧!你或許能從中找到點兒用處。在未來可預見的日子裏,或許是24小時,幾天,甚至是幾個月吧!你都毋需改變你的生活,或做為一個真正的程式師應該具備的全能本領。


參考書目
1.Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
2.Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
3.Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
4.Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

解答
  各種操作的時間,以2001年夏季,具代表性的1GHz個人電腦為標準:
執行單一指令 1奈秒
從L1快取記憶體取一個字組 2奈秒
從主記憶體取一個字組 10奈秒
從連續磁碟位址取一個字組 200奈秒
重定位由磁碟取一個字組(磁碟存取時間) 8百萬奈秒=8毫秒

備註:
  凱伯指出在亞馬遜網站有關《徹底解決問題的人》的網頁中,《21天自學孟加拉語》和《自學文法與風格》二書,被列在『購買此書的顧客也買了以下書籍』區。我猜一大部份看到這兩本書的人,是從這個網頁連過去的。