最近,我大量閱讀了Steve Yegge的文章。其中有一篇叫「Practicing Programming」(練習編程),寫成於2005年,讀後令我驚訝不已:程序員
與你所相信的偏偏相反,單純地天天埋頭於工做並不能算是真正意義上的鍛鍊——參加會議並不能鍛鍊你的人際交往能力;回覆郵件並不能提升你的打字水平。你必須按期留出時間,集中鍛鍊,這樣才能把事情作得更好。面試
我認識不少傑出的程序員——這是在亞馬遜工做最好的額外「福利」之一。若是仔細觀察他們,你會發現他們時時都在鍛鍊。他們已經很優秀了,但他們仍然不忘鍛鍊。他們鍛鍊的方法林林總總,而我在這篇文章中只會介紹其中的幾種。編程
據我瞭解,這些傑出程序員之因此如此成功,就是由於他們一直在鍛鍊。完美的身材要靠按期的鍛鍊才能得到,並且必須堅持鍛鍊才能保持,不然身材就會走形。對於編程和軟件工程來講,道理是同樣的。緩存
這是一個重要的區別——我天天都開車去上班,但個人駕駛水平遠遠不如專業車手;相似的狀況,每天編程可能並不足以使你成爲一名專業的程序員。那麼,什麼才能把一個普通人變成一名專業車手或者專業程序員呢?你須要鍛鍊什麼呢?編程語言
答案就在《科學美國人》的一篇名爲「The Expert Mind」(專家思惟)的文章裏:工具
愛立信提出,重要的並非經驗自己,而是「努力的學習」,也就是要不斷地挑戰自身能力以外的東西。一些狂熱的愛好者花費了大量的時間去下棋、打高爾夫球或者玩樂器,但他們可能始終停留在業餘水平上,而一個訓練有素的學生卻能夠在相對較短的時間裏超越他們,緣由就在這裏。值得注意的是,在提升水平方面,花費在下棋上的大量時間(即便參加各類比賽)彷佛仍是比不過專門的訓練來得更爲有效。訓練的主要價值在於發現弱點,並有針對性地進行提升。學習
「努力的學習」意味着,要經常去處理那些恰好在你能力極限上的問題,也就是那些對你來講有很大可能失敗的事情。若是不經歷一些失敗的話,你可能就不會成長。你必須不斷地挑戰自我,超越本身的極限。google
那樣的挑戰有時會在工做中碰到,但也未必。將鍛鍊從職業工做中分離出來,這在編程領域常被人稱爲「編碼套路」(Code Kata)。編碼
Code Kata的概念是由David Thomas提出的,他是《程序員修煉之道:從小工到專家》的做者之一。這個概念主要指的是,針對某一種特定技術或技能進行重複性的練習,從而將其熟練掌握。spa
所謂套路,就是一系列的招式。這個概念借鑑於武術。
若是你想要看一些編碼套路的例子(也就是努力學習和磨練編程技能的方法),SteveYegge的文章裏卻是提出了一些不錯的建議。他把它們稱做爲「實踐演練」:
1. 寫一份本身的簡歷。把本身全部的相關技能都羅列出來,而後把那些在100年後還用獲得的標出來。給每一個技能打分,滿分爲10分。
2. 羅列出你所景仰的程序員。儘可能包括那些與你一塊兒工做的人,由於你會在工做中從他們身上獲取一些技能。記錄下他們身上的1 ~ 2個閃光點,也就是你但願本身有所提升的方面。
3. 查看維基百科上的「計算機科學」欄目,找到「計算機領域先驅者」這個分類,從這個列表中挑選一我的,閱讀他的事蹟,而且在閱讀時打開任何你感興趣的連接。
4. 花20分鐘通讀別人的代碼。讀出色的代碼和讀糟糕的代碼都是有益的,二者都要讀,輪流切換。若是你沒法感受出它們之間的區別,能夠求助於一位你尊敬的程序員,讓他給你展現一下什麼是出色的代碼、什麼是糟糕的代碼。把你讀過的代碼給別人也看看,問問他們的見解。
5. 羅列出你最喜歡的10個編程工具——那些你以爲你用得最多、非有不行的工具。隨機挑選其中的一個工具,花一個小時去閱讀它的文檔。在這一個小時裏,努力去學習這個工具的某個你未曾意識到的新功能,或者發現某種新的使用方法。
6. 想想,除了編程以外你最擅長什麼事情?再想想,你是經過怎樣的鍛鍊才變得如此熟練和專業的?這對於你的編程工做又有什麼啓發呢?(怎麼把這些經驗應用到編程方面?)
7. 拿出一疊簡歷,並和一組面試官在同一個房間裏待上一個小時。確保每份簡歷都至少被3個面試官看過,而且要給出1 ~ 3分的評分。針對那些不一樣面試官評判截然不同的簡歷展開討論。
8. 參與一個電話面試。過後寫下你的反饋,拋出你的觀點,而後與主持電話面試的人聊一聊,看看大家是否達成了一致的結論。
9. 進行一次技術面試,而且被面試的人應該是某個你不太瞭解的領域裏的專家。讓他假定聽衆在該領域裏一無所知,所以請他從最基礎的講起。努力去理解他所說的,必要時問一些問題。
10. 有機會參與別人的技術面試。期間,你只是認真地聽、認真地學。在應聘者努力解決技術問題的同時,你也要在本身腦子裏嘗試解決這些問題。
11. 找到一個能和你交換實際問題的人,每隔一週,相互交流編程問題。花10 ~ 15分鐘來嘗試解決這些問題,再用10 ~ 15分鐘進行討論(不管可否解決)。
12. 當你聽到任何你一時之間也沒法解決的面試問題時,趕忙回到你的座位上,把這個問題用電子郵件發給本身,以留做往後的提醒。在那一週裏找出點時間,用本身最喜歡的編程語言來解決它。
我之因此喜歡Steve開出的這個清單,是由於它看上去很全面。有些程序員一想到「鍛鍊」,總認爲就是一些編碼上的難題。但在我看來,編程更在於人,而不是代碼。所以,經過解決世上全部的、而且晦澀的編程面試題目,在提升你的我的能力方面,這種方法是有侷限的。
關於「努力的學習」的諸多建議:
1. 與別的程序員交流。讀別人的代碼。這比任何書籍或培訓課程都更重要。
2. 動手寫程序!最好的學習方法就是邊作邊學。
3. 在本科或研究生的課程中學習編程課程。
4. 找一些項目來作,而且須要與其餘程序員造成團隊來合做。在項目的進行過程當中,學會辨別最出色的程序員以及最糟糕的程序員。
5. 在項目中跟隨別的程序員一塊兒工做,瞭解如何維護那些不是你寫的代碼,而且學習如何寫出利於他人維護的代碼。
6. 學習多種不一樣的編程語言,特別是那些與你如今所熟悉的語言有着不一樣的世界觀和編程模型的。
7. 瞭解硬件對軟件的影響。知道你的電腦執行一條指令須要多少時間,從內存中取出一個字(在有緩存或沒緩存的狀況下)須要多少時間,在以太網(或者因特網)上傳輸數據須要多少時間,從磁盤中讀取連續的數據或者在磁盤上跳轉到另外一個位置須要多少時間,等等。
你還能夠從Dave Thomas的21種實用的編碼套路中獲取靈感(CodeKata.com),或者你更願意加入一個你家當地的「編程武館」(CodingDojo.org)。
對於「努力的學習」,我沒法像Steve,Peter或者Dave那樣提供一個長長的建議列表。我遠不如他們有耐心。實際上,在我看來,「編程套路」只需兩個招式:
1. 寫博客。我在2004年初創辦了CodingHorror.com博客,做爲我本身努力學習的一種形式。它在一開始很不起眼,到後來成爲我職業生涯中作過的最重要的一件事。因此,你也應該寫博客。最後「聞達於天下」的人,每每就是那些可以有效書寫和溝通的人。他們的聲音最響亮,是他們在制定遊戲規則,而且引領世界的潮流。
2. 積極參與著名的開源項目。全部的高談闊論聽起來都很好,可是,你是一個大話王仍是一名實幹家呢?別光說不練,這個很是重要,由於人們會用你的行動來衡量你,而不是你的言論。努力在公衆面前留下些實實在在有用的東西吧,到時候你就能夠說,「我在那個項目中出過力。」
當你能編寫精彩的代碼、而且能用精彩的言辭向世人解釋那些代碼時,到那時候,我會以爲你已經掌握了最牛的編碼套路!