十年自學(xué)編程
彼得·諾維格
為什么每個人都這么著急?
走進(jìn)任何書店侦锯,您將看到如何在24小時內(nèi)自學(xué)Java,以及無窮無盡的變體,可以在幾天或幾小時內(nèi)教授C肄扎,SQL,Ruby荆针,算法等碑宴。亞馬遜高級搜索[標(biāo)題:自學(xué),自學(xué)姐叁,自學(xué)克懊,自2000年以來,共發(fā)現(xiàn)512本書七蜘。在前十名中谭溉,有九本是編程書籍(另一本是關(guān)于簿記的)。通過將“自學(xué)”替換為“學(xué)習(xí)”或?qū)ⅰ靶r”替換為“天”橡卤,可以得到類似的結(jié)果扮念。
結(jié)論是要么人們急于學(xué)習(xí)編程,要么編程比其他任何事物都更容易學(xué)習(xí)碧库。Felleisen等柜与。?在他們的書《如何設(shè)計程序》中對這種趨勢表示贊同,當(dāng)他們說“錯誤的編程很容易嵌灰。白癡可以在21天內(nèi)學(xué)習(xí)它弄匕,即使他們是傻瓜」敛t!?Abtruse Goose漫畫也受到了歡迎迁匠。
讓我們分析一下“?24小時自學(xué)C ++”這樣的標(biāo)題的?含義:
自學(xué):在24小時內(nèi),您將沒有時間編寫幾個重要的程序驹溃,并從中學(xué)習(xí)成功和失敗的原因城丧。您將沒有時間與經(jīng)驗豐富的程序員一起工作,也不了解在C ++環(huán)境中生活的感覺豌鹤。簡而言之亡哄,您將沒有時間學(xué)習(xí)很多東西。因此布疙,這本書只能說是膚淺的熟悉蚊惯,而不是深刻的理解愿卸。正如亞歷山大·波普(Alexander Pope)所說,學(xué)一點東西是危險的截型。
C ++:在24小時內(nèi)趴荸,您可能可以學(xué)習(xí)C ++的某些語法(如果您已經(jīng)知道另一種語言),但是您對如何使用該語言的了解卻不多菠劝。簡而言之赊舶,如果您是一名Basic程序員,則可以學(xué)習(xí)使用C ++語法以Basic風(fēng)格編寫程序赶诊,但是您將無法了解C ++的優(yōu)點(或缺點)笼平。那有什么意義呢??艾倫·珀利斯(Alan Perlis)曾經(jīng)說過:“不影響您對編程的思考方式的語言是不值得了解的”舔痪。一個可能的觀點是寓调,您必須學(xué)習(xí)一小部分C ++(或更可能是JavaScript或Processing之類的東西),因為您需要與現(xiàn)有工具交互以完成特定任務(wù)锄码。但是夺英,那時您不會學(xué)習(xí)編程。您正在學(xué)習(xí)完成該任務(wù)滋捶。
在24小時內(nèi):不幸的是痛悯,這還不夠,如下一節(jié)所示重窟。
十年自學(xué)編程
研究人員(Bloom(1985)载萌,Bryan&Harter(1899),Hayes(1989)巡扇,Simmon&Chase(1973))顯示扭仁,在下棋,音樂等眾多領(lǐng)域中發(fā)展專業(yè)知識大約需要十年的時間厅翔。寫作乖坠,電報操作,繪畫刀闷,彈鋼琴熊泵,游泳,網(wǎng)球以及神經(jīng)心理學(xué)和拓?fù)鋵W(xué)研究涩赢。關(guān)鍵是商議?練習(xí):不僅要一遍又一遍地做戈次,還要挑戰(zhàn)一項超越您當(dāng)前能力的任務(wù)來挑戰(zhàn)自己,嘗試一下筒扒,分析執(zhí)行前后的表現(xiàn),并糾正任何錯誤绊寻。然后重復(fù)花墩。再重復(fù)一次悬秉。似乎沒有真正的捷徑:即使是4歲的音樂天才莫扎特,也花了13年的時間才開始創(chuàng)作世界一流的音樂冰蘑。在另一種類型中和泌,甲殼蟲樂隊似乎爆出一連串的#1熱門歌曲,并在1964年的埃德·沙利文(Ed Sullivan)演出中露面祠肥。但是自1957年以來武氓,他們一直在利物浦和漢堡的小型俱樂部里打球,盡管他們頗具吸引力在早期仇箱,他們的第一個重大成功就是Sgt县恕。Peppers于1967年發(fā)行。
馬爾科姆·格拉德威爾盡管他專注于10,000小時(而不是10年)剂桥,但他已經(jīng)推廣了這個想法忠烛。亨利·卡蒂埃·布雷森(Henri Cartier-Bresson权逗,1908-2004年)還有另一個度量標(biāo)準(zhǔn):“您的前10,000張照片是最糟糕的美尸。”?(他沒想到數(shù)碼相機(jī)會在一個星期內(nèi)達(dá)到這個目標(biāo)斟薇。)真正的專業(yè)知識可能需要一輩子:塞繆爾·約翰遜(Samuel Johnson(1709-1784))說:“任何部門的出色表現(xiàn)都只能靠他的勞動來實現(xiàn)师坎。一輩子;不要以較低的價格購買堪滨】杪”?喬uc(1340-1400)抱怨說:“ lyf太短了,工藝太長了椿猎』塘耄”?希波克拉底(約公元前400年)以“ ars longa,vita brevis”的摘錄而聞名犯眠,它是“ Ars longa按灶,vita brevis,occasio praeceps筐咧,experimentum perculosum鸯旁,iudicium difficile”較長引語的一部分量蕊,英語中用“ Life”表示铺罢。是短,?當(dāng)然残炮,沒有一個數(shù)字可以作為最終答案:假設(shè)所有技能(例如編程韭赘,下棋,下棋和玩音樂)可能都需要完全相同的時間來掌握势就,這似乎是不合理的泉瞻,也不會所有人都花費(fèi)完全相同的時間脉漏。正如?K. Anders Ericsson教授所說:“在大多數(shù)領(lǐng)域,即使是最有才華的個人也需要多少時間才能達(dá)到最高水平袖牙。令人難以置信的是侧巨,10,000小時的工作時間使您感覺我們正在談?wù)摱嗄昴承┤藭f,那些天生才華橫溢的人每周必須花費(fèi)10到20個小時才能達(dá)到最高水平鞭达∷境溃”
所以你想成為一名程序員
這是我編程成功的秘訣:
獲取感興趣的節(jié)目,并做一些畴蹭,因為它很有趣坦仍。確保它保持足夠的樂趣,以便您愿意投入十年/ 10,000小時的時間撮胧。
程序桨踪。最好的學(xué)習(xí)是邊做邊學(xué)。從技術(shù)上來說芹啥,“在一定范圍內(nèi)锻离,個人的最高績效不會根據(jù)擴(kuò)展經(jīng)驗而自動獲得,但是即使是經(jīng)驗豐富的個人墓怀,由于有意改進(jìn)也可以提高績效水平汽纠。 】模”?(p虱朵。366)?和“最有效的學(xué)習(xí)需要對特定個體具有適當(dāng)難度級別的明確定義的任務(wù),信息反饋以及重復(fù)和糾正錯誤的機(jī)會钓账〔耆”?(第20-21頁)《實踐中的認(rèn)知:日常生活中的思維,數(shù)學(xué)和文化》是對此觀點的有趣參考梆暮。
與其他程序員交談服协;閱讀其他程序。這比任何書籍或培訓(xùn)課程都重要啦粹。
如果需要偿荷,可以在大學(xué)學(xué)習(xí)四年(或者在研究生院學(xué)習(xí)四年)。這將使您能夠訪問一些需要證書的工作唠椭,并且可以使您對該領(lǐng)域有更深入的了解跳纳,但是,如果您不喜歡學(xué)校贪嫂,則可以(有一定的奉獻(xiàn)精神)獨(dú)自或在工作中獲得類似的經(jīng)驗寺庄。 。無論如何,僅靠書籍學(xué)習(xí)是不夠的铣揉∪纳睿《新黑客字典》的作者埃里克·雷蒙德(Eric Raymond)表示:“計算機(jī)科學(xué)教育不能像學(xué)習(xí)畫筆和顏料那樣使任何人成為專家程序員餐曹」涔埃”?我曾經(jīng)雇用過的最好的程序員之一只有高中學(xué)位。他制作了很多很棒的?軟件台猴,并擁有自己的新聞組并且擁有足夠的股票期權(quán)購買自己的夜總會朽合。
與其他程序員一起從事項目。在某些項目中成為最好的程序員饱狂;在其他人身上最糟糕曹步。當(dāng)您處于最佳狀態(tài)時,就可以測試自己領(lǐng)導(dǎo)項目的能力休讳,并用自己的遠(yuǎn)見激發(fā)他人的才能讲婚。在最壞的情況下,您將學(xué)習(xí)大師的所作所為俊柔,并了解他們不喜歡做的事情(因為他們讓您為他們做)筹麸。
在其他程序員之后從事項目。了解別人編寫的程序雏婶∥锔希看看當(dāng)原始程序員不在時需要理解和修復(fù)它的過程×敉恚考慮如何設(shè)計您的程序酵紫,使那些在您之后維護(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ī)科學(xué)”中有一個“計算機(jī)”。知道您的計算機(jī)執(zhí)行一條指令蜜氨,從內(nèi)存中獲取一個單詞(有或沒有緩存未命中)械筛,從磁盤讀取連續(xù)的單詞以及在磁盤上尋找新位置花了多長時間。(在這里回答飒炎。)
參與語言?標(biāo)準(zhǔn)化工作埋哟。它可以是ANSI C ++委員會,也可以確定您的本地編碼樣式是否具有2或4個空格縮進(jìn)級別。無論哪種方式赤赊,您都可以了解其他人在某種語言中的喜好闯狱,他們的感受有多深,甚至可能很少了解他們?yōu)槭裁慈绱恕?/p>
具有良好的意識抛计,可以盡快開始語言標(biāo)準(zhǔn)化工作哄孤。
考慮到所有這些,僅通過學(xué)習(xí)書籍就能取得多大的成績值得懷疑吹截。在我的第一個孩子出生之前瘦陈,我閱讀了所有“如何做”書,仍然覺得自己是一個笨手笨手的新手波俄。30個月后晨逝,當(dāng)我的第二個孩子到期時,我是否又回到書店復(fù)習(xí)了懦铺?否捉貌。相反,我依靠自己的個人經(jīng)歷冬念,事實證明趁窃,與專家撰寫的成千上萬頁相比,這對我來說更加有用和令人放心刘急。
弗雷德·布魯克斯(Fred Brooks)在他的論文《無銀子彈》中?確定了一個由三部分組成的計劃棚菊,以尋找優(yōu)秀的軟件設(shè)計師:
盡早系統(tǒng)地確定頂級設(shè)計師。
指派職業(yè)指導(dǎo)者負(fù)責(zé)潛在客戶的發(fā)展叔汁,并仔細(xì)保存職業(yè)檔案统求。
為成長中的設(shè)計師提供互動和相互刺激的機(jī)會。
假設(shè)某些人已經(jīng)具備成為優(yōu)秀設(shè)計師所需的素質(zhì)据块;工作是適當(dāng)?shù)睾弪_他們码邻。?艾倫·佩里斯(Alan Perlis)更簡潔地說:“每個人都可以被雕刻而成:米開朗基羅必須被教導(dǎo)如何不做。偉大的程序員也是如此另假∠裎荩”?佩利斯(Perlis)說,偉人的內(nèi)在素質(zhì)超越了他們的訓(xùn)練边篮。但是質(zhì)量從何而來己莺?是天生的嗎?還是他們通過勤奮發(fā)展戈轿?正如奧古斯特·古斯托(Ratatouille的虛構(gòu)廚師?)所說凌受,“任何人都可以做飯,但只有無所畏懼的人才能做得好思杯∈を龋”?我將其更多地看作是愿意將一生的大部分時間投入到思考實踐中。但也許?無所畏懼是一種總結(jié)的方式√懿幔或者领突,正如古斯托(Gusteau)的批評家安東·埃戈(Anton Ego)所說:“并非每個人都能成為一位偉大的藝術(shù)家,但是一位偉大的藝術(shù)家可以來自任何地方案怯【”
因此,繼續(xù)購買那本Java / Ruby / Javascript / PHP書殴泰;您可能會從中受益匪淺于宙。但是您不會在24小時或21天之內(nèi)改變自己的生活,也不會改變自己真正的整體專業(yè)知識悍汛。如何努力在24個月內(nèi)不斷改進(jìn)?好吧至会,現(xiàn)在您開始有所建樹...
參考文獻(xiàn)
本杰明·布魯姆(ed离咐。),《年輕人的發(fā)展才能》奉件,巴蘭廷宵蛀,1985年。
布魯克斯县貌,弗雷德术陶,《無銀子彈》,IEEE計算機(jī)煤痕,第一卷?20號?1987年第4期梧宫,第4頁。10-19摆碉。
Bryan塘匣,WL&Harter,N.“關(guān)于電報語言的研究:習(xí)性等級的獲得巷帝〖陕保《心理學(xué)評論》,1899年楞泼,第8期驰徊,第345-375頁
海耶斯(John Hayes),《完全問題解決者》勞倫斯·艾爾鮑姆(Lawrence Erlbaum)堕阔,1989年棍厂。
Chase,William G.&Simon印蔬,Herbert A.?“國際象棋的?認(rèn)知”認(rèn)知心理學(xué)勋桶,1973,4,55-81例驹。
Lave捐韩,Jean,《實踐中的認(rèn)知:日常生活中的思維鹃锈,數(shù)學(xué)和文化》荤胁,劍橋大學(xué)出版社,1988年屎债。
答案典型PC上各種操作的大概時間:
執(zhí)行典型的指令1 / 1,000,000,000秒= 1納秒
從L1緩存中獲取0.5納秒
分支預(yù)測錯誤5納秒
從二級緩存中獲取7納秒
互斥鎖25納秒
從主內(nèi)存中獲取100納秒
通過1Gbps網(wǎng)絡(luò)發(fā)送2K字節(jié)20,000納秒
從內(nèi)存順序讀取1MB250,000納秒
從新磁盤位置獲冉稣(查找)8,000,000納秒
從磁盤順序讀取1MB20,000,000納秒
將小包美國發(fā)送到歐洲并返回150毫秒= 150,000,000納秒
附錄:語言選擇
一些人問他們應(yīng)該首先學(xué)習(xí)哪種編程語言。沒有答案盆驹,但是請考慮以下幾點:
使用你的朋友圆丹。當(dāng)被問及“我應(yīng)該使用哪種操作系統(tǒng),Windows躯喇,Unix或Mac辫封?”時,我的回答通常是:“使用您的朋友使用的任何軟件”廉丽。從朋友那里學(xué)習(xí)的好處將抵消操作系統(tǒng)之間或編程語言之間的任何內(nèi)在差異倦微。還請考慮您的未來朋友:如果繼續(xù),您將成為程序員社區(qū)的一部分正压。您選擇的語言是一個正在成長的大型社區(qū)還是一個瀕臨滅絕的社區(qū)欣福?是否有書籍,網(wǎng)站和在線論壇可提供答案焦履?你喜歡那些論壇里的人嗎拓劝?
保持簡單。諸如C ++和Java之類的編程語言是由經(jīng)驗豐富的程序員組成的大型團(tuán)隊設(shè)計的裁良,這些團(tuán)隊關(guān)心其代碼的運(yùn)行時效率凿将。結(jié)果,這些語言具有針對這些情況設(shè)計的復(fù)雜部分价脾。您擔(dān)心要學(xué)習(xí)編程牧抵。您不需要那種麻煩。您需要一種被設(shè)計為易于由單個新程序員學(xué)習(xí)和記住的語言侨把。
玩犀变。您寧愿學(xué)習(xí)彈鋼琴的方式:正常的互動方式,即敲擊琴鍵后便會聽到每個音符秋柄,也就是“批量”模式获枝,即在整首歌結(jié)束后才聽到音符。 骇笔?顯然省店,交互模式使鋼琴和編程學(xué)習(xí)變得更加容易嚣崭。堅持使用交互式模式的語言并使用它。
給定這些條件懦傍,我對第一種編程語言的建議是Python或?Scheme雹舀。另一個選擇是Javascript,不是因為它是為初學(xué)者精心設(shè)計的粗俱,而是因為有很多在線教程供您使用说榆,例如?Khan Academy的教程。但是您的情況可能會有所不同寸认,還有其他不錯的選擇签财。如果您的年齡是個位數(shù),則您可能更喜歡?Alice或Squeak?或Blockly(年齡較大的學(xué)習(xí)者可能會喜歡)偏塞。重要的是您選擇并開始唱蒸。
附錄:書籍和其他資源
有幾個人問他們應(yīng)該從中學(xué)到什么書和網(wǎng)頁。我重申“僅靠書本學(xué)習(xí)是不夠的”烛愧,但我可以推薦以下內(nèi)容:
方案:?計算機(jī)程序的結(jié)構(gòu)和解釋(Abelson和Sussman)可能是計算機(jī)科學(xué)的最好入門油宜,它確實教授編程作為理解計算機(jī)科學(xué)的一種方式。您可以在本書上在線觀看講座視頻怜姿,以及在線全文。這本書極具挑戰(zhàn)性疼燥,將淘汰一些可能通過其他方法成功的人沧卢。
方案:?如何設(shè)計程序(Felleisen等人)是一本有關(guān)如何以一種優(yōu)雅而實用的方式實際設(shè)計程序的最佳書籍之一。
Python:?Python編程:CS入門(Zelle)是使用Python的不錯的入門醉者。
Python:Python.org?上提供了一些在線教程但狭。
Oz:?計算機(jī)編程的概念,技術(shù)和模型(Van Roy和Haridi)?被某些人視為Abelson&Sussman的現(xiàn)代繼任者撬即。這是一門編程的大創(chuàng)意立磁,涵蓋了比Abelson&Sussman更大的范圍,同時也許更易于閱讀和遵循剥槐。它使用一種不知名的語言O(shè)z唱歧,但它是學(xué)習(xí)其他語言的基礎(chǔ)。<
筆記
T. Capey指出粒竖,亞馬遜上的“完全解決問題”頁面現(xiàn)在在“購買此商品的客戶也購買了這些商品”部分下有“ 21天自學(xué)孟加拉語”和“自學(xué)語法和風(fēng)格”書颅崩。我猜想看那本書的人很大一部分來自此頁面。感謝Ross Cohen為希波克拉底提供的幫助蕊苗。