十年自學編程
彼得·諾維格
為什么大家都這么著急?
走進任何一家書店,你就會知道怎么做24小時自學Java除了提供無休止的變化之外,還提供在幾天或幾小時內(nèi)教授C、 SQL、Ruby、算法等。亞馬遜高級搜索[標題:自學,自2000年起,小時數(shù)找到了512本這樣的書。其他十本書中,編程類書籍占上風。類似的結(jié)果來自于用“學習”代替“自學”,或者用“天”代替“小時”
結(jié)論是,要么人們急于學習編程,要么編程比其他任何東西都容易得多。費萊森等等。在他們的書中對這種趨勢表示贊同如何設(shè)計程序,當他們說“糟糕的編程很容易。白癡可以在21天即使他們是假人“《阿不勒斯鵝》漫畫也有他們的看法.
我們來分析一下標題是什么樣的24小時自學C++可能意味著:
自學:在24小時內(nèi),你將沒有時間編寫幾個重要的程序,并從成功和失敗中吸取教訓。你沒有時間和有經(jīng)驗的程序員一起工作,也沒有時間去理解生活在C++環(huán)境中的感覺。簡而言之,你沒有時間去學習。所以這本書只能說是膚淺的熟悉,而不是深刻的理解。正如亞歷山大·波普所說:“一點點學習是一件危險的事。
C++:在24小時內(nèi),你也許能學會一些C++的語法(如果你已經(jīng)知道另一種語言的話),但是你不能學到很多關(guān)于如何使用這種語言的知識。如果你用C++編寫的程序很糟糕,你可以說用C++編寫的程序很糟糕。那么有什么意義呢?阿蘭 珀利斯曾經(jīng)說過:“一種不影響你思考編程方式的語言是不值得知道的”。一個可能的觀點是,你必須學習一點C++(或者更可能的是,像JavaScript或處理之類的東西),因為你需要與現(xiàn)有的工具交互來完成特定的任務。但你并不是在學習如何編程,而是在學習如何完成這項任務。
24小時內(nèi):不幸的是,這是不夠的,正如下一節(jié)所示。
十年自學編程
研究人員(布魯姆(1985),哈提恩和布萊恩(1899),海耶斯(1989),西蒙蔡斯(1973))研究表明,要培養(yǎng)出各種領(lǐng)域的專業(yè)知識需要大約十年的時間,包括國際象棋、音樂創(chuàng)作、電報操作、繪畫、鋼琴演奏、游泳、網(wǎng)球以及神經(jīng)心理學和拓撲學的研究。關(guān)鍵是深思熟慮的練習:不只是一次又一次地做,而是挑戰(zhàn)你自己——用一個超出你目前能力的任務,去嘗試它,在做的時候和之后分析你的表現(xiàn),糾正任何錯誤。然后重復。再重復一遍。似乎沒有真正的捷徑:即使是4歲時音樂天才的莫扎特,也花了13年的時間才開始創(chuàng)作世界級的音樂。在另一種類型中,披頭士樂隊似乎以一串一串的熱門歌曲和1964年的埃德·沙利文秀(Ed Sullivan show)亮相而登場,但他們從1957年開始就在利物浦和漢堡打小型俱樂部,雖然他們很早就有了大眾的吸引力,但他們的第一次重大成功,辣椒中士,于1967年被釋放。
馬爾科姆?格拉德威爾他還沒想到10年前卡地亞用數(shù)碼相機拍了10萬張照片,真正的專業(yè)知識可能需要一輩子的時間:塞繆爾·約翰遜(Samuel Johnson,1709-1784)曾說:“任何部門的卓越都只能通過一生的努力才能達到,而不是以更低的價格買到的?!眴疼牛?340-1400)抱怨道:“l(fā)yf太短了,利恩的手藝很長。”希波克拉底(約公元前400年)因節(jié)選“ars longa, vita brevis”而聞名,這是較長的引語“ars longa,vita brevis,occasio preceps,experitum periculosum,iudicium difficile”,在英語中的意思是“生命短暫,[這]工藝漫長,機會轉(zhuǎn)瞬即逝,實驗危險,判斷困難?!碑斎唬瑳]有一個數(shù)字可以作為最終答案:假設(shè)所有技能(例如編程、下棋、下棋和玩音樂)都需要完全相同的時間來掌握,也不認為所有人都需要完全相同的時間來掌握。作為 教授。K、 安德斯·愛立信他說:“在大多數(shù)領(lǐng)域,即使是最有才華的人也需要多少時間才能達到最高水平的績效,這一點是值得注意的。1萬小時的數(shù)字讓你感覺到,我們說的是一周10到20個小時的工作時間,有些人會說,那些天生最有才華的人,仍然需要達到最高水平?!?/p>
所以你想成為一名程序員
以下是我編程成功的秘訣:
得到感興趣的在編程方面,做一些因為它很有趣。一定要保持足夠的樂趣,這樣你才會愿意投入10年/10000小時。
程序.?最好的學習方式是在實踐中學習.?從技術(shù)上講,“個人在某一領(lǐng)域的最高水平的績效并不是隨著經(jīng)驗的增長而自動達到的,但即使是經(jīng)驗豐富的個人,也可以通過深思熟慮的努力來提高績效水平。”(第366頁)“最有效的學習需要一個明確的任務,對特定的個體有適當?shù)碾y度水平,信息反饋,以及重復和糾正錯誤的機會”(第20-21頁)?實踐中的認知:日常生活中的思維、數(shù)學、文化是這個觀點的有趣參考。
與…交談其他程序員;閱讀其他程序。這比任何書籍或培訓課程都重要。
如果你愿意的話,在一個學院(在研究生院或更多)。這會讓你接觸到一些需要證書的工作,也會讓你對這個領(lǐng)域有更深入的了解,但如果你不喜歡學校,你可以(帶著一些奉獻精神)在自己或工作中獲得類似的經(jīng)驗。無論如何,光靠書本學習是不夠的?!薄队嬎銠C科學教育》一書的作者埃里克·雷蒙德說:“計算機科學教育不能使任何人成為專家程序員,就像學習畫筆和顏料可以使某人成為專家畫家一樣。”新黑客詞典.?我雇過的最好的程序員之一只有高中學歷,他已經(jīng)創(chuàng)造了很多偉大的?軟件,有他自己的新聞組他賺了足夠的股票期權(quán)來買自己的夜總會.
從事項目其他程序員。在某些項目上做最好的程序員;在其他項目中做最差的程序員。當你是最好的,你可以測試你領(lǐng)導一個項目的能力,并用你的遠見激勵別人。當你是最差的時候,你會學到大師們做什么,你也會知道他們不喜歡做什么(因為他們讓你為他們而做)。
從事項目之后其他程序員。理解他人編寫的程序。當最初的程序員不在時,看看如何理解和修復它。想一想如何設(shè)計你的程序,讓那些在你之后維護它們的人更容易。
至少學半打程序設(shè)計語言.?包括一種強調(diào)類抽象的語言(如Java或C++),一種強調(diào)函數(shù)抽象(如Lisp或ML或Haskell),一種支持語法抽象(如Lisp),一種支持聲明性規(guī)范(如Prolog或C++)的語言,以及一種強調(diào)并行性的語言(如Clojure或Go)。
記住有一個“計算機在“計算機科學”。知道計算機執(zhí)行一條指令、從內(nèi)存中取出一個字(無論是否有緩存未命中)、從磁盤讀取連續(xù)的單詞以及查找到磁盤上的新位置所需的時間。(答案在這里。)
學習一門語言標準化努力。它可以是ANSI C++委員會,也可以是決定您的本地編碼風格是否有2或4個空格縮進級別。為什么他們會對你的語言有一點深刻的感覺。
有理智下車語言標準化工作盡快進行。
考慮到這些,你僅僅靠書本學習能走多遠還是個問題。在我第一個孩子出生之前,我讀了如何書,還是覺得自己是個無知的新手。30個月后,當我的第二個孩子出生的時候,我有沒有回到書本上復習一下?沒有。相反,我依靠的是我的個人經(jīng)驗,這對我來說比專家寫的幾千頁更有用,更讓我安心。
弗雷德·布魯克斯,在他的文章里沒有銀彈確定了尋找優(yōu)秀軟件設(shè)計師的三部分計劃:
盡早系統(tǒng)地確定頂尖設(shè)計師。
指派一位職業(yè)導師負責潛在客戶的發(fā)展,并認真保存職業(yè)檔案。
為成長中的設(shè)計師提供互動和激勵的機會。
這是假設(shè)有些人已經(jīng)具備了成為一名偉大設(shè)計師所必需的素質(zhì);工作就是適當?shù)卣f服他們。阿蘭 珀利斯更簡潔地說:“每個人都可以被教導去雕塑:米開朗基羅本應該被教導如何不去雕塑?!皞ゴ蟮某绦騿T也是如此”。珀利斯說,偉大的球員有一些超越訓練的內(nèi)在品質(zhì)。但質(zhì)量從何而來?是天生的嗎?還是通過勤奮來發(fā)展?就像奧古斯特·古斯特(奧古斯特·古斯托)臘腸)“任何人都會做飯,但只有無畏的人才是偉大的。”我認為這更像是愿意把一生的大部分時間投入到深思熟慮的實踐中。但也許吧無所畏懼是一種總結(jié)。或者,正如古斯托的批評家安東·艾戈所說:“不是每個人都能成為偉大的藝術(shù)家,但偉大的藝術(shù)家可以來自任何地方?!?/p>
所以繼續(xù)購買Java/Ruby/Javascript/PHP這本書吧;你可能會從中得到一些用處。但你不會在24小時或21天內(nèi)改變你的生活,也不會改變你作為一名程序員真正的整體專業(yè)知識。努力工作,在24個月內(nèi)不斷改進如何?好吧,現(xiàn)在你開始有所進展。。。
工具書類
布魯姆,本杰明(編輯)培養(yǎng)青年人才,百齡壇,1985年。
布魯克斯,弗雷德,沒有銀彈,IEEE計算機,第20卷,第4期,1987年,第10-19頁。
Bryan,W.L.&Harter,N.,《電報語言研究:習慣等級的習得》。心理學評論,1899年8月345-375
海斯,約翰·R。,完成問題解決者勞倫斯·厄爾鮑姆,1989年。
威廉·G·蔡斯和赫伯特·A·西蒙。“象棋中的知覺”?認知心理學1973年4月55-81日。
拉維,珍,實踐中的認知:日常生活中的思維、數(shù)學、文化,劍橋大學出版社,1988年。
答案典型PC上各種操作的大致時間:
執(zhí)行典型指令1/1000000000秒=1納秒
從一級緩存內(nèi)存提取0.5納秒
分支誤預測5納秒
從二級緩存內(nèi)存提取7毫微秒
互斥鎖/解鎖25毫微秒
從主存取出100毫微秒
通過1Gbps網(wǎng)絡發(fā)送2K字節(jié)20000毫微秒
從內(nèi)存中按順序讀取1MB250000毫微秒
從新磁盤位置獲?。╯eek)8000000納秒
從磁盤按順序讀取1MB20000000納秒
把包裹寄到歐洲再寄回來150毫秒=150000000納秒
附錄:語言選擇
有幾個人問他們應該先學什么編程語言。 沒有一個答案,但請考慮以下幾點:
利用你的朋友.?問我應該用什么操作系統(tǒng),我的回答通常是:“使用你朋友使用的任何東西?!睆呐笥涯抢飳W習所獲得的好處將抵消操作系統(tǒng)之間或編程語言之間的任何內(nèi)在差異。同時考慮你未來的朋友:如果你繼續(xù)下去,你將成為程序員社區(qū)的一部分。你所選擇的語言是有一個正在成長的大社區(qū),還是一個正在消亡的小社區(qū)?是否有書籍、網(wǎng)站和在線論壇可以獲得答案?你喜歡那些論壇里的人嗎?
保持簡單.?C++和Java這樣的編程語言是為專業(yè)開發(fā)而設(shè)計的,他們都是由經(jīng)驗豐富的程序員組成的,他們關(guān)心自己代碼的運行時效率。因此,這些語言都有針對這些情況而設(shè)計的復雜部分。您關(guān)心的是如何學習編程。你不需要這種復雜的語言,你需要的是一種簡單易學、易于記憶的語言。
玩吧。你更愿意用哪種方式學習彈鋼琴:一種普通的、互動的方式,即你一按一個鍵就聽到每一個音符,或者“批處理”模式,在這種模式下,你只在完成一整首歌之后才聽到音符?很明顯,交互式模式使鋼琴學習和編程更容易。堅持一種具有互動模式的語言并加以運用。
考慮到這些標準,我對第一種編程語言的建議是蟒蛇或方案.?另一個選擇是Javascript,這并不是因為它非常適合初學者,而是因為它有很多在線教程,比如可汗學院教程但是你的情況可能會有所不同,還有其他好的選擇。如果你的年齡是個位數(shù),你可能更喜歡愛麗絲或吱吱聲或塊狀(年長的學習者可能也喜歡這些)。重要的是你選擇并開始行動。
附錄:書籍和其他資源
有幾個人問他們應該從什么書和網(wǎng)頁中學到什么。我重申“光靠書本學習是不夠的”,但我可以推薦以下幾點:
方案:?計算機程序的結(jié)構(gòu)和解釋(Abelson&Sussman)可能是最好的計算機科學入門課程,而且它確實把編程作為理解計算機科學的一種方式。你可以看到講座在線視頻在這本書上,以及在線全文.?這本書具有挑戰(zhàn)性,它將淘汰一些可能通過另一種方法獲得成功的人。
方案:?如何設(shè)計程序(Felleisen等等。)是最好的書籍之一 如何實際設(shè)計一個優(yōu)雅和功能性的程序。
蟒蛇:?Python編程:CS簡介(Zelle)是使用Python的一個很好的介紹。
蟒蛇:幾個 在線教程可在Python.org網(wǎng)站.
奧茲:?計算機程序設(shè)計的概念、技術(shù)和模型(范羅伊和哈里迪)它被一些人看作是現(xiàn)代的Abelson&Sussman的繼承者。它是一個關(guān)于編程的大思想的旅行,覆蓋范圍比Abelson&Sussman更廣,同時也更易于閱讀和理解。它使用一種不為人所知的語言O(shè)z,它是學習其他語言的基礎(chǔ)<
筆記
T、 卡佩指出完成 問題解決者亞馬遜的頁面現(xiàn)在有“21天自學孟加拉語”和“自學語法和風格”兩本書,分別位于“購買該產(chǎn)品的客戶也購買這些產(chǎn)品”部分。我想大部分看那本書的人都是從這一頁來的。多虧了羅斯·科恩對希波克拉底的幫助。