作為程式員來說,看代碼是我們的必修課。記得以前《Linux核心修鍊之道》的作者說過,學習linux最好的途徑就是看代碼。《深入淺出MFC》的作者侯捷也說過,代碼面前沒有秘密可言。但是,代碼真的是那麼容易讀的嗎?其實就我個人的經驗而言,代碼裡面有的不僅僅是知識,更多的是對業務的一種提煉和理解。換句話說,我們在代碼中看到的不僅僅是業務的處理,看得更多的可能是對異常和突發情況的處理。這在某種情況下很有可能會左右我們對代碼的認識。不熟悉語言、不熟悉編譯環境、不熟悉業務、不熟悉測試情境、不熟悉別人的開發思路,這些都會成為我們學習的障礙。那麼,有什麼辦法可以提高自己看代碼的能力呢?
(1)熟悉程式設計語言
不同的項目有不同的程式設計語言,這一點在sourceforge、google code上面可以看得很清楚。現在開源的項目很多,小的程式碼程式庫比如說有linux 0.11,前後大約有兩萬行左右,大的代碼就不勝枚舉了,什麼linux 3.0、open office、mplayer、gimp、android,基本上每一個項目的程式碼數都是在百萬行以上。所以,如果你想對開源項目有一個基本的瞭解,那麼你就需要對它的基本程式設計語言有一個透徹、詳盡的瞭解。很難想象一個對C語言、組合語言都不是很了記得人怎麼能夠看懂linux
kernel的代碼?當然了,這些還只是基礎。它是你進一步提高的必要條件,卻不是充分條件。
(2)學會使用開源項目的準系統
很多朋友在接觸開源的時候都有一個很不好的習慣。那就是,不管是什麼項目的代碼,他都會不管三七二十一,下載下來立馬解壓,接著就看起代碼來。至於說,這個代碼有哪些功能,這個開源軟體是怎麼使用的,他全然不管。舉個例子來說,很多朋友都喜歡notepad++這個工具,它也是一個很有名的開源項目。如果我們對notepad++的相關功能沒有一個清晰的認識,那麼我們就會把自己陷入到代碼當中去,沒有一個突破點。開源項目大多經過多年的發展,整個代碼量遠不是幾千行那麼簡單。所以說,如果剝開軟體的準系統,只注重代碼本身,你學到的東西其實是很少的。
(3)學會編譯代碼
編譯代碼是我們學習軟體的基本功課。在widnows上面,你要學會利用visual studio編譯軟體;在linux上面,你要學會gcc、ld、makefile等工具,同時還要學會自己搭建編譯環境,不同的編譯環境還要注意在版本上是否相互匹配。即使是Windows上面,由於版本的差別,有的軟體代碼只能使用高版本的visual studio才能編譯,有的軟體需要directx庫、ddk才能參與編譯。所以編譯代碼本身並不是那麼簡單的一件事情。就拿ucos嵌入式作業系統來說,相信很多人都看過它的代碼。但是我想問的是,真正把ucos編譯成可執行檔的朋友究竟有多少?
(4)學會看懂、修改代碼
在代碼編譯之後,我們常常就可以得到執行檔案了。但是,這些工作只是一些基本工作,我們還有很多其他的工作要做。比如說,你要知道這個軟體的進入點有哪些?實現了那些功能?基本機制是什嗎?模組和模組之間究竟是怎麼銜接的?協議棧或者軟體是怎麼分層的?在真正看懂代碼之前,你需要
a)分清代碼的結構,這些一般可以從readme檔案可以看出來;
b)弄清代碼本身有多少線程,每個線程的功能是什麼;
c)分清資料和代碼的走向,理清楚代碼的執行流程;
d)善於利用軟體的準系統點來看代碼;
e)編譯代碼的時候添加-g選項,這樣可以實現單步調試,查看每一步資料的變化情況;
f)給原來的開源模組添加新的功能,但是不能破壞原來的基本構架和機制,驗證和深化自己的認識。
(5)學會模擬代碼、重構代碼
如果我們看代碼的目的只是為了利用某一些lib函數的使用方法,那麼做到上面4點就已經很不錯了。但是,我們常常有更高的要求。通過學習,我們可以發現原來的開源軟體有哪些設計的閃光點?自己是不是可以對它的準系統用相同的程式設計語言儘快模擬出來?甚至於,我們可以自己編寫一個類似的開源軟體,實現更多的功能,而在資源的利用和資料的訪問速度上有一個質的提高。等到我們可以模擬代碼、重構代碼的時候,那個時候我們才能說對這個代碼真正掌握了。
不同的人看代碼的目的是不一樣的。但是,既然我們看了這些代碼,那麼至少需要掌握一些東西、學習一些東西,否則那不是在浪費時間嗎?不管什麼方法,有幾個原則是我們必須牢記的,否則看代碼的效果就會大打折扣的,
1】代碼必須完全編譯出來,不能編譯的代碼基本是沒有什麼用的;
2】代碼必須單步調試,慢工才能出細活;
3】修改代碼必須建立在對軟體深刻理解的程度上,否則bug會越改越多的;
4】代碼是需要反覆看、反覆驗證的,通常每一次看都會有新的收穫;
5】看代碼的時候注意相互交流彼此的看法,這樣會受益良多。