十年自學程式設計譯文 作者: 彼得·諾維格

莫名私下裡發表於2019-12-26

為什麼每個人都這麼著急?

原文
走進任何書店,您將看到如何在24小時內自學Java,以及無窮無盡的變體,可以在幾天或幾小時內教授C,SQL,Ruby,演算法等。亞馬遜從2000年開始高階搜尋[ 標題:自學,自學,上課時間,共找到512本書。在前十名中,有九本是程式設計書籍(另一本是關於簿記的)。透過將“自學”替換為“學習”或將“小時”替換為“天”,可以得到類似的結果。

結論是要麼人們急於學習程式設計,要麼程式設計比其他任何事物都更容易學習。Felleisen 等。 在他們的書《如何設計程式》中對這種趨勢表示贊同,當他們說“錯誤的程式設計很容易。白痴可以在21天內學習它,即使他們是傻瓜。” Abtruse Goose漫畫也受到了歡迎

讓我們分析一下“ 24小時自學C ++”這樣的標題的 含義:

  • 自學:在24小時內,您將沒有時間編寫幾個重要的程式,並從它們的成功和失敗中學習。您將沒有時間與經驗豐富的程式設計師一起工作,也不瞭解在C ++環境中生活的感覺。簡而言之,您將沒有時間學習很多東西。因此,這本書只能說是膚淺的熟悉,而不是深刻的理解。正如亞歷山大·波普(Alexander Pope)所說,學一點東西是危險的。
  • C ++:在24小時內,您可能可以學習C ++的某些語法(如果您已經知道另一種語言),但是您對如何使用該語言的瞭解卻不多。簡而言之,如果您是一名Basic程式設計師,則可以學習使用C ++語法以Basic風格編寫程式,但是您將無法瞭解C ++的優點(或缺點)。那有什麼意義呢? 艾倫·珀利斯(Alan Perlis)曾經說過:“不影響您對程式設計的思考方式的語言是不值得了解的”。一個可能的觀點是,您必須學習一點C ++(或更可能是JavaScript或Processing之類的東西),因為您需要與現有工具互動以完成特定任務。但是,然後您就沒有學習如何程式設計。您正在學習完成該任務。
  • 在24小時內:不幸的是,這還不夠,如下一節所示。

十年自學程式設計

研究人員(Bloom(1985)Bryan&Harter(1899)Hayes(1989)Simmon&Chase(1973))顯示,在下棋,音樂等眾多領域中發展專業知識大約需要十年的時間。寫作,電報操作,繪畫,彈鋼琴,游泳,網球以及神經心理學和拓撲學研究。關鍵是商議 練習:不僅要一遍又一遍地做,還要挑戰一項超越您當前能力的任務來挑戰自己,嘗試一下,分析執行前後的表現,並糾正任何錯誤。然後重複。再重複一次。似乎沒有真正的捷徑:即使是4歲的音樂天才莫扎特,也花了13年的時間才開始創作世界一流的音樂。在另一種型別中,甲殼蟲樂隊似乎爆出一連串的#1熱門歌曲,並在1964年的埃德·沙利文(Ed Sullivan)演出中露面。但是自1957年以來,他們一直在利物浦和漢堡的小型俱樂部打球,儘管如此,他們仍然具有巨大的吸引力早期,他們的第一個重大成功就是Sgt。Peppers於1967年發行。

馬爾科姆·格拉德威爾儘管他專注於10,000小時(而不是10年),但他已經推廣了這個想法。亨利·卡蒂埃·佈雷森(Henri Cartier-Bresson,1908-2004年)的另一個標準是:“您的前10,000張照片是最糟糕的。” (他沒想到數位相機會在一個星期內達到這個目標。)真正的專業知識可能需要一輩子:塞繆爾·約翰遜(Samuel Johnson(1709-1784))說:“只有透過一生;不要以較低的價格購買它。” 喬uc(1340-1400)抱怨說:“ lyf太短了,工藝太長了。” 希波克拉底(約公元前400年)以“ ars longa,vita brevis”的摘錄而聞名,它是“ Ars longa,vita brevis,occasio praeceps,experimentumperculosum,iudicium difficile”較長引語的一部分,在英語中譯為“生命”。是短, 當然,沒有一個數字可以作為最終答案:假設所有技能(例如程式設計,下棋,下棋和玩音樂)可能都需要完全相同的時間來掌握,這似乎是不合理的,也不會所有人都花費完全相同的時間。正如 K. Anders Ericsson教授所說:“在大多數領域,即使是最有才華的人也需要多少時間才能達到最高水平的表現。10,000小時的小時數使您感覺我們在談論幾年每週10至20個小時,有些人會說這些是天賦最才華的人,仍然需要達到最高水平。”

所以你想成為一名程式設計師

這是我程式設計成功的秘訣:

  • 獲取感興趣的節目,並做一些,因為它很有趣。確保它保持足夠的樂趣,以便您願意投入十年/ 10,000小時的時間。
  • 程式。最好的學習方法就是邊做邊學。從技術上講,“在一定範圍內,個人的最高績效不會根據擴充套件的經驗而自動獲得,但是即使是經驗豐富的個人,也可以透過有針對性的努力來提高績效水平。 ”。(p。366) 和“最有效的學習需要對特定個體具有適當難度級別的明確定義的任務,資訊反饋以及重複和糾正錯誤的機會。” (第20-21頁)《實踐中的認知:日常生活中的思維,數學和文化》是對此觀點的有趣參考。
  • 其他程式設計師交談;閱讀其他程式。這比任何書籍或培訓課程都重要。
  • 如果需要,可以在大學學習四年(或者在研究生院學習四年)。這將使您能夠訪問一些需要證照的工作,並且可以使您對該領域有更深入的瞭解,但是,如果您不喜歡學校,則可以(有一定的奉獻精神)自己或在工作中獲得類似的經驗。 。無論如何,僅靠書籍學習是不夠的。《新駭客詞典》的作者埃裡克·雷蒙德(Eric Raymond)表示:“電腦科學教育不能像學習畫筆和顏料那樣使任何人成為專家程式設計師。” 我曾經僱用過的最好的程式設計師之一隻有高中學位。他製作了很多很棒的 軟體,並擁有自己的新聞組並且擁有足夠的股票期權購買自己的夜總會
  • 其他程式設計師一起從事專案。在某些專案中成為最好的程式設計師;在其他人身上最糟糕。當您處於最佳狀態時,就可以測試自己領導專案的能力,並用自己的遠見激發他人的能力。在最壞的情況下,您將學習大師的所作所為,並瞭解他們不喜歡做的事情(因為他們讓您為他們做)。
  • 其他程式設計師之後從事專案。瞭解別人編寫的程式。看看當原始程式設計師不在時需要理解和修復它的過程。考慮如何設計您的程式,使那些在您之後維護它們的人更容易。
  • 學習至少六種程式語言。包括一種強調類抽象的語言(例如Java或C ++),一種強調功能抽象的語言(例如Lisp或ML或Haskell),一種支援語法抽象的語言(例如Lisp),一種支援宣告性規範的語言(例如Prolog或C ++模板)。 ,並且強調並行性(例如Clojure或Go)。
  • 請記住,“電腦科學” 中有一個“ 計算機 ”。知道您的計算機執行一條指令,從記憶體中提取一個單詞(有或沒有快取未命中),從磁碟讀取連續的單詞以及尋找磁碟上的新位置需要多長時間。(在這裡回答。
  • 參與語言 標準化工作。它可以是ANSI C ++委員會,也可以確定您的本地編碼樣式是否具有2或4個空格縮排級別。無論哪種方式,您都可以瞭解其他人在某種語言中的喜好,對他們的感受有多深,甚至可能對他們為何如此感覺有所瞭解。
  • 具有良好的意識,可以儘快開始語言標準化工作。

考慮到所有這些,僅透過學習書籍就能取得多大的成績值得懷疑。在我的第一個孩子出生之前,我閱讀了所有“ 如何做”書,仍然覺得自己是一個笨手笨手的新手。30個月後,當我的第二個孩子到期時,我是否回到書本上覆習了?否。相反,我依靠我的個人經驗,事實證明,與專家撰寫的成千上萬頁相比,這對我而言更加有用和令人放心。

弗雷德·布魯克斯(Fred Brooks)在他的論文《無銀子彈》中 確定了一個由三部分組成的計劃,以尋找優秀的軟體設計師:

  1. 儘早系統地確定頂級設計師。
  2. 指派職業指導者負責潛在客戶的發展,並仔細儲存職業檔案。
  3. 為成長中的設計師提供互動和相互刺激的機會。

這是假設一些人已經具備成為優秀設計師所需的素質;工作是適當地哄騙他們。 艾倫·佩里斯(Alan Perlis)更簡潔地說:“每個人都可以雕刻:米開朗基羅必須被教導如何不做。偉大的程式設計師也是如此。” 佩利斯說,偉人的內在素質超越了他們的訓練。但是質量從何而來?是天生的嗎?還是他們透過勤奮發展?正如奧古斯特·古斯托(Ratatouille的虛構廚師 )所說:“任何人都可以做飯,但只有無所畏懼的人才能做得好。” 我將其更多地看作是願意將一生的大部分時間投入到思考實踐中。但也許 無所畏懼是一種概括的方式。或者,正如古斯托(Gusteau)的批評家安東·埃戈(Anton Ego)所說:“並非每個人都能成為一名偉大的藝術家,但是偉大的藝術家可以來自任何地方。”

因此,繼續購買那本Java / Ruby / Javascript / PHP書;您可能會從中受益。但是您不會在24小時或21天之內改變自己的生活,也不會改變自己真正的整體專業知識。如何努力在24個月內不斷改進?好吧,現在您開始有所建樹...


參考文獻

本傑明·布魯姆(ed。),《年輕人的發展才能》,巴蘭廷,1985年。

布魯克斯,弗雷德,《無銀子彈》,IEEE計算機,第1卷。20號 1987年第4期,第4頁。10-19。

Bryan,WL&Harter,N.“關於電報語言的研究:習性等級的獲得。Psychology Review,1899,8,345-375

海斯(John Hayes),《完全問題解決者》勞倫斯·艾爾鮑姆(1989)。

Chase,William G.&Simon,Herbert A. “國際象棋的 認知” 認知心理學,1973,4,55-81。

Lave,Jean,《實踐中的認知:日常生活中的思維,數學和文化》,劍橋大學出版社,1988年。


答案

典型PC上各種操作的大概時間:

指令 時間
執行典型的指令 1 / 1,000,000,000秒= 1納秒
從L1快取中獲取 0.5納秒
分支預測錯誤 5納秒
從二級快取中獲取 7納秒
互斥鎖鎖定/解鎖 25納秒
從主記憶體中獲取 100納秒
透過1Gbps網路傳送2K位元組 20,000納秒
從記憶體順序讀取1MB 250,000納秒
從新磁碟位置獲取(查詢) 8,000,000納秒
從磁碟順序讀取1MB 20,000,000納秒
將小包美國傳送到歐洲並返回 150毫秒= 150,000,000納秒

附錄:語言選擇

一些人問他們應該首先學習哪種程式語言。沒有答案,但請考慮以下幾點:

  • 使用你的朋友。當被問及“我應該使用哪種作業系統,Windows,Unix或Mac?”時,我的回答通常是:“使用您的朋友使用的任何軟體”。從朋友那裡學習的好處將抵消作業系統之間或程式語言之間的任何內在差異。還請考慮您的未來朋友:如果繼續,您將成為程式設計師社群的一部分。您選擇的語言是一個正在成長的大型社群還是一個瀕臨滅絕的社群?是否有書籍,網站和線上論壇可提供答案?您喜歡那些論壇中的人嗎?
  • 保持簡單。諸如C ++和Java之類的程式語言是由經驗豐富的程式設計師組成的大型團隊設計的,這些團隊關心他們的程式碼的執行時效率。結果,這些語言具有針對這些情況設計的複雜部分。您擔心要學習程式設計。您不需要那種麻煩。您需要一種被設計為易於被單個新程式設計師學習和記住的語言。
  • 玩。您寧願學會彈鋼琴的方式:正常的互動方式,即敲擊琴鍵後便會聽到每個音符,或者是“批處理”模式,即在整首歌結束後才聽到音符。 ?顯然,互動模式使鋼琴和程式設計學習變得更加容易。堅持使用互動式模式的語言並使用它。

給定這些條件,我對第一種程式語言的建議是Python或 Scheme。另一個選擇是Javascript,不是因為它是為初學者精心設計的,而是因為有許多線上教程供您使用,例如 Khan Academy的教程。但是您的情況可能會有所不同,還有其他不錯的選擇。如果您的年齡是個位數,則您可能更喜歡 AliceSqueak 或Blockly(年齡較大的學習者可能會喜歡)。重要的是您選擇並開始。


附錄:書籍和其他資源

有幾個人問他們應該從中學到什麼書和網頁。我重申“僅靠書本學習是不夠的”,但我可以推薦以下內容:

筆記

T. Capey指出,亞馬遜上的“ 完整問題解決者”頁面現在在“購買此商品的客戶也購買了這些商品”部分下有“ 21天自學孟加拉語”和“自學語法和風格”書。我猜想看那本書的人很大一部分來自此頁面。感謝Ross Cohen為希波克拉底提供的幫助。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章