Teach Yourself Programming in Ten Years——用十年教會自己編程

作者:Peter Norvig

譯者:劉海粟

本文原文爲:http://norvig.com/21-days.html

該翻譯文檔的PDF版可以在這裏獲得:http://download.csdn.net/source/2983778

爲何萬事都如此倉促?
     隨便走進一家書店,你就能看到《7天學會Java》以及各種萬變不離其宗的書籍,形如:在數天或是數小時內學會Visual Basic、Windows系統、互聯網等等。我在亞馬遜 做了個高級搜索 :
     pubdate: after 1992 and title: days and
      (title: learn or title: teach yourself) [1]
     共得到了248個結果。前78個是計算機類圖書(第79個是《30天學會孟加拉語 》)。我把搜索中的“days (天)”替換成“hours (小時)”,結果得到了一個相似度驚人的結果:253本書中,前77本都是計算機類圖書,緊隨其後的第78本是《24小時內教會自己語法與格調 》。而在200名之後,有96%是計算機類圖書。
     由此可見:要麼是人們都在急匆匆的學習計算機,要麼就是出於某種原因計算機比其他任何東西都要好學。而沒有一本書是關於如何在數日之內學會貝多芬或是量子力學甚至是狗的飼養的。Felleisen等人在《如何設計程序 》中也指出了這一趨勢,他們說:“糟糕的編程非常簡單,蠢貨都能在21天的時間內學會,即便他們就是根木頭都可以!”
     讓我們來分析一下諸如《三天內學會C++ 》這樣的標題意味着什麼:


學會: 3天的時間,你完全沒有時間去完成一些大型程序,也無法從其中的成功與失敗中汲取知識。你也沒有時間和一個有經驗的程序員一起工作並熟悉C++環境下的開發是個什麼樣子。總之,你沒有時間去深入的學習。所以這種書只能給你一個膚淺的認識而非深入的理解。正像Alexander Pope說的——一知半解是件危險的事情。
C++: 3天內你可能學會一些C++的語法(前提是你學過其他編程語言),但你學不到如何去使用這種語言。總而言之,如果你是——比方說——一個Basic程序員,你或許能學會以Basic的風格用C++語法編程,但你無法掌握C++真正的優點(或缺點)。問題何在?Alan Perlis 曾說過:“如果一種語言不能影響你的編程思路,那就不值得學習。”唯一合理的解釋就是你只需要學習一丁點的C++(類似的還有JavaScript或是Flash的Flex)以便爲了某個特定目標而去連接一個現有工具的接口。但如果這樣,你就不是在學習如何編程,而僅僅是在學習如何完成你的目標而已。
三天內: 很不幸,正像我們在下一節中要展示的那樣,這遠遠不夠。

用十年教會自己編程
     研究員們(Bloom (1985) , Bryan & Harter (1899) , Hayes (1989) , Simmon & Chase (1973) )已經指出在許多領域中想達到精通都需要花費十年左右的時間,這其中包括國際象棋、音樂創作、電報操作、繪畫、鋼琴演奏、游泳、網球以及對神經心理學或是拓撲學的研究。關鍵在於用心去練習:並非僅僅是一遍又一遍的單純重複,而是要去挑戰一個剛好高於你目前水平的目標。去嘗試,並在做的時候以及完成後分析自己的表現,指出所有的錯誤。之後重複,再重複……這沒有捷徑:甚至是莫扎特——4歲時他就是個音樂神童了,但一樣是用了13年的時間才創作出世界級的音樂。另一個例子,雖然看上去甲殼蟲樂隊是在1964年的埃德·沙利文秀上一夜走紅的,但其實他們早在1957年就開始在利物浦和漢堡的小俱樂部中演出了,而且雖然很早就受到大衆的青睞,但他們第一次重要的成功卻是1967年發行的專輯——《Sgt. Peppers》。Malcolm Gladwell 公佈了一份關於柏林音樂學院學生的研究報告,比較了優等、中等和後進的三類學生併爲他們制定了練習時間:

      三組人從幾乎相同的年齡開始練習演奏——大約五歲左右。起初的幾年中,每個人都練習幾乎相同的時間——每週2到3個小時。但到了八歲左右的時候,真正的差距開始出現了。那些班中最優秀的學生的練習量開始超過其他人:九歲時達到每週6小時,十二歲時每週8小時,十四歲時每週16小時,越來越多。到了二十歲的時候,他們每週的練習時間超過了30小時。二十歲時,在精英演奏者的人生歷程中共計練習了10,000小時。相較之下,僅僅是好學生的練習時間只有 8,000小時,而未來的音樂教師僅有4,000小時的練習。 

     所以,或許10,000小時——而不是10年——纔是一個神奇的數字。Samuel Johnson (1709-1784)認爲這可能要花更長的時間:“要實現任何領域的卓越才能都是需要畢生奮鬥的——不會再有更低的代價來獲得它了。”而Chaucer (1340-1400)則抱怨“人生短暫,但卻有太多技藝要學。”Hippocrates (約公元前400年)因那句“ars longa, vita brevis”而聞名,全文是“Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”,這話用中文 [2] 表達出來既是“技藝永恆,生命短暫,機會易逝,實驗詭詐,抉擇艱難”。雖然在拉丁文中“ars”一詞既可以表示“藝術”也可以表示“技術”,但在原本的希臘文中“techne”一詞則只有“技能”的意思而非“藝術”。
     以下是我編程成功的訣竅:


對編程產生興趣,並試着從興趣出發去做些什麼。你要確信它能持續的給你帶來樂趣好讓你能夠爲它傾注十年的心血。
與其他程序員交流,閱讀其他的程序。這比任何一本書或一項訓練都要重要。
編程。學習的最好方式就是邊做邊學 。更學術性的說:“在特定領域內,個人能力的最高上限無法通過長期經驗而自動獲得。但即便是經驗豐富的個人也可以通過刻意的努力而獲得經驗的提高。”(p. 336 )並且“最爲有效的學習需要針對特定個體、信息反饋以及重複和改正錯誤的機會有一個適當難度的明確目標” (p. 20-21)。《實踐中認知:日常生活中的思想,數學與文化 》是一本對於該觀點有趣的參考書籍。
如果你願意,在大學中投入四年的時間(或者繼續在研究生學院投入更多的時間)。這將使你獲得一些工作的入門資質,並且會給你一些關於這個學科更加深入的認識,而如果你不喜歡上學,你也可以(需要一些貢獻)在工作中獲得類似的經驗。但無論如何,僅僅看書是絕對不夠的。“計算機科學的教育不會讓任何人成爲專業程序員,正如研究筆刷和顏料不會讓任何人成爲專業畫家一樣。”,《新***辭典》的作者Eric Raymand如是說。我所聘用過的最好的程序員之一 [3] 僅擁有高中學歷。他卻創造出了很多偉大 的軟件 ,擁有他自己的新聞組 ,甚至在股票期權中賺到足夠的錢買下一家自己的夜總會 。
與其他程序員共同完成一些項目。在某些項目中成爲最出色的程序員,而在其他一些項目中成爲最糟糕的。當你最出色時,你將有機會測試自己領導一個項目的能力,並且以你的視野去激勵其他人。當你最糟糕時,你要學習大師們做了什麼,而不喜歡做什麼(因爲他們讓你去爲他們做)。
從其他程序員那裏接手一些項目。理解其他人編寫好的程序。看看有什麼需要理解的,並在原作者不在的時候試着自己去解決一些問題。考慮一下如何設計你的程序能讓它更容易被那些從你手裏接手項目的人們理解。
學習至少六種編程語言。其中包括一種支持類抽象的語言(如Java或C++),一種支持函數抽象的語言(如LISP或ML),一種支持語法抽象的語言(如LISP),一種支持聲明規範的語言(如Prolog或C++模板),一種支持協程的語言(如Icon或Scheme)以及一種支持並行處理的語言(如Sisal)。
牢記在“計算機科學”中有一個“計算機”。你要知道計算機需要多長時間去執行你的一條指令、需要多長時間從內存中讀取一個字(帶有或不帶有緩存缺失)、需要多長時間從磁盤中連續讀取字符以及需要多長時間完成磁盤的重新定位。(答案在這裏 )
參與一個語言的標準制定工作。這可以是ANSI C++委員會項目,也可以僅僅是決定你的代碼是用2個還是4個空格作爲縮進。但無論如何,這將會讓你學到其他人對語言的偏好以及他們到底對此有多麼偏好,甚至你還可能明白爲什麼他們會有此偏好。
擁有儘快從語言標準化工作中抽身的理智。
     出於以上經驗,我很懷疑你能從書本中學到多少。在我第一個孩子出生前,我讀了所有的指南書籍,但依然感到茫然無措。30個月之後,當我第二個孩子出生的時候,我還需要回去複習那些書籍麼?不,這次完全憑藉我的個人經驗了。這對我來說顯然比專家們寫的數千頁的紙張更有效果。
     Fred Brooks,在他的文章《沒有銀彈 》中指出了尋找一位偉大的程序設計者的三個步驟:


儘早系統的確定一批頂級設計者隊伍。
指派一個業務主管來負責前景的發展以及確保職業規劃。
爲增進設計師們的互相影響與激勵提供足夠的機會。
     這樣做的前提是已經假定了某人具有一個偉大設計者所應有的素質,他要做的只是去引導其他人的前進。Alan Perlis 將這些變得更加簡潔:“每個人都能學會雕塑:米開朗基羅這樣的人反倒需要學習如何不去雕塑。偉大的程序員也是如此。”
     所以,儘管去買那本Java的教程吧。或許你能從中學到些什麼,但你不會因此改變人生,也不會在24小時、24天甚至是24個月之後成爲一個真正的程序員。


參考文獻:
Bloom, Benjamin (編)《在年輕人中培養人才 》, 百齡壇, 1985.
Brooks, Fred, 《沒有銀彈 》, IEEE計算機, vol. 20, no. 4, 1987, p. 10-19.
Bryan, W.L.和Harter, N.《電報語言研究:一種習慣上的收穫》, 心理學回顧, 1899, 8, 345-375
Hayes, John R., 《完全問題求解 》, Lawrence Erlbaum, 1989.
Chase, William G.和Simon, Herbert A.《國際象棋的感知 》, 認知心理學, 1973, 4, 55-81
Lave, Jean, 《實踐中認知:日常生活中的思想,數學與文化 》, 劍橋大學出版社, 1988.

答案:
在典型PC機上各種操作的近似時間:
執行典型指令
 1/1,000,000,000 秒 =1 納秒
 
從一級緩存中讀取數據
 0.5 納秒
 
分支預測錯誤
 5 納秒
 
從二級緩存中讀取數據
 7 納秒
 
互斥鎖定 / 解鎖
 25 納秒
 
從主存儲器中讀取數據
 100 納秒
 
在 1Gbps 的網絡中發送 2KB 數據
 20,000 納秒
 
從內存中讀取 1MB 數據
 250,000 納秒
 
從新的磁盤位置讀取數據 ( 尋軌 )
 8,000,000 納秒
 
從磁盤中讀取 1MB 數據
 20,000,000 納秒
 
在美國向歐洲發包並返回
 150 毫秒 =150,000,000 納秒
 


附錄:語言的選擇
     許多人都問我應該首先學習哪種編程語言。答案並不唯一,但需要考慮以下幾點:


善用你的朋友們。每每被問及“我該用哪種操作系統,Windows、Unix還是Mac?”的時候,我的回答總是:“用你的朋友們都在用的那種。”你在朋友那裏學到的東西要遠大於操作系統或編程語言之間的固有優勢。但也要考慮到你未來的朋友:若你繼續學習,你肯定會加入到某個程序員社區中去。你所選擇的語言是否擁有一個大規模發展的社區?還是瀕臨滅絕?是否有足夠的書籍、網站或在線論壇讓你尋找答案?你是否喜歡那些社區中的人們?
保持簡單。像C++或Java這種編程語言是爲那些由關心他們代碼執行效率且經驗老道的程序員組成的大規模團隊來進行專業開發而設計的。因此,這些編程語言都擁有爲這些情況而設計的複雜結構。你關心的是學習編程,而不是那些複雜的東西。所以你需要的是一種爲了程序員新手便於記憶和學習而設計的語言。
運行。你更喜歡哪種學習鋼琴演奏的方式:正常的交互模式,當你按下一個琴鍵的時候立刻就可以聽到對應的音符。還是“批發”模式,只有在你完成整段樂曲之後才能聽到聲音?顯然互動模式讓學習鋼琴變得更簡單,編程亦是如此。堅持一種交互模式的語言並使用它。
     給出以上這些準則,我建議首先學習的語言是Python 或Scheme 。但你自身的情況可能有所不同,所以還有很多其他不錯的選擇。如果你的年齡是個位數,你可能更喜歡Alice 或Squeak (年長一些的學習者可能也會喜歡這些)。重點在於——你選擇並且你開始。

附錄:書籍與其他資源
     常有人問有哪些書籍或網站可以學習。我重申“僅僅看書是絕對不夠的”,但我可以推薦以下這些:


Scheme: 《計算機程序的結構與詮釋 》(Abelson和Sussman)可能是對計算機科學最好的介紹,同時作爲了解計算機科學的一種途徑,本書也講解如何編程。你可以看這本書的在線視頻講座 ,或是完整的在線文本 。這本書具有挑戰性並將淘汰一些用其他方法取得成功的人。
Scheme: 《如何設計程序 》(Felleisen等編)是一本非常優秀的介紹如何用典雅又不失實用的方式去編程的書籍。
Python: 《Python編程:計算機科學導論 》(Zelle)是一部用Python完成的不錯的導論。
Python: Python網站 上的一些在線教程 都是非常實用的。
Oz: 《計算機編程的概念,技術和模型 》(Van Roy和Haridi)被認爲是當代Abelson與Sussman的繼承者。本書通過編程的整體構思,在更易於閱讀和學習的同時,較之Abelson與Sussman獲得了更廣泛的視野。該書使用了一種叫做Oz的編程語言,雖然它並不被大衆所知,但可以很好的作爲其他語言的基礎來學習。

作者註釋:
     T. Capey指出,亞馬遜網站上《完全問題求解 》一書的頁面中,“購買此商品的顧客也同時購買”一項裏已經出現了《30天學會孟加拉語》和《24小時內教會自己語法與格調》。我猜這其中大部分的人是從此文中看到那些書的。感謝Ross Cohen在Hippocrates問題上對我的幫助。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/UndeadWraith/archive/2011/01/14/6140455.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章