十年內(nèi)自學編程
彼得·諾維格
為什么大家都這么著急要尔?
走進任何一家書店婉宰,您將了解如何在 24 小時內(nèi)自學 Java势似,并在幾天或幾小時內(nèi)提供無休止的變體拌夏,以教授 C、SQL履因、Ruby障簿、算法等。亞馬遜高級搜索 [標題: 教栅迄, 你自己站故, 小時, 自: 2000 年以來毅舆, 并發(fā)現(xiàn)了 512 這樣的書西篓。前十名中,有九本是編程書籍(另一本是關于簿記的)憋活。類似的結果來自將"自學"替換為"學習"或"小時"與"天"岂津。
結論是,要么人們急于學習編程悦即,要么編程比什么都容易學吮成。Felleisen等人在《如何設計程序》一書中對這種趨勢點頭,當時他們說"糟糕的編程很容易辜梳。白癡可以在21天內(nèi)學會粱甫,即使他們是假人。阿布特魯斯鵝漫畫也有他們采取冗美。
讓我們分析一下 24 小時內(nèi)"C++"標題可能意味著什么:
教導自己:在24小時內(nèi)魔种,你將沒有時間寫幾個重要的程序,并學習你的成功和失敗與他們粉洼。您沒有時間與經(jīng)驗豐富的程序員合作节预,并了解生活在一個良好的環(huán)境中C++∈羧停總之安拟,你將沒有時間學習太多。所以這本書只能說是膚淺的熟悉宵喂,不能是深刻的理解糠赦。正如亞歷山大·波普說的,一點學習是危險的事情锅棕。
C++:在24小時內(nèi)拙泽,你也許能夠?qū)W習C++的一些語法(如果你已經(jīng)知道另一種語言),但你不能學到很多如何使用的語言裸燎。簡言之顾瞻,如果你是一個基本程序員,你可以學會用C++語法編寫基本風格的程序德绿,但是你不能學習C++實際上是好(和壞)什么荷荤。那有什么意義呢?艾倫·佩利斯曾經(jīng)說過:"一種不影響你編程方式的語言移稳,不值得了解蕴纳。一個可能的觀點是,你必須學習一點點C++(或者更可能个粱,像JavaScript或處理)古毛,因為你需要與現(xiàn)有的工具接口來完成一個特定的任務。但是都许,你并沒有學習如何編程;你正在學習完成那個任務
在24小時:不幸的是稻薇,這是不夠的,如下一節(jié)顯示梭稚。
十年內(nèi)自學編程
研究人員(Bloom(1985年)颖低、布萊恩和哈特(1899年)、海耶斯(1989年)弧烤、西蒙和蔡斯(1973年))表明忱屑,在象棋、音樂創(chuàng)作暇昂、電報操作莺戒、繪畫、鋼琴演奏急波、游泳从铲、網(wǎng)球以及神經(jīng)心理學和拓撲學研究等許多領域,大約需要10年時間澄暮。關鍵是審議實踐:不只是一次又一次地做名段,而是用一個超出你當前能力的任務來挑戰(zhàn)自己阱扬,嘗試一下,在做之后分析你的表現(xiàn)伸辟,并糾正任何錯誤麻惶。然后重復。再重復一遍似乎沒有真正的捷徑:即使是4歲時音樂神童的莫扎特信夫,也花了13年時間才開始創(chuàng)作世界級的音樂窃蹋。在另一種類型中,披頭士樂隊似乎以一連串的#1和1964年埃德·沙利文的時裝秀而登上舞臺静稻。但是他們自1957年以來一直在利物浦和漢堡打小俱樂部警没,雖然他們很早就有大眾的吸引力,但他們的第一次重大成功振湾,佩珀斯中士杀迹,在1967年被釋放。
馬爾科姆·格拉德威爾已經(jīng)推廣了這個想法恰梢,盡管他專注于10佛南,000小時,而不是10年嵌言。亨利·卡蒂埃-布雷森(1908-2004)還有另一個指標:"你的前10嗅回,000張照片是你們最差的。"(他沒想到摧茴,使用數(shù)碼相機绵载,有些人可以在一個星期內(nèi)達到這個目標。真正的專業(yè)知識可能需要一生的時間:塞繆爾·約翰遜(Samuel Johnson苛白,1709-1784)說:"任何部門都只有一生的勞動才能取得卓越成就;它不應該以較低的價格購買娃豹。喬瑟 (1340 - 1400) 抱怨道: "萊夫這么短, 工藝這么久购裙, 對勒恩來說懂版。Hippocrates (c. 400BC) 以摘錄 "ars longa, vita brevis" 而廣為人知躏率, 這是較長語錄 "阿爾斯 · 朗加躯畴, 維塔 · 布雷維斯, 偶爾練習薇芝, 實驗腹膜蓬抄, 膽汁困難" 的一部分, 在英語中渲染為 "生命是短暫的夯到, [the] 工藝長嚷缭, 機會轉(zhuǎn)瞬即逝, 實驗背信棄義, 判斷困難" 阅爽。當然路幸,沒有一個數(shù)字可以是最終的答案:似乎不合理地假設所有技能(如編程、棋牌优床、跳棋和音樂演奏)都需要完全相同的時間來掌握劝赔,也不認為所有人都需要完全相同的時間誓焦。正如安德斯·愛立信教授所說胆敞,"在大多數(shù)領域,即使是最有才華的個人也需要多少時間才能達到最高水平杂伟,這一點令人矚目移层。10,000 小時的數(shù)字只是讓您感覺到赫粥,我們談論的是每周 10 到 20 小時观话,有些人會認為這些人是天生的天才人才,仍然需要達到最高水平越平。
所以你想成為一名程序員
以下是我的編程成功秘訣:
對編程感興趣频蛔,并做一些,因為它很有趣秦叛。確保它一直足夠有趣晦溪,這樣你才愿意投入你的十年/10,000小時挣跋。
程序三圆。最好的學習就是通過做學習。更技術上說避咆,"給定領域中個人的最高績效水平不是作為擴展經(jīng)驗的函數(shù)自動實現(xiàn)的舟肉,但即使經(jīng)驗豐富的個人,由于經(jīng)過深思熟慮查库,可以提高績效水平路媚。羅夫。(第366)和"最有效的學習需要一個明確界定的任務樊销,對于特定的個人整慎,信息豐富的反饋,以及重復和糾正錯誤的機會现柠,具有適當?shù)碾y度級別院领。(第20-21號)《實踐認知:日常生活中的思維、數(shù)學和文化》一書是這一觀點的有趣參考够吩。
與其他程序員交談;閱讀其他程序比然。這一點比任何書籍或培訓課程都重要。
如果你想的話周循,在一所大學里工作四年(或者多在研究生院)强法。這將讓您訪問一些需要證書的工作万俗,并讓您更深入地了解該領域,但如果您不喜歡學校饮怯,您可以(有一些奉獻精神)獲得類似的經(jīng)驗闰歪,自己或工作。無論如何蓖墅,單靠書本學習是不夠的库倘。《新黑客詞典》的作者埃里克·雷蒙德(Eric Raymond)說:"計算機科學教育不能讓任何人成為專家程序員论矾,更不能讓任何人成為專家程序員教翩,更不能讓任何人成為專家畫家。我雇傭過的最好的程序員之一只有高中學位;他制作了很多偉大的軟件贪壳, 有自己的新聞集團饱亿, 并做了足夠的股票期權, 以購買自己的夜總會闰靴。
與其他程序員一起處理項目彪笼。成為某些項目的最佳程序員;是其他人最差的。當你是最好的蚂且,你可以測試你的能力配猫,領導一個項目,并激勵別人與你的遠見膘掰。當你是最差的時候章姓,你學習主人做什么,你學習他們不喜歡做什么(因為他們讓你為他們做)识埋。
在其他程序員之后處理項目凡伊。了解其他人編寫的程序≈现郏看看當原始程序員不在的時候系忙,需要什么來理解和修復它』莶颍考慮如何設計程序银还,使那些在您之后維護程序的人更容易。
學習至少六種編程語言洁墙。包括一種強調(diào)類抽象的語言(如Java或C++)蛹疯、一種強調(diào)函數(shù)抽象的語言(如Lisp或ML或哈斯克爾)、一種支持句法抽象的語言(如Lisp)热监、一種支持聲明性規(guī)范(如Prolog或C++模板)的語言捺弦,以及一種強調(diào)并行性的語言(如Cljure或 Go)。
請記住,"計算機科學"中存在"計算機"列吼。了解計算機執(zhí)行指令幽崩、從內(nèi)存中獲取單詞(有和沒有緩存錯過)、從磁盤讀取連續(xù)單詞以及查找磁盤上的新位置需要多長時間寞钥。(答案在這里慌申。
參與語言標準化工作。它可能是 ANSI C++理郑,也可以決定您的本地編碼風格是否具有 2 或 4 個空間縮進級別蹄溉。無論哪種方式,你都了解別人喜歡的語言香浩,他們感覺有多深类缤,甚至一點點關于他們?yōu)槭裁催@樣的感覺。
有好感邻吭,盡快擺脫語言標準化工作。
想到這一切宴霸, 你只要通過書本學習能多遠囱晴, 就值得懷疑了。在我的第一個孩子出生之前瓢谢,我讀了所有的《如何》一書畸写,仍然覺得自己是一個無知的新手。30 個月后氓扛, 當我的第二個孩子到期時枯芬, 我回到書本上復習一下嗎?不采郎。相反千所,我依靠我個人的經(jīng)驗,事實證明蒜埋,這比我有用和放心得多淫痰,比專家寫的數(shù)千頁。
弗雷德·布魯克斯在他的論文《沒有銀彈》中確定了尋找偉大軟件設計師的三部分計劃:
盡早系統(tǒng)地確定頂級設計師整份。
指派一位職業(yè)導師負責潛在客戶的發(fā)展待错,并仔細保存職業(yè)檔案。
為成長的設計師提供互動和刺激的機會烈评。
這假定有些人已經(jīng)具備成為偉大設計師所需的素質(zhì);工作是正確地哄他們一起火俄。艾倫·佩利斯說得更簡潔:"每個人都可以被教導去雕刻:米開朗基羅必須被教導如何不雕刻。因此讲冠,這是與偉大的程序員"瓜客。佩利斯說,偉大的球員有一些超越他們訓練的內(nèi)部素質(zhì)。但是質(zhì)量從何而來呢忆家?是天生的嗎犹菇?還是他們通過勤奮來發(fā)展?正如奧古斯特·古斯托(拉塔圖耶虛構的廚師)所說芽卿,"任何人都可以做飯揭芍,但只有無所畏懼的人才能是偉大的。我認為更多的是愿意把一生中的很大一部分用于審議實踐卸例。但也許無所畏懼是總結這一點的一種方式称杨。或者筷转,正如古斯托的批評家安東·埃戈所說:"不是每個人都能成為一個偉大的藝術家姑原,但一個偉大的藝術家可以來自任何地方。
因此呜舒,繼續(xù)購買 Java/Ruby/Javascript/PHP 書籍;你可能會從中得到一些利用锭汛。但你不會改變你的生活,或者你作為程序員在24小時或21天內(nèi)真正的整體專業(yè)知識袭蝗。努力在24個月內(nèi)不斷改進怎么樣唤殴?現(xiàn)在你開始找個地方了...
引用
布魯姆,本杰明(Ed.)培養(yǎng)年輕人的人才到腥,巴蘭廷朵逝,1985年。
布魯克斯乡范, 弗雷德配名, 沒有銀彈, IEEE 電腦晋辆, 第 20 卷渠脉, 第 4 號, 1987 年栈拖, 第 10 - 19 周连舍。
布萊恩, W. l. – 哈特涩哟, N. "關于電報語言的研究: 獲得習慣的層次索赏。心理學評論, 1899贴彼, 8潜腻, 345-375
海斯,約翰R.器仗,完全問題解決者勞倫斯·埃鮑姆融涣,1989年童番。
蔡斯, 威廉 G. & 西蒙威鹿, 赫伯特 A. "國際象棋感知" 認知心理學剃斧, 1973 年, 4忽你, 55 - 81 幼东。
拉夫,讓科雳,實踐認知:思維根蟹,數(shù)學和文化的日常生活,劍橋大學出版社糟秘,1988年简逮。
答案
典型 PC 上各種操作的大致計時:
執(zhí)行典型指令 1/1,000尿赚,000散庶,000 秒 = 1 納米秒從 L1 緩存內(nèi)存 0。5 nanosec 分網(wǎng)預測錯誤 5 納米秒從 L2 緩存存儲器 7 nanosecMutex 鎖 / 解鎖 25 nanosecfetch 從主存儲器 100 nanosecsend 2K 字節(jié)超過 1Gbps 網(wǎng)絡 20吼畏,000 nanosecread 1MB 順序從內(nèi)存 250督赤,000 從新的磁盤位置 (尋求) 8,000泻蚊,000 nanosecread 1MB 順序從磁盤 20,000丑婿,000 nanosec 發(fā)送數(shù)據(jù)包美國到歐洲和回 150 毫秒 = 150性雄,000,000 nanosec
附錄:語言選擇
有幾個人問他們應該先學什么編程語言羹奉。沒有一個答案秒旋,但請考慮以下幾點:
用你的朋友。當被問及"我應該使用什么操作系統(tǒng)诀拭,Windows迁筛,Unix,還是Mac耕挨?從朋友那里學習的好處將抵消操作系統(tǒng)之間或編程語言之間的任何內(nèi)在差異细卧。還要考慮你未來的朋友:如果你繼續(xù),你將成為其中一員的程序員社區(qū)筒占。您選擇的語言是有一個龐大的成長社區(qū)還是一個垂死的小社區(qū)贪庙?是否有書籍、網(wǎng)站和在線論壇可以獲得答案翰苫?你喜歡那些論壇里的人嗎止邮?
保持簡單这橙。編程語言(C++ 和 Java)是由經(jīng)驗豐富的程序員團隊為專業(yè)開發(fā)而設計的,他們關注代碼的運行時效率导披。因此屈扎,這些語言具有專為這些情況設計的復雜部分。你關心的是學習編程撩匕。你不需要這種并發(fā)癥鹰晨。您想要一種由單個新程序員設計得易于學習和記憶的語言。
玩滑沧。你寧愿學習哪種方式彈鋼琴:正常的互動方式并村,你一點擊一個鍵,或"批"模式滓技,你只聽到音符后哩牍,你完成了一整首歌?顯然令漂,交互式模式使鋼琴和編程的學習更加容易膝昆。堅持使用交互式模式的語言并使用它。
鑒于這些標準叠必,我對第一種編程語言的建議將是Python或S方案荚孵。另一種選擇是Javascript,不是因為它為初學者設計得很好纬朝,而是因為有這么多的在線教程收叶,如Khan學院的教程。但是共苛,你的情況可能會有所不同判没,還有其他不錯的選擇。如果你的年齡是一位數(shù)隅茎,你可能更喜歡愛麗絲或吱吱聲或塊(年齡較大的學習者也可能喜歡這些)澄峰。重要的是你選擇并開始。
附錄:書籍和其他資源
有幾個人問他們應該從哪些書籍和網(wǎng)頁中學習辟犀。我再說一遍俏竞, "單靠書學習是不夠的", 但我可以推薦以下內(nèi)容:
方案:計算機程序的結構和解釋(Abelson & Sussman)可能是計算機科學的最佳介紹堂竟,它教編程作為理解計算機科學的一種方式魂毁。您可以在線查看有關本書的講座視頻,以及完整的文本跃捣。這本書很有挑戰(zhàn)性漱牵,將一些人從另一種方法中去掉。
方案:如何設計程序(Felleisen等人)是有關如何以優(yōu)雅和實用的方式實際設計程序的最佳書籍之一疚漆。
Python: Python 編程: 使用 Python 的 Cs 簡介 (Zelle) 是一個很好的介紹酣胀。
Python:在一些在線教程Python.org刁赦。
奧茲: 計算機編程的概念、技術和模型 (范羅伊和哈里迪) 被一些人視為阿貝爾森和蘇斯曼的現(xiàn)代接班人闻镶。這是一個通過編程的大想法之旅甚脉, 涵蓋比亞伯森和蘇斯曼更廣泛的范圍, 而也許更容易閱讀和遵循铆农。它使用一種語言牺氨,Oz,這是不廣為人知墩剖,但作為學習其他語言的基礎猴凹。<
筆記
T. Capey指出,亞馬遜上的"完全問題解決者"頁面現(xiàn)在有"在21天內(nèi)自學孟加拉語"和"自學語法和風格"的書籍下"為這個項目購物的顧客也為這些物品購物"部分岭皂。我猜看那本書的人很多來自這個頁面郊霎。感謝羅斯·科恩對希波克拉底的幫助
翻譯
由于以下作者,本頁的翻譯有:阿拉伯文
(穆罕默德·葉海亞)
保加利亞語
(博伊科·班切夫)
中文
(郭曉剛)
克羅地亞語
(特夫爾特科·貝德科維奇)
語
(費德里科·戈博)
法語
(艾蒂安·博切斯內(nèi))
德語
(斯特凡·拉姆)
希伯來語
(埃里克·麥凱恩)
印地語
(維卡什·蒂瓦里)
匈牙利語
(馬頓·梅斯蒂揚)
印度尼西亞語
(特里吉托·桑托索)
意大利語
(法比奧·泰西托)
日語
(約莫約莫)
韓語(黃恳妗)
波斯語
(邁赫迪·阿加里)
波蘭語
(庫巴·諾瓦克)
葡萄牙語
(奧古斯托·拉德克)
羅馬尼亞
(特凡·拉澤爾)
俄語
(康斯坦丁·普蒂辛)
塞爾維亞語
(拉扎爾·科瓦切維奇)
西班牙語
(卡洛斯·魯埃達)
斯洛伐克語
(揚·瓦克勞耶克)
土耳其語
(阿塞爾·烏盧沙欣)
烏克蘭
(奧萊克西·莫爾恰諾夫斯基)
彼得·諾維格 (版權所有书劝,2001-2014)