為什么每個人都這么著急渤滞?
走進任何書店捶索,您將看到如何在24小時內(nèi)自學Java,以及無窮無盡的變體等舔,可以在幾天或幾小時內(nèi)教授C牺荠,SQL翁巍,Ruby,算法等休雌。亞馬遜高級搜索[標題:自學灶壶,自學,自學杈曲,自2000年以來驰凛,共發(fā)現(xiàn)512本書。在前十名中担扑,有九本是編程書籍(另一本是關(guān)于簿記的)恰响。通過將“自學”替換為“學習”或?qū)ⅰ靶r”替換為“天”,可以得到類似的結(jié)果涌献。
結(jié)論是要么人們急于學習編程胚宦,要么編程比其他任何事物都更容易學習。 Felleisen等。在他們的書《如何設計程序》中對這種趨勢表示贊同间唉,當他們說“錯誤的編程很容易绞灼。白癡即使是假人也可以在21天內(nèi)學習它〕室埃” Abtruse Goose漫畫也受到了歡迎低矮。
讓我們分析一下“ 24小時自學C ++”這樣的標題的含義:
自學:在24小時內(nèi),您將沒有時間編寫幾個重要的程序被冒,并從中學習成功和失敗的原因军掂。您將沒有時間與經(jīng)驗豐富的程序員一起工作,也不了解在C ++環(huán)境中生活的感覺昨悼。簡而言之蝗锥,您將沒有時間學習很多東西。因此率触,這本書只能說是膚淺的熟悉终议,而不是深刻的理解。正如亞歷山大·波普(Alexander Pope)所說葱蝗,學一點東西是危險的穴张。
C ++:在24小時內(nèi),您可能可以學習C ++的某些語法(如果您已經(jīng)知道另一種語言)两曼,但是您對如何使用該語言的了解卻不多皂甘。簡而言之,如果您是一名Basic程序員悼凑,則可以學習使用C ++語法以Basic風格編寫程序偿枕,但是您將無法了解C ++的優(yōu)點(或缺點)。那有什么意義呢户辫?艾倫·珀利斯(Alan Perlis)曾經(jīng)說過:“不影響您對編程的思考方式的語言是不值得了解的”渐夸。一個可能的觀點是,您必須學習一小部分C ++(或更可能是JavaScript或Processing之類的東西)渔欢,因為您需要與現(xiàn)有工具交互以完成特定任務墓塌。但是,那時您不會學習編程膘茎。您正在學習完成該任務。
在24小時內(nèi):不幸的是酷誓,這還不夠披坏,如下一節(jié)所示。
十年自學編程
研究人員(Bloom(1985)盐数,Bryan&Harter(1899)棒拂,Hayes(1989),Simmon&Chase(1973))顯示,在下棋帚屉,音樂等眾多領(lǐng)域中發(fā)展專業(yè)知識大約需要十年的時間谜诫。寫作,電報操作攻旦,繪畫喻旷,彈鋼琴,游泳牢屋,網(wǎng)球以及神經(jīng)心理學和拓撲學研究且预。關(guān)鍵是深思熟慮的實踐:不僅要一遍又一遍地做,還要挑戰(zhàn)一項超越您當前能力的任務來挑戰(zhàn)自己烙无,嘗試一下锋谐,分析執(zhí)行前后的表現(xiàn),并糾正任何錯誤截酷。然后重復涮拗。再重復一次。似乎沒有真正的捷徑:即使是4歲的音樂天才莫扎特迂苛,也花了13年的時間才開始創(chuàng)作世界一流的音樂三热。在另一種類型中,甲殼蟲樂隊似乎爆出一連串的#1熱門歌曲灾部,并在1964年的埃德·沙利文(Ed Sullivan)演出中露面康铭。但是,自1957年以來赌髓,他們一直在利物浦和漢堡的小型俱樂部打球从藤,盡管如此,他們?nèi)匀痪哂芯薮蟮奈υ谠缙谒洌麄兊牡谝粋€重大成功就是Sgt夷野。胡椒,于1967年發(fā)行荣倾。
馬爾科姆·格拉德威爾(Malcolm Gladwell)推廣了這個想法悯搔,盡管他專注于10,000小時而不是10年。亨利·卡蒂吧嗳裕·布雷森(Henri Cartier-Bresson妒貌,1908-2004年)還有另一個度量標準:“您的前10,000張照片是最糟糕的≈恚” (他沒想到數(shù)碼相機會在一個星期內(nèi)達到這個目標灌曙。)真正的專業(yè)知識可能需要一輩子:塞繆爾·約翰遜(Samuel Johnson(1709-1784))說:“只有通過一輩子;不要以較低的價格購買节芥≡诖蹋”喬uc(1340-1400)抱怨說:“ lyf太短了逆害,工藝太長了◎纪眨”希波克拉底(約公元前400年)以其摘錄“ ars longa魄幕,vita brevis”而著稱,這是更長的引文“ Ars longa颖杏,vita brevis纯陨,occasio praeceps,experimentum perculosum输玷,iudicium difficile”的一部分队丝,英語中用“ Life”表示。短欲鹏,工藝長机久,機會稍縱即逝,實驗詭reach赔嚎,判斷困難膘盖。”當然尤误,沒有一個數(shù)字可以作為最終答案:假設所有技能(例如編程侠畔,下棋,下棋和玩音樂)可能都需要完全相同的時間來掌握损晤,這似乎是不合理的软棺,也不會所有人都花費完全相同的時間。正如K. Anders Ericsson教授所說:“在大多數(shù)領(lǐng)域尤勋,即使是最有才華的個人也需要多少時間才能達到最高水平喘落。令人難以置信的是,10,000小時的工作時間使您感覺我們正在談論多年某些人會說最冰,那些天生才華橫溢的人每周必須花費10到20個小時才能達到最高水平瘦棋。”
所以你要成為一名程序員
這是我編程成功的秘訣:
對編程感興趣暖哨,并做一些有趣的事情赌朋。確保它保持足夠的樂趣,以便您愿意投入十年/ 10,000小時的時間篇裁。
程序沛慢。最好的學習方法就是邊做邊學。從技術(shù)上來說达布,“在一定范圍內(nèi)团甲,個人的最高績效不會根據(jù)擴展經(jīng)驗而自動獲得,但是即使是經(jīng)驗豐富的個人往枣,由于有意改進也可以提高績效水平伐庭。 》指裕” (p圾另。366)和“最有效的學習需要對特定個體具有適當難度級別的明確定義的任務,信息反饋以及重復和糾正錯誤的機會雕沉〖牵” (第20-21頁)《實踐中的認知:日常生活中的思維,數(shù)學和文化》是對此觀點的有趣參考坡椒。
與其他程序員交談扰路;閱讀其他程序。這比任何書籍或培訓課程都重要倔叼。
如果需要汗唱,可以在大學學習四年(或者在研究生院學習四年)。這將使您能夠訪問一些需要證書的工作丈攒,并且可以使您對該領(lǐng)域有更深入的了解哩罪,但是,如果您不喜歡學校巡验,則可以(有一定的奉獻精神)獨自或在工作中獲得類似的經(jīng)驗际插。 。無論如何显设,僅靠書籍學習是不夠的框弛。 《新黑客字典》的作者埃里克·雷蒙德(Eric Raymond)表示:“計算機科學教育不能像學習畫筆和顏料那樣使任何人成為專家程序員〔段妫”我曾經(jīng)雇用過的最好的程序員之一只有高中學位瑟枫。他開發(fā)了許多出色的軟件,擁有自己的新聞組绞蹦,并擁有足夠的股票期權(quán)來購買自己的夜總會力奋。
與其他程序員一起從事項目。在某些項目中成為最好的程序員幽七;在其他人身上最糟糕景殷。當您處于最佳狀態(tài)時,就可以測試自己領(lǐng)導項目的能力澡屡,并用自己的遠見激發(fā)他人的才能猿挚。在最壞的情況下,您將學習大師的所作所為驶鹉,并了解他們不喜歡做的事情(因為他們讓您為他們做)绩蜻。
在其他程序員之后從事項目。了解別人編寫的程序室埋“炀看看當原始程序員不在時需要理解和修復它的過程伊约。考慮如何設計您的程序孕蝉,使那些在您之后維護它們的人更輕松屡律。
學習至少六種編程語言。包括一種強調(diào)類抽象的語言(如Java或C ++)降淮,一種強調(diào)功能抽象的語言(如Lisp或ML或Haskell)超埋,一種支持語法抽象的語言(如Lisp),一種支持聲明性規(guī)范的語言(如Prolog或C ++模板)佳鳖。 霍殴,并且強調(diào)并行性(例如Clojure或Go)。
請記住系吩,“計算機科學”中有一個“計算機”来庭。知道計算機執(zhí)行指令,從內(nèi)存中獲取一個單詞(有或沒有緩存未命中)穿挨,從磁盤讀取連續(xù)的單詞以及在磁盤上尋找新位置花了多長時間巾腕。 (在這里回答。)
參與語言標準化工作絮蒿。它可以是ANSI C ++委員會尊搬,也可以確定您的本地編碼樣式是否具有2或4個空格縮進級別。無論哪種方式土涝,您都可以了解其他人在某種語言中的喜好佛寿,他們的感受有多深,甚至可能很少了解他們?yōu)槭裁慈绱恕?/p>
具有良好的意識但壮,可以盡快開始語言標準化工作冀泻。
考慮到所有這些,僅通過學習書籍就能獲得多大的成績值得懷疑蜡饵。在我的第一個孩子出生之前弹渔,我閱讀了所有“如何做”書,仍然覺得自己是一個笨手笨手的新手溯祸。 30個月后肢专,當我的第二個孩子到期時,我是否又回到書店復習了焦辅?否博杖。相反,我依靠自己的個人經(jīng)歷筷登,事實證明剃根,與專家撰寫的成千上萬頁相比,這對我來說更加有用和令人放心前方。
弗雷德·布魯克斯(Fred Brooks)在他的論文《無銀子彈》中確定了一個由三部分組成的計劃狈醉,以尋找優(yōu)秀的軟件設計師:
盡早系統(tǒng)地確定頂級設計師廉油。
指派職業(yè)指導者負責潛在客戶的發(fā)展,并仔細保存職業(yè)檔案苗傅。
為成長中的設計師提供互動和相互刺激的機會娱两。
假設某些人已經(jīng)具備成為優(yōu)秀設計師所需的素質(zhì);工作是適當?shù)睾弪_他們金吗。艾倫·珀利斯(Alan Perlis)更簡潔地說:“每個人都可以學會雕刻:必須教導米開朗基羅如何不做。偉大的程序員也是如此趣竣∫∶恚”佩利斯(Perlis)說,偉人的內(nèi)在素質(zhì)超越了他們的訓練遥缕。但是質(zhì)量從何而來卫袒?是天生的嗎?還是他們通過勤奮發(fā)展单匣?正如奧古斯特·古斯托(Ratatouille的虛構(gòu)廚師)所說夕凝,“任何人都可以做飯,但只有無所畏懼的人才能做得好户秤÷氡”我認為這更多是愿意花很大的時間去思考認可的實踐。但是也許無所畏懼是一種概括的方式鸡号∽或者,正如古斯托(Gusteau)的批評家安東·埃戈(Anton Ego)所說:“不是每個人都能成為一名偉大的藝術(shù)家鲸伴,但是偉大的藝術(shù)家可以來自任何地方府蔗。”
因此汞窗,繼續(xù)購買那本Java / Ruby / Javascript / PHP書姓赤;您可能會從中受益匪淺。但是您不會在24小時或21天之內(nèi)改變自己的生活仲吏,也不會改變自己真正的整體專業(yè)知識不铆。如何努力在24個月內(nèi)不斷改進?好吧裹唆,現(xiàn)在您開始有所建樹...
參考文獻
本杰明·布魯姆(ed狂男。),《年輕人的發(fā)展才能》品腹,巴蘭廷岖食,1985年。
布魯克斯舞吭,弗雷德泡垃,《無銀子彈》析珊,IEEE計算機,第1卷蔑穴。 20號1987年第4期忠寻,第4頁。 10-19存和。
布萊恩(W.L.) &Harter奕剃,N .:“電報語言研究:習性等級的獲得【柰龋《心理評論》纵朋,1899年,第8期茄袖,第345-375頁
海耶斯(John Hayes)操软,《完全問題解決者》勞倫斯·艾爾鮑姆(Lawrence Erlbaum),1989年宪祥。
Chase聂薪,William G.和Simon,Herbert A.“國際象棋的認知”認知心理學蝗羊,1973藏澳,4,55-81耀找。
Lave笆载,Jean,《實踐中的認知:日常生活中的思維涯呻,數(shù)學和文化》凉驻,劍橋大學出版社,1988年复罐。
答案
典型PC上各種操作的大概時間:
執(zhí)行典型指令1 / 1,000,000,000秒= 1納秒
從L1緩存中獲取0.5納秒
分支錯誤預測5納秒
從二級緩存中獲取7納秒
互斥鎖25納秒
從主內(nèi)存獲取100納秒
通過1Gbps網(wǎng)絡發(fā)送2K字節(jié)20,000納秒
從內(nèi)存250,000納秒順序讀取1MB
從新磁盤位置獲壤缘恰(搜索)8,000,000納秒
從磁盤20,000,000納秒順序讀取1MB
將數(shù)據(jù)包發(fā)送到歐洲并返回150毫秒= 150,000,000納秒
附錄:語言選擇
一些人問他們應該首先學習哪種編程語言。沒有答案效诅,但是請考慮以下幾點:
使用你的朋友胀滚。當被問及“我應該使用哪種操作系統(tǒng),Windows乱投,Unix或Mac咽笼?”時,我的回答通常是:“使用您的朋友使用的任何軟件”戚炫。從朋友那里學習的好處將抵消操作系統(tǒng)之間或編程語言之間的任何內(nèi)在差異剑刑。還請考慮您的未來朋友:如果繼續(xù),您將成為程序員社區(qū)的一部分。您選擇的語言是一個正在成長的大型社區(qū)還是一個瀕臨滅絕的社區(qū)施掏?是否有書籍钮惠,網(wǎng)站和在線論壇可提供答案?你喜歡那些論壇里的人嗎七芭?
把事情簡單化素挽。諸如C ++和Java之類的編程語言是由經(jīng)驗豐富的程序員組成的大型團隊設計的,這些團隊關(guān)心其代碼的運行時效率狸驳。結(jié)果预明,這些語言具有針對這些情況設計的復雜部分。您擔心要學習編程耙箍。您不需要那種麻煩撰糠。您需要一種被設計為易于由單個新程序員學習和記住的語言。
玩究西。您寧愿學習彈鋼琴的方式:正常的互動方式,即敲擊琴鍵后便會聽到每個音符物喷,也就是“批量”模式卤材,即在整首歌結(jié)束后才聽到音符。 峦失?顯然扇丛,交互模式使鋼琴和編程學習變得更加容易。堅持使用交互式模式的語言并使用它尉辑。
給定這些條件帆精,我對第一種編程語言的建議是Python或Scheme。另一個選擇是Javascript隧魄,不是因為它是為初學者精心設計的卓练,而是因為有很多在線教程,例如Khan Academy的教程购啄。但是您的情況可能會有所不同襟企,還有其他不錯的選擇。如果您的年齡是個位數(shù)狮含,則您可能更喜歡Alice或Squeak或Blockly(年齡較大的學習者可能會喜歡)顽悼。重要的是您選擇并開始。
附錄:書籍和其他資源
有幾個人問他們應該從中學到什么書和網(wǎng)頁几迄。我重申“僅靠書本學習是不夠的”蔚龙,但我可以推薦以下內(nèi)容:
方案:計算機程序的結(jié)構(gòu)和解釋(Abelson和Sussman)可能是計算機科學的最好入門,它確實教授編程作為理解計算機科學的一種方式映胁。您可以在本書上在線觀看講座視頻木羹,以及在線全文。這本書極具挑戰(zhàn)性解孙,將淘汰一些可能通過其他方法成功的人汇跨。
方案:如何設計程序(Felleisen等人)是有關(guān)如何以優(yōu)雅和實用的方式實際設計程序的最佳書籍之一务荆。
Python:Python編程:CS入門(Zelle)是使用Python的不錯的入門。
Python:Python.org上提供了一些在線教程穷遂。
Oz:計算機編程的概念函匕,技術(shù)和模型(Van Roy和Haridi)被某些人視為Abelson&Sussman的現(xiàn)代繼任者。這是一門編程的大創(chuàng)意蚪黑,涵蓋了比Abelson&Sussman更大的范圍盅惜,同時也許更易于閱讀和遵循。它使用的語言是Oz忌穿,該語言雖然鮮為人知抒寂,但作為學習其他語言的基礎(chǔ)。 <
筆記
T. Capey指出掠剑,亞馬遜上的“完全解決問題”頁面現(xiàn)在在“購買此商品的客戶也購買了這些商品”部分下有“ 21天內(nèi)自學孟加拉語”和“自學語法和風格”書屈芜。 我猜想看那本書的人很大一部分來自此頁面。 感謝Ross Cohen為希波克拉底提供的幫助