十年內(nèi)自學(xué)編程

Peter Norvig

你們著什么急?

走進任何一家書店,您將看到如何在24小時內(nèi)教會自己Java,以及提供在幾天或幾小時內(nèi)教授C、SQL、Ruby、算法等的無休止的變體。亞馬遜高級搜索[title: teach, yourself, hours, since: 2000中找到512本這樣的書。在前十名中,有九本是編程書(另一本是關(guān)于簿記的)。類似的結(jié)果來自于將“自學(xué)”改為“學(xué)習(xí)”,或?qū)ⅰ靶r”替換為“天”。

結(jié)論是,要么人們急于學(xué)習(xí)編程,要么編程比其他任何東西都容易得多。費萊森等人在他們的“如何設(shè)計程序”(How To Design Program)一書中,他們表示:“糟糕的編程很容易,白癡可以在21天內(nèi)學(xué)會它,即使他們是假人?!边@位狂暴的鵝漫畫也有自己的想法。

讓我們分析24小時內(nèi)自學(xué)C++這樣的標題可能意味著什么:

自學(xué):在24小時內(nèi),你就沒有時間寫幾個重要的程序,從你的成功和失敗中吸取教訓(xùn)。您將沒有時間與有經(jīng)驗的程序員一起工作,并了解在C++環(huán)境中生活是什么感覺??傊?,你沒有時間學(xué)到很多東西。因此,這本書只能談?wù)撘环N膚淺的熟悉,而不是一種深刻的理解。正如亞歷山大·波普所說,一點點學(xué)習(xí)是一件危險的事情。

C++:在24小時內(nèi),您可能可以學(xué)習(xí)C++的一些語法(如果您已經(jīng)知道另一種語言),但您無法了解如何使用該語言。簡單地說,如果你是一個基本程序員,你可以學(xué)習(xí)用C++語法以Basic的方式編寫程序,但是你不能知道C++實際上是好的(和壞的)什么。那有什么意義?AlanPerlis曾經(jīng)說過:“一種不影響你對編程的思考方式的語言是不值得知道的”。一個可能的問題是,您必須學(xué)習(xí)一點C++(或者更可能的是,類似JavaScript或處理的東西),因為您需要與現(xiàn)有工具接口來完成特定的任務(wù)。但是你不是在學(xué)習(xí)如何編程,而是在學(xué)習(xí)如何完成這個任務(wù)。

在24小時內(nèi):不幸的是,這還不夠,正如下一節(jié)所示。

十年內(nèi)自學(xué)編程

研究人員(Bloom(1985)、Bryan&Harter(1899年)、Hayes(1989)、Simmon&Chase(1973))已經(jīng)證明,在包括國際象棋、音樂創(chuàng)作、電報運算、繪畫、鋼琴演奏、游泳、網(wǎng)球以及神經(jīng)心理學(xué)和拓撲學(xué)研究在內(nèi)的任何廣泛領(lǐng)域,都需要十年的時間才能發(fā)展出專門知識。關(guān)鍵是深思熟慮的實踐:不只是再做一次。再一次,用一項超出你目前能力范圍的任務(wù)來挑戰(zhàn)你自己,嘗試它,分析你在做的時候和之后的表現(xiàn),并糾正任何錯誤。那就重復(fù)一遍。再重復(fù)一遍。似乎沒有真正的捷徑:即使是莫扎特,他在4歲時是一個音樂天才,花了13年才開始創(chuàng)作世界級的音樂。在另一種類型中,披頭士樂隊似乎以一連串的熱門和1964年的埃德·沙利文秀出現(xiàn)在現(xiàn)場。但從1957年起,他們就一直在利物浦和漢堡打小俱樂部,雖然他們很早就有了很大的吸引力,但他們的第一個重大成功,魔鬼辣椒,在1967年被釋放了。

馬爾科姆·格拉德威爾(Malcolm Gladwell)推廣了這一理念,盡管他專注于1萬小時,而不是10年。HenriCartier-Bresson(1908-2004)有另一個指標:“你的前10,000張照片是你最差的。”(他沒有預(yù)料到,使用數(shù)碼相機,一些人可以在一周內(nèi)達到這一目標。)真正的專業(yè)知識可能需要一生的時間:塞繆爾·約翰遜(1709-1784)說:“任何部門的卓越都只能靠一生的勞動才能實現(xiàn);不能以較低的價格購買?!眴疼?1340-1400)抱怨道:“萊夫太短了,手藝太長了?!盚ippocrates(公元前400年)以摘錄“Ars Longa,vita brevis”而聞名,該句是來自于一個更長的引用:”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 這段話翻譯成英語就是:“生命很短暫,但是技藝卻很高深,機遇轉(zhuǎn)瞬即逝,探索難以捉摸,抉擇困難重重”。當然,沒有一個數(shù)字是最終的答案:似乎不合理地假定所有技能(例如編程、下棋、跳棋和音樂演奏)都需要完全相同的時間來掌握,也不認為所有人都需要完全相同的時間。正如K·安德斯·愛立信(K.Anders Ericsson)教授所言,“在大多數(shù)領(lǐng)域,即便是最有才華的人,也需要多少時間才能達到最高水平。1萬小時的時間讓你感覺到,我們所說的每周10到20個小時,有些人會認為,那些天生最有天賦的人仍然需要達到最高水平?!?/p>

所以你想成為一名程序員

下面是我編程成功的秘訣:

對編程感興趣,并做一些,因為它是有趣的。一定要保持足夠的樂趣,這樣你就會愿意投入你的10年/10,000小時。

項目,最好的學(xué)習(xí)方式是邊做邊學(xué)。更嚴格地說,“在某一領(lǐng)域,個人的最高業(yè)績水平并不是隨著經(jīng)驗的擴展而自動達到的,但即使是經(jīng)驗豐富的個人,也可以通過刻意改進而提高業(yè)績水平。”(第366頁)和“最有效的學(xué)習(xí)需要一個明確的任務(wù),適當?shù)碾y度水平,為特定的個人,信息反饋,并有機會重復(fù)和糾正錯誤。”(第20-21頁)“實踐中的認知:日常生活中的思想、數(shù)學(xué)和文化”是這一觀點的有趣參考。

與其他程序員交談;閱讀其他程序。這比任何書籍或培訓(xùn)課程都更重要。

如果你愿意,在一所大學(xué)(或更多的研究生院)待四年。這會讓你獲得一些需要資格證書的工作,也會讓你對這個領(lǐng)域有更深入的了解,但如果你不喜歡上學(xué),你可以(用一些奉獻精神)獨自或在工作中獲得類似的經(jīng)驗。無論如何,光靠書本學(xué)習(xí)是不夠的?!坝嬎銠C科學(xué)教育不能使任何人成為專業(yè)程序員,就像研究畫筆和顏料可以使人成為專業(yè)畫家一樣”,“新黑客詞典”的作者埃里克·雷蒙德說。我雇過的最好的程序員之一只有高中學(xué)位,他制作了很多很棒的軟件,有自己的新聞組,并且有足夠的股票期權(quán)來購買自己的夜總會。

與其他程序員一起完成項目。在某些項目中做最好的程序員;在其他項目上做最差的程序員。當你是最好的,你可以測試你的能力來領(lǐng)導(dǎo)一個項目,并用你的遠見激勵別人。當你是最壞的時候,你學(xué)會了主人做什么,你學(xué)會了他們不喜歡做什么(因為他們讓你為他們做)。

工作項目后,其他程序員。理解別人寫的程序。看看當原來的程序員不在的時候,需要什么才能理解和修復(fù)它。想一想如何設(shè)計你的程序,讓那些在你之后維護它們的人更容易。

至少學(xué)習(xí)六種編程語言。包括一種強調(diào)類抽象的語言(比如Java或C++)、一種強調(diào)函數(shù)抽象(比如Lisp、ML或Haskell)、一種支持語法抽象(比如Lisp)、一種支持聲明性規(guī)范(比如Prolog或C++模板)、一種強調(diào)并行性(比如Clojure或Go)。

記住,在“計算機科學(xué)”中有一個“計算機”。知道您的計算機執(zhí)行指令、從內(nèi)存中獲取一個單詞(是否有緩存丟失)、從磁盤中讀取連續(xù)單詞以及尋找磁盤上的新位置需要多長時間。(答案在這里)

參與語言標準化工作。它可能是ANSI C++委員會,也可能是決定您的本地編碼風格將有2或4個空間縮進水平。不管是哪種方式,你都可以了解到其他人在一種語言中喜歡什么,他們有多深,也許還有一點是關(guān)于為什么他們會這樣想的。

有良好的判斷力,盡快擺脫語言標準化的努力。

考慮到所有這些,僅僅通過書本學(xué)習(xí),你能走多遠是值得懷疑的。在我的第一個孩子出生之前,我讀了所有的書,仍然覺得自己是一個無知的新手。30個月后,當我的第二個孩子即將出生時,我是否又回到書本上復(fù)習(xí)了一下?沒有。相反,我依靠的是我個人的經(jīng)驗,這比專家們寫的幾千頁更有用,也更讓我放心。

弗雷德·布魯克斯(FredBrooks)在他的文章“沒有銀彈”中指出了一個尋找優(yōu)軟件設(shè)計師的三部分計劃:? ?

1. 有組織地辨認頂尖的軟件設(shè)計人才,越早越好(盡早系統(tǒng)的確定一批頂級設(shè)計者隊伍。)  

2. 安排一個職業(yè)導(dǎo)師,為其職業(yè)前景指點迷津,并謹慎對待自己的職業(yè)履歷。(指派一個業(yè)務(wù)主管來負責前景的發(fā)展以及確保職業(yè)規(guī)劃。)  

3. 為成長中的設(shè)計師們提供機會,讓他們能夠互相激發(fā)促進。(為增進設(shè)計師們的互相影響與激勵提供足夠的機會。)

即使一部分人已經(jīng)具備了成為優(yōu)秀軟件設(shè)計人員的潛質(zhì),也需要經(jīng)歷工作的慢慢琢磨,方可展現(xiàn)才華。Alan Perlis 則說得更加直接:“任何人都可以被‘教’成一個雕塑匠,但米開朗基羅則被‘教’如何不要成為一個雕塑匠,因為他要做的是雕塑大師,。這個道理放到編程大師身上同樣管用?!盤erlis 認為,偉大的軟件開發(fā)人員都有一種內(nèi)在的特質(zhì),這種特質(zhì)往往比他們所接受的訓(xùn)練更重要。但是這些特質(zhì)是從哪里來的呢?是與生俱來的?還是通過后天勤奮而來?正如 Auguste Gusteau(動畫電影《料理鼠王》里的幻象大廚)所說,“誰都能做飯,但只有那些無所畏懼的人才能成為大廚!”我很情愿地說,將你生命中的大部分時間花在審慎地練習(xí)和提高上,這很重要!但是“無所畏懼”的精神,才是將促使這些練習(xí)成果凝聚成形的途徑?;蛘?,就像是《料理鼠王》里那個與 Gusteau 作對的刻薄的美食評論家 Anton Ego 說的那樣:“不是任何人都能成為偉大的藝術(shù)家,不過,偉大的藝術(shù)家在成名前可能是任何人。”

所以盡管去書店大Java/Ruby/Javascript/PHP 書籍吧;你也許會發(fā)現(xiàn)他們真的挺管用。但是這樣做不會改變你的人生,也不會讓你在整體經(jīng)驗上有什么提高。24小時,幾天,幾周,做一個真正的程序員?光靠讀書可讀不出來。你嘗試過連續(xù) 24 個月不懈努力提高自己么?呵呵,如果你做到了,好吧,那么你開始上路了……

參考書目Bloom, Benjamin (ed.) Developing Talent in Young People (在年輕人中培養(yǎng)人才), Ballantine, 1985.

Brooks, Fred, No Silver Bullets (沒有銀彈), IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Bryan, W.L. & Harter, N. “Studies on the telegraphic language: The acquisition of a hierarchy of habits (電報語言研究:一種習(xí)慣上的收獲).Psychology Review, 1899, 8, 345-375

Hayes, John R., The Complete Problem Solver (完全問題求解)Lawrence Erlbaum, 1989.

Chase, William G. & Simon, Herbert A. “Perception in Chess” Cognitive Psychology (國際象棋的感知), 1973, 4, 55-81.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (實踐中認知:日常生活中的思想,數(shù)學(xué)與文化), Cambridge University Press, 1988.

問答

典型 PC 系統(tǒng)各種操作指令的大概時間Copyright ? 1999-2020, CSDN.NET, All Rights Reserved

QQ讀取瀏覽器歷史

登錄

ajian005

關(guān)注

Peter Norvig:Teach Yourself Programming in Ten Years(自學(xué)編程,十年磨一劍) 轉(zhuǎn)載

2012-11-23 14:30:23

ajian005

碼齡16年

關(guān)注

黃小非譯注:

本文作者 Peter Norvig 目前任職于 Google,其職位是研究主管(Director of Research). Peter Norvig 是享譽世界的計算機科學(xué)家和人工智能專家。

他是 AAAI 和 ACM 的會員,是業(yè)界內(nèi)經(jīng)典書籍《Artificial Intelligence: A Modern Approach 人工智能:一種現(xiàn)代方法》的作者之一。

在加入 Google 之前,他曾經(jīng)是 NASA (美國航空航天局)計算科學(xué)部門的主要負責人,并在南加州大學(xué)以及伯克利大學(xué)任教。以下為譯文。

英文原文:Teach Yourself Programming in Ten Years

你們著什么急?

隨意步入一家書店,滿目都是《7天搞定 Java 編程》這種速成書目,同樣的書籍還包括 Visual Basic、Window 系統(tǒng)、Internet 互聯(lián)網(wǎng)等等,它們都承諾在幾天,甚至幾小時之內(nèi)就讓你能夠?qū)W會相關(guān)技術(shù)。我在亞馬遜網(wǎng)站上做了如下的條件檢索:

  ? ? ? ? ? pubdate: after 1992 and title: days and 

 (title: learn or title: teach yourself)  

出版日期:1992年以后,題目關(guān)鍵字:

“天”,“學(xué)會”或者“自學(xué)” 

 然后得到了 248 條搜索結(jié)果。頭 78 條都是計算機類書籍(第 79 條記錄是《30天學(xué)會孟加拉語》)。我將“天”關(guān)鍵字換成了“小時”,不出意外地搜索到了 253 條記錄,其中頭 77 條記錄是計算機書籍,第 78 條的搜索記錄是《24小時語法和樣式自學(xué)手冊》。在總共搜索到的頭 200 條記錄中,有 96% 是計算機書籍?! ?/p>

從上面的搜索結(jié)果可以看出來,要么就是人們對計算機技術(shù)的學(xué)習(xí)如饑似渴,要么就是計算機技術(shù)實在太簡單,不費吹灰之力就能學(xué)會。相比于計算機技術(shù)書籍的如此“速成”,在其他領(lǐng)域的書籍里,你卻很難找到諸如:“三天學(xué)會貝多芬”,或者“五天搞定量子力學(xué)”,這種速成教材,甚至連《狗狗喂養(yǎng)手冊》這種寵物指南,都鮮有“幾天搞定”的說法。Felleisenet al.在他們的著作《如何設(shè)計程序》一書中明確指出了這種“速成”的趨勢,并評論到:“垃圾的編程技術(shù)當然非常容易,傻子都能在 21 天之內(nèi)學(xué)會,哪怕他天生就是個白癡。”

? 讓我們來仔細看看《3天學(xué)會C++》這種速成教材實際上意味著什么:

學(xué)會:在 3 天時間里你幾乎沒有時間去寫任何有意義的程序,就更不要談什么從編程中獲得經(jīng)驗和教訓(xùn)這種事情了。你也不可能有時間和有經(jīng)驗的程序員一起工作和交流,也不會體驗到在真正的 C++ 環(huán)境下工作是什么感覺。長話短說吧,你就是沒時間,也學(xué)不到什么。所以這種書籍最多也就讓你有個粗淺的印象,但是絕對不可能有深入的理解。就像亞歷山大教皇說的那樣,“淺嘗輒止是很危險的”。

C++: 如果你有其他編程語言的基礎(chǔ),那么3天之內(nèi)你也許可以學(xué)到 C++ 的一些語法,但即使是這樣,你還是無法了解如何使用該語言編程。簡言之,如果你之前是一個 Basic 程序員,那么經(jīng)過 3 天的學(xué)習(xí),你會成為一個“能使用 C++ 語法編寫 Basic 風格程序的程序員”,不過這樣是沒法發(fā)揮出 C++ 語言本身的優(yōu)勢的(說句不好聽的,你連怎么犯 C++ 的典型錯誤都不會)。僅僅知道一點語法意味著什么呢?Allan Perlis 曾經(jīng)說過:“一個無法改變你思維方式的編程語言是不值得學(xué)習(xí)的?!保涣硪环N可能性是,你可以只學(xué)一點點 C++ 知識(類似的,或者一點點 JavaScript,或者一點點 Flex Script),然后就可以利用現(xiàn)有的工具制作應(yīng)用接口,完成特定的編程任務(wù)了。但是這樣的行為并不意味著你“會”編程了,你只是會使用這個工具完成任務(wù)而已。

3天:很不幸,3天是遠遠不夠的,往下看你就知道了。

peter norvig 

研究人員(Bloom (1985)、 Bryan & Harter (1899,見文后參考書目)、Hayes (1989)、Simmon & Chase (1973,見文后參考書目) 的一系列調(diào)查研究顯示,在各個領(lǐng)域內(nèi),要想獲得專業(yè)級別的水平,大約需要 10 年時間的努力。參與此項調(diào)查的領(lǐng)域包括:國際象棋,作曲,發(fā)報,繪畫,鋼琴演奏,游泳,網(wǎng)球等??茖W(xué)家們從神經(jīng)心理學(xué)和拓撲學(xué)的角度對這些領(lǐng)域進行研究,并得出結(jié)論。若要在某一領(lǐng)域內(nèi)達到專家級的水平,其關(guān)鍵在于“審慎地重復(fù)”,也就是說,并非是機械地,一遍又一遍地練習(xí),而是要不斷地挑戰(zhàn)自我,試圖超越自身當前的水平,通過不斷的嘗試挑戰(zhàn),并在嘗試的過程中和嘗試之后對自身的表現(xiàn)進行分析和總結(jié),吸取經(jīng)驗,糾正之前犯過的各種錯誤。把這一“審慎”的過程不斷重復(fù),才能取得成功。

  所謂的“捷徑”是不存在的,即使對于莫扎特這種天才來說,也沒有捷徑可走,盡管 4 歲就開始作曲,可是他也花了 13 年的時間,才真正地寫出了世界級的作品。再舉一個例子,甲殼蟲樂隊(The Beatles),他們似乎在 1964 年憑借一系列熱門單曲和其在艾德沙利文秀(The Ed Sullivan show)上的演出一炮而紅,但是你也許不知道,他們早在 1957 年就在利物浦和漢堡兩地進行小規(guī)模演出了,而在此之前的非正式演出更是不計其數(shù)。甲殼蟲樂隊的主要成名曲《Sgt. Peppers》,則是 1967 年才發(fā)行的。Malcolm Gladwell 公布了他對柏林音樂學(xué)院所作的一項研究的報告,該研究對比了一個班里的學(xué)習(xí)成績?yōu)樯?、中下三個檔次的學(xué)生,并逐一詢問他們進行音樂練習(xí)的時間 

  這三個檔次中的所有人,大約都是在 5 歲的時候開始練習(xí)音樂的,一開始的時候大家練習(xí)音樂的時間都差不多,大約一周 2 到 3 小時。但是到了八歲左右,大家的區(qū)別就開始體現(xiàn)了。后來成為班里最好的那一部分學(xué)生開始比別的學(xué)生練習(xí)得更多,大概每周 6 到 9 小時,12歲的時候每周 8 小時,14歲的時候每周 16 小時,往后則越來越多,直到 20 歲左右,他們每周練習(xí)音樂的時間已經(jīng)超過 30 小時了。在 20 歲的年紀,那些精英級別的演奏家們都有累計超過 10000 小時的音樂練習(xí)時間。相比之下,僅有部分優(yōu)等生能達到 8000 小時的累計練習(xí)時間,而那些音樂教師級別的學(xué)生,他們的累計練習(xí)時間只有 4000 小時左右。

?   所以,也許這個讓你能達到專業(yè)等級的神奇時間應(yīng)該是 10000 小時,而不是 10 年。(Henri Cartier-Bresson (1908-2004)說過,“(作為攝影師),你所拍攝的頭 10000 張照片都是垃圾”,但即使是垃圾作品,他拍一張照片也要花接近一小時。)Samuel Johnson (1709-1784)認為這個時間應(yīng)該更長:“在任何一個領(lǐng)域要想做到極好,勢必窮盡一生的精力,否則根本無法企及?!?Chaucer (1340-1400)也發(fā)出過“生命如此短暫,技能如此高深”的感嘆。Hippocrates (c. 400BC)因?qū)懴铝巳缦碌木渥佣蝗朔Q頌:“ars longa, vita brevis”,該句是來自于一個更長的引用:”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 這段話翻譯成英語就是:“生命很短暫,但是技藝卻很高深,機遇轉(zhuǎn)瞬即逝,探索難以捉摸,抉擇困難重重”。這段話是用拉丁文寫的。在拉丁文里,ars 可以翻譯為“技藝”或者“藝術(shù)”,但是在古希臘文里,ars 只能做“技能”的意思,而沒有“藝術(shù)”的意思。 

 你想當程序員么? 

 下面是我列舉的程序員成功“食譜”

沉醉于編程,編程是為了興趣。保持這種充滿興趣的感覺,以便于你能將其投入到你的10 年/10000小時的編程時間中。

編寫程序。最好的學(xué)習(xí)方式是“在實踐中學(xué)習(xí)”。更技術(shù)一些地說:“一個人在某個專業(yè)領(lǐng)域方面能夠達到最高水平,并不是因為這個人經(jīng)驗增長了以后而自動獲得的,而是這個人為了進步所做出了專門的努力之后產(chǎn)生的結(jié)果?!?p. 366)“最有效的學(xué)習(xí)包括如下幾個要素:明確并且難度適當?shù)娜蝿?wù),適應(yīng)學(xué)習(xí)者個人情況,及時的信息反饋,有重新開始和改正錯誤的機會)(p. 20-21) 《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life / 實踐中認知:日常生活中的思想,數(shù)學(xué)與文化》這本書提供了上述有趣的觀點。

多閱讀優(yōu)秀源碼。同其他程序員交流,多閱讀其他人寫的程序(注:閱讀優(yōu)秀開源程序)。這些遠比你看書或者上培訓(xùn)班重要。

計算機專業(yè)研究生。如果你愿意的話,就選擇去讀一個計算機科學(xué)專業(yè)吧(當然你還可以去念這個專業(yè)的研究生)。如果你能做到這點,那么你就有機會找到一些需要計算機學(xué)位認證的工作,也會讓你對這個行業(yè)有更深的理解。不過,如果你不是上學(xué)的料,那么你可以(當然需要有足夠的毅力)靠自己學(xué)習(xí),或者通過工作來積累經(jīng)驗。無論你采用哪種途徑,光依靠書本是遠遠不夠的?!叭绻f僅僅靠學(xué)習(xí)油畫和調(diào)色技術(shù)無法創(chuàng)造出頂尖的畫家的話,那么光學(xué)習(xí)計算機科學(xué)課程更不能造就頂尖的程序員?!?,Eric Raymond 這樣說過,他著有《新黑客字典》一書。我所聘用過的最好的程序員僅僅只有高中文憑; 他寫了很多偉大的軟件,他有他自己的新聞組,并且通過股權(quán)賺夠了錢,還開了家屬于自己的夜店。(作者說的這個人是 Jamie Zawinski,他是網(wǎng)景瀏覽器(Netscape)的早期開發(fā)這者之一,也是開源項目 Mozilla 和XEmacs 的主要貢獻者,他開了一家叫做 DNA_lounge 的夜店,位于舊金山的 SoMa 區(qū)——譯者注)

與其他程序員一起做項目。在某些項目中要盡量做到最好,在某些項目中卻別做那么好。當你是最好的時候,你的領(lǐng)導(dǎo)能力就會得到鍛煉,并激發(fā)你高瞻遠矚的視野。當你做得不好的時候,你就能知道你的領(lǐng)導(dǎo)怎么做事,以及他們不喜歡哪些事(因為領(lǐng)導(dǎo)總是把那些他們不愛做的雜事丟給他們認為不得力的人去做)

嘗試后續(xù)跟隨其他程序員一起做項目。嘗試去理解其他人所寫的代碼??纯慈绻銦o法找到代碼的作者本人的情況下,理解和修正他寫的代碼需要花費什么樣的代價。同時也思考,如何規(guī)劃你自己的程序代碼,讓它們更容易被其他人理解和維護。

至少學(xué)習(xí)半打編程語言(注:一打是十二個)。包括一種支持類抽象的語言(例如 Java 或者C++),一種支持函數(shù)抽象的語言(例如 Lisp 或者 ML),一種支持語法抽象的語言(例如 Lisp),一種支持聲明式編程的語言(例如 Prolog 或者 C++ 模板),一種支持協(xié)同程序的語言(例如 Icon 或者 Scheme),一種支持平行并發(fā)編程的語言(例如 Sial)

牢記“計算機科學(xué)”中包含著“計算機”這個詞(注:性能:數(shù)據(jù)結(jié)構(gòu)與算法)。了解計算機需要花多長的時間執(zhí)行一條指令,花多長時間從內(nèi)存中獲取一個字(word)(包括緩存命中和不命中兩種情況),如果連續(xù)從磁盤中獲取數(shù)據(jù),時間消耗如何?以及需要花多少時間才能再磁盤上定位一個新的位置?

盡量參與語言的標準化過程。往大了說,你可以試著加入 ANSI C++ 委員會這樣的專業(yè)組織,往小了講,你也可以從自己的代碼規(guī)范入手,限定代碼縮進是需要 2 個空格寬還是 4 個空格寬。無論采用哪種方式,你都需要了解其他人對于語言的喜好,以及他們的喜好的程度,甚至你要知道他們?yōu)槭裁串a(chǎn)生這樣的喜好的原因。

與新技術(shù)標準俱進。有良好的意識,能盡快適應(yīng)語言標準化的成果。 

 要掌握上面所說的所有內(nèi)容,光靠看書學(xué)習(xí)應(yīng)該是很難做到的。當我的第一個孩子出生的時候,我?guī)缀蹰喿x了市面上所有的《如何…》指南書籍,但是我讀完了以后還是覺得自己是個菜鳥。30個月以后,我的第二個孩子快出生時,我難道還要做一個書蟲么?不!相反,我此時更依賴我的個人經(jīng)驗,這些經(jīng)驗相比于那些上千頁的書籍,則更加有效和讓我放心。

發(fā)現(xiàn)和培養(yǎng)軟件設(shè)計人才的三步驟 

 Fred Brooks 所著的著名的論文《No Silver Bullets 沒有銀彈》里向我們揭示了發(fā)現(xiàn)和培養(yǎng)軟件設(shè)計人才的三步驟:

  1. 有組織地辨認頂尖的軟件設(shè)計人才,越早越好(盡早系統(tǒng)的確定一批頂級設(shè)計者隊伍。) 

 2. 安排一個職業(yè)導(dǎo)師,為其職業(yè)前景指點迷津,并謹慎對待自己的職業(yè)履歷。(指派一個業(yè)務(wù)主管來負責前景的發(fā)展以及確保職業(yè)規(guī)劃。)  

? 3. 為成長中的設(shè)計師們提供機會,讓他們能夠互相激發(fā)促進。(為增進設(shè)計師們的互相影響與激勵提供足夠的機會。)  

即使一部分人已經(jīng)具備了成為優(yōu)秀軟件設(shè)計人員的潛質(zhì),也需要經(jīng)歷工作的慢慢琢磨,方可展現(xiàn)才華。Alan Perlis 則說得更加直接:“任何人都可以被‘教’成一個雕塑匠,但米開朗基羅則被‘教’如何不要成為一個雕塑匠,因為他要做的是雕塑大師,。這個道理放到編程大師身上同樣管用?!盤erlis 認為,偉大的軟件開發(fā)人員都有一種內(nèi)在的特質(zhì),這種特質(zhì)往往比他們所接受的訓(xùn)練更重要。但是這些特質(zhì)是從哪里來的呢?是與生俱來的?還是通過后天勤奮而來?正如 Auguste Gusteau(動畫電影《料理鼠王》里的幻象大廚)所說,“誰都能做飯,但只有那些無所畏懼的人才能成為大廚!”我很情愿地說,將你生命中的大部分時間花在審慎地練習(xí)和提高上,這很重要!但是“無所畏懼”的精神,才是將促使這些練習(xí)成果凝聚成形的途徑?;蛘?,就像是《料理鼠王》里那個與 Gusteau 作對的刻薄的美食評論家 Anton Ego 說的那樣:“不是任何人都能成為偉大的藝術(shù)家,不過,偉大的藝術(shù)家在成名前可能是任何人。”

 所以盡管去書店大買 Java/Ruby/Javascript/PHP 書籍吧;你也許會發(fā)現(xiàn)他們真的挺管用。但是這樣做不會改變你的人生,也不會讓你在整體經(jīng)驗上有什么提高。24小時,幾天,幾周,做一個真正的程序員?光靠讀書可讀不出來。你嘗試過連續(xù) 24 個月不懈努力提高自己么?呵呵,如果你做到了,好吧,那么你開始上路了……

參考書目Bloom, Benjamin (ed.) Developing Talent in Young People (在年輕人中培養(yǎng)人才), Ballantine, 1985.

Brooks, Fred, No Silver Bullets (沒有銀彈), IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Bryan, W.L. & Harter, N. “Studies on the telegraphic language: The acquisition of a hierarchy of habits (電報語言研究:一種習(xí)慣上的收獲).Psychology Review, 1899, 8, 345-375

Hayes, John R., The Complete Problem Solver (完全問題求解)Lawrence Erlbaum, 1989.

Chase, William G. & Simon, Herbert A. “Perception in Chess” Cognitive Psychology (國際象棋的感知), 1973, 4, 55-81.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (實踐中認知:日常生活中的思想,數(shù)學(xué)與文化), Cambridge University Press, 1988. 

 問答 

 典型 PC 系統(tǒng)各種操作指令的大概時間

execute typical instruction 執(zhí)行基本指令

1/1,000,000,000 sec = 1 nanosec

fetch from L1 cache memory

從一級緩存中讀取數(shù)據(jù)

0. 5 nanosec

branch misprediction? 分支誤預(yù)測

5 nanosec

fetch from L2 cache memory? 從二級緩存獲取數(shù)據(jù)

7 nanosec

Mutex lock/unlock? 互斥加鎖/解鎖

25 nanosec

fetch from main memory 從主內(nèi)存獲取數(shù)據(jù)

100 nanosec

send 2K bytes over 1Gbps network? ? 通過 1G bps 的網(wǎng)絡(luò)發(fā)送 2K 字節(jié)

20,000 nanosec

read 1MB sequentially from memory? 從內(nèi)存中順序讀取 1MB 數(shù)據(jù)

250,000 nanosec

fetch from new disk location (seek)? ? 從新的磁盤位置獲取數(shù)據(jù)(隨機讀取)

8,000,000 nanosec

read 1MB sequentially from disk? ? 從磁盤中順序讀取 1MB 數(shù)據(jù)

20,000,000 nanosec

send packet US to Europe and back? 從美國發(fā)送一個報文包到歐洲再返回

150 milliseconds = 150,000,000 nanosec

附錄:語言選擇

有幾個人問他們應(yīng)該先學(xué)哪種編程語言。沒有一個答案,但請考慮以下幾點:

1、善用你的朋友們;當被問到“我應(yīng)該使用什么系統(tǒng)呢?Windows, Unix 還是 Mac?”,我的回答通常是:“看你的朋友們用什么你就用什么。”這么做的好處是,有了你朋友的幫助,你就能有效地回避操作系統(tǒng)固有的一些差異,對于選擇編程語言來說,也是同樣道理。同時,你還要有點兒戰(zhàn)略眼光:如果選擇了一種編程語言,并成為其編程社區(qū)的一員,那么你選擇的語言和社區(qū)是正在不斷壯大?還是奄奄一息?如果你有編程方面的問題,能不能從相關(guān)的書籍,網(wǎng)站以及在線論壇中得到解答?你是不是跟論壇里的人合得來?這些都是要考慮的。

2、簡單實用。諸如 C++ 以及 Java 這樣的編程語言都是非常專業(yè)的開發(fā)語言,適用于有經(jīng)驗的大型團隊進行開發(fā),需要時常考慮代碼的運行效率。所以,這類的編程語言就適合于那樣(復(fù)雜)的編程環(huán)境。如果你是一個初學(xué)者,那么就不要搞那么復(fù)雜。你所需要的是一種簡單易學(xué)的編程語言,你靠你自己就可以搞定的語言。

3、交互(運行)。給你兩種選擇去學(xué)鋼琴:第一種,常規(guī)做法,也是互動的做法,也就是你每敲一下琴鍵就能聽到琴音;第二種,批量模式,等你把所有該按的琴鍵都按了一遍,然后再一次性放給你聽。你選擇哪一個呢?顯然,交互式的方式對于鋼琴學(xué)習(xí)來說更容易,對于編程學(xué)習(xí)也是如此。那么就堅持使用交互式模式學(xué)習(xí)編程吧。

基于上述的觀點,我所推薦的編程入門語言應(yīng)該是 Phyton 或者 Scheme. 但是讀者自身的環(huán)境是非常復(fù)雜多變的,所以你們也許會其他更好的選擇。如果你的年齡還不到兩位數(shù),那么你們應(yīng)該考慮 Alice 語言或者 Squeak 語言(很多成年的初學(xué)者也認為他們很有趣)。當然,做出選擇并開始行動,這個最重要。

附錄:注記書籍和其他資源

模式編程:《Structure and Interpretation of Computer Programs (Abelson & Sussman) 計算機程序的構(gòu)造和解釋》 這本書或許是計算機科學(xué)最好的入門書籍,本書從計算機科學(xué)的角度入手,教你如何進行編程。你可以在online videos of lectures 觀看本書的在線視頻教程,以及 complete text online 的在線文字版。 學(xué)習(xí)本書是需要一些挑戰(zhàn)的,相信該書會讓一部分人望而卻步的。

模式編程:《How to Design Programs (Felleisenet al.) 程序設(shè)計方法》是一本好書,該書介紹了如何用優(yōu)雅并且有效的方式進行程序設(shè)

Python: Python Programming: An Intro to CS (Zelle) 是一本介紹 Python 的好書

Python: Python.org 官方網(wǎng)站上提供了一些在線教程 tutorials.

Oz: Concepts, Techniques, and Models of Computer Programming (計算機編程的概念,技術(shù)和模型) (Van Roy & Haridi) 被看做是 Abelson & Sussman(經(jīng)典計算機教程《計算機程序的構(gòu)造和解釋》的作者——譯者注)的當代傳承者。該書繪制了一幅關(guān)于計算機編程的宏觀藍圖,它囊括了比 Abelson & Sussman 的經(jīng)典教材更廣泛的知識領(lǐng)域,也更加通俗易懂。此書中使用了一種編程語言,Oz, 這種語言在工業(yè)領(lǐng)域內(nèi)幾乎不被使用,其主要目的就是針對于學(xué)習(xí)其他語言

注記

T. Capey 指出,Amazon 網(wǎng)頁上那個 Complete Problem Solver (完全問題求解)頁面把《21天搞定孟加拉語》以及《21天學(xué)會語法》這兩本書移到了“購買此書的用戶還購買過這些產(chǎn)品”這個區(qū)域內(nèi)。我估計大部分人就是從這個區(qū)域看到這本書的。感謝 Ross Cohen 的幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容