十年內(nèi)自學(xué)編程
彼得·諾維格
為什么大家都這么著急煌恢?
走進任何一家書店,你就會看到如何自學(xué)爪哇 24 小時內(nèi)除了無休止的變化提供教 C, SQL、Ruby世剖、算法等在幾天或幾小時內(nèi)完成。 亞馬遜高級搜索 |標(biāo)題: 教學(xué)笤虫, 自己旁瘫, 小時, 因為: 20發(fā)現(xiàn)了512本這樣的書前十名中琼蚯,有九本是編程書籍(另一本是關(guān)于簿記的)境蜕。類似的結(jié)果來自將"自學(xué)"替換為"學(xué)習(xí)"或"小時"與"天"。
結(jié)論是凌停,要么人大都急于學(xué)習(xí) 關(guān)于編程粱年,或編程是不知何故非常容易 學(xué)習(xí)比什么都重要。 費雷森等罚拟。在他們的書里點頭如何設(shè)計程序台诗, 當(dāng)他們說 "糟糕的編程很容易完箩。白癡可以學(xué)習(xí)它21 天, 即使他們是傻瓜."阿布特魯斯鵝漫畫也有他們采取.
讓我們分析一下標(biāo)題是什么樣的在 24 小時內(nèi)C++一些孩子可能意味著:
自學(xué):在24小時內(nèi),你將沒有時間寫幾個 重要的計劃拉队,并學(xué)習(xí)你的成功和失敗 他們弊知。 您沒有時間與經(jīng)驗豐富的程序員合作, 了解生活在一個C++粱快。 簡而言之秩彤,您 不會有時間學(xué)太多。 所以這本書只能談一個 膚淺的熟悉事哭,不是深刻的理解漫雷。正如亞歷山大·波普說的 一點學(xué)習(xí)是件危險的事情。
C++:在24小時內(nèi)鳍咱,你也許能夠?qū)W習(xí)一些語法 C++(如果你已經(jīng)知道另一種語言)降盹,但你不能 學(xué)習(xí)如何使用語言。 總之谤辜,如果你是蓄坏,說,一個 基本程序員丑念,你可以學(xué)會寫程序的風(fēng)格 基本C++語法涡戳,但無法了解C++是什么 其實好 (和壞) 。 那有什么意義呢脯倚?艾倫 佩利斯曾經(jīng)說過:"一種語言妹蔽,不會影響你的方式 考慮編程,不值得知道"挠将。 一個可能的點是 你必須學(xué)習(xí)一點點C++ (或更可能的東西 像 JavaScript 或處理),因為您需要與 用于完成特定任務(wù)的現(xiàn)有工具编整。但你不是 學(xué)習(xí)如何編程;你正在學(xué)習(xí)完成那個任務(wù)
24 小時內(nèi):不幸的是舔稀,這還不夠,作為下一個 節(jié)顯示掌测。
十年內(nèi)自學(xué)編程
研究人員(綻放 (1985),布萊恩和哈特 (1899),海斯 (1989),西蒙與大通 (1973)) 已顯示它 需要大約十年的時間内贮,以發(fā)展專業(yè)知識,在任何各種 領(lǐng)域汞斧,包括國際象棋夜郁、音樂創(chuàng)作、電報 操作粘勒,繪畫竞端,鋼琴演奏,游泳庙睡,網(wǎng)球和研究 神經(jīng)心理學(xué)和拓撲學(xué)事富。 關(guān)鍵是協(xié)商實踐: 不只是一遍又一遍技俐, 但挑戰(zhàn)自己 任務(wù)超出了你目前的能力,嘗試一下统台, 分析您的性能雕擂,同時和之后這樣做,并糾正 任何錯誤贱勃。 然后重復(fù)井赌。 再重復(fù)一遍 似乎沒有 真正的捷徑:甚至莫扎特,誰是音樂神童在4歲贵扰,采取了 13年前仇穗,他開始制作世界級的音樂。 在 另一種流派拔鹰,披頭士樂隊似乎爆裂到現(xiàn)場與 一串#1和1964年埃德·沙利文秀的出場仪缸。 但他們一直在利物浦和漢堡打小俱樂部, 因為 1957年列肢,雖然他們有大規(guī)模呼吁早期恰画,他們的第一個偉大的 關(guān)鍵的成功,辣椒中士瓷马,于1967年發(fā)行拴还。
馬爾科姆 格拉德韋爾他推廣了這個想法, 雖然他專注于 10欧聘,000 小時片林, 而不是 10 年。 亨利·卡蒂埃-布雷森(1908-2004)還有另一個指標(biāo):"你的前10怀骤,000張照片是你們最差的费封。(他沒有 預(yù)計使用數(shù)碼相機,有些人可以在一周內(nèi)達到這個目標(biāo)蒋伦。 真正的專業(yè)知識可能需要一生的時間: 塞繆爾·約翰遜 (1709-1784) 說:"在任何部門弓摘,卓越都可以 只通過一生的勞動獲得;它不得在 較低的價格。 喬瑟 (1340 - 1400) 抱怨 "萊夫這么短痕届, 工藝 這么久的勒恩韧献。希波克拉底 (c. 400BC) 是眾所周知的摘錄 "阿爾斯朗加, 維塔布雷維斯"研叫,這是較長的報價"阿爾斯龍加锤窑,維塔的一部分 布雷維斯, 偶爾練習(xí)嚷炉, 實驗周利庫蘇姆渊啰, iudicium 困難",在英語中呈現(xiàn)為"生命是短暫的申屹,[the]工藝 長虽抄, 機會轉(zhuǎn)瞬即逝走搁, 實驗背信棄義, 判斷 困難迈窟。當(dāng)然私植,沒有一個數(shù)字可以是最終的答案:它似乎不合理 假定所有技能(例如編程、下棋车酣、跳棋和音樂演奏) 可以都需要完全相同的時間來掌握曲稼,也不是所有的人 需要完全相同的時間。作為 教授湖员。K贫悄。安德斯·愛立信說,"在大多數(shù)領(lǐng)域娘摔,這是顯著多少時間窄坦,甚至最 人才需要達到最高水平。10凳寺,000 小時的數(shù)字只是讓您感覺到鸭津,我們談?wù)摰氖敲恐?10 到 20 小時,有些人會認為這些人是天生的天才人才肠缨,仍然需要達到最高水平逆趋。
所以你想成為一名程序員
以下是我的編程成功秘訣:
獲取興趣在編程,并做一些晒奕,因為它是有趣的闻书。 確保 它一直足夠有趣,這樣你才愿意投入你的十年/10脑慧,000小時魄眉。
程序. 最好的學(xué)習(xí)方式是學(xué)習(xí) 通過做. 簡單地說,技術(shù)上闷袒,"最高水平 未達到給定域中個人的性能 自動作為擴展體驗的函數(shù)坑律,但級別 即使經(jīng)驗豐富的個人可以提高績效, 經(jīng)過深思熟慮的改進霜运。(第366位)和"最有效的學(xué)習(xí)需要一個明確定義的任務(wù)與 適合特定個體的難度級別, 信息性反饋蒋腮,以及重復(fù)和更正的機會 錯誤淘捡。(第20-21號) 這本書實踐中的認知:日常思維、數(shù)學(xué)和文化 生活是一個有趣的 參考這個觀點池摧。
與交談其他程序員;閱讀其他程序焦除。 這更重要 比任何書籍或培訓(xùn)課程。
如果你想作彤,把在四年大學(xué)(或更多在 研究生院)膘魄。 這將讓您訪問一些需要 憑據(jù)乌逐,它會讓您更深入地了解該領(lǐng)域, 但如果你不喜歡學(xué)校创葡, 你可以 (與一些奉獻) 得到 類似的經(jīng)驗浙踢,你自己或工作。無論如何灿渴,單靠書本學(xué)習(xí)不會 就足夠了洛波。"計算機科學(xué)教育不能使任何人成為專家 程序員比研究刷子和顏料可以使 某人是專家畫家,"埃里克·雷蒙德說骚露,作者新 黑客詞典.我雇傭過的最好的程序員之一 只有高中學(xué)位;他產(chǎn)生了很多偉大軟件蹬挤, 有他自己的新聞組,并做了足夠的股票期權(quán)購買自己的夜總會.
工作在項目與其他程序員棘幸。成為最好的程序員 在某些項目上;是其他人最差的焰扳。 當(dāng)你是最好的 你可以測試你的能力,領(lǐng)導(dǎo)一個項目误续,并激勵 別人有你的愿景吨悍。 當(dāng)你是最差的,你學(xué)到什么 大師做女嘲,你學(xué)習(xí)他們不喜歡什么做(因為他們 讓你為他們做)畜份。
工作在項目后其他程序員。 了解其他人編寫的程序欣尼”ⅲ看看需要什么 了解和修復(fù)它時, 原始程序員不 周圍愕鼓「铺考慮如何設(shè)計程序,使其更易于使用 那些會支持你的人
至少學(xué)習(xí)半打編程語言. 包括一個 強調(diào)類抽象的語言(如Java或C++)菇晃,一個 強調(diào)功能抽象(如 Lisp 或 ML 或 Haskell)册倒,一 支持句法抽象 (如 Lisp), 一 支持聲明性規(guī)范(如 Prolog 或 C++ 模板)磺送,以及 一個強調(diào)平行性 (如克洛朱爾或去) 驻子。
請記住,有一個"計算機在"計算機科學(xué)"中估灿。知道 計算機執(zhí)行指令需要多長時間崇呵,獲取 從內(nèi)存中的字(有和沒有緩存錯過),從磁盤讀取連續(xù)單詞馅袁,并查找到磁盤上的新位置域慷。(答案在這里。)
參與語言標(biāo)準(zhǔn)化努力。 可能是安西C++委員會犹褒, 或者它 可以決定您的本地編碼風(fēng)格是否會有 2 或 4 個空間 縮進級別抵窒。 無論哪種方式,你了解什么其他人 喜歡在語言叠骑,他們感覺多么深李皇,甚至一點點 關(guān)于他們?yōu)槭裁磿@樣。
有好感下車語言標(biāo)準(zhǔn)化工作作為 盡快座云。
這一切在心中疙赠, 它值得懷疑的, 你能得到多遠朦拖, 只是 書籍學(xué)習(xí)圃阳。 在我的第一個孩子出生之前,我讀了所有的如何 自書璧帝,仍然覺得自己像一個無知的新手捍岳。 30個月后 當(dāng)我的第二個孩子到期,我回到書 復(fù)習(xí)睬隶?不锣夹。 相反,我依靠我的個人經(jīng)驗苏潜,這 原來更有用银萍,更讓人放心 對我來說比寫數(shù)千頁 由專家。
弗雷德·布魯克斯恤左,在他的文章中無銀彈確定了一個三部分的計劃贴唇,找到偉大的 軟件設(shè)計師:
盡早系統(tǒng)地確定頂級設(shè)計師。
指派一位職業(yè)導(dǎo)師負責(zé)潛在客戶的發(fā)展飞袋,并仔細保存職業(yè)檔案戳气。
為成長的設(shè)計師提供互動和刺激的機會。
這假定有些人已經(jīng)具備了 成為一個偉大的設(shè)計師;工作是正確地哄他們一起巧鸭。艾倫 佩利斯說得更簡潔:"每個人都可以被教導(dǎo)雕刻: 米開朗基羅必須被教導(dǎo)如何不瓶您。因此,它是與 偉大的程序員"纲仍。 佩利斯說呀袱,偉人有一些 超越他們訓(xùn)練的內(nèi)部質(zhì)量。 但是郑叠,在哪里 質(zhì)量來自夜赵? 是天生的嗎? 或者他們通過 勤奮锻拘? 作為奧古斯特古斯托 (虛構(gòu)的廚師在拉塔圖耶)說油吭,"任何人都可以做飯,但只有無所畏懼 可以是偉大的署拟。 我認為它更多的是愿意奉獻一個大 一個人一生審議實踐的一部分婉宰。 但也許無畏是一種總結(jié)的方法⊥魄睿或者心包,作為古斯托的批評者, 安東·埃戈說:"不是每個人都能成為一個偉大的藝術(shù)家馒铃,但一個偉大的 藝術(shù)家可以從任何地方蟹腾。
因此,繼續(xù)購買 Java/Ruby/Javascript/PHP 書籍;你會 可能從中得到一些利用区宇。 但你不會改變你的生活娃殖,或者 您作為程序員在 24 小時或 21 天內(nèi)獲得真正的整體專業(yè)知識。 努力在24個月內(nèi)不斷改進怎么樣议谷? 現(xiàn)在你開始找個地方了...
引用
布魯姆炉爆, 本杰明 (ed.)培養(yǎng)青年人才,巴蘭廷卧晓,1985年芬首。
布魯克斯 弗雷德無銀彈, IEEE 計算機逼裆, 第 20 卷郁稍, 第 4 號, 1987 年胜宇, p. 10 -19耀怜。
布萊恩, W. l. – 哈特掸屡, N. "關(guān)于電報語言的研究: 習(xí)慣等級的獲取封寞。心理學(xué)評論, 1899, 8, 345-375
海斯,約翰完整的問題解算器勞倫斯·埃鮑姆仅财,1989年狈究。
蔡斯, 威廉 G. 和西蒙盏求, 赫伯特 A."國際象棋中的感知"認知心理學(xué), 1973, 4, 55-81.
熔巖抖锥,約翰,實踐中的認知:日常思維碎罚、數(shù)學(xué)和文化 生活磅废,劍橋大學(xué)出版社,1988年荆烈。
答案
典型 PC 上各種操作的大致計時:
執(zhí)行典型指令1/1拯勉,000竟趾,000,000 秒 = 1 納米秒從 L1 緩存內(nèi)存獲取0.5 納米秒分支預(yù)測錯誤5 納米秒從 L2 緩存內(nèi)存獲取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é)什么編程語言檐盟。 沒有一個答案褂萧,但請考慮以下幾點:
使用你的朋友.當(dāng)被問及"什么操作系統(tǒng)應(yīng)該 我使用, Windows葵萎, Unix箱玷, 或 Mac? 你的朋友使用陌宿。 從學(xué)習(xí)中獲得的優(yōu)勢 朋友將抵消操作系統(tǒng)之間的任何內(nèi)在差異锡足,或 編程語言之間。 還要考慮你未來的朋友: 程序員社區(qū)壳坪,你將成為其中的一部分舶得,如果你 繼續(xù)。 您選擇的語言是否擁有龐大的增長社區(qū) 還是一個小垂死的爽蝴? 是否有書籍沐批、網(wǎng)站和在線論壇 得到答案? 你喜歡那些論壇里的人嗎蝎亚?
保持簡單. 編程語言九孩,如C++ 和 Java 是專為專業(yè)開發(fā)由大型團隊 經(jīng)驗豐富的程序員誰關(guān)心運行時效率 他們的代碼。 因此发框,這些語言具有專為這些情況設(shè)計的復(fù)雜部分躺彬。 你關(guān)心的是學(xué)習(xí)編程。 你不需要這種并發(fā)癥梅惯。 你想要一種被設(shè)計成易于學(xué)習(xí)和記憶的語言宪拥。 單個新程序員。
玩铣减。哪種方式她君,你寧愿學(xué)習(xí)彈鋼琴: 正常,互動的方式葫哗,你聽到每個音符缔刹,只要你點擊一個鍵球涛, 或 "批" 模式, 你只聽到筆記后校镐, 你完成了一整首歌宾符? 顯然,交互式模式使鋼琴的學(xué)習(xí)更容易灭翔,也為 編程。堅持使用交互式模式的語言并使用它辣苏。
鑒于這些標(biāo)準(zhǔn)肝箱,我關(guān)于第一次編程的建議 語言將是Python或方案. 另一個選擇是Javascript,不是因為它為初學(xué)者設(shè)計得很好稀蟋, 但因為有這么多的在線教程煌张,如汗學(xué)院的教程. 但您的 情況可能會有所不同,還有其他不錯的選擇退客。如果您的 年齡是一位數(shù)骏融,你可能更喜歡愛 麗 絲或吱吱 聲或塊(年齡較大的學(xué)習(xí)者也可能喜歡這些)。重要 事情是萌狂, 你選擇和開始档玻。
附錄:書籍和其他資源
有幾個人問他們應(yīng)該學(xué)什么書和網(wǎng)頁 從。 我再說一遍茫藏, "單靠書學(xué)習(xí)是不夠的"误趴, 但我可以 建議以下事項:
方案:結(jié)構(gòu)和 計算機程序的解釋(阿貝爾森和蘇斯曼)是 可能是計算機科學(xué)的最佳介紹, 它確實 教編程作為理解計算機科學(xué)的一種方式务傲。 你可以看到講座的在線視頻在這本