21天帶你進入c

  • 3天:不幸的是,這是不夠的,正如下一節所言。

10年學編程

一些研究者(Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973))的研究表明,在許多領域,都需要大約10 年時間才能培養出專業技能,包括國際象棋、作曲、繪畫、鋼琴、游泳、網球,以及神經心理學和拓撲學的研究。似乎並不存在真正的捷徑:即使是莫扎特,他4歲就顯露出音樂天才,在他寫出世界級的音樂之前仍然用了超過13年時間。

再看另一種音樂類型的披頭士,他們似乎是在1964年的Ed Sullivan節目中突然冒頭的。但其實他們從1957年就開始表演了,即使他們很早就顯示出了巨大的吸引力,他們第一次真正的成功——Sgt. Peppers——也要到1967年才發行。Malcolm Gladwell 研究報告稱,把在伯林音樂學院學生一個班的學生按水平分成高中低,然後問他們對音樂練習花了多少工夫:

在這三個小組中的每一個人基本上都是從相同的時間開始練習的(在五歲的時候)。在開始的幾年裡,每個人都是每週練習2-3個小時。但是在八歲的時候,練習的強度開始顯現差異。在這個班中水平最牛的人開始比別人練習得更多——在九歲的時候每週練習6個小時,十二歲的時候,每週8個小時,十四歲的時候每週16個小時,並在成長過程中練習得越來越多,到20歲的時候,其每週練習可超過30個小時。到了20歲,這些優秀者在其生命中練習音樂總共超過 10,000 小時。與之對比,其它人只平均有8,000小時,而未來只能留校當老師的人僅僅是4,000 小時。

所以,這也許需要10,000 小時,並不是十年,但這是一個magic number。Samuel Johnson(英國詩人)認為10 年還是不夠的:“任何領域的卓越成就都只能通過一生的努力來獲得;稍低一點的代價也換不來。”(Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.) 喬叟(Chaucer,英國詩人,1340-1400)也抱怨說:“生命如此短暫,掌握技藝卻要如此長久。”(the lyf so short, the craft so long to lerne.)

下面是我在編程這個行當裡獲得成功的處方:

  • 對編程感興趣,因為樂趣而去編程。確定始終都能保持足夠的樂趣,以致你能夠將10年時間投入其中。

  • 跟其他程序員交談;閱讀其他程序。這比任何書籍或訓練課程都更重要。

  • 編程。最好的學習是從實踐中學習。用更加技術性的語言來講,“個體在特定領域最高水平的表現不是作為長期的經驗的結果而自動獲得的,但即使是非常富有經驗的個體也可以通過刻意的努力而提高其表現水平。”(p. 366),而且“最有效的學習要求為特定個體制定適當難度的任務,有意義的反饋,以及重複及改正錯誤的機會。”(p. 20-21)《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在實踐中認知:心智、數學和日常生活的文化)是關於這個觀點的一本有趣的參考書。

  • 如果你願意,在大學裡花上4年時間(或者再花幾年讀研究生)。這能讓你獲得一些工作的入門資格,還能讓你對此領域有更深入的理解,但如果你不喜歡進學校,(作出一點犧牲)你在工作中也同樣能獲得類似的經驗。在任何情況下,單從書本上學習都是不夠的。“計算機科學的教育不會讓任何人成為內行的程序員,正如研究畫筆和顏料不會讓任何人成為內行的畫家”, Eric Raymond,《The New Hacker’s Dictionary》(新黑客字典)的作者如是說。我曾經僱用過的最優秀的程序員之一僅有高中學歷;但他創造出了許多偉大的軟件(XEmacs, Mozilla),甚至有討論他本人的新聞組,而且股票期權讓他達到我無法企及的富有程度(譯註:指Jamie Zawinski,Xemacs和Netscape的作者)。

  • 跟別的程序員一起完成項目。在一些項目中成為最好的程序員;在其他一些項目中當最差的一個。當你是最好的程序員時,你要測試自己領導項目的能力,並通過你的洞見鼓舞其他人。當你是最差的時候,你學習高手們在做些什麼,以及他們不喜歡做什麼(因為他們讓你幫他們做那些事)。

  • 接手別的程序員完成項目。用心理解別人編寫的程序。看看在沒有最初的程序員在場的時候理解和修改程序需要些什麼。想一想怎樣設計你的程序才能讓別人接手維護你的程序時更容易一些。

  • 學會至少半打編程語言。包括一門支持類抽象(class abstraction)的語言(如Java或C++),一門支持函數抽象(functional abstraction)的語言(如Lisp或ML),一門支持句法抽象(syntactic abstraction)的語言(如Lisp),一門支持說明性規約(declarative specification)的語言(如Prolog或C++模版),一門支持協程(coroutine)的語言(如Icon或Scheme),以及一門支持並行處理(parallelism)的語言(如Sisal)。

  • 記住在“計算機科學”這個詞組裡包含“計算機”這個詞。瞭解你的計算機執行一條指令要多長時間,從內存中取一個word要多長時間(包括緩存命中和未命中的情況),從磁盤上讀取連續的數據要多長時間,定位到磁盤上的新位置又要多長時間。(答案在這裡)

  • 嘗試參與到一項語言標準化工作中。可以是ANSI C++委員會,也可以是決定自己團隊的編碼風格到底採用2個空格的縮進還是4個。不論是哪一種,你都可以學到在這門語言中到底人們喜歡些什麼,他們有多喜歡,甚至有可能稍微瞭解為什麼他們會有這樣的感覺。

  • 擁有儘快從語言標準化工作中抽身的良好判斷力。

抱著這些想法,我很懷疑從書上到底能學到多少東西。在我第一個孩子出生前,我讀完了所有“怎樣……”的書,卻仍然感到自己是個茫無頭緒的新手。30個月後,我第二個孩子出生的時候,我重新拿起那些書來複習了嗎?不。相反,我依靠我自己的經驗,結果比專家寫的幾千頁東西更有用更靠得住。

Fred Brooks在他的短文《No Silver Bullets》(沒有銀彈)中確立瞭如何發現傑出的軟件設計者的三步規劃:

  • 儘早系統地識別出最好的設計者群體。

  • 指派一個事業上的導師負責有潛質的對象的發展,小心地幫他保持職業生涯的履歷。

  • 讓成長中的設計師們有機會互相影響,互相激勵。

這實際上是假定了有些人本身就具有成為傑出設計師的必要潛質;要做的只是引導他們前進。Alan Perlis說得更簡潔:“每個人都可以被教授如何雕塑;而對米開朗基羅來說,能教給他的倒是怎樣能夠不去雕塑。傑出的程序員也一樣”。

所以儘管去買那些Java書;你很可能會從中找到些用處。但你的生活,或者你作為程序員的真正的專業技術,並不會因此在24小時、24天甚至24個月內發生真正的變化。每天會更新論文和視頻,還有如果想學習c++知識在晚上8.30免費觀看這個直播:https://ke.qq.com/course/131973#tuin=b52b9a80


分享到:


相關文章: