Teach Yourself Programming in Ten Years——用十年教會本身編程

做者:Peter Norvightml

譯者:劉海粟程序員

本文原文爲: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 公佈了一份關於柏林音樂學院學生的研究報告,比較了優等、中等和後進的三類學生併爲他們制定了練習時間:ide

      三組人從幾乎相同的年齡開始練習演奏——大約五歲左右。起初的幾年中,每一個人都練習幾乎相同的時間——每週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

相關文章
相關標籤/搜索