十年內(nèi)自學(xué)編程
研究者(Bloom(1985)忍坷、Bryan & Harter(1899)蹲堂、Hayes(1989)凉驻、Simmon & Chase(1973))都表明,在下棋艳丛、音樂創(chuàng)作匣掸、電報(bào)操作趟紊、繪畫、彈鋼琴碰酝、游泳霎匈、網(wǎng)球以及神經(jīng)心理學(xué)和拓?fù)鋵W(xué)研究等眾多領(lǐng)域中的任何一個(gè)領(lǐng)域,都需要大約10年的時(shí)間來發(fā)展專業(yè)知識(shí)送爸。關(guān)鍵是刻意練習(xí):不是一味地重復(fù)做铛嘱,而是用一個(gè)剛好超出你目前能力的任務(wù)來挑戰(zhàn)自己,嘗試一下袭厂,在做的時(shí)候和做完之后分析自己的表現(xiàn)墨吓,并糾正任何錯(cuò)誤。然后再重復(fù)纹磺。然后再重復(fù)帖烘。似乎沒有真正的捷徑:即使是4歲就成為音樂神童的莫扎特,也花了13年時(shí)間才開始創(chuàng)作出世界級(jí)的音樂橄杨。在另一種類型中秘症,披頭士樂隊(duì)似乎是憑借一連串的#1熱門歌曲和1964年在埃德-沙利文節(jié)目中的亮相而嶄露頭角的。但自1957年以來式矫,他們一直在利物浦和漢堡的小俱樂部演出乡摹,雖然他們?cè)缙诰哂写蟊娢Γ麄兊牡谝粋€(gè)巨大的評(píng)論成功衷佃,Sgt.Peppers趟卸,于1967年發(fā)布。
馬爾科姆-格拉德威爾(Malcolm Gladwell)已經(jīng)普及了這個(gè)想法氏义,盡管他專注于10000小時(shí)锄列,而不是10年。亨利-卡蒂爾-布列松(1908-2004)有另一個(gè)衡量標(biāo)準(zhǔn):"你的前一萬張照片是你最糟糕的作品"惯悠。他沒有預(yù)料到邻邮,用數(shù)碼相機(jī),有些人可以在一周內(nèi)達(dá)到這個(gè)大關(guān))克婶。真正的專業(yè)技能可能需要一生的時(shí)間筒严。塞繆爾-約翰遜(1709-1784)說過 "任何部門的卓越只有通過一生的努力才能達(dá)到,它是不可能用較低的價(jià)格買到的情萤。" 而喬叟(1340-1400)抱怨 "lyf so short鸭蛙,the craft so long to lerne"。希波克拉底(Hippocrates筋岛,約公元前400年)以節(jié)選 "Ars longa娶视,vita brevis "著稱,這是較長引文 "Ars longa,vita brevis肪获,occasionio praeceps寝凌,experimentum periculosum,iudicium difficile "的一部分孝赫,英文譯為 "Life is short较木,[the]craft long,opportunity fleeting青柄,experiment treacherous伐债,judge difficult"。當(dāng)然刹前,沒有一個(gè)單一的數(shù)字可以作為最終的答案:假設(shè)所有的技能(如編程泳赋、下棋雌桑、下跳棋和音樂演奏)都可能需要完全相同的時(shí)間來掌握喇喉,也假設(shè)所有的人都需要完全相同的時(shí)間,這似乎并不合理校坑。正如安德斯-愛立信教授所說:"在大多數(shù)領(lǐng)域拣技,即使是最有天賦的人也需要多少時(shí)間才能達(dá)到最高水平的表現(xiàn)。1萬小時(shí)這個(gè)數(shù)字只是讓你感覺到耍目,我們說的是每周10到20個(gè)小時(shí)的年限膏斤,而那些有些人認(rèn)為是最有天分的人仍然需要這樣的時(shí)間才能達(dá)到最高水平。
為什么大家都這么著急邪驮?
走進(jìn)任何一家書店莫辨,你都會(huì)看到《24小時(shí)內(nèi)自學(xué)Java》,旁邊還有無窮無盡的變種毅访,提供在幾天或幾個(gè)小時(shí)內(nèi)教授C沮榜、SQL、Ruby喻粹、算法等蟆融。亞馬遜高級(jí)搜索【標(biāo)題:教,自己守呜,小時(shí)型酥,自:2000年以來,發(fā)現(xiàn)512本這樣的書查乒。前十名中弥喉,有9本是編程類書籍(另一本是關(guān)于記賬的)。把 "教自己 "換成 "學(xué)"玛迄,或者把 "小時(shí) "換成 "天"由境,也有類似的結(jié)果。
結(jié)論是憔晒,要么是人們大肆學(xué)習(xí)編程藻肄,要么是編程在某種程度上比其他東西更容易學(xué)得美妙蔑舞。Felleisen等人在他們的《如何設(shè)計(jì)程序》一書中對(duì)這一趨勢進(jìn)行了點(diǎn)撥,他們說:"糟糕的編程很容易嘹屯。白癡可以在21天內(nèi)學(xué)會(huì)它攻询,即使他們是傻瓜。" Abtruse Goose的漫畫也有他們的看法州弟。
所以你想成為一名程序員
這是我的編程成功秘訣:
對(duì)編程感興趣钧栖,因?yàn)楹猛妫砸鲆恍┢畔琛4_保它一直足夠有趣拯杠,這樣你才會(huì)愿意投入你的十年/10000小時(shí)。
程序啃奴。最好的學(xué)習(xí)是在實(shí)踐中學(xué)習(xí)潭陪。更技術(shù)化地講,"個(gè)人在某一領(lǐng)域中的最大表現(xiàn)水平并不是作為長期經(jīng)驗(yàn)的函數(shù)而自動(dòng)達(dá)到的最蕾,但即使是經(jīng)驗(yàn)豐富的個(gè)人依溯,也可以通過刻意努力提高表現(xiàn)水平"。(第366頁)而 "最有效的學(xué)習(xí)需要有一個(gè)明確的任務(wù)瘟则,對(duì)特定個(gè)體來說有適當(dāng)?shù)碾y度黎炉,有信息反饋,有重復(fù)和糾正錯(cuò)誤的機(jī)會(huì)"醋拧。(第20-21頁)《實(shí)踐中的認(rèn)知》一書慷嗜。"(第20-21頁)《實(shí)踐中的認(rèn)知:日常生活中的心智、數(shù)學(xué)和文化》一書是這一觀點(diǎn)的有趣參考丹壕。
與其他程序員交流庆械;閱讀其他程序。這比任何書籍或培訓(xùn)課程都重要雀费。
如果你愿意干奢,在大學(xué)里投入四年的時(shí)間(或者在研究生院里投入更多)。這將使你有機(jī)會(huì)從事一些需要證書的工作盏袄,而且會(huì)使你對(duì)這個(gè)領(lǐng)域有更深的了解忿峻,但如果你不喜歡上學(xué),你可以(在有一定的奉獻(xiàn)精神的情況下)自己或在工作中獲得類似的經(jīng)驗(yàn)辕羽。無論如何逛尚,僅靠書本學(xué)習(xí)是不夠的。新黑客詞典》的作者埃里克-雷蒙德(Eric Raymond)說:"計(jì)算機(jī)科學(xué)教育不能使任何人成為程序員專家刁愿,就像學(xué)習(xí)毛筆和顏料可以使某人成為畫家專家一樣"绰寞。我曾經(jīng)雇傭過的一個(gè)最好的程序員只有高中學(xué)歷,他制作了很多優(yōu)秀的軟件,擁有自己的新聞集團(tuán)滤钱,股票期權(quán)賺得足夠買下自己的夜總會(huì)觉壶。
與其他程序員一起做項(xiàng)目。在一些項(xiàng)目上成為最好的程序員件缸,在另一些項(xiàng)目上成為最差的程序員铜靶。當(dāng)你是最好的,你可以檢驗(yàn)?zāi)泐I(lǐng)導(dǎo)項(xiàng)目的能力他炊,并以你的眼光激勵(lì)他人争剿。當(dāng)你是最差的時(shí)候,你可以學(xué)習(xí)高手們做的事情痊末,也可以學(xué)習(xí)他們不喜歡做的事情(因?yàn)樗麄冏屇銥樗麄冏觯?/h4>
?跟著其他程序員做項(xiàng)目蚕苇。理解別人寫的程序。當(dāng)原來的程序員不在的時(shí)候凿叠,看看要怎么理解和修復(fù)它涩笤。思考如何設(shè)計(jì)你的程序,讓你之后維護(hù)程序的人更輕松幔嫂。
至少學(xué)習(xí)半打編程語言辆它。包括一門強(qiáng)調(diào)類抽象的語言(如Java或C++)誊薄,一門強(qiáng)調(diào)功能抽象的語言(如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ù)讀取字俏脊、尋找到磁盤上的新位置需要多長時(shí)間全谤。(答案在此。)
參與語言標(biāo)準(zhǔn)化工作爷贫∪先唬可能是ANSI C++委員會(huì),也可能是決定你的本地編碼風(fēng)格是采用2個(gè)還是4個(gè)空格縮進(jìn)級(jí)別漫萄。不管是哪種方式卷员,你都能了解到其他人喜歡的語言是什么,他們有多深的感受腾务,甚至可能會(huì)了解到他們?yōu)槭裁磿?huì)有這樣的感受毕骡。
要有良好的意識(shí),盡快擺脫語言標(biāo)準(zhǔn)化工作。
考慮到這些未巫,其僅靠書本學(xué)習(xí)能走多遠(yuǎn)窿撬,值得商榷。在第一個(gè)孩子出生前叙凡,我把所有的How To書都看了一遍尤仍,但還是覺得自己是個(gè)毫無頭緒的新手。30個(gè)月后狭姨,當(dāng)我的第二個(gè)孩子即將出生時(shí)宰啦,我又回到書本上復(fù)習(xí)了嗎?相反饼拍,我依靠自己的親身經(jīng)歷赡模,這比專家們寫的幾千頁書更有用,也更讓我放心师抄。
Fred Brooks在他的文章《No Silver Bullet》中指出了尋找優(yōu)秀軟件設(shè)計(jì)師的三個(gè)部分計(jì)劃:
1.盡早系統(tǒng)地識(shí)別頂級(jí)設(shè)計(jì)師漓柑。
2.指派一名職業(yè)導(dǎo)師負(fù)責(zé)對(duì)潛在客戶的培養(yǎng),并認(rèn)真保存職業(yè)檔案叨吮。
3.為成長中的設(shè)計(jì)師提供相互交流辆布、相互激勵(lì)的機(jī)會(huì)
這就假設(shè)有些人已經(jīng)具備了成為一名優(yōu)秀設(shè)計(jì)師的必備素質(zhì),工作就是要適當(dāng)?shù)卣T導(dǎo)他們茶鉴。Alan Perlis說得更簡潔锋玲。"每個(gè)人都可以被教成雕塑家 米開朗基羅就得教他如何不雕刻。偉大的程序員也是如此"涵叮。Perlis的意思是說惭蹂,偉大的人都有一些超越他們訓(xùn)練的內(nèi)在品質(zhì)。但這種品質(zhì)從何而來割粮?是與生俱來的嗎盾碗?還是他們通過勤奮培養(yǎng)出來的?正如Auguste Gusteau(《料理鼠王》中虛構(gòu)的廚師)所說舀瓢,"任何人都可以做飯廷雅,但只有無畏者才能成為偉大的人"。我認(rèn)為更多的是愿意將自己生命中的大部分時(shí)間投入到刻意的實(shí)踐中京髓。但也許無畏是一種概括的方式航缀。或者朵锣,正如食神的批評(píng)家安東-埃戈所說:"不是每個(gè)人都能成為偉大的藝術(shù)家谬盐,但偉大的藝術(shù)家可以來自任何地方。"
所以去買那本Java/Ruby/Javascript/PHP的書吧诚些;你可能會(huì)從中得到一些用處飞傀。但你不會(huì)在24小時(shí)或21天內(nèi)改變你的生活皇型,也不會(huì)改變你作為一個(gè)程序員的真正的整體專業(yè)知識(shí)。怎么樣在24個(gè)月內(nèi)努力地不斷提高呢砸烦?好了弃鸦,現(xiàn)在你開始有收獲了......
考慮到這些未巫,其僅靠書本學(xué)習(xí)能走多遠(yuǎn)窿撬,值得商榷。在第一個(gè)孩子出生前叙凡,我把所有的How To書都看了一遍尤仍,但還是覺得自己是個(gè)毫無頭緒的新手。30個(gè)月后狭姨,當(dāng)我的第二個(gè)孩子即將出生時(shí)宰啦,我又回到書本上復(fù)習(xí)了嗎?相反饼拍,我依靠自己的親身經(jīng)歷赡模,這比專家們寫的幾千頁書更有用,也更讓我放心师抄。
Fred Brooks在他的文章《No Silver Bullet》中指出了尋找優(yōu)秀軟件設(shè)計(jì)師的三個(gè)部分計(jì)劃:
這就假設(shè)有些人已經(jīng)具備了成為一名優(yōu)秀設(shè)計(jì)師的必備素質(zhì),工作就是要適當(dāng)?shù)卣T導(dǎo)他們茶鉴。Alan Perlis說得更簡潔锋玲。"每個(gè)人都可以被教成雕塑家 米開朗基羅就得教他如何不雕刻。偉大的程序員也是如此"涵叮。Perlis的意思是說惭蹂,偉大的人都有一些超越他們訓(xùn)練的內(nèi)在品質(zhì)。但這種品質(zhì)從何而來割粮?是與生俱來的嗎盾碗?還是他們通過勤奮培養(yǎng)出來的?正如Auguste Gusteau(《料理鼠王》中虛構(gòu)的廚師)所說舀瓢,"任何人都可以做飯廷雅,但只有無畏者才能成為偉大的人"。我認(rèn)為更多的是愿意將自己生命中的大部分時(shí)間投入到刻意的實(shí)踐中京髓。但也許無畏是一種概括的方式航缀。或者朵锣,正如食神的批評(píng)家安東-埃戈所說:"不是每個(gè)人都能成為偉大的藝術(shù)家谬盐,但偉大的藝術(shù)家可以來自任何地方。"