以下文章全文:
正如每個(gè)人都知道的那樣,寫更多的代碼是提高編程能力最顯著方法擅腰。但是我所確信的另外一種可以提高編程能力的方法是與寫代碼完全相反的徙鱼。我將要盡可能清楚的陳述這種方法恶迈。
只有大量的閱讀別人的代碼才能顯著的提高你自己的編程能力啰劲。
不論你是否相信,但是我覺得你可以試一下筋现,你會(huì)覺得自己所花的時(shí)間是完全值得的庭瑰。
在這篇文章里我將會(huì)教你如何選擇閱讀的內(nèi)容以及教會(huì)你如何閱讀局装。如果你已經(jīng)知道如何閱讀代碼藕施,或許你已經(jīng)發(fā)現(xiàn)通過你的努力可以獲取更多。如果你還不知道如何很好的閱讀代碼藻茂,那么請(qǐng)一定繼續(xù)往下看驹暑。
讀什么
我們很難決定閱讀什么樣的代碼,也很難給別人建議辨赐。我不會(huì)簡(jiǎn)單的給你指出你應(yīng)該讀什么樣的代碼优俘,因?yàn)樗罱K還是取決于你喜歡讀什么。我會(huì)給你提供一些參考掀序,使得你能夠有所側(cè)重的去選擇閱讀什么代碼帆焕。
這些都是極其錯(cuò)可以作為候選的地方。如果你已經(jīng)對(duì)其公開的APIs十分的熟悉森枪,那么理解其內(nèi)在的工作原理已經(jīng)不再是一件困難的事情视搏。另外,作為一個(gè)代碼的使用者县袱,你有機(jī)會(huì)為其添加文件浑娜,實(shí)現(xiàn)一個(gè)新的功能,或者對(duì)原來的項(xiàng)目提出修改的建議式散。
閱讀那些能夠讓你眼前一亮的代碼
我還記得第一次看280 Slides的時(shí)候就心想這些代碼讓我眼前一亮筋遭。隨后我迅速發(fā)現(xiàn)這個(gè)網(wǎng)站的源代碼是Cappuccino的開源項(xiàng)目。當(dāng)這一信息在我的大腦深處徘徊的時(shí)候我猛然想起另外一個(gè)讓我印象深刻的軟件也是運(yùn)行在Cappuccino上的暴拄,這時(shí)候我知道了有一個(gè)我可以學(xué)習(xí)到很多東西的項(xiàng)目了漓滔。有什么是讓你最近印象深刻的?它是一個(gè)開源項(xiàng)目嗎乖篷?如果是的話响驴,那么它將會(huì)是一個(gè)值得你去讀的代碼,因?yàn)檫@些代碼會(huì)像最終的應(yīng)用一樣吸引你撕蔼。
讀那些你認(rèn)為是大牛所寫的代碼
如果你已經(jīng)用開源項(xiàng)目的軟件編程了一段時(shí)間豁鲤,
那么肯定有發(fā)現(xiàn)其他能夠讓你印象深刻的程序員。
我的腦海中有那么幾個(gè)能夠?qū)懗鲎屛沂至w慕的代碼的程序員鲸沮。
如果你的印象里還沒有這樣的開發(fā)者琳骡,只要你愿意的話是很容易找到一個(gè)的。他/她或許在過去已經(jīng)寫了屬于以下2個(gè)類型中的代碼讼溺。(一種是你所依賴的楣号,另一種是令你印象深刻的)
讀那些你可以意會(huì)的代碼
如果你勇于冒險(xiǎn)的話,那么有可能會(huì)考慮深入研究類似Ruby on Rails, Drupal, 或者 jQuery的大項(xiàng)目怒坯。我建議你現(xiàn)在最好不要接觸類似的項(xiàng)目炫狱,除非你在閱讀代碼方面已經(jīng)很有經(jīng)驗(yàn)了。
大的項(xiàng)目有很多可以移動(dòng)的模塊剔猿,你可能會(huì)糾結(jié)于很多概念而無法及時(shí)學(xué)到很多知識(shí)毕荐。疑惑會(huì)令人泄氣,在閱讀大的項(xiàng)目的過程中更加容易產(chǎn)生疑惑和泄氣的負(fù)面情緒艳馒。從一個(gè)小的項(xiàng)目入手的好處在于整個(gè)程序的完整邏輯可以在腦海中浮現(xiàn)憎亚。剩下的就是去探索其細(xì)節(jié)并從中學(xué)習(xí)。
如何閱讀代碼
既然你已經(jīng)選擇了一些要讀的代碼弄慰,那么什么是最好的閱讀方式呢第美?我在過去閱讀了許多的代碼,因此可以給你推薦一些可以最大化投資回報(bào)率的方法陆爽。
假設(shè)你已經(jīng)在閱讀代碼方面達(dá)到了一個(gè)突出的水平了什往。如果沒有,那么建議你去查看項(xiàng)目的網(wǎng)站慌闭、使用說明書别威、文件或是任何除了代碼外幫助你理解的內(nèi)容躯舔。
那么,我首先建議的是使自己的腦海里有這個(gè)項(xiàng)目清晰的框架省古。其工作量是基于你所選取的代碼庫的大小粥庄。但是只要是大于一個(gè)文件的項(xiàng)目都會(huì)消耗一定的時(shí)間。
首先對(duì)文件的結(jié)構(gòu)加以注釋豺妓。如果一個(gè)編者的文件具有像TextMate一樣的可視化視圖結(jié)構(gòu)將會(huì)極大的幫助這一步驟的完成惜互。譬如這里有一個(gè)Twitter Ruby gem的完美概要。
這一步驟的目標(biāo)是為了讓你更加的熟悉代碼琳拭。找出那些文件包含/需要/加載其他的文件训堆,以及代碼主題的位置,是否用過命名空間白嘁,或是其他諸如此類的東西坑鱼。如果你已經(jīng)了解了大的架構(gòu),那么你就可以深入去關(guān)注其細(xì)節(jié)了絮缅。
記錄下你所發(fā)現(xiàn)的東西
閱讀代碼應(yīng)該是一個(gè)主動(dòng)的行為姑躲。我鼓勵(lì)你根據(jù)自己的想法增加一些評(píng)論,當(dāng)你理解程序的流程的時(shí)候記錄下你的假設(shè)以及自己的結(jié)論盟蚣。那么剛開始的時(shí)候你的評(píng)論可能是這樣的:
當(dāng)你的理解不斷的進(jìn)步的時(shí)候你會(huì)減少那些碎片化的評(píng)論并且能夠增加一些更加有意義或權(quán)威的評(píng)論黍析,這些評(píng)論或許能夠?qū)ν晟圃瓉淼捻?xiàng)目有所幫助。
使用測(cè)試屎开,Luke
但愿你選擇的項(xiàng)目有測(cè)試的套件阐枣,如果沒有的話你可以完全跳過這一部分(或者重新選擇一個(gè)有的項(xiàng)目)。
測(cè)試是一個(gè)很好的地方能夠讓你隨時(shí)閱讀別人的代碼因?yàn)樗鼈冇涗浟诉@些代碼需要實(shí)現(xiàn)的功能奄抽。一些測(cè)試能夠提供很多的信息蔼两,但是不論寫的有多好,你在測(cè)試?yán)锟梢员仍趫?zhí)行里更好的發(fā)現(xiàn)作者的意圖逞度。在你閱讀代碼的時(shí)候盡量讓其測(cè)試的套件成功運(yùn)行额划。這會(huì)讓你的開發(fā)環(huán)境得到合理的配置,也會(huì)讓你更加自信的去做出一些改變档泽。
執(zhí)行俊戳,調(diào)整,再執(zhí)行
誰說看代碼的時(shí)候就不能執(zhí)行代碼馆匿?只有將一切東西拆解再將其恢復(fù)原樣才能真正的理解其本質(zhì)抑胎。還記得那些你所經(jīng)歷的測(cè)試嗎?在失敗后渐北,增加一些代碼阿逃,或者在不破壞的前提下改變其執(zhí)行的情況。嘗試增加一些你覺得很酷的小屬性,或者在項(xiàng)目范圍內(nèi)增加一些記錄恃锉,這樣你就可以在編寫代碼的不同階段打印輸出搀菩。這些還僅僅是閱讀代碼嗎?
這是毫無疑問的破托,但是從這個(gè)角度看更像是一段奇妙的經(jīng)歷而不是閱讀一篇神秘的小說肪跋。這是一件非常好的事情。
沖洗和重復(fù)
一旦你閱讀完一個(gè)代碼庫炼团,立即選取另外一個(gè)并重復(fù)之前的步驟。你只有閱讀足夠多的代碼疏尿,才能提高閱讀新的代碼的效率瘟芝。你會(huì)發(fā)現(xiàn)你的投入產(chǎn)出比在不斷的上升并且發(fā)現(xiàn)這是一個(gè)十分有趣的學(xué)習(xí)過程。
從哪里開始
在我的代碼閱讀資源中褥琐,GitHub是對(duì)我影響最大的锌俱。在這個(gè)網(wǎng)站里,你能夠很快找到新項(xiàng)目以及其作者敌呈,如果你不使用這個(gè)網(wǎng)站那么對(duì)你來說是一個(gè)很大的損失贸宏。我建議先從GitHub上開始直到你能夠找到一個(gè)可以學(xué)習(xí)的項(xiàng)目。記住下面這段話并開始閱讀吧磕洪。
你是怎么看的吭练?你是把閱讀代碼當(dāng)成一種學(xué)習(xí)的手段嗎?你會(huì)給別人推薦哪些項(xiàng)目析显?最近是否閱讀過很好的代碼鲫咽?