Pages

搜尋網誌

Sunday, July 6, 2014

[轉載] 10年自學程式設計 (Teach Yourself Programming in Ten Years)

作者:Peter Norvig (Copyright 2001)
原文:http://www.norvig.com/21-days.html
譯稿:2005/01

內文

為何人人都如此匆忙?

  走進任何一家書店,你常常會看到像《Teach Yourself Java in 7 Days》這類的書,擺滿了長長一排的書櫃。這些並排的書還有 Windows 作業系統、網際網路、Visual Basic 等,有些甚至強調只要幾天甚至幾個小時。

  我在亞馬遜網路書店,以下列關鍵字,進行條件搜尋:

出版年限:1922 以後 AND 書名:days AND (書名:learn OR 書名:Teach Yourself)

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

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

讓我們分析像《Learn Pascal in 3 Days》這樣書名想傳達什麼意旨:


▊學會

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

▊Pascal 語言

  三天內你或許可以學會 Pascal 語言的語法 (如果你已經學過一個類似的程式語言),但是你無法學會如何妥善運用。簡言之,如果你是個 Basic 程式設計師,你可以用 Pascal 語言寫出類似 Basic 語言風格的程式,但你學不到 Pascal 語言的優點 (還有缺點)。那麼重點究竟是什麼?Alan Perlis 曾說:「如果電腦語言不能影響你寫程式時的思維,那就不值得去學。」

  另一個可能的觀點是,你必須學會一點點 Pascal 語言(或是像 Visual Basic、Java Script),因為你需要跟現成的工具配合,用它來完成特定的工作。不過這個時候,你可不是在學怎麼寫程式,而是要學會完成工作

▊三天

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

十年自學程式設計

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

  再看另一種類型的代表,披頭四樂團,他們似乎是在 1964 年的 Ed Sullivan 劇場表演,突然地成為熱門樂團首席。其實他們從 1957 年開始,就在利物浦、漢堡等地的小型俱樂部表演了。雖然他們很早就顯現強大的吸引力,但是他們具決定性的成功作品《Sgt. Peppers》也要到 1967 年才首次發行。

  Samuel Johnson 則認為十年根本不夠:「任何領域的卓越成就,只能用一生的努力才能取得;稍微低一點的代價是換不到的。」喬瑟抱怨說:「生命如此短促,學習技藝卻要如此地長。」

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

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

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

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

 而「最有效的學習需要,定義明確的任務,特定人則有其相應難度,能增進知識的回饋,還有重複及修正錯誤的機會。」

▊如果你想,你可以去讀四年大學 (或再讀研究所)。這是你找工作時所需的資格,同時也可讓你對這個領域有更深的認識。但如你不喜歡學校,你還是可以 (得有犧牲) 透過工作獲得類似的經驗。

 就任何情況來說,只從書本上學是不夠的。「電腦科學的教育無法讓人成為程式設計的專家,正如研究畫筆跟顏料,也不會讓人成為專業畫家。」Eric Raymond,《新駭客辭典》的作者這麼說。

 我曾聘請一個優秀的程式設計師,他只有高中畢業,但他寫出一堆很棒的軟體,他還擁有他自己的新聞群組。毫無疑問的,股票選擇權讓他變得富有,他的財力甚至遠高過我。

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

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

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

▊記住在『電腦科學』中包括電腦這個詞。要知道你的電腦執行一條指令需時多久,到記憶體中取一個字組需時多久 (快取內有無資料的情形),到磁碟機讀取邏輯相連的字組需時多久,而磁碟的定位又需要多久 (http://www.norvig.com/21-days.html#answers)。

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

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

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

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

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

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