天天看點

源代碼閱讀技巧

                                      轉載請注明出處,作者:羅立樹

    最近有人問我怎麼學習源代碼?怎麼分析開源代碼?的确在網際網路行業中,采用了很多開放源代碼,網際網路的發展促進了開源代碼的快速發展,在項目開發過程中,為了降低成本和提升項目的品質、開發效率等等,我們的思維形式往往就會考慮,這個系統實作是否有一些成熟的開源軟體可以支援。正因為是開源的,品質其實也不能得到百分百的保證,有些問題可能本身開源的作者也沒有遇到過或者沒考慮周全,是以在拿過來用的時候也是存在風險的,另外我們通過源代碼的分析閱讀,掌握技術細節,這樣就更加有利于我們今後線上的穩定,當然技術本身就是存在比較高的門檻的,能夠熟練掌握,對于我們工作中有很多好處,這裡不多說了。

很多人看源代碼,一開始就一頭紮進一堆代碼中,然後跟着各個類檔案或者代碼流程,一點一點的跟蹤,結果跟來跟去,把自己搞的越來越糊塗了,這種方式是不太高效的。

下面,根據我自己的一些經驗,和大家分享一些閱讀源代碼的技巧。

1.閱讀源代碼前必須要有紮實的基礎知識,沒有紮實的基礎知識,很難能夠了解代碼的實作細節。譬如閱讀一個NIO架構必須要了解NIO的實作原理和細節,閱讀Tomcat代碼必須要知道JVM記憶體管理、Servlet标準、http協定、java類加載政策、線程池、網絡IO等等知識。閱讀Redis得掌握C語言程式設計、常用的資料結構、網絡IO、系統記憶體管理、系統線程管理、libevent(知道redis為什麼不用,和memcached做一些比較)等等,這裡不一一列舉了。是以即使不會,我們必須要在閱讀源代碼前做好準備,做好理論上的支援,沒有理論的支援很多東西了解起來都是比較困難的。

2.先了解源代碼都有哪些功能特性,在熟練使用的時候,再去深入挖掘。我們常說,知其然,再知道其是以然的一個過程。

3.先網上搜尋一下相關開源架構的介紹,學習别人對該架構的評價和使用、分析等,分析出開源軟體的設計思想,這是站在别人的基礎上,牛頓說:站在巨人的肩膀上。

4.掌握軟體工程,得學會軟體設計的一些原則,什麼依賴倒轉原則、開閉原則、裡氏代換原則等等,假如實作上采用面向對象的語言的話,還得學會設計模式,懂得變與不變分離的思想。

5.學會使用工具,精通debug技巧,先分析出各個子工程或者代碼子產品的依賴關系,然後将依賴關系理清楚,整理它的先後順序和優先級,當我們把依賴關系弄明白了,自然入手也更加友善。

6.學會總體概括思維,了解好抽象,把握其總體架構,抓關鍵點,

  譬如學習Spring源代碼,那Spring的核心功能就是IOC和AOP,那基于IOC的實作來說,是BeanFactory,而BeanFactory是通過分層的模式來對不同的運作環境進行隔離的,IOC的支援是通過BeanDefinition來進行管理的,而Bean的配置通過命名空間的支援。而AOP來說,它的入口是AopProxy(實作方式有Cglib和AopProxy),一方面是通過AOP來實作事務,支援Aspectj的面向切面程式設計,基于Aop實作一些不通過非入侵性編碼就可以實作的功能。

Spring的哲學就是面向接口的,互相之間的調用關系可以通過接口分析就可以明确。

7.多動手應用實踐和測試,根據以上的總體了解,然後建構相應的應用場景,邊實踐邊debug,因為在軟體設計過程中,代碼量是非常大的,不做試驗很難知道它到底是怎麼回事。

8.學會總結、歸納,對所學的知識進行系統化概括,然後不僅局限于目前技術,學會比較,将多個同類産品之間的優缺點比較一下,譬如:redis和memcached都有什麼優缺點,各自的應用場景在哪裡更加好一些。在什麼樣的場景更加适合。

9.學會以審視的眼光來看,開源代碼不一定就是最好的,在一些特别重要的關鍵設計中,看看該代碼是否存在缺陷,假如自己來設計的話,是否有改進的地方。

10.技術碼農是一個很苦很累的活,一定要有興趣,需要堅持的去做,沒有興趣的話學什麼都想急于求成,這樣在了解過程中是有所遺漏和不全的,要學會在技術上進行多交流、多分享,這樣才能更多的了解自己哪裡存在不足。

好了,做了這麼多總結,在今後的時間中,我會給大家帶來一些源代碼方面的分析的分享,短期的目标是以下内容:

1.《Spring源代碼解讀》

2.《Struts2源代碼解讀》

3.《Redis源代碼解讀》 

4.其它等。。。。。

關于源代碼閱讀的一些技巧,和學習的一些方法論,歡迎大家一起讨論,共同進步