記閱讀大型項目源代碼心得

爲什麼要閱讀源碼

要想成爲一名出色的書法家,需要時常研究大師們的經典碑帖,然後練習、臨摹,不斷重複。那麼想要成爲一名優秀的程序員,我覺得也應該學習研究大牛寫出來的代碼。所幸有很多優秀的開源項目可以給我們學習。我在前兩個月花了一些時間閱讀了一些開源數據庫源碼,現將自己暫時的一些心得體會記錄下來,有新的體會我會及時更新。

如何閱讀源碼

一、準備階段

下載源碼

毋庸置疑,要學習項目源碼,前提是關注的項目是開源項目,這時就不能下載編譯好的安裝包了。一般有兩種途徑獲取源碼:

1、 直接去官網下載:

知名的開源項目一般都會有自己的官網,例如:MySQL、PostgreSQL等,只要找到Source Code項下載即可。

2、Github

總所周知,Github是程序員最大的相親網站,開源項目一般都會在上面託管。(Tip:Issues裏面有很多AQ,因此當你有啥問題,可以逛逛該項目的Issues

初識項目

好的項目都會有README文件,該文件通常是對項目的一個整體介紹,可能會包括以下方面的內容(項目不同有異):

  • 目的:介紹該項目主要解決了什麼問題
  • 結構:項目的功能模塊及其簡單說明
  • 安裝:如何通過源碼編譯安裝(或者單獨的INSTALL文件介紹)
  • 使用:簡單的使用教程

編譯安裝

源碼下載之後,是需要進行編譯的。爲了能夠探究程序運行細節,當然需要選擇以Debug形式編譯。

我們知道,通過gcc或者g++要以debug模型編譯,需要增加-g選項。例如debug一個main.c代碼,形式如下:

gcc  -g main.c -o main

但是,其實在多文件編譯中,爲了編譯的方便,將編譯項加入了Makefile文件中。關於這一點,好的項目都寫好了Makefile,通過READ裏面的編譯介紹,在運行make函數時,添加debug需要的參數選項即可。

二、閱讀源碼

對於一個成熟的大型項目,其代碼量是相當大的,例如PostgreSQL的代碼已超過100萬行,所以,如果我們想要一上來就研究其所有的程序細節,那是完全不可能的。但是,如果不能粗略瞭解其代碼的組織結構(包括模塊劃分、文件結構、主要流程等),那麼你可能感覺會無從下手。

我覺得閱讀源碼應該遵循一個原則:先高屋建瓴,再深入細節。(感覺其他事好像也是一樣,嘿嘿)

因此一開始很有必要弄清項目裏的各個文件夾下都是哪一塊兒的功能代碼。可通過以下方式解讀:

  • 在README裏面可能會說明功能模塊都存放於相應哪個文件夾下
  • 好的命名規則會大大增加代碼可讀性,所以通過文件夾命名意義推測(該準則也適用於解讀代碼文件、函數、變量等)含義。通常來說:以src命名的一般是包括所有代碼的主文件夾;config下通常是一些配置文件(與Makefile文件在編譯時使用);doc下一般是文檔類文件;test下是測試性代碼;tools下是工具類代碼;bin下是放置編譯後能生成可執行文件的代碼;include是頭文件;lib下是庫文件;copyright是版權信息文件;帶有main命名的通常就是包含了整個項目的入口函數代碼。
  • 參考各路大神源碼筆記博客(不止在瞭解代碼結構,俗話說:前人種樹,後人乘涼。也許前輩的一篇博客總結,勝過你花費半天時間的閉門研究)

接着,可以嘗試讓代碼運行起來。

關於調試工具,這裏推薦使用GDB(蘋果系統下使用LLDB,兩者功能幾乎相同,命令對照參考:http://lldb.llvm.org/use/map.html)進行調試。它可以幫助我們理清很多的運行細節,包括函數調用堆棧關係、運行線程數、實時變量值等。由於目前我也是剛採用LLDB進行大型項目的調試,所以等過段時間使用更加嫺熟之後,會以實際的例子介紹如何有效地使用。在這裏附上GDB官方在線文檔http://sourceware.org/gdb/current/onlinedocs/gdb/

靈活運用調試工具,能夠極大程度地幫助我們深入到程序執行細節(這是我目前認爲研究源碼最有效的手段!)

有一點很重要,我們看源碼是有目標的,因此,要有選擇性地閱讀代碼,過濾掉不相關的粗枝末節。

以我這兩個月看數據庫源碼來說,我的目的是爲了弄清楚數據庫的客戶端與服務器的通信協議細節,因此我首先會定位到代碼中服務端代碼模塊中,並且通過調試時獲取的函數調用關係,繪製一幅服務端函數調用流程圖。這很重要,因爲可能今天你看懂函數執行流程了,過兩天就會忘掉,因此一幅自己繪製的流程圖能夠幫助你隨時記起程序邏輯。

當然,僅通過調試器也是不夠的。很多時候,我們需要將函數抽離出來,合理利用項目裏的測試樣例(自己也可以寫),並適當添加一些輸出(例如print),進行小範圍的代碼運行,這樣能更有助於理解到細節。

三、筆記

其實這一點是最容易被忽略的,因爲存在惰性思維。多做筆記,適時總結,這是一個非常好的習慣。

ok,先寫到這。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章