1. 程式人生 > >自學程式設計 10000 小時

自學程式設計 10000 小時

為何每個人都如此匆忙?

180.png

走進任意一家書店,你會看到 如何在24小時內自學 Java ,以及在幾天或幾小時內教授 C、SQL、Ruby、演算法等無窮無盡的書籍變種。亞馬遜高階搜尋以下關鍵詞[ title: teach, yourself, hours, since: 2000 ,會發現有512本這樣的書。在前十名中,有九本是程式設計書籍(另一本是關於記賬的)。類似的結果來自於將 “teach yourself"替換為"learn"或將"hours"替換為"days”。

結論是,要麼人們都急於學習程式設計,要麼程式設計在某種程度上比其他任何東西都更容易學習。Felleisen 等人在他們的“ How to Design Programs

 ”一書中對此趨勢表示贊同,“糟糕的程式設計很容易。即使是傻瓜,人們也可以在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年以來他們一直在利物浦和 Hamburg 小型俱樂部演唱,雖然他們有早期粉絲,但他們的第一次重大成功, Sgt. Peppers

 ,於1967年釋出。

馬爾科姆·格拉德維爾推廣了這一思想,儘管他更關注10,000個小時而不是10年。亨利·卡蒂埃-佈列鬆則有其他的標準:“最糟糕的是你前10,000張照片”(他沒想到數碼相機的出現致使某些人在一週之內就能達成目標)。“真正的專業知識需要你用一生來了解”,塞繆爾·約翰遜說到,“任何學科的卓越成就依靠畢生勞作,靠金錢買不來。”喬叟則抱怨道:“生之有崖,學而無涯。”希波克拉底因這條摘要 "ars longa, vita brevis"而著名,這是引文“Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”的一部分,在英語中則說 “Life is short, [the] craft long, opportunity fleeting, experiment treacherous, judgment difficult.”(譯者注:生命短暫,技藝長遠,機會易逝,實驗詭譎,判斷困難的意思,希波克拉底用拉丁文寫的)當然,答案不唯一:假設所有技能(例如:程式設計,下象棋,玩跳棋還有演奏音樂)都需要完全相同的時間掌握那是不合理的,並非所有人都花費相同時間。像安德斯·愛立信教授所言,“在大多數領域中,才華橫溢者也需時間成就不朽偉業。10,000這個數給我們每週僅工作10至20個小時,有些人辯稱大天才還需要達到最高水準。”

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

這是我在程式設計方面獲得成功的祕訣:

  • 對程式設計 感興趣 ,因為它很有趣而完成一些程式設計工作。確保它能對你保持足夠的興趣,以便你願意在未來投入十年/10,000小時。

  • 編碼。最好的學習方式是 邊學邊做 。更具技術性地描述下,“特定領域中個人的最高績效水平並不是作為增加經驗的功能而自動實現的,但即使是經驗豐富的個體因刻意努力改進是可以提高績效水平的。”( p. 366 )和“最有效的學習需要一個定義明確的任務,對特定的個體有適當的難度級別、資訊反饋,以及重複和糾正錯誤的機會。” (第20-21頁) “實踐中的認知:日常生活中的思想,數學和文化” ( *Cognition in Practice *)一書中是對這一觀點的一個有趣的引用。

  • 跟其他程式設計師 交談 ,或閱讀其他人的程式。這比其他任何書籍或課程都管用。

  • 如果對學校有興趣,你可以讀4年 大學 (或再讀幾年研究生)。這樣你就可以找那些有學歷門檻的工作,而且學校可以讓你對這個領域有更深的認識。當然,如果你不喜歡學校,那麼也可以通過自學或工作來達到相同的效果。無論如何,單單看書肯定是不夠的。“單憑計算機課無法讓一個人變成一個程式設計專家,就像單純研究刷子和顏料無法造就一個畫家一樣。”《新黑客字典》的作者 Eric Raymond 這樣說。我曾經有個員工,雖然只有高中學歷,但非常厲害,寫了很多很棒的軟體,還有自己的 新聞組 ,甚至還靠股票期權買下了自己的 夜總會 。

  • 跟其他程式設計師 一起做專案 。在一些專案裡,你可能是最牛的;在另一些專案裡,你可能是最弱的。在那些你最牛的專案裡,你可以訓練你的領導能力,用你的眼界來激發大家。在那些你最弱的專案裡,你可以學學那些大牛是怎麼做的,也可以學學那些大牛不想做的東西(因為大牛讓你替他們做)

  • 接手其他程式設計師的專案。理解其他人寫的程式。看看理解和修復其他人的程式會有多難。這樣你就可以想想怎麼優化自己的設計,可以讓別人接手時簡單一些,再簡單一些。

  • 至少要學那麼六七門 程式語言 。其中至少要有一門是強調類抽象的(比如 Java 和 C++),一門是強調函式抽象的(比如 Lisp、ML 或 Haskell),一門是支援語法抽象的(比如 Lisp),一門是支援宣告式規範的(比如 Prolog 和 C++ 模板),一門是強調並行性的(比如 Clojure 和 Go)。

  • 記住,“電腦科學”中是有一個“ 計算機 ”的。你得知道你的計算機執行一條指令需要多久,從記憶體取一個詞需要多久(快取命中要多久,不命中要多久),從磁碟讀連續的字要多久,磁碟尋道要多久。

  • 加入到語言的 標準化 過程中。大到加入 ANSI C++ 委員會,小到確定你們公司裡是用2個空格縮排還是4個空格縮排。通過這些過程,你可以瞭解其他人對語言裡某些東西的喜好,這種喜好到底有多深刻,甚至為什麼有這種喜好。

  • 還要有儘快從語言標準化工作中 抽身而出 的決斷力。

考慮到所有這些問題,你可以通過書本學習到多少。在我的第一個孩子出生之前,我讀了所有的 How To 書籍,仍然感覺像一個無知的新手。30個月後,當我的第二個孩子到來時,我是否還要回到書本上進行復習?不。相反,我依靠我的個人經驗,結果證明,與專家撰寫的數千頁相比,這對我來說更有用,更讓人放心。

弗雷德布魯克斯在他的文章 *No Silver Bullet   *中確定了一個由三部分組成的計劃來尋找優秀的軟體設計師:

  1. 儘早系統地識別頂級設計師。

  2. 指派一名職業導師負責潛在客戶的發展並謹慎地保留工作檔案。

  3. 為成長中的設計師提供互動和互相激勵的機會。

這裡假設有些人已經擁有成為優秀設計師所需的品質;任務就是要循循善誘之。 Alan Perlis 的表達更簡潔:“每個人都可以被教導雕琢:米開朗基羅必須被教導如何不被雕琢。偉大的程式設計師也是如此”。Perlis 說過,偉人的內在品質超越了他們的訓練。但其品質來自哪裡?它是天生的嗎?或者他們是通過勤奮來形成的?正如 Auguste Gusteau( Ratatouille 中虛構的廚師)所說,“任何人都可以烹飪,但只有無所畏懼者才能做得很好。”我更多地想到將一個人的大部分時間投入到審慎的實踐中的意願。但也許無畏是對其總結的一種方式。或者,正如 Gusteau 的評論家 Anton Ego 所說:“並非每個人都能成為偉大的藝術家,但偉大的藝術家可以來自任何地方。”

所以不妨繼續購買 Java/Ruby/Javascript/PHP 類書籍;你可能會用到其中一些。但你不會在24小時或21天內改變你的生活或習得作為程式設計師所需的真正整體的專業知識。努力不斷改進超過24個月如何?好吧,現在你開始觸控到某個地方了…

這裡推薦一下我的前端學習交流群:784783012,裡面都是學習前端的,如果你想製作酷炫的網頁,想學習程式設計。自己整理了一份2018最全面前端學習資料,從最基礎的HTML+CSS+JS【炫酷特效,遊戲,外掛封裝,設計模式】到移動端HTML5的專案實戰的學習資料都有整理,送給每一位前端小夥伴,有想學習web前端的,或是轉行,或是大學生,還有工作中想提升自己能力的,正在學習的小夥伴歡迎加入學習。