彼得 · 諾維格
為什么每個人都這么匆忙屈尼?
走進任何一家書店,你會看到如何在24小時內自學Java赴叹,以及提供無盡的變體來教授C鸿染、SQL、Ruby乞巧、算法,幾天或幾小時后等等摊鸡。亞馬遜高級搜索 [標題: 教绽媒,你自己,小時免猾,從: 2000開始是辕,發(fā)現了512本這樣的書。前十名中有九本是編程書籍 (另一本是關于記賬的)猎提。類似的結果來自于用 “學習” 代替 “自學” 或用 “天” 代替 “小時”获三。
結論是,要么人們急于學習編程锨苏,要么編程比其他任何東西都容易得多疙教。Felleisen等人在他們的《如何設計程序》一書中對這一趨勢表示贊同,他們說 “糟糕的編程很容易伞租。白癡可以在21天內學會贞谓,即使他們是假人】”Abtruse Goose漫畫也有他們的看法裸弦。
讓我們分析一下像24小時自學C ++ 這樣的標題可能意味著什么:
自學: 在24小時內祟同,你將沒有時間寫幾個重要的程序,并從中學習成功和失敗理疙。你沒有時間和一個有經驗的程序員一起工作晕城,也沒有時間理解生活在C + + 環(huán)境中的感覺。簡而言之窖贤,您將沒有時間學習很多東西广辰。所以這本書只能談論表面的熟悉,而不是深刻的理解主之。正如亞歷山大 · 波普所說择吊,一點點學習是一件危險的事情。
C ++: 在24小時內槽奕,您也許可以學習C ++ 的一些語法 (如果您已經知道另一種語言)几睛,但是你不能學到很多關于如何使用這種語言的知識。簡而言之粤攒,如果你是一個基本的程序員所森,你可以學習使用C + + 語法以基本的風格編寫程序,但是你無法了解C + + 實際上是什么好 (和壞)夯接。那有什么意義呢焕济?艾倫 · 佩里斯曾經說過: “一種不影響你思考編程方式的語言不值得知道”。一個可能的觀點是你必須學習一點點C + + (或者更可能的是盔几,像JavaScript或處理之類的東西) 因為您需要與現有工具交互以完成特定任務晴弃。但是你沒有學習如何編程; 你正在學習完成那個任務。
24小時內: 不幸的是逊拍,這還不夠上鞠,如下一節(jié)所示。
十年后自學編程
研究人員 (布魯姆 (1985) 芯丧、布萊恩和哈特 (1899) 芍阎、海斯 (1989) 、西蒙·蔡斯 (1973)) 已經證明缨恒,在各種領域發(fā)展專業(yè)知識需要大約十年的時間谴咸,包括下棋、音樂創(chuàng)作骗露、電報操作岭佳、繪畫、鋼琴演奏椒袍、游泳驼唱、網球,以及神經心理學和拓撲研究驹暑。關鍵是深思熟慮的實踐: 不僅僅是一次又一次地做這件事玫恳,而是用一項超出你目前能力的任務來挑戰(zhàn)你自己辨赐,嘗試它,分析你在做這件事之后的表現京办,并糾正任何錯誤掀序。然后重復。再重復一遍惭婿。似乎沒有真正的捷徑可走: 甚至莫扎特不恭,一個4歲的音樂天才,也花了13年多的時間才開始創(chuàng)作世界級的音樂财饥。在另一種類型中换吧,甲殼蟲樂隊似乎憑借一系列熱門歌曲和1964年埃德 · 沙利文秀的亮相而嶄露頭角。但是自1957年以來钥星,他們一直在利物浦和漢堡打小型俱樂部沾瓦,雖然他們很早就有了廣泛的吸引力,但他們的第一個重大成功是中士谦炒。胡椒贯莺,于1967年發(fā)行。
馬爾科姆 · 格拉德威爾推廣了這個想法宁改,盡管他專注于10,000小時缕探,而不是10年。亨利 · 卡蒂埃-布列松 (1908-2004) 有另一個指標: “你的前10,000張照片是你最差的还蹲〉模“ (他沒想到,有了數碼相機秽誊,有些人可以在一周內達到那個目標鲸沮。)真正的專業(yè)知識可能需要一生: 塞繆爾 · 約翰遜 (1709-1784) 說: “任何部門的卓越只有通過一生的勞動才能實現; 它不能以較低的價格購買」郏”喬叟 (1340-1400) 抱怨道: “l(fā)yf太短了,飛船太長了楣号∽钜祝”希波克拉底 (c.公元前400年) 以摘錄 “龍舌蘭,短梭菌” 而聞名炫狱,這是較長的引文 “龍舌蘭藻懒,短梭菌,大胸草视译,大胸草嬉荆,三葉草,艱難梭菌” 的一部分酷含,在英語中鄙早,它描述為 “生命短暫汪茧,[這] 工藝漫長,機會短暫限番,實驗危險舱污,判斷困難∶峙埃”當然扩灯,沒有一個數字可以成為最終答案: 假設所有技能 (例如g.,編程霜瘪、下棋珠插、跳棋和音樂演奏) 都需要完全相同的時間來掌握,也不是所有人都需要完全相同的時間颖对。作為K教授安德斯 · 愛立信 (Anders Ericsson) 表示: “在大多數領域捻撑,即使是最有才華的人也需要多少時間才能達到最高水平。10,000小時的數字只是給你一種感覺惜互,我們談論的是每周10到20小時的年份布讹,有些人會認為這些年份是天生最有才華的人,他們仍然需要最高級別训堆∶柩椋”
所以你想成為一名程序員
這是我成功編程的秘訣:
對編程感興趣,并做一些坑鱼,因為它很有趣膘流。確保它保持足夠的樂趣,這樣你就愿意投入你的十年/10,000小時鲁沥。
程序呼股。最好的學習方式是邊做邊學。更嚴格地說画恰,“在給定領域中彭谁,個人的最大績效水平不是作為擴展經驗的函數自動獲得的,但是允扇,由于深思熟慮地努力提高缠局,即使是經驗豐富的個人也可以提高績效水平】既螅“ (第366) 和”最有效的學習需要一個定義明確的任務狭园,為特定的個人提供適當的難度水平、信息反饋以及重復和糾正錯誤的機會糊治〕“(第20-21) 這本書《實踐中的認知: 日常生活中的思想、數學和文化》是這一觀點的有趣參考。
與其他程序員交談; 閱讀其他程序绎谦。這比任何書籍或培訓課程都重要管闷。
如果你愿意,在大學里呆四年 (或者在研究生院呆四年以上)燥滑。這將讓你獲得一些需要證書的工作渐北,也會讓你對這個領域有更深入的了解,但是如果你不喜歡學校铭拧,你可以 (有一些奉獻精神) 獨自或在工作中獲得類似的經驗赃蛛。無論如何,僅靠書本學習是不夠的搀菩∨槐郏《新黑客詞典》的作者埃里克 · 雷蒙德說: “計算機科學教育不能讓任何人成為專業(yè)程序員,就像學習畫筆和顏料可以讓某人成為專業(yè)畫家一樣肪跋∑缃”我雇傭過的最好的程序員之一只有高中學位; 他制作了很多很棒的軟件,有自己的新聞組州既,并且有足夠的股票期權來購買他自己的夜總會谜洽。
和其他程序員一起做項目。在一些項目上做最好的程序員; 在其他項目上做最差的吴叶。當你是最棒的時候阐虚,你可以測試你領導一個項目的能力,并用你的愿景激勵他人蚌卤。當你最糟糕的時候实束,你知道大師做什么,你知道他們不喜歡做什么 (因為他們讓你為他們做)逊彭。
在其他程序員之后的項目上工作咸灿。理解別人寫的程序∥甓#看看當原始程序員不在時避矢,需要什么來理解和修復它。想想如何設計你的程序囊榜,讓那些在你之后維護它們的人更容易谷异。
學習至少六種編程語言。包括一種強調類抽象的語言 (如Java或C ++)锦聊,一種強調功能抽象的語言 (如Lisp或ML或Haskell),一種支持語法抽象的語言 (如Lisp)箩绍,一個支持聲明性規(guī)范 (如Prolog或C + + 模板)孔庭,一個強調并行性 (如clojuror Go)。
請記住,“計算機科學” 中有一臺 “計算機”圆到。了解您的計算機執(zhí)行指令怎抛、從內存中獲取單詞 (有或沒有緩存缺失) 、從磁盤讀取連續(xù)單詞需要多長時間芽淡,并尋找磁盤上的新位置马绝。(這里回答。)
參與語言標準化工作挣菲。它可以是ANSI C committee委員會富稻,也可以決定您的本地編碼樣式是否具有2或4個空間縮進級別。無論哪種方式白胀,你都可以了解其他人在一種語言中喜歡什么椭赋,他們的感受有多深,甚至可能了解他們?yōu)槭裁磿羞@種感覺或杠。
有良好的意識盡快停止語言標準化工作哪怔。
考慮到所有這些,僅僅通過書本學習你能走多遠是值得懷疑的向抢。在我的第一個孩子出生之前认境,我讀了所有的《如何讀書》,仍然覺得自己是一個無知的新手挟鸠。30個月后叉信,當我的第二個孩子到期時,我回到書上復習了嗎兄猩?不茉盏。相反,我依靠我的個人經驗枢冤,結果證明這比專家寫的數千頁對我來說更有用鸠姨,更讓人放心。
弗雷德 · 布魯克斯在他的論文《沒有銀彈》中確定了一個尋找優(yōu)秀軟件設計師的三部分計劃:
盡早系統地識別頂級設計師淹真。
指派一名職業(yè)導師負責潛在客戶的發(fā)展讶迁,并仔細保存一份職業(yè)檔案。
為成長中的設計師提供相互交流和激勵的機會核蘸。
這假設一些人已經具備了成為一名偉大的設計師所必需的品質; 工作就是恰當地哄騙他們巍糯。艾倫 · 佩里斯更簡潔地說: “每個人都可以被教導去雕刻: 米開朗基羅必須被教導如何不去。偉大的程序員也是如此 ”客扎。佩里斯說偉人有一些超越他們訓練的內在品質祟峦。但是質量從何而來呢?是先天徙鱼?還是他們通過勤奮來發(fā)展宅楞?正如奧古斯特 · 古斯特 (《料理鼠王》中的虛構廚師) 所說针姿,“任何人都會做飯,但只有無所畏懼的人才會很棒厌衙【嘁”我認為這更多的是愿意將一生的大部分時間用于協商實踐。但也許無所畏懼是總結這一點的一種方式婶希¢畔荆或者,正如古斯托的評論家安東 · 自我所說: “不是每個人都能成為偉大的藝術家喻杈,但是偉大的藝術家可以來自任何地方彤枢。”
所以去買那本Java/Ruby/Javascript/PHP的書吧; 你可能會從中得到一些利用奕塑。但是你不會在24小時或21天內改變你的生活堂污,或者你作為程序員的真正的整體專業(yè)知識。努力工作在24個月內不斷提高怎么樣龄砰?好吧盟猖,現在你開始有所進展了……