通過艱難的六步讓你成長為一名出色的程式設計師

鵠思亂想發表於2011-10-24

以下是我參加 Translate Geeks to Chinese 翻譯活動 對第11篇的譯文。這是我幾個星期前就譯過了的,真是巧。希望大家給點意見。

原文標題:Become a Good Programmer in Six Really Hard Steps 原文連結

在GDNet論壇裡,其中一類比較常見到的是像這樣的一些主題:“你好,我剛 [ 買了臺電腦 | 寫了一個簡單的遊戲 | 找到了一個遊戲引擎 ] ,我想知道從這起步的話,可以走到哪?如果說我想要最終能實現某個特定目標的話,我需要學習什麼東西呢?”

首先,你必須明白,Peter Norvig 很久以前就已經非常清楚的知道: 成為一名程式設計師要花費10年時間。現在市面上充斥大量的"短時間內學會X" 型別的書; 還有一大堆部落格教你 "如何通過一些簡單的方法提高程式設計水平"; 總的來說,很多人總是在尋找一些能夠讓他們通過最少的努力來成為專家的方法。

我在這裡想把標準調高一點。與其告訴你5種容易的方法來在21天內寫出令人驚豔的程式碼, 我將要告訴你的是事實是怎麼樣的。請看如何通過艱難的六步讓你成長為一名出色的程式設計師。

第一步:堅持。沉下心,深吸一口氣。如果做不到就一邊去觀鳥算了。

當然, 你可以反覆折騰,寫一些小巧的Shell指令碼或者幾個小遊戲。到這裡,如果你已經滿足於你已經擁有的技能,那麼只管通過最快和最容易的方法去解決你遇到的問題就可以了。 我不想忽視這個選擇的合理性,有些人沒有時間(或者甚至沒有意願)成為一個程式設計高手。如果你並不為你將訓練你的手藝上十年直至你精通它為止的想法而津津樂道的話,那就別那麼幹。但是不要被迷惑了,你將一直只能被侷限在你以前能做什麼和能把什麼做好。如果你幾經權衡,認為那已經足夠。好,那麼你就沒有必要繼續閱讀下去了。

對於繼續閱讀下來的我們,其實還是有這麼一些東西吸引我們,讓我們真真正正精通程式設計技巧。我們想成為專家,忍者,領袖級人物 - 任何超高階的衝擊你幻想的名詞。對於我們來說,10年看上去是合理的投資。可能看上去有那麼點沉重,但如果這本身就是值得你去做的事情,就值得你做對,不是嗎?

所以,要想成為出色的程式設計師的第一步,就是吞下苦水。接受現實,這不是十年的過程,而是一輩子的過程。 像Norvig說的那樣,這樣做只是因為你想去做。如果不是自己願意去做的話,沒有人會在那方面變得異常出色。世界紀錄保持者不會因為那天他恰巧吃下最多的熱狗被紀錄下來,而一定是因為那天他也確實是感到餓的。

第二步:不斷寫程式碼

並不是說一定說寫出來的,都要是很優秀的程式碼。而且,在很長的一段時間裡,它也不會是很優秀的程式碼。只管寫,能實現功能就好了。任何情況下,如果發覺你每天用電腦都會遇到同一個煩人的問題,想想你是不是可以寫個程式來處理它。任何時候,如果你發現什麼有趣的東西你想嘗試一下,那麼你就去做。儘可能多得去體驗新的概念,工具和語言。

學習的過程永遠也不會停止,所以,如果在一段時間裡,你秉持通過不斷的解決問題的同時來學習和進步的態度來前進的話,你將可以走的很遠。要認識到,如果在一天、一星期、一個月內如果沒有學到有趣的東西,其實是一種失敗。每天,其實都有足夠多的事情讓你能從中學習到一點有益的東西。當然這從15年左右作為一個標記來看的話會很難,但也是完全可能的。沒有一個凡人可以完全吸收這世界上關於程式設計的所有知識,所以,如果你感覺到你沒什麼東西要學習了,開始一個新的專案,寫更多的程式碼。

當你這樣做的時候,請留心。尋找一些模式 - 一些你經常做的,可能可以變成自動處理的東西,或者說一些你經常寫的,可以被分出來放在共享包裡的程式碼。尋找那些非常容易處理特定任務的語言,同時也找出那些處理同樣任務,卻不太容易的語言,並想想為什麼他們有什麼不同。

但最重要的是:不斷寫程式碼。每天,即使那只是一個簡單的正規表示式來搜查你的郵件歷史或別的什麼。儘可能經常的用程式設計的手法來處理事情。記住,如果什麼時候你覺得你做的事情不再顯得有趣,那麼,去做別的事。做一些你本身並不享受的事情沒有一點意義。

第三步: 讀更多的程式碼

一旦你已經積累下一點專案程式碼後,你可以嘗試去閱讀別人的程式碼。一開始,可能有點困難。因為他們並不是你看過,或者熟悉的風格,或者用你學習過的語言去做一些事情。如果你認為那很有趣,嘗試閱讀完它全部的程式碼。別因為要深入分析任何專案而恐懼,至少別在一開始的時候。其實它可以像你做全職工作,去理解那些龐大的專案的程式碼庫一樣。選擇一兩件你認為你可以學會怎麼去做的事,並掌握它們是如何實現的。

閱讀新的程式碼為你展示出新的思維方式,並幫助你延展思維極限。延展對保持進步異常重要,而且也確保你能不斷發現新的事物來學習。

一定要和別的程式設計師交流。問他們為什麼和怎麼做到某些事。問他們如果可以重新來過的話,是否會用不同的方式來做。問他們對你的程式碼有沒有任何建議。(請要有禮貌。很多出色的程式設計師都極度繁忙,並不都有這樣的時間和意願來免費為別人的工作疏通整理和提出意見。 尊敬可以把你引領得更遠。這個世界很小,聲望很重要。)

第四步: 學多門語言,掌握幾門.

你不會有足夠多的時間同時掌握多門語言,除非你非常幸運。因此,淺度學習儘量多的語言 - 瞭解怎麼讓它們執行起來,為什麼它們擅長於特定某些工作,它們的缺點是什麼。延展在這裡很重要。不要死守於命令式語言,像C,或面嚮物件語言,像Java,或別的。同時也要擴充套件到函式式語言,或宣告式語言。

學習一種Lisp方言。原因在這 它不會對你的日常程式設計有什麼直接影響,因為你不需要使用它。但是它會讓你擁有更好的思維方式,並讓你深入瞭解簡單的遞迴系統的優美之處。堅持到你發出“啊哈”那一瞬間。因為在那以前,它看起來都會是古怪的語法和風格攪和在一起了。但一旦你看破以後,它將一直保留在你的職業生涯內其中之一由種人類設計出來的最重要的優美的理念。

然後學習一種純函式式語言。我推薦Haskell, 因為它強迫你去純粹使用函式到別的函式式語言都無法相比的程度 (包括大部分Lisp方言) 。你必須要把你的思維扭曲到一定程度,但是一但又到了那個“啊哈”的瞬間(從我的經驗來看,大概在瞭解到使用monads的原因所在的時候),你會再一次把你的思維和設計出優美的系統的能力再推進一步。

最後,學習一種宣告式語言。SQL也算,雖然單單學習SQL好像弱了點。Prolog是多數人會推薦的語言,但不是太可能會接觸到。實踐領域上看,XAML, XSLT和XQuery是好的學習工具, 並且它會讓你瞭解到宣告式語言背後的概念。(簡單來說, 你告訴電腦你想做什麼,然後它自己想辦法做出來。這完全是和指令式程式設計反過來的,因為指令式程式設計是你告訴電腦怎麼做然後希望它做到你想要的做的事情。而函式式語言是你要去描述資料和型別的轉換。)

況且,在你學習Lisp方言後去學習XML工具會讓你非常明顯得感覺到為什麼XML想重新發明s-expressions是多麼的難,並且它現在是做得那麼的差勁。

第五步: 創造一門語言.

它不需要有多複雜,或包含多豐富的特性,或多抽象,或甚至有多優雅。它甚至不需要是原創的。我經常建議寫一個Lisp直譯器(為一種Lisp方言來做這件事是值得獎勵的)來作為一種好的學習語言基礎的方式。重要的是,這樣你可以得到計算機語言設計的基本感覺:詞法,解析,編譯,解釋,虛擬機器,和無數的語言設計基本理念,以至於它是如何影響到它在處理不同任務時是否更有效率。

這樣做會讓你有以下三種收穫:

你會更深入的理解到你的工具是如何工作的,那麼你在使用它們的時候會更有效率。 你會慢慢看到那些吸引你的或讓你覺得很不舒服的主流語言和工具的設計理念。這樣,你在今後開始新專案的時候,就能更有效的選擇你的工具。 你將可以留意到那些可供開發的新語言和工具的處女地,為你開啟前所未有的視野去學習和嘗試新的東西。

第六步: 學習一些沒有別的人學習過的東西

這是最難也是最後一步。到目前為止,你已經習得那些已知的東西,那些能從別的人程式碼,或書,或學術文章獲得的東西。那些東西值得學習,但並不是標新立異的東西。

現在是時候打破僵界,真正上升到大師級別的時候的。現在是時候在沒有別的人冒險進入過的領域開創一條血路的時候了。

別誤會。這並不會是你真正擁有10年經驗前你會嘗試去做的事情。因為只有你真的走到那裡,你才有可能創造出新的東西,而不是在重新發明輪子。但是,一但你精通了某一領域,其實並不是那麼難去發掘出計算機的未知領域。

這很有可能還要再花你另外10年時間,如果不是永遠的話。別放棄。記住,這應該對你來說還是非常有趣的事情。如果在任何時候,你發現你已經不在熱愛你手上做的事情,去做別的事。生命太短暫了,你不應該浪費任何時間去做任何你不再想做的事情。

並不是所有的人都能成功走完這一步,但任何曾經嘗試過的人都會受益非淺。不要讓任何事情擊敗你。即便你沒能獲得圖靈獎,你也應當在你的程式設計師生涯不斷前行,向著你的終極領域進發。而這一切,都需要靠著你不斷挑戰難題,延展你的大腦。

恭喜! 你已經成為一名出色的程式設計師了! 等等... 事實上,你可能已經因為年紀太大而離去了。對不起,下輩子再來一遍吧,可能會好運點!

哈哈,玩笑話。話說回來,別認為會有結束的那天。在你在成長旅途中一但開始停滯不前,你實際已經開始死亡,而變得無關了。我在程式設計世界裡見過的最讓人覺得悲傷的失敗是那些選擇在這領域開始並前行一段後,決定放棄,不再學習了。作為一個人,他們現在肯定完全已經對軟體世界來說是毫無相干的了,也幾乎可以說他們再也走不出他們目前的處境,除非,他們再繼續學習前進。

現在就開始前進吧,寫程式碼! 可能某一天你就會成為一名出色的程式設計師,然後告訴我你是怎麼做的。

我非常熱愛學習。

本文參加 Translate Geeks to Chinese 翻譯活動

相關文章