開發心得分享:10年編程無師自通

來源:互聯網
上載者:User
編程|心得

  原文:Teach Yourself Programming in Ten Years
  作者:Peter Norvig
  翻譯:郭曉剛(foosleeper@163.net
  最後修訂日期:2004-3-19
  2005-01-12增加了新的譯本連結。

  本中文譯本得到了Peter Norvig的許可。

為什麼每個人都急不可耐?

  走進任何一家書店,你會看見《Teach Yourself Java in 7 Days》(7天Java無師自通)的旁邊是一長排看不到盡頭的類似書籍,它們要教會你Visual Basic、Windows、Internet等等,而只需要幾天甚至幾小時。我在Amazon.com上進行了如下搜尋

    pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
    (出版日期:1992年後 and 書名:天 and (書名:學會 or 書名:無師自通))

  我一共得到了248個搜尋結果。前面的78個是電腦書籍(第79個是《Learn Bengali in 30 days》,30天學會孟加拉語)。我把關鍵詞“days”換成“hours”,得到了非常相似的結果:這次有253本書,頭77本是電腦書籍,第78本是《Teach Yourself Grammar and Style in 24 Hours》(24小時學會文法和文體)。頭200本書中,有96%是電腦書籍。

  結論是,要麼是人們非常急於學會電腦,要麼就是不知道為什麼電腦驚人地簡單,比任何東西都容易學會。沒有一本書是要在幾天裡教會人們欣賞貝多芬或者量子物理學,甚至怎樣給狗打扮。

  讓我們來分析一下像《Learn Pascal in Three Days》(3天學會Pascal)這樣的題目到底是什麼意思:

  ·學會:在3天時間裡,你不夠時間寫一些有意義的程式,並從它們的失敗與成功中學習。你不夠時間跟一些有經驗的程式員一起工作,你不會知道在那樣的環境中是什麼滋味。簡而言之,沒有足夠的時間讓你學到很多東西。所以這些書談論的只是表面上的精通,而非深入的理解。如Alexander Pope(譯註:英國詩人、作家,1688-1744)所言,一知半解是危險的(a little learning is a dangerous thing)。

  ·Pascal:在3天時間裡你可以學會Pascal的文法(如果你已經會一門類似的語言),但你無法學到多少如何運用這些文法。簡而言之,如果你是,比如說一個Basic程式員,你可以學會用Pascal文法寫出Basic風格的程式,但你學不到Pascal真正的優點(和缺點)。那關鍵在哪裡?Alan Perlis(譯註:ACM第一任主席,圖靈獎得主,1922-1990)曾經說過:“如果一門語言不能影響你對編程的想法,那它就不值得去學”。另一種觀點是,有時候你不得不學一點Pascal(更可能是Visual Basic和JavaScript之類)的皮毛,因為你需要接觸現有的工具,用來完成特定的任務。但此時你不是在學習如何編程,你是在學習如何完成任務。

  ·3天:不幸的是,這是不夠的,正如下一節所言。

10年編程無師自通

  一些研究者(HayesBloom)的研究表明,在許多領域,都需要大約10 年時間才能培養出專業技能,包括國際象棋、作曲、繪畫、鋼琴、遊泳、網球,以及神經心理學和拓撲學的研究。似乎並不存在真正的捷徑:即使是莫紮特,他4 歲就顯露出音樂天才,在他寫出世界級的音樂之前仍然用了超過13年時間。再看另一種音樂類型的代表--披頭士,他們似乎是在1964年的Ed Sullivan節目中突然冒頭的。但其實他們從1957年就開始表演了,即使他們很早就顯示出了巨大的吸引力,他們第一次真正的成功之作《Sgt. Peppers》也要到1967年才發行。Samuel Johnson(譯註:英國詩人)認為10 年還是不夠的:“任何領域的卓越成就都只能通過一生的努力來獲得;稍低一點的代價也換不來。”(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,英國詩人,1340-1400)也抱怨說:“生命如此短暫,掌握技藝卻要如此長久。”(the lyf so short, the craft so long to lerne.)
下面是我在編程這個行當裡獲得成功的處方:

  ·對編程感興趣,因為樂趣而去編程。確定始終都能保持足夠的樂趣,以致你能夠將10年時間投入其中。

  ·跟其他程式員交談;閱讀其他程式。這比任何書籍或訓練課程都更重要。

  ·編程。最好的學習是從實踐中學習。用更加技術性的語言來講,“個體在特定領域最高水平的表現不是作為長期的經驗的結果而自動獲得的,但即使是非常富有經驗的個體也可以通過刻意的努力而提高其表現水平。”(p. 366),而且“最有效學習要求為特定個體制定適當難度的任務,有意義的反饋,以及重複及改正錯誤的機會。”(p. 20-21)《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在實踐中認知:心智、數學和日常生活的文化)是關於這個觀點的一本有趣的參考書。

  ·如果你願意,在大學裡花上4年時間(或者再花幾年讀研究生)。這能讓你獲得一些工作的入門資格,還能讓你對此領域有更深入的理解,但如果你不喜歡進學校,(作出一點犧牲)你在工作中也同樣能獲得類似的經驗。在任何情況下,單從書本上學習都是不夠的。“電腦科學的教育不會讓任何人成為內行的程式員,正如研究畫筆和顏料不會讓任何人成為內行的畫家”,Eric Raymond,《The New Hacker's Dictionary》(新駭客字典)的作者如是說。我曾經僱用過的最優秀的程式員之一僅有高中學曆;但他創造出了許多偉大的軟體,甚至有討論他本人的新聞群組,而且股票期權讓他達到我無法企及的富有程度(譯註:指Jamie Zawinski,XEmacs和Netscape Navigator的作者)。

  ·跟別的程式員一起完成項目。在一些項目中成為最好的程式員;在其他一些項目中當最差的一個。當你是最好的程式員時,你要測試自己領導項目的能力,並通過你的洞見鼓舞其他人。當你是最差的時候,你學習高手們在做些什麼,以及他們不喜歡做什麼(因為他們讓你幫他們做那些事)。

  ·接手別的程式員完成項目。用心理解別人編寫的程式。看看在沒有最初的程式員在場的時候理解和修改程式需要些什麼。想一想怎樣設計你的程式才能讓別人接手維護你的程式時更容易一些。

  ·學會至少半打程式設計語言。包括一門支援類抽象(class abstraction)的語言(如Java或C++),一門支援函數抽象(functional abstraction)的語言(如Lisp或ML),一門支援句法抽象(syntactic abstraction)的語言(如Lisp),一門支援說明性規約(declarative specification)的語言(如Prolog或C++模版),一門支援協程(coroutine)的語言(如Icon或Scheme),以及一門支援平行處理(parallelism)的語言(如Sisal)。

  ·記住在“電腦科學”這個片語裡包含“電腦”這個詞。瞭解你的電腦執行一條指令要多長時間,從記憶體中取一個word要多長時間(包括快取命中和未命中的情況),從磁碟上讀取連續的資料要多長時間,定位到磁碟上的新位置又要多長時間。(答案在這裡。

  ·嘗試參與到一項語言標準化工作中。可以是ANSI C++委員會,也可以是決定自己團隊的編碼風格到底採用2個空格的縮排還是4個。不論是哪一種,你都可以學到在這門語言中到底人們喜歡些什麼,他們有多喜歡,甚至有可能稍微瞭解為什麼他們會有這樣的感覺。

  ·擁有儘快從語言標準化工作中抽身的良好判斷力。

  抱著這些想法,我很懷疑從書上到底能學到多少東西。在我第一個孩子出生前,我讀完了所有“怎樣……”的書,卻仍然感到自己是個茫無頭緒的新手。30個月後,我第二個孩子出生的時候,我重新拿起那些書來複習了嗎?不。相反,我依靠我自己的經驗,結果比專家寫的幾千頁東西更有用更靠得住。

  Fred Brooks在他的短文《No Silver Bullets》(沒有銀彈)中確立了如何發現傑出的軟體設計者的三步規劃:

  1、儘早系統地識別出最好的設計者群體。

  2、指派一個事業上的導師負責有潛質的對象的發展,小心地幫他保持職業生涯的履曆。

  3、讓成長中的設計師們有機會互相影響,互相激勵。

  這實際上是假定了有些人本身就具有成為傑出設計師的必要潛質;要做的只是引導他們前進。Alan Perlis說得更簡潔:“每個人都可以被教授如何雕塑;而對米開朗基羅來說,能教給他的倒是怎樣能夠不去雕塑。傑出的程式員也一樣”。

  所以儘管去買那些Java書;你很可能會從中找到些用處。但你的生活,或者你作為程式員的真正的專業技術,並不會因此在24小時、24天甚至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 PC上完成:

    執行單條指令            1 納秒 = (1/1,000,000,000) 秒
    從L1緩衝中取一個word        2 納秒
    從主記憶體中取一個word        10 納秒
    從連續的磁碟位置中取一個word    200 納秒
    從新的磁碟位置中取一個word(定址) 8,000,000納秒 = 8毫秒

腳註

  T. Capey指出Amazon上面《Complete Problem Solver》的頁面中,《Teach Yourself Bengali in 21 days》和《Teach Yourself Grammar and Style》被列在了“購買此書的顧客還買了以下書籍”欄目裡面。我猜其中一大部分察看這兩本書的人都是從我這裡過去的。

譯本

  感謝以下作者將本文翻譯成其他語言:

  日文(Yasushi Murakawa),中文(郭曉剛),繁體中文(Jason Chen),西班牙文(Carlos Rueda),德文(Stefan Ram),法文(P. E. Allary),土耳其文(Çağıl Uluşahin)。

  Peter Norvig (Copyright 2001)



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。