歡迎光臨
每天分享高質量文章

最牛逼的編碼套路

(點選上方公眾號,可快速關註)


英文:Jeff Atwood ,翻譯:呦呦鹿鳴(@豆巴陸其明)

blog.csdn.net/happydeer/article/details/17023229


最近,我大量閱讀了Steve Yegge的文章。其中有一篇叫“Practicing Programming”(練習程式設計),寫成於2005年,讀後令我驚訝不已:


與你所相信的恰恰相反,單純地每天埋頭於工作並不能算是真正意義上的鍛煉——參加會議並不能鍛煉你的人際交往能力;回覆郵件並不能提高你的打字水平。你必須定期留出時間,集中鍛煉,這樣才能把事情做得更好。


我認識很多傑出的程式員——這是在亞馬遜工作最好的額外“福利”之一。如果仔細觀察他們,你會發現他們時時都在鍛煉。他們已經很優秀了,但他們仍然不忘鍛煉。他們鍛煉的方法林林總總,而我在這篇文章中只會介紹其中的幾種。


據我瞭解,這些傑出程式員之所以如此成功,就是因為他們一直在鍛煉。完美的身材要靠定期的鍛煉才能獲得,而且必須堅持鍛煉才能保持,否則身材就會走形。對於程式設計和軟體工程來說,道理是一樣的。


這是一個重要的區別——我每天都開車去上班,但我的駕駛水平遠遠不如專業車手;類似的情況,天天程式設計可能並不足以使你成為一名專業的程式員。那麼,什麼才能把一個普通人變成一名專業車手或者專業程式員呢?你需要鍛煉什麼呢?


答案就在《科學美國人》的一篇名為“The Expert Mind”(專家思維)的文章裡:


愛立信提出,重要的並不是經驗本身,而是“努力的學習”,也就是要不斷地挑戰自身能力之外的東西。一些狂熱的愛好者花費了大量的時間去下棋、打高爾夫球或者玩樂器,但他們可能始終停留在業餘水平上,而一個訓練有素的學生卻可以在相對較短的時間裡超越他們,原因就在這裡。值得註意的是,在提高水平方面,花費在下棋上的大量時間(即使參加各種比賽)似乎還是比不過專門的訓練來得更為有效。訓練的主要價值在於發現弱點,並有針對性地進行提高。


“努力的學習”意味著,要常常去處理那些剛好在你能力極限上的問題,也就是那些對你來說有很大可能失敗的事情。如果不經歷一些失敗的話,你可能就不會成長。你必須不斷地挑戰自我,超越自己的極限。


那樣的挑戰有時會在工作中碰到,但也未必。將鍛煉從職業工作中分離出來,這在程式設計領域常被人稱為“編碼套路”(Code Kata)。


Code Kata的概念是由David Thomas提出的,他是《程式員修煉之道:從小工到專家》的作者之一。這個概念主要指的是,針對某一種特定技術或技能進行重覆性的練習,從而將其熟練掌握。——譯者註




所謂套路,就是一系列的招式。這個概念借鑒於武術。


如果你想要看一些編碼套路的例子(也就是努力學習和磨練程式設計技能的方法),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開出的這個清單,是因為它看上去很全面。有些程式員一想到“鍛煉”,總認為就是一些編碼上的難題。但在我看來,程式設計更在於人,而不是程式碼。因此,透過解決世上所有的、並且晦澀的程式設計面試題目,在提高你的個人能力方面,這種方法是有侷限的。


關於“努力的學習”,我也很喜歡Peter Norvig在《Teach Yourself Programming in TenYears | 花10年時間自學程式設計》一文中提出的諸多建議:(給主頁君傳送  自學,可檢視全文)


1. 與別的程式員交流。讀別人的程式碼。這比任何書籍或培訓課程都更重要。


2. 動手寫程式!最好的學習方法就是邊做邊學。


3. 在本科或研究生的課程中學習程式設計課程。


4. 找一些專案來做,並且需要與其他程式員形成團隊來合作。在專案的進行過程中,學會辨別最出色的程式員以及最糟糕的程式員。


5. 在專案中跟隨別的程式員一起工作,瞭解如何維護那些不是你寫的程式碼,並且學習如何寫出利於他人維護的程式碼。


6. 學習多種不同的程式語言,特別是那些與你現在所熟悉的語言有著不同的世界觀和程式設計模型的。


7. 瞭解硬體對軟體的影響。知道你的電腦執行一條指令需要多少時間,從記憶體中取出一個字(在有快取或沒快取的情況下)需要多少時間,在乙太網(或者因特網)上傳輸資料需要多少時間,從磁碟中讀取連續的資料或者在磁碟上跳轉到另一個位置需要多少時間,等等。


你還可以從Dave Thomas的21種實用的編碼套路中獲取靈感(CodeKata.com),或者你更願意加入一個你家當地的“程式設計武館”(CodingDojo.org)。


對於“努力的學習”,我無法像Steve,Peter或者Dave那樣提供一個長長的建議串列。我遠不如他們有耐心。實際上,在我看來,“程式設計套路”只需兩個招式:


1. 寫部落格。我在2004年初創辦了CodingHorror.com部落格,作為我自己努力學習的一種形式。它在一開始很不起眼,到後來成為我職業生涯中做過的最重要的一件事。所以,你也應該寫部落格。最後“聞達於天下”的人,往往就是那些能夠有效書寫和溝通的人。他們的聲音最響亮,是他們在制定遊戲規則,並且引領世界的潮流。


2. 積極參與著名的開源專案。所有的高談闊論聽起來都很好,但是,你是一個大話王還是一名實幹家呢?別光說不練,這個非常重要,因為人們會用你的行動來衡量你,而不是你的言論。努力在公眾面前留下些實實在在有用的東西吧,到時候你就可以說,“我在那個專案中出過力。”


當你能編寫精彩的程式碼、並且能用精彩的言辭向世人解釋那些程式碼時,到那時候,我會覺得你已經掌握了最牛的編碼套路!

看完本文有收穫?請轉發分享給更多人

關註「資料分析與開發」,提升資料技能

贊(0)

分享創造快樂