天天看點

如何閱讀代碼?理論+實踐 非常棒

http://www.cocoachina.com/gamedev/misc/2013/0729/6688.html

1.盡力建構并運作代碼。 這通常是一個簡單的步驟,就像你在看可運作的代碼(這和随機代碼相反)。 不過,并非總是如此。通過建構和執行代碼,你能從中學到很多上層代碼結構。 說到工作代碼,你是否非常熟悉如何建構你的目前項目? 雖然建構通常非常複雜,但通過建構并生成可執行的代碼,你能學到很多。

2. 不要隻注重細節。 你要做的第一件事是,在你正閱讀的代碼中,找到代碼結構和風格的。 首先浏覽一下代碼,盡力了解不同代碼段要做什麼。這會讓你熟整個代碼的上層結構,你也能領會到你正處理的代碼的一些構思(良好架構和意大利面條等)。 這時候,你可以找到切入點(不管它是什麼,主函數、servlet或控制器等),并檢視代碼如何在那裡分支。 不要在這上面花過多的時間,随着你愈加熟悉代碼,你可以随時回來檢視。

如果你不知道代碼要做什麼,那你就走不了很遠。 即便隻有幾個你不熟悉的結構,你應當深入檢視。 你現在是在探索你所用程式設計語言中你以前不知道的東西,為此花幾個小時來閱讀代碼,我也非常樂意。

4. 既然你對大多數結構已有很好了解,那現在是該做些随機深入研究了。 就像步驟2,開始浏覽代碼,當這次要挑選一些随機函數或類,并開始逐行詳細檢視。 這是硬仗開始的地方,但也是你要取得主要成功的地方。 這裡的構想,會形成你正在檢視的代碼庫的思維模式。 也不要在這上面花過長的時間,但在繼續前行之前,你要盡力并極大吸收一些有内容的代碼塊。 這個步驟,你也可以随時反複回過頭來,每次你都會了解更多的背景,并收獲更多。

5. 毫無疑問,在前面這些步驟中,肯定有你困惑的地方,是以這是你做些測試的最佳時間。 在測試的時候,你的麻煩可能會更少,同時你也能了解代碼。 我一直感到奇怪,開發人員忽略一套寫得很好很全面的測試代碼,而盡力去閱讀并了解某些代碼。 當然了,有時候并沒有測試。

6. 如果你說沒有測試,那這聽起來是編寫測試的時候了。 (編寫測試)有很多益處,有助于你自己的了解,有助于你提升代碼庫,閱讀代碼時也能編寫代碼,這是該你出手做些事的時候。 即便已經有了測試,通常你也可以編寫一些測試,你總能受益的。 測試代碼通常需要換種方式思考問題,那些你以前不太明了的概念也會變得更清晰。

7. 提取奇特的代碼,使其成為單獨的程式。我發現閱讀代碼是個非常有趣的練習,即便隻為節奏變化。 即便你不了解代碼的底層細節,你或許能知道一些代碼在上層結構上要做什麼。 什麼不提取一些特定的函數,單獨列為獨立的程式。 當你在執行小段程式時,調試也會更簡單。反過來說,可能還需要一些額外的步驟,才能了解你正檢視的代碼。

我并不建議你重寫整個代碼庫,但重構部分代碼,真的有助于你了解層次上升一層。 把你了解的函數拿出來,改成獨立的函數。 在你知道之前,原來的大函數看起來易管理,你可以在腦海中修改它。 重構允許你把代碼變成自己的,無需完成重寫代碼。 如果有好的測試,有助于重構,但即便你沒有好的測試,抽取你确定的函數并做測試。 即便測試看起來完全不充分,但作為一個開發人員,你得學着相信你的技能,有時候你隻需努力去做(重構)。(如果你必須重構,你通常都可以把代碼恢複原狀。)

9. 如果沒什麼能幫上忙,那你就找個閱讀代碼的同伴。或許并非隻有你一個人能從這代碼中獲益,是以去找一個人,一起閱讀代碼吧。 但你别找專家,他們會從上層結構上,向你解釋所有東西,你會錯失那些你自己詳細檢視代碼時所能學到的細微差别。 然而,如果不見效的話,你也不能了解,有時候,你能做的最好的事就是去問。 向你的同僚請教,如果你正在閱讀開源代碼,可以在網際網路上找人問問。 但是你要記住,這是最後一步,而不是第一步。

如果我時間緊迫,需要快速合理地了解某些代碼,并且我隻能挑選上述步驟的其中一個,那我會選擇“重構”(即:第8個步驟)。 雖然你能了解的東西不會很多,但那些你領會的東西,你會牢牢記住的。 總之,有件事你需要記在心裡。 如果你新接觸一個重要的代碼庫,你不可能立即能了解它。 這需要數天、數周和數月的潛心努力,接受這個事實。 即便有一位專家和你在一起,也不能明顯地縮短時間(。 然而,當涉及到代碼庫時,如果你能耐心并有條不紊地閱讀(和編寫)代碼,你最終能熟悉項目的方方面面,你能成為大牛。 你或者是逃避閱讀代碼,經常尋求某人幫你講解某事。

我知道我會成為哪一種人。

尋找閱讀代碼的機遇 – 不要錯失

我們喜歡編寫新代碼,是因為我們這次能正确處理問題。 好吧,也許不是這次,但一定是下次。 事實上是,你經常改進你的技術,但你從沒有恰當地處理問題。 這就是編寫新代碼的價值所在,你可以曆練并磨練你的技能,但閱讀和把玩其他人編寫的代碼,(如果沒有更多的價值,)也是有同樣多的價值。 你不僅能從中獲得一些有價值的技術知識,也能收獲領域知識,領域知識通常仍具更多價值(畢竟,代碼是文檔的最終形式)。

即便代碼寫得很神秘,無任何慣例可言,但還是有價值。 你知道我在說的代碼,它幾乎看起來晦澀難懂,但不是有意而為之(因某些原因,Perl語言代碼通常是這樣的)。 不管什麼時候我看到那樣的代碼,我都會這樣想: 把它想象成隻有你破譯它後才能學到的東西。 是的,這是主要的痛楚之處,但要接受它,有時候你自己也會因瑣碎的原因而寫出那種使人困惑的代碼(否認沒有用,你知道這是真的)。 好了,如果你花些時間來閱讀那樣的代碼,你更有可能最終寫出同樣的代碼。并不說你将會寫出那樣的代碼,但你有能力寫出那樣的代碼。 最後,态度通常是最重要的(編注:态度決定一切)。

如果你視閱讀代碼為日常繁瑣的工作,那它就是(繁瑣的工作),并且你會逃避,但如果你視其為一個機遇,那好事終将到來。