《十年学会编程》
《十年學(xué)會(huì)編程》
《十年學(xué)會(huì)編程》
Peter Norvig
為啥都想速成?
隨便逛一下書(shū)店,你會(huì)看到《7天自學(xué)Java》等諸如此類(lèi)的N天甚至N小時(shí)學(xué)習(xí)Visual Basic、Windows、Internet的書(shū)。我用亞馬遜網(wǎng)站的搜索功能,出版年份選1992年以后,書(shū)名關(guān)鍵詞是:“天”、“自學(xué)”、“教你”,查到248個(gè)結(jié)果,前78個(gè)是計(jì)算機(jī)類(lèi)圖書(shū),第79個(gè)是《30天學(xué)孟加拉語(yǔ)》。我用“天”換成“小時(shí)”,結(jié)果更驚人,有多達(dá)253本書(shū),前77本是計(jì)算機(jī)圖書(shū),第78是《24小時(shí)自學(xué)語(yǔ)法句式》。在前200名中,96%是計(jì)算機(jī)的書(shū)。
結(jié)論就是:要么人們急于學(xué)習(xí)電腦,要么計(jì)算機(jī)比其他東西學(xué)起來(lái)要異常簡(jiǎn)單。沒(méi)有任何書(shū)是關(guān)于幾天學(xué)習(xí)貝多芬或量子物理的,甚至連犬類(lèi)裝扮都沒(méi)有。費(fèi)雷森(Felleisen)等人在其著作《如何設(shè)計(jì)程序》中同意這個(gè)趨勢(shì),其中提到:“壞設(shè)計(jì)很簡(jiǎn)單,笨蛋才用21天學(xué),盡管他們還是真傻。”
讓我們看看《三日學(xué)會(huì)C++》這個(gè)書(shū)名意味著什么:
◇學(xué)習(xí):
三天內(nèi)你可能沒(méi)有時(shí)間寫(xiě)出有意義的程序,或者從中積累經(jīng)驗(yàn)。你不可能有時(shí)間去跟職業(yè)編程者一起去理解在C++環(huán)境下的狀況。簡(jiǎn)而言之,你沒(méi)有充足的時(shí)間學(xué)很多。所以這本書(shū)只能說(shuō)膚淺的知識(shí)。正如亞歷山大·波普(Alexander Pope)所言:一知半解是很危險(xiǎn)的。
◇C++:
三天內(nèi)你可能學(xué)會(huì)C++的句法(如果你已經(jīng)了解其他的語(yǔ)言),但你還不會(huì)使用它。打個(gè)比方,假如你是個(gè)Basic程序員,你可能寫(xiě)出Basic風(fēng)格的C++程序,而無(wú)法理解C++的真實(shí)好處。那要點(diǎn)是什么?艾倫·佩里斯(Alan Perlis)曾經(jīng)說(shuō)過(guò):“一門(mén)不能影響你編程觀點(diǎn)的語(yǔ)言不足學(xué)的。”有可能你學(xué)了一點(diǎn)點(diǎn)C++(或者諸如Javascript、Flex之類(lèi)),因?yàn)槟阈枰同F(xiàn)成的工具接口以完成手頭的任務(wù)。這種情況下,你不是在學(xué)習(xí)如何編程,只是在學(xué)習(xí)如何完成任務(wù)。
◇三日:
不幸地是,這遠(yuǎn)遠(yuǎn)不夠,下一部分會(huì)詳細(xì)講。
如何用十年掌握編程?
研究人員(Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973))得出結(jié)論:想要在諸多領(lǐng)域達(dá)到職業(yè)水平需要十年,比如國(guó)際象棋,作曲,電報(bào)操作,繪畫(huà),彈鋼琴,游泳,網(wǎng)球以及神經(jīng)心理學(xué)和拓?fù)鋵W(xué)的研究。關(guān)鍵是精心練習(xí),只是一遍一遍地重復(fù)是不夠的,必須挑戰(zhàn)恰好超越你能限的事情,嘗試并思考你的表現(xiàn),并自我矯正。周而復(fù)始。這并無(wú)捷徑!4歲的音樂(lè)奇才莫扎特用了13年才能創(chuàng)作世界級(jí)的音樂(lè)。另外,披頭士樂(lè)隊(duì)似乎在1964年的埃德·蘇利文( Ed Sullivan show)演出中一炮而紅,但是他們自從1957年就在利物浦和漢堡的酒吧演出,在取得廣泛關(guān)注后,第一部重量級(jí)作品《佩珀軍士》(Sgt. Peppers)是在1967年發(fā)行。馬爾科姆·格拉德威爾(Malcolm Gladwell)撰文描述了一項(xiàng)針對(duì)柏林音樂(lè)學(xué)院學(xué)生的研究,他們被分為尖子,中等和不足三類(lèi),并被問(wèn)到他們練琴的情況:
所有三組中的人,開(kāi)始學(xué)琴的年齡大概相差無(wú)幾,五歲左右。在剛開(kāi)始的幾年,所有人練習(xí)量也差不多,一周兩三個(gè)小時(shí)。自八歲開(kāi)始,實(shí)質(zhì)性變化就有了。那些精英學(xué)生開(kāi)始比其他人練習(xí)更多:九歲的時(shí)候一周六個(gè)小時(shí),十二歲的時(shí)候一周八個(gè)小時(shí),十四歲的時(shí)候一周十六個(gè)小時(shí),一直到二十歲的時(shí)候一周要超過(guò)三十小時(shí)。截止到二十歲,在他們的生涯里已經(jīng)有總計(jì)一萬(wàn)小時(shí)練琴。僅僅表現(xiàn)可以的那部分學(xué)生加起來(lái)是八千小時(shí),那些未來(lái)的音樂(lè)老師有四千小時(shí)。
所以,更確切地說(shuō),一萬(wàn)小時(shí),而非十年,是個(gè)神奇之?dāng)?shù)。薩繆爾·約翰遜(Samuel Johnson, 1709-1784)認(rèn)為還需更長(zhǎng)時(shí)間:“卓越乃一生之追求,而非其它”。 喬叟(Chaucer, 1340-1400)抱怨道”the lyf so short, the craft so long to lerne.” (生之有限,學(xué)也無(wú)涯)。希波克拉底(Hippocrates, c. 400BC)因這句話被世人所知:”ars longa, vita brevis”(譯注:拉丁語(yǔ),意為“藝無(wú)盡,生有涯”),更長(zhǎng)的版本是 “Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”,翻譯成英文就是 “Life is short, (the) craft long, opportunity fleeting, experiment treacherous, judgment difficult.” (生有涯,藝無(wú)盡,機(jī)遇瞬逝,踐行誤導(dǎo),決斷不易)。
我的編程成功秘笈是:
◇首先要對(duì)編程感興趣,能從編程中得到樂(lè)趣
一定要讓它足夠有趣,因?yàn)槟阋3帜愕呐d趣長(zhǎng)達(dá)十年。
◇與別的程序員交流
閱讀別人的代碼——這比看任何書(shū)或參加培訓(xùn)課都重要。
◇實(shí)踐。最好的學(xué)習(xí)乃實(shí)踐。
俗話說(shuō):“編程的至高境界一定要通過(guò)充分的實(shí)踐才能達(dá)到,而個(gè)人的能力可通過(guò)不懈努力獲得顯著提升?!?(p. 366) “最有效率的學(xué)習(xí)需要明確的目標(biāo),適當(dāng)?shù)碾y度,知識(shí)回饋,并容許重復(fù)或修正錯(cuò)誤?!?(p. 20-21) 《實(shí)踐認(rèn)知:每日的思維、數(shù)學(xué)及文化》(Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life) 在這方面可做參考。
無(wú)論如何,單靠書(shū)本是遠(yuǎn)遠(yuǎn)不夠的?!皩W(xué)習(xí)計(jì)算機(jī)科學(xué)不會(huì)讓你成為編程專(zhuān)家,如同學(xué)習(xí)繪畫(huà)和色彩理論不會(huì)讓你成為畫(huà)家一樣”
◇如果你愿意,花四年學(xué)習(xí)大學(xué)課程(或者再加上讀研)。這將給你贏得某些工作機(jī)會(huì),并給予你在該領(lǐng)域的深層見(jiàn)解。但如果你不喜歡學(xué)校的學(xué)習(xí),你同樣可以在工作中獲得相似的經(jīng)驗(yàn)。無(wú)論如何,單靠書(shū)本是遠(yuǎn)遠(yuǎn)不夠的?!皩W(xué)習(xí)計(jì)算機(jī)科學(xué)不會(huì)讓你成為編程專(zhuān)家,如同學(xué)習(xí)繪畫(huà)和色彩理論不會(huì)讓你成為畫(huà)家一樣”。這是埃里克·雷蒙德(Eric Raymond)說(shuō)的,他是《新黑客字典》(The New Hacker’s Dictionary)的作者。我雇用過(guò)的最優(yōu)秀程序員,只有高中文憑。但他開(kāi)發(fā)過(guò)許多偉大軟件,有自己的新聞組,通過(guò)公司認(rèn)股賺的錢(qián)就讓他買(mǎi)下了自己的夜店。
◇和其他程序員一起參與工程項(xiàng)目。在某些項(xiàng)目中擔(dān)當(dāng)最優(yōu)秀程序員
在另一些項(xiàng)目中充當(dāng)最差勁程序員。充當(dāng)領(lǐng)頭羊的時(shí)候,你要測(cè)試你領(lǐng)導(dǎo)一項(xiàng)工程的能力,并用你的視野來(lái)激發(fā)他人;如果在項(xiàng)目組中墊底,就應(yīng)該學(xué)習(xí)其它牛人在做些啥,以及他們不喜歡做的(看他們把哪些活讓給你做)。
◇繼續(xù)別人的工程項(xiàng)目。
去理解先前程序員寫(xiě)的程序。學(xué)習(xí)如何理解并解決先前程序員沒(méi)有考慮到的問(wèn)題。思考你的程序該如何設(shè)計(jì)以便讓之后的程序員更容易維護(hù)。
◇至少學(xué)6種程序語(yǔ)言。
其中包括一種支持類(lèi)抽象的(Java和C++),一種支持函數(shù)抽象的(如Lisp或ML),一種支持語(yǔ)義抽象的(Lisp),一種支援聲明規(guī)范的(如Prolog或C++模板),還有一種支援協(xié)程的(Icon或Scheme),另外一種支持并發(fā)的(Sisal)。
理解計(jì)算機(jī)執(zhí)行你的代碼的時(shí)候花費(fèi)的時(shí)間
◇記住,在“計(jì)算機(jī)科學(xué)”里有“計(jì)算機(jī)”一詞。理解計(jì)算機(jī)執(zhí)行你的代碼的時(shí)候花費(fèi)的時(shí)間。比如:從內(nèi)存中取一個(gè)字(考慮有無(wú)緩存未命中情形),連續(xù)從磁盤(pán)讀字,或者在磁盤(pán)中定位。
◇參加語(yǔ)言標(biāo)準(zhǔn)化工作。
這可能是有關(guān) ANSI C++ 委員會(huì),也可能是決定你編碼風(fēng)格是兩格縮進(jìn)或四格縮進(jìn)。無(wú)論如何,你要知道其他人對(duì)語(yǔ)言的喜好程度,有時(shí)還要想想他們?yōu)槭裁聪矚g這樣。
◇知道自己應(yīng)該在何時(shí)脫身于語(yǔ)言標(biāo)準(zhǔn)化
所有上述這些,很難通過(guò)書(shū)本的學(xué)習(xí)來(lái)達(dá)到。我頭一個(gè)孩子出生時(shí),我讀了所有的“如何做”(How To)系列的書(shū)籍,卻依然對(duì)育嬰毫無(wú)頭緒。30個(gè)月后,我第二個(gè)孩子出生,我還需要溫習(xí)一下那些書(shū)嗎?絕對(duì)不!相反,我完全可以參照個(gè)人經(jīng)驗(yàn),而結(jié)果相當(dāng)有效。這更讓我確信:我的經(jīng)驗(yàn)勝過(guò)那些專(zhuān)家們寫(xiě)的上千頁(yè)文字。
弗雷德·布魯克斯(Fred Brooks)在《沒(méi)有銀彈》(No Silver Bullet)一書(shū)給出了尋找頂級(jí)設(shè)計(jì)師的三條建議:
◇盡早系統(tǒng)地識(shí)別出頂級(jí)設(shè)計(jì)師。
◇分配一個(gè)人作為其職業(yè)規(guī)劃的導(dǎo)師。
◇給予機(jī)遇讓成長(zhǎng)中的設(shè)計(jì)師互相磨礪。
此處假定有部分人已經(jīng)有成為偉大設(shè)計(jì)師的潛質(zhì),你所需的就是要誘導(dǎo)他們。艾倫·佩里斯(Alan Perlis)一針見(jiàn)血地指出:”假如人人都可以學(xué)雕刻,那就得教米開(kāi)朗基羅如何不去干雕刻。對(duì)于偉大程序員,也是如此?!?/p>
所以,簡(jiǎn)單地買(mǎi)一本Java書(shū),你或許能找到些有用的東西,但絕不會(huì)讓你在24小時(shí)內(nèi)甚至24天抑或24月內(nèi),成為行家里手。
轉(zhuǎn)載于:https://www.cnblogs.com/huangke/p/7644959.html
總結(jié)
- 上一篇: 高可用性系统架构:负载均衡与容错策略
- 下一篇: /u 反斜杠u 编码总结