無標題文章

十年自學編程

彼得·諾維格

為什么大家都這么著急?

走進任何一家書店,你就會知道怎么做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)品”部分。我想大部分看那本書的人都是從這一頁來的。多虧了羅斯·科恩對希波克拉底的幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • ### 1.安裝 nodejs ### 2.安裝 git ### 3.下載 [vue-element-admin]...
    gogogo_e6cf閱讀 599評論 0 0
  • #Node課程大綱V10(一周) ##目錄 *1day -基本介紹 -環(huán)境配置(nodenvm,cnpm) -RE...
    lint_b7d1閱讀 231評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,656評論 30 472
  • Python第一節(jié) 1.計算機的概念 1.1計算機是什么? 。計算機俗稱電腦,是現(xiàn)代一種用于高速計算的電子計算機器...
    心夢無痕_ea8a閱讀 99評論 0 0
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點、注意力、語言聯(lián)想、情景聯(lián)想 觀點: 1.統(tǒng)計學現(xiàn)在叫數(shù)據(jù)分析,社會...
    Jenaral閱讀 6,037評論 0 5

友情鏈接更多精彩內(nèi)容