如何突破編碼瓶頸

||轉(zhuǎn)自:呦呦鹿鳴
最近崎场,我大量閱讀了Steve Yegge的文章。其中有一篇叫“Practicing Programming”(練習(xí)編程),寫成于2005年,讀后令我驚訝不已:

與你所相信的恰恰相反勘究,單純地每天埋頭于工作并不能算是真正意義上的鍛煉——參加會(huì)議并不能鍛煉你的人際交往能力龟劲;回復(fù)郵件并不能提高你的打字水平地梨。你必須定期留出時(shí)間溶其,集中鍛煉祟昭,這樣才能把事情做得更好所坯。

我認(rèn)識(shí)很多杰出的程序員——這是在亞馬遜工作最好的額外“福利”之一频敛。如果仔細(xì)觀察他們堰乔,你會(huì)發(fā)現(xiàn)他們時(shí)時(shí)都在鍛煉仓犬。他們已經(jīng)很優(yōu)秀了秀撇,但他們?nèi)匀徊煌憻挸住K麄冨憻挼姆椒至挚偪偅以谶@篇文章中只會(huì)介紹其中的幾種呵燕。

據(jù)我了解棠绘,這些杰出程序員之所以如此成功,就是因?yàn)樗麄円恢痹阱憻捲倥ぁM昝赖纳聿囊慷ㄆ诘腻憻挷拍塬@得氧苍,而且必須堅(jiān)持鍛煉才能保持,否則身材就會(huì)走形泛范。對(duì)于編程和軟件工程來說让虐,道理是一樣的。

這是一個(gè)重要的區(qū)別——我每天都開車去上班罢荡,但我的駕駛水平遠(yuǎn)遠(yuǎn)不如專業(yè)車手赡突;類似的情況,天天編程可能并不足以使你成為一名專業(yè)的程序員柠傍。那么麸俘,什么才能把一個(gè)普通人變成一名專業(yè)車手或者專業(yè)程序員呢?你需要鍛煉什么呢惧笛?

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

愛立信提出从媚,重要的并不是經(jīng)驗(yàn)本身,而是“努力的學(xué)習(xí)”患整,也就是要不斷地挑戰(zhàn)自身能力之外的東西拜效。一些狂熱的愛好者花費(fèi)了大量的時(shí)間去下棋、打高爾夫球或者玩樂器各谚,但他們可能始終停留在業(yè)余水平上紧憾,而一個(gè)訓(xùn)練有素的學(xué)生卻可以在相對(duì)較短的時(shí)間里超越他們,原因就在這里昌渤。值得注意的是赴穗,在提高水平方面,花費(fèi)在下棋上的大量時(shí)間(即使參加各種比賽)似乎還是比不過專門的訓(xùn)練來得更為有效。訓(xùn)練的主要價(jià)值在于發(fā)現(xiàn)弱點(diǎn)般眉,并有針對(duì)性地進(jìn)行提高了赵。

“努力的學(xué)習(xí)”意味著,要常常去處理那些剛好在你能力極限上的問題甸赃,也就是那些對(duì)你來說有很大可能失敗的事情柿汛。如果不經(jīng)歷一些失敗的話,你可能就不會(huì)成長(zhǎng)埠对。你必須不斷地挑戰(zhàn)自我络断,超越自己的極限。

那樣的挑戰(zhàn)有時(shí)會(huì)在工作中碰到项玛,但也未必貌笨。將鍛煉從職業(yè)工作中分離出來,這在編程領(lǐng)域常被人稱為“編碼套路”(Code Kata)稍计。

Code Kata的概念是由David Thomas提出的躁绸,他是《程序員修煉之道:從小工到專家》的作者之一。這個(gè)概念主要指的是臣嚣,針對(duì)某一種特定技術(shù)或技能進(jìn)行重復(fù)性的練習(xí)净刮,從而將其熟練掌握」柙颍——譯者注

所謂套路淹父,就是一系列的招式。這個(gè)概念借鑒于武術(shù)怎虫。

如果你想要看一些編碼套路的例子(也就是努力學(xué)習(xí)和磨練編程技能的方法)暑认,SteveYegge的文章里倒是提出了一些不錯(cuò)的建議。他把它們稱作為“實(shí)踐演練”:

1.寫一份自己的簡(jiǎn)歷大审。把自己所有的相關(guān)技能都羅列出來蘸际,然后把那些在100年后還用得到的標(biāo)出來。給每個(gè)技能打分徒扶,滿分為10分粮彤。

2.羅列出你所景仰的程序員。盡量包括那些與你一起工作的人姜骡,因?yàn)槟銜?huì)在工作中從他們身上獲取一些技能导坟。記錄下他們身上的1 ~ 2個(gè)閃光點(diǎn),也就是你希望自己有所提高的方面圈澈。

3.查看維基百科上的“計(jì)算機(jī)科學(xué)”欄目惫周,找到“計(jì)算機(jī)領(lǐng)域先驅(qū)者”這個(gè)分類,從這個(gè)列表中挑選一個(gè)人康栈,閱讀他的事跡递递,并且在閱讀時(shí)打開任何你感興趣的鏈接喷橙。

4.花20分鐘通讀別人的代碼。讀出色的代碼和讀糟糕的代碼都是有益的漾狼,兩者都要讀重慢,輪流切換饥臂。如果你無法感覺出它們之間的區(qū)別逊躁,可以求助于一位你尊敬的程序員,讓他給你展示一下什么是出色的代碼隅熙、什么是糟糕的代碼稽煤。把你讀過的代碼給別人也看看,問問他們的看法囚戚。

5.羅列出你最喜歡的10個(gè)編程工具——那些你覺得你用得最多酵熙、非有不行的工具。隨機(jī)挑選其中的一個(gè)工具驰坊,花一個(gè)小時(shí)去閱讀它的文檔匾二。在這一個(gè)小時(shí)里,努力去學(xué)習(xí)這個(gè)工具的某個(gè)你不曾意識(shí)到的新功能拳芙,或者發(fā)現(xiàn)某種新的使用方法察藐。

6.想一想,除了編程之外你最擅長(zhǎng)什么事情舟扎?再想一想分飞,你是通過怎樣的鍛煉才變得如此熟練和專業(yè)的?這對(duì)于你的編程工作又有什么啟發(fā)呢睹限?(怎么把這些經(jīng)驗(yàn)應(yīng)用到編程方面譬猫?)

7.拿出一疊簡(jiǎn)歷,并和一組面試官在同一個(gè)房間里待上一個(gè)小時(shí)羡疗。確保每份簡(jiǎn)歷都至少被3個(gè)面試官看過染服,并且要給出1 ~ 3分的評(píng)分。針對(duì)那些不同面試官評(píng)判大相徑庭的簡(jiǎn)歷展開討論叨恨。

8.參與一個(gè)電話面試柳刮。事后寫下你的反饋,拋出你的觀點(diǎn)特碳,然后與主持電話面試的人聊一聊诚亚,看看你們是否達(dá)成了一致的結(jié)論。

9.進(jìn)行一次技術(shù)面試午乓,并且被面試的人應(yīng)該是某個(gè)你不太了解的領(lǐng)域里的專家站宗。讓他假定聽眾在該領(lǐng)域里一無所知,因此請(qǐng)他從最基礎(chǔ)的講起益愈。努力去理解他所說的梢灭,必要時(shí)問一些問題夷家。

10.有機(jī)會(huì)參與別人的技術(shù)面試。期間敏释,你只是認(rèn)真地聽库快、認(rèn)真地學(xué)。在應(yīng)聘者努力解決技術(shù)問題的同時(shí)钥顽,你也要在自己腦子里嘗試解決這些問題义屏。

11.找到一個(gè)能和你交換實(shí)際問題的人,每隔一周蜂大,相互交流編程問題闽铐。花10 ~ 15分鐘來嘗試解決這些問題奶浦,再用10 ~ 15分鐘進(jìn)行討論(無論能否解決)兄墅。

12.當(dāng)你聽到任何你一時(shí)之間也無法解決的面試問題時(shí),趕緊回到你的座位上澳叉,把這個(gè)問題用電子郵件發(fā)給自己隙咸,以留作日后的提醒。在那一周里找出點(diǎn)時(shí)間成洗,用自己最喜歡的編程語(yǔ)言來解決它五督。

我之所以喜歡Steve開出的這個(gè)清單,是因?yàn)樗瓷先ズ苋婷谇埂S行┏绦騿T一想到“鍛煉”概荷,總認(rèn)為就是一些編碼上的難題。但在我看來碌燕,編程更在于人误证,而不是代碼。因此修壕,通過解決世上所有的愈捅、并且晦澀的編程面試題目,在提高你的個(gè)人能力方面慈鸠,這種方法是有局限的蓝谨。

關(guān)于“努力的學(xué)習(xí)”,我也很喜歡Peter Norvig在“Teach Yourself Programming in TenYears”(花10年時(shí)間自學(xué)編程)一文中提出的諸多建議:

1.與別的程序員交流青团。讀別人的代碼譬巫。這比任何書籍或培訓(xùn)課程都更重要。

2.動(dòng)手寫程序督笆!最好的學(xué)習(xí)方法就是邊做邊學(xué)芦昔。

3.在本科或研究生的課程中學(xué)習(xí)編程課程。

4.找一些項(xiàng)目來做娃肿,并且需要與其他程序員形成團(tuán)隊(duì)來合作咕缎。在項(xiàng)目的進(jìn)行過程中珠十,學(xué)會(huì)辨別最出色的程序員以及最糟糕的程序員。

5.在項(xiàng)目中跟隨別的程序員一起工作凭豪,了解如何維護(hù)那些不是你寫的代碼焙蹭,并且學(xué)習(xí)如何寫出利于他人維護(hù)的代碼。

6.學(xué)習(xí)多種不同的編程語(yǔ)言嫂伞,特別是那些與你現(xiàn)在所熟悉的語(yǔ)言有著不同的世界觀和編程模型的孔厉。

7.了解硬件對(duì)軟件的影響。知道你的電腦執(zhí)行一條指令需要多少時(shí)間末早,從內(nèi)存中取出一個(gè)字(在有緩存或沒緩存的情況下)需要多少時(shí)間烟馅,在以太網(wǎng)(或者因特網(wǎng))上傳輸數(shù)據(jù)需要多少時(shí)間,從磁盤中讀取連續(xù)的數(shù)據(jù)或者在磁盤上跳轉(zhuǎn)到另一個(gè)位置需要多少時(shí)間然磷,等等。

你還可以從Dave Thomas的21種實(shí)用的編碼套路中獲取靈感(CodeKata.com)刊驴,或者你更愿意加入一個(gè)你家當(dāng)?shù)氐摹熬幊涛漯^”(CodingDojo.org)姿搜。

對(duì)于“努力的學(xué)習(xí)”,我無法像Steve捆憎,Peter或者Dave那樣提供一個(gè)長(zhǎng)長(zhǎng)的建議列表舅柜。我遠(yuǎn)不如他們有耐心。實(shí)際上躲惰,在我看來致份,“編程套路”只需兩個(gè)招式:

1.寫博客。我在2004年初創(chuàng)辦了CodingHorror.com博客础拨,作為我自己努力學(xué)習(xí)的一種形式氮块。它在一開始很不起眼,到后來成為我職業(yè)生涯中做過的最重要的一件事诡宗。所以滔蝉,你也應(yīng)該寫博客。最后“聞達(dá)于天下”的人塔沃,往往就是那些能夠有效書寫和溝通的人蝠引。他們的聲音最響亮,是他們?cè)谥贫ㄓ螒蛞?guī)則蛀柴,并且引領(lǐng)世界的潮流螃概。

2.積極參與著名的開源項(xiàng)目。所有的高談闊論聽起來都很好鸽疾,但是吊洼,你是一個(gè)大話王還是一名實(shí)干家呢?別光說不練肮韧,這個(gè)非常重要融蹂,因?yàn)槿藗儠?huì)用你的行動(dòng)來衡量你旺订,而不是你的言論。努力在公眾面前留下些實(shí)實(shí)在在有用的東西吧超燃,到時(shí)候你就可以說区拳,“我在那個(gè)項(xiàng)目中出過力∫馀遥”

當(dāng)你能編寫精彩的代碼樱调、并且能用精彩的言辭向世人解釋那些代碼時(shí),到那時(shí)候届良,我會(huì)覺得你已經(jīng)掌握了最牛的編碼套路笆凌!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市士葫,隨后出現(xiàn)的幾起案子乞而,更是在濱河造成了極大的恐慌,老刑警劉巖慢显,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爪模,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荚藻,警方通過查閱死者的電腦和手機(jī)屋灌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來应狱,“玉大人共郭,你說我怎么就攤上這事〖采耄” “怎么了除嘹?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)罐韩。 經(jīng)常有香客問我憾赁,道長(zhǎng),這世上最難降的妖魔是什么散吵? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任龙考,我火速辦了婚禮,結(jié)果婚禮上矾睦,老公的妹妹穿的比我還像新娘晦款。我一直安慰自己,他們只是感情好枚冗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布缓溅。 她就那樣靜靜地躺著,像睡著了一般赁温。 火紅的嫁衣襯著肌膚如雪坛怪。 梳的紋絲不亂的頭發(fā)上淤齐,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音袜匿,去河邊找鬼更啄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛居灯,可吹牛的內(nèi)容都是我干的祭务。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怪嫌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼义锥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岩灭,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拌倍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后川背,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贰拿,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年熄云,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妙真。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缴允,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出珍德,到底是詐尸還是另有隱情练般,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布锈候,位于F島的核電站薄料,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏泵琳。R本人自食惡果不足惜摄职,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望获列。 院中可真熱鬧谷市,春花似錦、人聲如沸击孩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巩梢。三九已至创泄,卻和暖如春艺玲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞠抑。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工饭聚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碍拆。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓若治,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親感混。 傳聞我的和親對(duì)象是個(gè)殘疾皇子端幼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評(píng)論 25 707
  • 本文把程序員所需掌握的關(guān)鍵知識(shí)總結(jié)為三大類19個(gè)關(guān)鍵概念,然后給出了掌握每個(gè)關(guān)鍵概念所需的入門書籍弧满,必讀書籍婆跑,以及...
    dle_oxio閱讀 11,119評(píng)論 6 244
  • 我猜大家一定有這樣的經(jīng)歷滑进,就是同學(xué)大聚會(huì)時(shí),你突然發(fā)現(xiàn)某某居然是自己的高中同學(xué)募谎,怎么就一點(diǎn)想不起來呢扶关?搞不好我們自...
    復(fù)古劉海閱讀 192評(píng)論 10 0
  • 因?yàn)橐ù笈铮屹?gòu)買了大量的鋼管和建材堆放在遠(yuǎn)離村子的農(nóng)田里数冬,為防被盜夜里必須住下看守节槐。時(shí)值夏季天氣炎熱,一輪明月...
    敕勒川云海峰閱讀 2,614評(píng)論 0 2
  • ELK + Redis Window7Oracle JDK8Redis: Redis-x64-3.2.100 fo...
    Jeff閱讀 1,475評(píng)論 0 1