? ??
彼得·諾維格
為什么大家都這么著急?
走進任何一家書店,你就會知道怎么做24小時自學爪哇除了無止境的變化之外,還提供在幾天或幾小時內(nèi)教授C、SQL、Ruby、算法等。亞馬遜高級搜索[標題:自學,自學,學時,自2000年起找到了512本這樣的書。在前十名中,有九本是編程書籍(另一本是關于簿記)。類似的結(jié)果來自于用“學習”代替“自學”,或者用“天”代替“小時”
結(jié)論是,要么人們急于學習編程,要么編程比其他任何東西都容易得多。費雷森等等在他們的書中對這種趨勢表示贊同如何設計程序,當他們說“糟糕的編程很容易。白癡可以在21天即使他們是假人“《阿不勒斯鵝》漫畫也有他們的看法.
我們來分析一下標題是什么樣的24小時自學C可能意味著:
自學:你可以在24小時內(nèi)從失敗中吸取教訓。你沒有時間和有經(jīng)驗的程序員一起工作,也沒有時間去理解生活在C環(huán)境中的感覺。在短時間內(nèi),你不會學到很多東西。所以這本書只能說是一種表面的熟悉,而不是深刻的理解。正如亞歷山大·波普所說,一點點學習是危險的。
C:在24小時內(nèi),你也許能學會一些of c的語法(如果你已經(jīng)知道另一種語言的話),但你卻無法學到很多關于如何使用這種語言的知識。簡而言之,如果你是一個基礎程序員,你可以學習用C語法以basic的風格編寫程序,但是你不能學習C實際上的優(yōu)點(和缺點)。那么有什么意義呢?丙泊酚曾經(jīng)說過:“一種不影響你思考編程方式的語言是不值得知道的”。一個可能的觀點是你必須學習一點C語言(或者更可能是JavaScript或處理之類的東西),因為你需要與一個現(xiàn)有的工具交互來完成特定的任務。但你并不是在學習如何編程,而是在學習如何完成這項任務。
24小時內(nèi):不幸的是,這還不夠,正如下一節(jié)所示。
十年自學編程
研究人員(布魯姆(1985),布萊恩和哈特(1899),海斯(1989),西蒙蔡斯(1973))已經(jīng)證明了它需要十年的時間來發(fā)展在各個領域的專業(yè)知識,包括國際象棋、音樂創(chuàng)作、電視廣播、繪畫、鋼琴演奏、游泳、網(wǎng)球以及歐洲心理學和拓撲學的研究。關鍵是深思熟慮的練習:不只是一次又一次地做,而是用一個超出你目前能力的任務來挑戰(zhàn)你自己,嘗試它,分析你在做的時候和之后的表現(xiàn),并改正任何錯誤。然后重復。再重復一遍。似乎有諾雷亞爾的捷徑:即使是莫扎特,他在4歲時是一個音樂天才,也比他開始創(chuàng)作世界級的音樂多了13年。沙利文在1965年首次在漢堡演出時,他們在其他類型的樂隊中表現(xiàn)得很出色,但他們在1964年首次在漢堡演出時就表現(xiàn)得很搶眼,辣椒中士,于1967年被釋放。
馬爾科姆格拉德威爾盡管他專注于10000個小時,而不是10年。Henri Cartier-Bresson(1908-2004)有另一個衡量標準:“你的前10000張照片是你最差的?!保ㄋ麤]有想到數(shù)碼相機,真正的專業(yè)知識可能需要一輩子的時間:塞繆爾·約翰遜(Samuel Johnson,1709-1784)曾說:“任何部門的卓越都只能靠一生的勞動來獲得,而不是以較低的價格買到的?!眴疼牛?340-1400)抱怨道:“l(fā)yf太短了,希波克拉底(約公元前400年)因節(jié)選“ars longa,vita brevis”而聞名,這是較長引語“ars longa,vita brevis,occasio praeceps,experitum periculosum,iudiciumdifficile”的一部分,在英語中是“生命是短暫的,[the]craftlong,機會轉(zhuǎn)瞬即逝,實驗充滿危險,很難判斷?!碑斎?,沒有一個數(shù)字可以作為最終答案:假設所有技能(例如編程、下棋、下棋和玩音樂)都需要完全相同的時間來掌握,也不認為所有人都需要完全相同的時間來掌握。作為教授。K、 安德斯·愛立信他說:“在大多數(shù)領域,即使是最優(yōu)秀的個人也需要多少時間才能達到最高水平的績效,這一點是值得注意的。1萬小時的數(shù)字讓你感覺到,我們說的是一周10到20個小時的工作時間,有些人會說,那些天生最有才華的人,仍然需要達到最高水平?!?/p>
所以你想成為一名程序員
以下是我編程成功的秘訣:
得到感興趣的在編程方面,做一些因為它很有趣。一定要讓它保持足夠的樂趣,這樣你才會愿意投入你的10年/10000小時。
程序. 最好的學習方式是邊干邊學. 從技術上講,“個人在某一特定領域的最高績效水平并不是作為經(jīng)驗擴展的函數(shù)自動實現(xiàn)的,但是即使是經(jīng)驗豐富的個人,通過深思熟慮的努力,績效水平也可以提高?!?a target="_blank">(第366頁)“最有效的學習需要一個明確的任務,對特定的個體有適當?shù)碾y度,信息反饋,以及重復和糾正錯誤的機會。”(p.20-21)實踐中的認知:日常生活中的思維、數(shù)學與文化是這個觀點的一個有趣的參考。
與…交談其他程序員;閱讀其他程序。這比任何書籍或培訓課程都重要。
如果你愿意的話,在一個學院(在農(nóng)業(yè)學?;蚋啵_@會讓你接觸到一些需要進修的工作,也會讓你對這個領域有更深入的了解,但如果你不喜歡上學,你可以(帶著一些奉獻精神)在自己或工作中獲得類似的經(jīng)驗。無論如何,光靠書本學習是不夠的?!庇嬎銠C科學教育不能使任何人成為專業(yè)程序員,正如學習畫筆和顏料可以使某人成為專家畫家一樣新黑客詞典. 我雇過的最好的程序員之一只有高中學歷,他已經(jīng)做了很多工作偉大的軟件,有他自己的新聞組他賺了足夠的股票期權來買自己的夜總會.
從事項目其他程序員。在某些項目上做最好的程序員;在其他項目上做最差的。當你是最好的,你可以測試你的能力,領導一個項目,并用你的遠見激勵別人。當你是最差的時候,你會知道他們做什么,你也會知道他們不喜歡做什么(因為他們讓你為他們做)。
從事項目之后其他程序員。理解別人寫的程序??纯葱枰裁床拍芾斫獠⒃谧畛醯某绦騿T不在的時候修復它。想想如何設計你的程序,讓那些在你之后維護它們的人更容易。
至少學半打程序設計語言. 包括一種強調(diào)類抽象的語言(如Java或C),一種強調(diào)功能抽象的語言(如Lisp或ML或Haskell),一種支持語法抽象(如Lisp),一種支持聲明性規(guī)范(如Prolog或C模板),以及一種強調(diào)并行性的語言(如Clojure或Go)。
記住有一個“計算機在“計算機科學”。知道您的計算機執(zhí)行一條指令、從內(nèi)存中獲取一個字(有或沒有緩存未命中)、從磁盤讀取連續(xù)的字以及在磁盤上尋找新位置所需的時間。(答案在這里)
學習一門語言標準化努力。它可以是ANSI C委員會,也可以是決定您的本地編碼風格是否有2或4個空格縮進級別。無論哪種方式,你都能了解到其他人喜歡哪種語言,他們的感受有多深,甚至可能了解他們?yōu)槭裁催@么想。
有理智下車語言標準化工作盡快進行。
這本書對你有什么疑問。在我第一個孩子出生之前,我讀了怎么做書,還是覺得自己是個無知的新手。30個月后,當我的第二個孩子出生的時候,我有沒有為了更新鮮的東西而回去讀書?沒有。相反,我依靠的是我的個人經(jīng)驗,這比專家寫的幾千頁對我更有用,更讓我安心。
弗雷德·布魯克斯,在他的文章里沒有銀彈確定了尋找優(yōu)秀軟件設計師的三部分計劃:
盡早系統(tǒng)地確定頂尖設計師。
指派一位職業(yè)導師負責潛在客戶的發(fā)展,并認真保存職業(yè)檔案。
為成長中的設計師提供互動和激勵的機會。
這是假設有些人已經(jīng)具備了成為一個偉大的設計師所必需的素質(zhì);工作就是適當?shù)卣f服他們。丙泊酚更簡潔地說:“每個人都可以被教導去雕塑:米開朗基羅本應該被教導如何不去雕塑。偉大的程序員也是如此。佩利斯說,偉大的球員有一些超越訓練的內(nèi)在品質(zhì)。但質(zhì)量從何而來?是天生的嗎?或者他們是通過智力發(fā)展出來的?就像奧古斯特·古斯特(奧古斯特·古斯托)臘腸)“任何人都會做飯,但只有無畏的人才是偉大的。”我認為這更像是愿意把自己一生的大部分時間投入到深思熟慮的實踐中。但也許吧無所畏懼是一種總結(jié)。正如古斯特所說:“不管是誰,也不是每個人都可以成為偉大的批評家?!?/p>
所以去買那本Java/Ruby/Javascript/PHP書吧;你可能會從中得到一些有用的東西。但你不會在24小時或21天內(nèi)改變你的生活,也不會改變你作為一個程序員真正的整體專業(yè)知識。在24個月內(nèi)努力工作以持續(xù)改進怎么樣?好吧,現(xiàn)在你開始有所進展了。。。
工具書類
布魯姆,本杰明(編輯)培養(yǎng)青年人才,百齡壇,1985年。
布魯克斯,弗雷德,沒有銀彈,IEEE計算機,第20卷,第4期,1987年,第10-19頁。
《語言習得的層次結(jié)構(gòu):語言習得研究》。心理學評論1899年8月345-375年
海斯,約翰·R。,完成問題解決者勞倫斯·厄爾鮑姆,1989年。
威廉·G·蔡斯和赫伯特·A·西蒙。“象棋中的知覺”認知心理學1973年4月55-81日。
拉維,珍,實踐中的認知:日常生活中的思維、數(shù)學與文化,劍橋大學出版社,1988年。
答案典型PC上各種操作的大致時間:
執(zhí)行典型指令1/1,000,000,000 sec = 1 nanosec
從一級緩存內(nèi)存提取0.5納秒
分支誤預測5納秒
從二級緩存內(nèi)存提取7毫微秒
互斥鎖/解鎖25毫微秒
從主存取出100毫微秒
通過1Gbps網(wǎng)絡發(fā)送2K字節(jié)20000毫微秒
從內(nèi)存中按順序讀取1MB納秒250000
從新磁盤位置獲?。╯eek)8000000納秒
從1MB磁盤順序讀取20000000納秒
把包裹寄到歐洲再寄回來150 milliseconds = 150,000,000 nanosec
語言選擇:附錄
有幾個人問他們應該先學什么編程語言。沒有一個答案,但請考慮以下幾點:
利用你的朋友. 當被問到“我應該使用什么操作系統(tǒng),Windows、Unix還是Mac?”,我的回答通常是:“使用你朋友使用的任何東西?!睆呐笥涯抢飳W習所獲得的好處將抵消操作系統(tǒng)之間或編程語言之間的任何內(nèi)在差異。還要考慮你未來的朋友:如果你繼續(xù)下去,你將成為程序員社區(qū)的一部分。你所選擇的語言是有一個正在成長的大社區(qū)還是一個正在消亡的小社區(qū)?有沒有書籍、網(wǎng)站和在線論壇可以得到答案?你喜歡那些論壇里的人嗎?
保持簡單. 像C和Java這樣的編程語言都是為專業(yè)開發(fā)而設計的,他們都是由大量經(jīng)驗豐富的程序員團隊設計的,他們關心的是代碼的運行時效率。因此,這些語言有一些復雜的部分是為這些環(huán)境設計的。你關心的是如何學習編程。你不需要復雜的語言,你需要的是一個新程序員設計的易于學習和記憶的語言。
玩吧你更愿意用哪種方式來學習彈鋼琴:一種正常的、互動的方式,即你一按一個鍵就聽到每一個音符,或是“批處理”模式,即只在你完成一整首歌之后才聽到音符?顯然,交互模式使學習鋼琴和編程更容易。堅持一種具有互動模式的語言并加以運用。
考慮到這些標準,我對第一種編程語言的建議是蟒蛇或方案. 另一個選擇是Javascript,這并不是因為它非常適合初學者,而是因為有很多關于它的在線教程,比如可汗學院教程。但你的情況可能會有所不同,還有其他好的選擇。如果你的年齡是個位數(shù),你可能更喜歡愛麗絲或吱吱聲或塊狀(年長的學習者可能也喜歡這些)。重要的是你選擇并開始。
附錄:書籍和其他資源
有幾個人問他們應該從哪些書籍和網(wǎng)頁上學習。我重申“光靠書本學習是不夠的”,但我可以推薦以下幾點:
方案:計算機程序的結(jié)構(gòu)和解釋(Abelson&Sussman)它無疑是計算機科學的最好的入門課程,它把編程作為理解計算機科學的一種方式。你可以看到講座在線視頻在這本書上,以及在線全文. 這本書很有挑戰(zhàn)性,它將淘汰一些也許可以用另一種方法成功的人。
方案:如何設計程序(Felleisen等等)是一本關于如何以優(yōu)雅而實用的方式設計程序的最好的書之一。
蟒蛇:Python編程:CS簡介(Zelle)是使用Python的一個很好的介紹。
蟒蛇:幾條線教程可在Python.org網(wǎng)站.
奧茲:計算機程序設計的概念、技術和模型(范羅伊和哈里迪)is seen by some as the modern-day successor to Abelson & Sussman.It is a tour through the big ideas of programming, covering a widerrange than Abelson & Sussman while being perhaps easier to read andfollow. It uses a language, Oz, that is not widely known but serves asa basis for learning other languages.<
筆記
T、 卡佩指出完成問題解決者現(xiàn)在在亞馬遜的“學習你自己的語法”這一頁上,你也可以教你自己的“21天”的書籍。我想大部分看這本書的人都是從這一頁來的。多虧了羅斯·科恩對希波克拉底的幫助。
翻譯