Peter Norvig
你們著什么急?
走進(jìn)任何一家書店均唉,您將看到如何在24小時(shí)內(nèi)教會(huì)自己Java,以及提供在幾天或幾小時(shí)內(nèi)教授C婚夫、SQL浸卦、Ruby、算法等的無休止的變體案糙。亞馬遜高級(jí)搜索[title: teach, yourself, hours, since: 2000中找到512本這樣的書限嫌。在前十名中,有九本是編程書(另一本是關(guān)于簿記的)时捌。類似的結(jié)果來自于將“自學(xué)”改為“學(xué)習(xí)”怒医,或?qū)ⅰ靶r(shí)”替換為“天”。
結(jié)論是奢讨,要么人們急于學(xué)習(xí)編程稚叹,要么編程比其他任何東西都容易得多。費(fèi)萊森等人在他們的“如何設(shè)計(jì)程序”(How To Design Program)一書中拿诸,他們表示:“糟糕的編程很容易扒袖,白癡可以在21天內(nèi)學(xué)會(huì)它,即使他們是假人亩码〖韭剩”這位狂暴的鵝漫畫也有自己的想法。
讓我們分析24小時(shí)內(nèi)自學(xué)C++這樣的標(biāo)題可能意味著什么:
自學(xué):在24小時(shí)內(nèi)描沟,你就沒有時(shí)間寫幾個(gè)重要的程序飒泻,從你的成功和失敗中吸取教訓(xùn)鞭光。您將沒有時(shí)間與有經(jīng)驗(yàn)的程序員一起工作,并了解在C++環(huán)境中生活是什么感覺泞遗《栊恚總之,你沒有時(shí)間學(xué)到很多東西史辙。因此汹买,這本書只能談?wù)撘环N膚淺的熟悉,而不是一種深刻的理解髓霞。正如亞歷山大·波普所說卦睹,一點(diǎn)點(diǎn)學(xué)習(xí)是一件危險(xiǎn)的事情。
C++:在24小時(shí)內(nèi)方库,您可能可以學(xué)習(xí)C++的一些語法(如果您已經(jīng)知道另一種語言),但您無法了解如何使用該語言障斋。簡(jiǎn)單地說纵潦,如果你是一個(gè)基本程序員,你可以學(xué)習(xí)用C++語法以Basic的方式編寫程序垃环,但是你不能知道C++實(shí)際上是好的(和壞的)什么邀层。那有什么意義?AlanPerlis曾經(jīng)說過:“一種不影響你對(duì)編程的思考方式的語言是不值得知道的”遂庄。一個(gè)可能的問題是寥院,您必須學(xué)習(xí)一點(diǎn)C++(或者更可能的是,類似JavaScript或處理的東西)涛目,因?yàn)槟枰c現(xiàn)有工具接口來完成特定的任務(wù)秸谢。但是你不是在學(xué)習(xí)如何編程,而是在學(xué)習(xí)如何完成這個(gè)任務(wù)霹肝。
在24小時(shí)內(nèi):不幸的是估蹄,這還不夠,正如下一節(jié)所示沫换。
十年內(nèi)自學(xué)編程
研究人員(Bloom(1985)臭蚁、Bryan&Harter(1899年)、Hayes(1989)讯赏、Simmon&Chase(1973))已經(jīng)證明垮兑,在包括國(guó)際象棋、音樂創(chuàng)作漱挎、電報(bào)運(yùn)算系枪、繪畫、鋼琴演奏识樱、游泳嗤无、網(wǎng)球以及神經(jīng)心理學(xué)和拓?fù)鋵W(xué)研究在內(nèi)的任何廣泛領(lǐng)域震束,都需要十年的時(shí)間才能發(fā)展出專門知識(shí)。關(guān)鍵是深思熟慮的實(shí)踐:不只是再做一次当犯。再一次垢村,用一項(xiàng)超出你目前能力范圍的任務(wù)來挑戰(zhàn)你自己,嘗試它嚎卫,分析你在做的時(shí)候和之后的表現(xiàn)嘉栓,并糾正任何錯(cuò)誤。那就重復(fù)一遍拓诸。再重復(fù)一遍侵佃。似乎沒有真正的捷徑:即使是莫扎特,他在4歲時(shí)是一個(gè)音樂天才奠支,花了13年才開始創(chuàng)作世界級(jí)的音樂馋辈。在另一種類型中,披頭士樂隊(duì)似乎以一連串的熱門和1964年的埃德·沙利文秀出現(xiàn)在現(xiàn)場(chǎng)倍谜。但從1957年起迈螟,他們就一直在利物浦和漢堡打小俱樂部,雖然他們很早就有了很大的吸引力尔崔,但他們的第一個(gè)重大成功答毫,魔鬼辣椒,在1967年被釋放了季春。
馬爾科姆·格拉德威爾(Malcolm Gladwell)推廣了這一理念洗搂,盡管他專注于1萬小時(shí),而不是10年载弄。HenriCartier-Bresson(1908-2004)有另一個(gè)指標(biāo):“你的前10,000張照片是你最差的耘拇。”(他沒有預(yù)料到侦锯,使用數(shù)碼相機(jī)驼鞭,一些人可以在一周內(nèi)達(dá)到這一目標(biāo)。)真正的專業(yè)知識(shí)可能需要一生的時(shí)間:塞繆爾·約翰遜(1709-1784)說:“任何部門的卓越都只能靠一生的勞動(dòng)才能實(shí)現(xiàn)尺碰;不能以較低的價(jià)格購(gòu)買挣棕。”喬叟(1340-1400)抱怨道:“萊夫太短了亲桥,手藝太長(zhǎng)了洛心。”Hippocrates(公元前400年)以摘錄“Ars Longa题篷,vita brevis”而聞名词身,該句是來自于一個(gè)更長(zhǎng)的引用:”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 這段話翻譯成英語就是:“生命很短暫番枚,但是技藝卻很高深法严,機(jī)遇轉(zhuǎn)瞬即逝损敷,探索難以捉摸,抉擇困難重重”深啤。當(dāng)然拗馒,沒有一個(gè)數(shù)字是最終的答案:似乎不合理地假定所有技能(例如編程、下棋溯街、跳棋和音樂演奏)都需要完全相同的時(shí)間來掌握诱桂,也不認(rèn)為所有人都需要完全相同的時(shí)間。正如K·安德斯·愛立信(K.Anders Ericsson)教授所言呈昔,“在大多數(shù)領(lǐng)域挥等,即便是最有才華的人,也需要多少時(shí)間才能達(dá)到最高水平堤尾。1萬小時(shí)的時(shí)間讓你感覺到肝劲,我們所說的每周10到20個(gè)小時(shí),有些人會(huì)認(rèn)為哀峻,那些天生最有天賦的人仍然需要達(dá)到最高水平涡相。”
所以你想成為一名程序員
下面是我編程成功的秘訣:
對(duì)編程感興趣剩蟀,并做一些,因?yàn)樗怯腥さ那型R欢ㄒ3肿銐虻臉啡び兀@樣你就會(huì)愿意投入你的10年/10,000小時(shí)。
項(xiàng)目先朦,最好的學(xué)習(xí)方式是邊做邊學(xué)缰冤。更嚴(yán)格地說,“在某一領(lǐng)域喳魏,個(gè)人的最高業(yè)績(jī)水平并不是隨著經(jīng)驗(yàn)的擴(kuò)展而自動(dòng)達(dá)到的棉浸,但即使是經(jīng)驗(yàn)豐富的個(gè)人,也可以通過刻意改進(jìn)而提高業(yè)績(jī)水平刺彩∶灾#”(第366頁)和“最有效的學(xué)習(xí)需要一個(gè)明確的任務(wù),適當(dāng)?shù)碾y度水平创倔,為特定的個(gè)人嗡害,信息反饋,并有機(jī)會(huì)重復(fù)和糾正錯(cuò)誤畦攘“悦茫”(第20-21頁)“實(shí)踐中的認(rèn)知:日常生活中的思想、數(shù)學(xué)和文化”是這一觀點(diǎn)的有趣參考知押。
與其他程序員交談叹螟;閱讀其他程序鹃骂。這比任何書籍或培訓(xùn)課程都更重要。
如果你愿意罢绽,在一所大學(xué)(或更多的研究生院)待四年畏线。這會(huì)讓你獲得一些需要資格證書的工作,也會(huì)讓你對(duì)這個(gè)領(lǐng)域有更深入的了解有缆,但如果你不喜歡上學(xué)象踊,你可以(用一些奉獻(xiàn)精神)獨(dú)自或在工作中獲得類似的經(jīng)驗(yàn)。無論如何棚壁,光靠書本學(xué)習(xí)是不夠的杯矩。“計(jì)算機(jī)科學(xué)教育不能使任何人成為專業(yè)程序員袖外,就像研究畫筆和顏料可以使人成為專業(yè)畫家一樣”史隆,“新黑客詞典”的作者埃里克·雷蒙德說。我雇過的最好的程序員之一只有高中學(xué)位曼验,他制作了很多很棒的軟件泌射,有自己的新聞組,并且有足夠的股票期權(quán)來購(gòu)買自己的夜總會(huì)鬓照。
與其他程序員一起完成項(xiàng)目熔酷。在某些項(xiàng)目中做最好的程序員;在其他項(xiàng)目上做最差的程序員豺裆。當(dāng)你是最好的拒秘,你可以測(cè)試你的能力來領(lǐng)導(dǎo)一個(gè)項(xiàng)目,并用你的遠(yuǎn)見激勵(lì)別人。當(dāng)你是最壞的時(shí)候,你學(xué)會(huì)了主人做什么洒闸,你學(xué)會(huì)了他們不喜歡做什么(因?yàn)樗麄冏屇銥樗麄冏?。
工作項(xiàng)目后羹应,其他程序員。理解別人寫的程序次屠≡捌ィ看看當(dāng)原來的程序員不在的時(shí)候,需要什么才能理解和修復(fù)它帅矗。想一想如何設(shè)計(jì)你的程序偎肃,讓那些在你之后維護(hù)它們的人更容易。
至少學(xué)習(xí)六種編程語言浑此。包括一種強(qiáng)調(diào)類抽象的語言(比如Java或C++)累颂、一種強(qiáng)調(diào)函數(shù)抽象(比如Lisp、ML或Haskell)、一種支持語法抽象(比如Lisp)紊馏、一種支持聲明性規(guī)范(比如Prolog或C++模板)料饥、一種強(qiáng)調(diào)并行性(比如Clojure或Go)。
記住朱监,在“計(jì)算機(jī)科學(xué)”中有一個(gè)“計(jì)算機(jī)”岸啡。知道您的計(jì)算機(jī)執(zhí)行指令、從內(nèi)存中獲取一個(gè)單詞(是否有緩存丟失)赫编、從磁盤中讀取連續(xù)單詞以及尋找磁盤上的新位置需要多長(zhǎng)時(shí)間巡蘸。(答案在這里)
參與語言標(biāo)準(zhǔn)化工作。它可能是ANSI C++委員會(huì)擂送,也可能是決定您的本地編碼風(fēng)格將有2或4個(gè)空間縮進(jìn)水平悦荒。不管是哪種方式,你都可以了解到其他人在一種語言中喜歡什么嘹吨,他們有多深搬味,也許還有一點(diǎn)是關(guān)于為什么他們會(huì)這樣想的。
有良好的判斷力蟀拷,盡快擺脫語言標(biāo)準(zhǔn)化的努力碰纬。
考慮到所有這些,僅僅通過書本學(xué)習(xí)问芬,你能走多遠(yuǎn)是值得懷疑的悦析。在我的第一個(gè)孩子出生之前,我讀了所有的書此衅,仍然覺得自己是一個(gè)無知的新手她按。30個(gè)月后,當(dāng)我的第二個(gè)孩子即將出生時(shí)炕柔,我是否又回到書本上復(fù)習(xí)了一下?沒有媒佣。相反匕累,我依靠的是我個(gè)人的經(jīng)驗(yàn),這比專家們寫的幾千頁更有用默伍,也更讓我放心欢嘿。
弗雷德·布魯克斯(FredBrooks)在他的文章“沒有銀彈”中指出了一個(gè)尋找優(yōu)軟件設(shè)計(jì)師的三部分計(jì)劃:
? ? ? ? 1. 有組織地辨認(rèn)頂尖的軟件設(shè)計(jì)人才,越早越好(盡早系統(tǒng)的確定一批頂級(jí)設(shè)計(jì)者隊(duì)伍也糊。)
2. 安排一個(gè)職業(yè)導(dǎo)師炼蹦,為其職業(yè)前景指點(diǎn)迷津,并謹(jǐn)慎對(duì)待自己的職業(yè)履歷狸剃。(指派一個(gè)業(yè)務(wù)主管來負(fù)責(zé)前景的發(fā)展以及確保職業(yè)規(guī)劃掐隐。)
3. 為成長(zhǎng)中的設(shè)計(jì)師們提供機(jī)會(huì),讓他們能夠互相激發(fā)促進(jìn)。(為增進(jìn)設(shè)計(jì)師們的互相影響與激勵(lì)提供足夠的機(jī)會(huì)虑省。)
即使一部分人已經(jīng)具備了成為優(yōu)秀軟件設(shè)計(jì)人員的潛質(zhì)匿刮,也需要經(jīng)歷工作的慢慢琢磨,方可展現(xiàn)才華探颈。Alan Perlis 則說得更加直接:“任何人都可以被‘教’成一個(gè)雕塑匠熟丸,但米開朗基羅則被‘教’如何不要成為一個(gè)雕塑匠,因?yàn)樗龅氖堑袼艽髱熚苯冢庑摺_@個(gè)道理放到編程大師身上同樣管用』炒螅”Perlis 認(rèn)為纱兑,偉大的軟件開發(fā)人員都有一種內(nèi)在的特質(zhì),這種特質(zhì)往往比他們所接受的訓(xùn)練更重要叉寂。但是這些特質(zhì)是從哪里來的呢萍启?是與生俱來的?還是通過后天勤奮而來屏鳍?正如 Auguste Gusteau(動(dòng)畫電影《料理鼠王》里的幻象大廚)所說勘纯,“誰都能做飯,但只有那些無所畏懼的人才能成為大廚钓瞭!”我很情愿地說驳遵,將你生命中的大部分時(shí)間花在審慎地練習(xí)和提高上,這很重要山涡!但是“無所畏懼”的精神堤结,才是將促使這些練習(xí)成果凝聚成形的途徑⊙即裕或者竞穷,就像是《料理鼠王》里那個(gè)與 Gusteau 作對(duì)的刻薄的美食評(píng)論家 Anton Ego 說的那樣:“不是任何人都能成為偉大的藝術(shù)家,不過鳞溉,偉大的藝術(shù)家在成名前可能是任何人瘾带。”
所以盡管去書店大Java/Ruby/Javascript/PHP 書籍吧熟菲;你也許會(huì)發(fā)現(xiàn)他們真的挺管用看政。但是這樣做不會(huì)改變你的人生,也不會(huì)讓你在整體經(jīng)驗(yàn)上有什么提高抄罕。24小時(shí)允蚣,幾天,幾周呆贿,做一個(gè)真正的程序員嚷兔?光靠讀書可讀不出來。你嘗試過連續(xù) 24 個(gè)月不懈努力提高自己么?呵呵谴垫,如果你做到了章母,好吧,那么你開始上路了……
參考書目
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 (電報(bào)語言研究:一種習(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 (國(guó)際象棋的感知), 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (實(shí)踐中認(rèn)知:日常生活中的思想乳怎,數(shù)學(xué)與文化), Cambridge University Press, 1988.
問答
典型 PC 系統(tǒng)各種操作指令的大概時(shí)間
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 是享譽(yù)世界的計(jì)算機(jī)科學(xué)家和人工智能專家蚪缀。
他是 AAAI? 和 ACM 的會(huì)員,是業(yè)界內(nèi)經(jīng)典書籍《Artificial Intelligence: A Modern Approach? 人工智能:一種現(xiàn)代方法》的作者之一恕出。
在加入 Google 之前询枚,他曾經(jīng)是 NASA (美國(guó)航空航天局)計(jì)算科學(xué)部門的主要負(fù)責(zé)人,并在南加州大學(xué)以及伯克利大學(xué)任教浙巫。以下為譯文金蜀。
英文原文:Teach Yourself Programming in Ten Years
你們著什么急?
隨意步入一家書店的畴,滿目都是《7天搞定 Java 編程》這種速成書目渊抄,同樣的書籍還包括 Visual Basic、Window 系統(tǒng)丧裁、Internet 互聯(lián)網(wǎng)等等护桦,它們都承諾在幾天,甚至幾小時(shí)之內(nèi)就讓你能夠?qū)W會(huì)相關(guān)技術(shù)煎娇。我在亞馬遜網(wǎng)站上做了如下的條件檢索:
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
出版日期:1992年以后二庵,題目關(guān)鍵字:“天”,“學(xué)會(huì)”或者“自學(xué)”
然后得到了 248 條搜索結(jié)果缓呛。頭 78 條都是計(jì)算機(jī)類書籍(第 79 條記錄是《30天學(xué)會(huì)孟加拉語》)催享。我將“天”關(guān)鍵字換成了“小時(shí)”,不出意外地搜索到了 253 條記錄哟绊,其中頭 77 條記錄是計(jì)算機(jī)書籍睡陪,第 78 條的搜索記錄是《24小時(shí)語法和樣式自學(xué)手冊(cè)》。在總共搜索到的頭 200 條記錄中匿情,有 96% 是計(jì)算機(jī)書籍。
從上面的搜索結(jié)果可以看出來信殊,要么就是人們對(duì)計(jì)算機(jī)技術(shù)的學(xué)習(xí)如饑似渴炬称,要么就是計(jì)算機(jī)技術(shù)實(shí)在太簡(jiǎn)單,不費(fèi)吹灰之力就能學(xué)會(huì)涡拘。相比于計(jì)算機(jī)技術(shù)書籍的如此“速成”玲躯,在其他領(lǐng)域的書籍里,你卻很難找到諸如:“三天學(xué)會(huì)貝多芬”,或者“五天搞定量子力學(xué)”跷车,這種速成教材棘利,甚至連《狗狗喂養(yǎng)手冊(cè)》這種寵物指南,都鮮有“幾天搞定”的說法朽缴。Felleisenet al.在他們的著作《如何設(shè)計(jì)程序》一書中明確指出了這種“速成”的趨勢(shì)善玫,并評(píng)論到:“垃圾的編程技術(shù)當(dāng)然非常容易,傻子都能在 21 天之內(nèi)學(xué)會(huì)密强,哪怕他天生就是個(gè)白癡茅郎。”
讓我們來仔細(xì)看看《3天學(xué)會(huì)C++》這種速成教材實(shí)際上意味著什么:
學(xué)會(huì):在 3 天時(shí)間里你幾乎沒有時(shí)間去寫任何有意義的程序或渤,就更不要談什么從編程中獲得經(jīng)驗(yàn)和教訓(xùn)這種事情了系冗。你也不可能有時(shí)間和有經(jīng)驗(yàn)的程序員一起工作和交流,也不會(huì)體驗(yàn)到在真正的 C++ 環(huán)境下工作是什么感覺薪鹦。長(zhǎng)話短說吧掌敬,你就是沒時(shí)間,也學(xué)不到什么池磁。所以這種書籍最多也就讓你有個(gè)粗淺的印象奔害,但是絕對(duì)不可能有深入的理解。就像亞歷山大教皇說的那樣框仔,“淺嘗輒止是很危險(xiǎn)的”舀武。
C++: 如果你有其他編程語言的基礎(chǔ),那么3天之內(nèi)你也許可以學(xué)到 C++ 的一些語法离斩,但即使是這樣银舱,你還是無法了解如何使用該語言編程。簡(jiǎn)言之跛梗,如果你之前是一個(gè) Basic 程序員寻馏,那么經(jīng)過 3 天的學(xué)習(xí),你會(huì)成為一個(gè)“能使用 C++ 語法編寫 Basic 風(fēng)格程序的程序員”核偿,不過這樣是沒法發(fā)揮出 C++ 語言本身的優(yōu)勢(shì)的(說句不好聽的诚欠,你連怎么犯 C++ 的典型錯(cuò)誤都不會(huì))。僅僅知道一點(diǎn)語法意味著什么呢漾岳?Allan Perlis 曾經(jīng)說過:“一個(gè)無法改變你思維方式的編程語言是不值得學(xué)習(xí)的轰绵。”尼荆;另一種可能性是左腔,你可以只學(xué)一點(diǎn)點(diǎn) C++ 知識(shí)(類似的,或者一點(diǎn)點(diǎn) JavaScript,或者一點(diǎn)點(diǎn) Flex Script)捅儒,然后就可以利用現(xiàn)有的工具制作應(yīng)用接口液样,完成特定的編程任務(wù)了振亮。但是這樣的行為并不意味著你“會(huì)”編程了,你只是會(huì)使用這個(gè)工具完成任務(wù)而已鞭莽。
3天:很不幸坊秸,3天是遠(yuǎn)遠(yuǎn)不夠的,往下看你就知道了澎怒。
peter norvig
研究人員(Bloom (1985)褒搔、 Bryan & Harter (1899,見文后參考書目)丹拯、Hayes (1989)站超、Simmon & Chase (1973,見文后參考書目) 的一系列調(diào)查研究顯示乖酬,在各個(gè)領(lǐng)域內(nèi)死相,要想獲得專業(yè)級(jí)別的水平,大約需要 10 年時(shí)間的努力咬像。參與此項(xiàng)調(diào)查的領(lǐng)域包括:國(guó)際象棋算撮,作曲,發(fā)報(bào)县昂,繪畫肮柜,鋼琴演奏,游泳倒彰,網(wǎng)球等审洞。科學(xué)家們從神經(jīng)心理學(xué)和拓?fù)鋵W(xué)的角度對(duì)這些領(lǐng)域進(jìn)行研究待讳,并得出結(jié)論芒澜。若要在某一領(lǐng)域內(nèi)達(dá)到專家級(jí)的水平,其關(guān)鍵在于“審慎地重復(fù)”创淡,也就是說痴晦,并非是機(jī)械地,一遍又一遍地練習(xí)琳彩,而是要不斷地挑戰(zhàn)自我誊酌,試圖超越自身當(dāng)前的水平,通過不斷的嘗試挑戰(zhàn)露乏,并在嘗試的過程中和嘗試之后對(duì)自身的表現(xiàn)進(jìn)行分析和總結(jié)碧浊,吸取經(jīng)驗(yàn),糾正之前犯過的各種錯(cuò)誤瘟仿。把這一“審慎”的過程不斷重復(fù)辉词,才能取得成功。
所謂的“捷徑”是不存在的猾骡,即使對(duì)于莫扎特這種天才來說瑞躺,也沒有捷徑可走,盡管 4 歲就開始作曲兴想,可是他也花了 13 年的時(shí)間幢哨,才真正地寫出了世界級(jí)的作品。再舉一個(gè)例子嫂便,甲殼蟲樂隊(duì)(The Beatles)捞镰,他們似乎在 1964 年憑借一系列熱門單曲和其在艾德沙利文秀(The Ed Sullivan show)上的演出一炮而紅,但是你也許不知道毙替,他們?cè)缭?1957 年就在利物浦和漢堡兩地進(jìn)行小規(guī)模演出了岸售,而在此之前的非正式演出更是不計(jì)其數(shù)。甲殼蟲樂隊(duì)的主要成名曲《Sgt. Peppers》厂画,則是 1967 年才發(fā)行的凸丸。Malcolm Gladwell 公布了他對(duì)柏林音樂學(xué)院所作的一項(xiàng)研究的報(bào)告,該研究對(duì)比了一個(gè)班里的學(xué)習(xí)成績(jī)?yōu)樯细ぴ骸⒅邢氯齻€(gè)檔次的學(xué)生屎慢,并逐一詢問他們進(jìn)行音樂練習(xí)的時(shí)間
這三個(gè)檔次中的所有人,大約都是在 5 歲的時(shí)候開始練習(xí)音樂的忽洛,一開始的時(shí)候大家練習(xí)音樂的時(shí)間都差不多腻惠,大約一周 2 到 3 小時(shí)。但是到了八歲左右欲虚,大家的區(qū)別就開始體現(xiàn)了集灌。后來成為班里最好的那一部分學(xué)生開始比別的學(xué)生練習(xí)得更多,大概每周 6 到 9 小時(shí)复哆,12歲的時(shí)候每周 8 小時(shí)欣喧,14歲的時(shí)候每周 16 小時(shí),往后則越來越多寂恬,直到 20 歲左右续誉,他們每周練習(xí)音樂的時(shí)間已經(jīng)超過 30 小時(shí)了。在 20 歲的年紀(jì)初肉,那些精英級(jí)別的演奏家們都有累計(jì)超過 10000 小時(shí)的音樂練習(xí)時(shí)間酷鸦。相比之下,僅有部分優(yōu)等生能達(dá)到 8000 小時(shí)的累計(jì)練習(xí)時(shí)間牙咏,而那些音樂教師級(jí)別的學(xué)生臼隔,他們的累計(jì)練習(xí)時(shí)間只有 4000 小時(shí)左右。?
所以妄壶,也許這個(gè)讓你能達(dá)到專業(yè)等級(jí)的神奇時(shí)間應(yīng)該是 10000 小時(shí)摔握,而不是 10 年。(Henri Cartier-Bresson (1908-2004)說過丁寄,“(作為攝影師)氨淌,你所拍攝的頭 10000 張照片都是垃圾”泊愧,但即使是垃圾作品,他拍一張照片也要花接近一小時(shí)盛正。)Samuel Johnson (1709-1784)認(rèn)為這個(gè)時(shí)間應(yīng)該更長(zhǎng):“在任何一個(gè)領(lǐng)域要想做到極好删咱,勢(shì)必窮盡一生的精力,否則根本無法企及豪筝√底蹋” Chaucer (1340-1400)也發(fā)出過“生命如此短暫,技能如此高深”的感嘆续崖。Hippocrates (c. 400BC)因?qū)懴铝巳缦碌木渥佣蝗朔Q頌:“ars longa, vita brevis”敲街,該句是來自于一個(gè)更長(zhǎng)的引用:”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 這段話翻譯成英語就是:“生命很短暫严望,但是技藝卻很高深多艇,機(jī)遇轉(zhuǎn)瞬即逝,探索難以捉摸著蟹,抉擇困難重重”墩蔓。這段話是用拉丁文寫的。在拉丁文里萧豆,ars 可以翻譯為“技藝”或者“藝術(shù)”奸披,但是在古希臘文里,ars 只能做“技能”的意思涮雷,而沒有“藝術(shù)”的意思阵面。
你想當(dāng)程序員么?
下面是我列舉的程序員成功“食譜”
沉醉于編程洪鸭,編程是為了興趣样刷。保持這種充滿興趣的感覺,以便于你能將其投入到你的10 年/10000小時(shí)的編程時(shí)間中览爵。
編寫程序置鼻。最好的學(xué)習(xí)方式是“在實(shí)踐中學(xué)習(xí)”。更技術(shù)一些地說:“一個(gè)人在某個(gè)專業(yè)領(lǐng)域方面能夠達(dá)到最高水平蜓竹,并不是因?yàn)檫@個(gè)人經(jīng)驗(yàn)增長(zhǎng)了以后而自動(dòng)獲得的箕母,而是這個(gè)人為了進(jìn)步所做出了專門的努力之后產(chǎn)生的結(jié)果【慵茫”(p. 366)“最有效的學(xué)習(xí)包括如下幾個(gè)要素:明確并且難度適當(dāng)?shù)娜蝿?wù)嘶是,適應(yīng)學(xué)習(xí)者個(gè)人情況,及時(shí)的信息反饋蛛碌,有重新開始和改正錯(cuò)誤的機(jī)會(huì))(p. 20-21) 《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life / 實(shí)踐中認(rèn)知:日常生活中的思想聂喇,數(shù)學(xué)與文化》這本書提供了上述有趣的觀點(diǎn)
多閱讀優(yōu)秀源碼。同其他程序員交流蔚携,多閱讀其他人寫的程序(注:閱讀優(yōu)秀開源程序)希太。這些遠(yuǎn)比你看書或者上培訓(xùn)班重要
計(jì)算機(jī)專業(yè)研究生克饶。如果你愿意的話,就選擇去讀一個(gè)計(jì)算機(jī)科學(xué)專業(yè)吧(當(dāng)然你還可以去念這個(gè)專業(yè)的研究生)誊辉。如果你能做到這點(diǎn)彤路,那么你就有機(jī)會(huì)找到一些需要計(jì)算機(jī)學(xué)位認(rèn)證的工作,也會(huì)讓你對(duì)這個(gè)行業(yè)有更深的理解芥映。不過,如果你不是上學(xué)的料远豺,那么你可以(當(dāng)然需要有足夠的毅力)靠自己學(xué)習(xí)奈偏,或者通過工作來積累經(jīng)驗(yàn)。無論你采用哪種途徑躯护,光依靠書本是遠(yuǎn)遠(yuǎn)不夠的惊来。“如果說僅僅靠學(xué)習(xí)油畫和調(diào)色技術(shù)無法創(chuàng)造出頂尖的畫家的話棺滞,那么光學(xué)習(xí)計(jì)算機(jī)科學(xué)課程更不能造就頂尖的程序員裁蚁。”继准,Eric Raymond 這樣說過枉证,他著有《新黑客字典》一書。我所聘用過的最好的程序員僅僅只有高中文憑; 他寫了很多偉大的軟件移必,他有他自己的新聞組室谚,并且通過股權(quán)賺夠了錢,還開了家屬于自己的夜店崔泵。(作者說的這個(gè)人是 Jamie Zawinski秒赤,他是網(wǎng)景瀏覽器(Netscape)的早期開發(fā)這者之一,也是開源項(xiàng)目 Mozilla 和XEmacs 的主要貢獻(xiàn)者憎瘸,他開了一家叫做 DNA_lounge 的夜店入篮,位于舊金山的 SoMa 區(qū)——譯者注)
與其他程序員一起做項(xiàng)目。在某些項(xiàng)目中要盡量做到最好幌甘,在某些項(xiàng)目中卻別做那么好潮售。當(dāng)你是最好的時(shí)候,你的領(lǐng)導(dǎo)能力就會(huì)得到鍛煉含潘,并激發(fā)你高瞻遠(yuǎn)矚的視野饲做。當(dāng)你做得不好的時(shí)候,你就能知道你的領(lǐng)導(dǎo)怎么做事遏弱,以及他們不喜歡哪些事(因?yàn)轭I(lǐng)導(dǎo)總是把那些他們不愛做的雜事丟給他們認(rèn)為不得力的人去做)
嘗試后續(xù)跟隨其他程序員一起做項(xiàng)目盆均。嘗試去理解其他人所寫的代碼∈荩看看如果你無法找到代碼的作者本人的情況下泪姨,理解和修正他寫的代碼需要花費(fèi)什么樣的代價(jià)游沿。同時(shí)也思考,如何規(guī)劃你自己的程序代碼肮砾,讓它們更容易被其他人理解和維護(hù)诀黍。
至少學(xué)習(xí)半打編程語言(注:一打是十二個(gè))。包括一種支持類抽象的語言(例如 Java 或者C++)仗处,一種支持函數(shù)抽象的語言(例如 Lisp 或者 ML)眯勾,一種支持語法抽象的語言(例如 Lisp),一種支持聲明式編程的語言(例如 Prolog 或者 C++ 模板)婆誓,一種支持協(xié)同程序的語言(例如 Icon 或者 Scheme)吃环,一種支持平行并發(fā)編程的語言(例如 Sial)
牢記“計(jì)算機(jī)科學(xué)”中包含著“計(jì)算機(jī)”這個(gè)詞(注:性能:數(shù)據(jù)結(jié)構(gòu)與算法)。了解計(jì)算機(jī)需要花多長(zhǎng)的時(shí)間執(zhí)行一條指令洋幻,花多長(zhǎng)時(shí)間從內(nèi)存中獲取一個(gè)字(word)(包括緩存命中和不命中兩種情況)郁轻,如果連續(xù)從磁盤中獲取數(shù)據(jù),時(shí)間消耗如何文留?以及需要花多少時(shí)間才能再磁盤上定位一個(gè)新的位置好唯?
盡量參與語言的標(biāo)準(zhǔn)化過程。往大了說燥翅,你可以試著加入 ANSI C++ 委員會(huì)這樣的專業(yè)組織骑篙,往小了講,你也可以從自己的代碼規(guī)范入手权旷,限定代碼縮進(jìn)是需要 2 個(gè)空格寬還是 4 個(gè)空格寬替蛉。無論采用哪種方式,你都需要了解其他人對(duì)于語言的喜好拄氯,以及他們的喜好的程度躲查,甚至你要知道他們?yōu)槭裁串a(chǎn)生這樣的喜好的原因。
與新技術(shù)標(biāo)準(zhǔn)俱進(jìn)译柏。有良好的意識(shí)镣煮,能盡快適應(yīng)語言標(biāo)準(zhǔn)化的成果。
要掌握上面所說的所有內(nèi)容鄙麦,光靠看書學(xué)習(xí)應(yīng)該是很難做到的典唇。當(dāng)我的第一個(gè)孩子出生的時(shí)候,我?guī)缀蹰喿x了市面上所有的《如何…》指南書籍胯府,但是我讀完了以后還是覺得自己是個(gè)菜鳥介衔。30個(gè)月以后,我的第二個(gè)孩子快出生時(shí)骂因,我難道還要做一個(gè)書蟲么炎咖?不!相反,我此時(shí)更依賴我的個(gè)人經(jīng)驗(yàn)乘盼,這些經(jīng)驗(yàn)相比于那些上千頁的書籍升熊,則更加有效和讓我放心。
發(fā)現(xiàn)和培養(yǎng)軟件設(shè)計(jì)人才的三步驟
Fred Brooks 所著的著名的論文《No Silver Bullets 沒有銀彈》里向我們揭示了發(fā)現(xiàn)和培養(yǎng)軟件設(shè)計(jì)人才的三步驟:
1. 有組織地辨認(rèn)頂尖的軟件設(shè)計(jì)人才绸栅,越早越好(盡早系統(tǒng)的確定一批頂級(jí)設(shè)計(jì)者隊(duì)伍级野。)
2. 安排一個(gè)職業(yè)導(dǎo)師,為其職業(yè)前景指點(diǎn)迷津粹胯,并謹(jǐn)慎對(duì)待自己的職業(yè)履歷蓖柔。(指派一個(gè)業(yè)務(wù)主管來負(fù)責(zé)前景的發(fā)展以及確保職業(yè)規(guī)劃。)
3. 為成長(zhǎng)中的設(shè)計(jì)師們提供機(jī)會(huì)风纠,讓他們能夠互相激發(fā)促進(jìn)渊抽。(為增進(jìn)設(shè)計(jì)師們的互相影響與激勵(lì)提供足夠的機(jī)會(huì)。)
即使一部分人已經(jīng)具備了成為優(yōu)秀軟件設(shè)計(jì)人員的潛質(zhì)议忽,也需要經(jīng)歷工作的慢慢琢磨,方可展現(xiàn)才華十减。Alan Perlis 則說得更加直接:“任何人都可以被‘教’成一個(gè)雕塑匠栈幸,但米開朗基羅則被‘教’如何不要成為一個(gè)雕塑匠,因?yàn)樗龅氖堑袼艽髱煱锉伲僦贰_@個(gè)道理放到編程大師身上同樣管用∮删裕”Perlis 認(rèn)為芍锚,偉大的軟件開發(fā)人員都有一種內(nèi)在的特質(zhì),這種特質(zhì)往往比他們所接受的訓(xùn)練更重要蔓榄。但是這些特質(zhì)是從哪里來的呢并炮?是與生俱來的?還是通過后天勤奮而來甥郑?正如 Auguste Gusteau(動(dòng)畫電影《料理鼠王》里的幻象大廚)所說逃魄,“誰都能做飯,但只有那些無所畏懼的人才能成為大廚澜搅!”我很情愿地說伍俘,將你生命中的大部分時(shí)間花在審慎地練習(xí)和提高上,這很重要勉躺!但是“無所畏懼”的精神癌瘾,才是將促使這些練習(xí)成果凝聚成形的途徑《Γ或者妨退,就像是《料理鼠王》里那個(gè)與 Gusteau 作對(duì)的刻薄的美食評(píng)論家 Anton Ego 說的那樣:“不是任何人都能成為偉大的藝術(shù)家,不過,偉大的藝術(shù)家在成名前可能是任何人碧注∠ィ”
所以盡管去書店大買 Java/Ruby/Javascript/PHP 書籍吧;你也許會(huì)發(fā)現(xiàn)他們真的挺管用萍丐。但是這樣做不會(huì)改變你的人生轩端,也不會(huì)讓你在整體經(jīng)驗(yàn)上有什么提高。24小時(shí)逝变,幾天基茵,幾周,做一個(gè)真正的程序員壳影?光靠讀書可讀不出來拱层。你嘗試過連續(xù) 24 個(gè)月不懈努力提高自己么?呵呵宴咧,如果你做到了根灯,好吧,那么你開始上路了……
參考書目
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 (電報(bào)語言研究:一種習(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 (國(guó)際象棋的感知), 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (實(shí)踐中認(rèn)知:日常生活中的思想烙肺,數(shù)學(xué)與文化), Cambridge University Press, 1988.
問答
典型 PC 系統(tǒng)各種操作指令的大概時(shí)間
execute typical instruction 執(zhí)行基本指令
1/1,000,000,000 sec = 1 nanosec
fetch from L1 cache memory? ? 從一級(jí)緩存中讀取數(shù)據(jù)
0. 5 nanosec
branch misprediction? ? 分支誤預(yù)測(cè)
5 nanosec
fetch from L2 cache memory? ? 從二級(jí)緩存獲取數(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ù)(隨機(jī)讀取)
8,000,000 nanosec
read 1MB sequentially from disk? ? ? ? 從磁盤中順序讀取 1MB 數(shù)據(jù)
20,000,000 nanosec
send packet US to Europe and back? ? ? 從美國(guó)發(fā)送一個(gè)報(bào)文包到歐洲再返回
150 milliseconds = 150,000,000 nanosec
附錄:語言選擇
有幾個(gè)人問他們應(yīng)該先學(xué)哪種編程語言氧卧。沒有一個(gè)答案桃笙,但請(qǐng)考慮以下幾點(diǎn):
1、善用你的朋友們;當(dāng)被問到“我應(yīng)該使用什么系統(tǒng)呢沙绝?Windows, Unix 還是 Mac?”搏明,我的回答通常是:“看你的朋友們用什么你就用什么∩撩剩”這么做的好處是星著,有了你朋友的幫助,你就能有效地回避操作系統(tǒng)固有的一些差異粗悯,對(duì)于選擇編程語言來說强饮,也是同樣道理。同時(shí)为黎,你還要有點(diǎn)兒戰(zhàn)略眼光:如果選擇了一種編程語言邮丰,并成為其編程社區(qū)的一員,那么你選擇的語言和社區(qū)是正在不斷壯大铭乾?還是奄奄一息剪廉?如果你有編程方面的問題,能不能從相關(guān)的書籍炕檩,網(wǎng)站以及在線論壇中得到解答年栓?你是不是跟論壇里的人合得來?這些都是要考慮的章钾。
2尝丐、簡(jiǎn)單實(shí)用三椿。諸如 C++ 以及 Java 這樣的編程語言都是非常專業(yè)的開發(fā)語言,適用于有經(jīng)驗(yàn)的大型團(tuán)隊(duì)進(jìn)行開發(fā),需要時(shí)常考慮代碼的運(yùn)行效率姓迅。所以,這類的編程語言就適合于那樣(復(fù)雜)的編程環(huán)境俊马。如果你是一個(gè)初學(xué)者丁存,那么就不要搞那么復(fù)雜。你所需要的是一種簡(jiǎn)單易學(xué)的編程語言柴我,你靠你自己就可以搞定的語言解寝。
3、交互(運(yùn)行)艘儒。給你兩種選擇去學(xué)鋼琴:第一種聋伦,常規(guī)做法,也是互動(dòng)的做法界睁,也就是你每敲一下琴鍵就能聽到琴音嘉抓;第二種,批量模式晕窑,等你把所有該按的琴鍵都按了一遍,然后再一次性放給你聽卵佛。你選擇哪一個(gè)呢杨赤?顯然,交互式的方式對(duì)于鋼琴學(xué)習(xí)來說更容易截汪,對(duì)于編程學(xué)習(xí)也是如此疾牲。那么就堅(jiān)持使用交互式模式學(xué)習(xí)編程吧。
基于上述的觀點(diǎn)衙解,我所推薦的編程入門語言應(yīng)該是 Phyton 或者 Scheme. 但是讀者自身的環(huán)境是非常復(fù)雜多變的阳柔,所以你們也許會(huì)其他更好的選擇。如果你的年齡還不到兩位數(shù)蚓峦,那么你們應(yīng)該考慮 Alice 語言或者 Squeak 語言(很多成年的初學(xué)者也認(rèn)為他們很有趣)舌剂。當(dāng)然,做出選擇并開始行動(dòng)暑椰,這個(gè)最重要霍转。
附錄:注記書籍和其他資源
模式編程:《Structure and Interpretation of Computer Programs (Abelson & Sussman)? 計(jì)算機(jī)程序的構(gòu)造和解釋》 這本書或許是計(jì)算機(jī)科學(xué)最好的入門書籍,本書從計(jì)算機(jī)科學(xué)的角度入手一汽,教你如何進(jìn)行編程避消。你可以在online videos of lectures 觀看本書的在線視頻教程,以及 complete text online 的在線文字版。 學(xué)習(xí)本書是需要一些挑戰(zhàn)的岩喷,相信該書會(huì)讓一部分人望而卻步的恕沫。
模式編程:《How to Design Programs (Felleisenet al.)? 程序設(shè)計(jì)方法》是一本好書,該書介紹了如何用優(yōu)雅并且有效的方式進(jìn)行程序設(shè)
Python: Python Programming: An Intro to CS (Zelle) 是一本介紹 Python 的好書
Python: Python.org 官方網(wǎng)站上提供了一些在線教程 tutorials.
Oz: Concepts, Techniques, and Models of Computer Programming (計(jì)算機(jī)編程的概念纱意,技術(shù)和模型) (Van Roy & Haridi) 被看做是 Abelson & Sussman(經(jīng)典計(jì)算機(jī)教程《計(jì)算機(jī)程序的構(gòu)造和解釋》的作者——譯者注)的當(dāng)代傳承者婶溯。該書繪制了一幅關(guān)于計(jì)算機(jī)編程的宏觀藍(lán)圖,它囊括了比 Abelson & Sussman 的經(jīng)典教材更廣泛的知識(shí)領(lǐng)域妇穴,也更加通俗易懂爬虱。此書中使用了一種編程語言,Oz腾它, 這種語言在工業(yè)領(lǐng)域內(nèi)幾乎不被使用跑筝,其主要目的就是針對(duì)于學(xué)習(xí)其他語言
注記
T. Capey 指出,Amazon 網(wǎng)頁上那個(gè) Complete Problem Solver (完全問題求解)頁面把《21天搞定孟加拉語》以及《21天學(xué)會(huì)語法》這兩本書移到了“購(gòu)買此書的用戶還購(gòu)買過這些產(chǎn)品”這個(gè)區(qū)域內(nèi)瞒滴。我估計(jì)大部分人就是從這個(gè)區(qū)域看到這本書的曲梗。感謝 Ross Cohen 的幫助。