我們應該怎麼閱讀學習開原始碼呢?

pythontab發表於2016-11-05

開原始碼作為一種特色的產物,隨著物聯網的進步得到了前所未有的發展。一開始,很多程式碼其實不是開源工程,後來軟體的開發商發現根本沒法用這些程式碼來掙錢,所以索性把這些程式碼釋出到網上,讓更多的人來進行維護和開發,比如說IBM的eclipse就是這樣。

 

當然,在網路上還是存在很多志趣相同的人,因為網路讓他們走在了一起,一起討論方案,一起討論軟體架構,慢慢社群的影響力也會越來越大,這方面做的最好的就是Linux、kde、gnome等軟體。

 

後來,在社群發展起來後,很多的大公司為了讓這些開源軟體在自己的硬體裝置上跑起來,紛紛對這些開源工程投入資源、建立相應的基金會、貢獻程式碼等,比如說hp、富士通等。等到後期,一些公司主動開發開源軟體,根本不指望他們能給公司帶來什麼收益,而是希望藉此帶來廣闊的人氣,比如說Android軟體。

 

關於開原始碼,其實可以說的內容很多,每個人也有自己的心得體會。今天主要是拋磚引玉,談談學習開原始碼的一些小經驗。


開原始碼的特點

相比較私有軟體,開原始碼有很多的自己的特點,我們不妨聊聊看看,


開原始碼質量差別迥異;

開原始碼形態各異,有的是完整的軟體,有的只是外掛;

開原始碼熱度不一樣,很多軟體其實已經沒有人維護了;

開原始碼一般沒有專門的支援人員,很多事情需要自己解決;

開原始碼的編譯環境迥異,要努力尋找合適自己的。


如何閱讀程式碼?

要閱讀程式碼,需要很多的前期條件。首先,你得把軟體編譯出來吧;其次你需要基本的軟體知識吧,常用的除錯方法也必須掌握;最後,對於軟體本身需要的內容你得明白吧,搞影片播放的得知道影片編解碼的相關知識,搞壓縮軟體的要知道壓縮的相關演算法,搞搜尋引擎需要知道爬行、分詞和索引查詢的相關知識吧,當然這些都是一些基礎條件。那麼,如果我們已經做到了上面幾點,接下來應該怎麼做呢?


下載程式碼,本地編譯透過,生成版本;

熟練使用該軟體,明白軟體的基本功能和操作方法;

根據軟體功能分析軟體的模組結構;

尋找到某一個軟體最被可能斷住的地方設定斷點,檢視上下文;

圍繞上下文判斷程式碼的來龍去脈,逐步展開;

嘗試修改程式碼,重新編譯驗證自己的想法,迴圈之;

不斷擴充程式碼的閱讀範圍,注意記錄筆記和與網友分享;

分析程式碼的時候,忌快,一目十行不如看懂一行。

 

編譯環境

對於C語言和C++與來說,使用的比較多的還是windows環境和linux環境。其實C語言的編譯其實挺簡單的,windows上面有visual studio幫忙,linux上面有autoconf和automake這個強大工具,編譯看上去是件容易的事情,其實不然,


不同的編譯器對C語言的支援標準是不一樣的;

編譯器的不同版本也會出現編譯不一致的情況;

很多軟體常常需要進行修改,這就是對大家基本功的考驗;

某些軟體需要依賴第三方庫,需要自己動手編譯;

部分軟體只支援高版本的編譯器,移植到低版本的編譯器要靠自己;

部分軟體使用linux可以編譯透過,但是在windows的cygwin就是編譯不過;

部分軟體編譯時間長,而且記憶體佔用大,一旦編譯失敗,前功盡棄;

標頭檔案失敗、連結失敗、資料型別轉變失敗,很多情況需要自己處理解決。


如何選擇程式碼?

網上的程式碼很多,但是要選擇真正對自己有用的程式碼。否則,對於那些低質量的程式碼,即使你下載下來也沒有什麼用。


下載高質量的程式碼;

下載的程式碼要結構清晰、編寫規範;

下載的程式碼要可編譯;

下載的程式碼最好一直在演進中;

下載的程式碼最好經過了很長時間的驗證;

下載可以獨立使用的一段程式碼,好閱讀、好總結;

使用業內廣泛使用的開原始碼,降低成本,儘量不要一個人戰鬥。


相關工具下載

目前關於程式碼下載的辦法還是很多的,當然最簡單、最方便的還是直接從伺服器上面進行下載使用,不過現在也有很多的下載軟體了,比如說,

svn工具;

Git工具;

ftp工具等等。


如何尋找程式碼?

首推的當然是github;

到sourceforge上查詢相關程式碼;

到google code上面查詢具體的程式碼;

直接到開源專案網站上面尋找程式碼;

到csdn等網站下載程式碼,偶爾會有意外的收穫;

到圖書出版社下載圖書附錄的程式碼;


一些簡單的學習專案推薦

chrome原始碼;

redis原始碼;

nginx原始碼;


其他的經驗

相信重複的力量

讀原始碼過程中最深的一點體會就是,重複重複再重複。當年讀ttserver原始碼是剛入行,本來對C就不熟,ttserver裡有很多比較奇怪的程式碼習慣,於是硬著頭皮vim一行一行一遍一遍地看,有些不懂的地方,看十來遍,還真就懂了,可能算是量變引發質變吧。


從資料結構入手,先想後讀

然後後來我學聰明瞭一點,不再從main函式一行一行的開始,學著先讀 .h 檔案,瞭解資料結構,結合能找著的文件,腦補作者的思路,在這個基礎上再去讀原始碼,看自己和作者想的有什麼不一樣,經常能發現自己錯誤或者不周全的地方,偶爾也能竊喜和大師們的不謀而合。


善用工具

再後來發現原來有ctags這類東西,如有神助,加上這時對C語言的基本寫法有了一些瞭解,讀碼效率頓時提升。今年下半年在lua和nginx中選了先讀nginx程式碼,目前結合一些工具做記錄,也頗有成效。


理論與實踐結合

當然,我讀過的所有原始碼,都不是為了讀而讀,基本都是我工作中經常會用到,會面對的一些東西。所以這裡有一點也很重要,建議最好先了解你這個東西的功用,再去讀原始碼,否則真的很難讀懂。最最好的當然是經常用到的東西,自己對其本身的功能已經很熟悉了,甚至說內部實現機理都能略說一二,這時候讀起來肯定更省力。


教就是學

讀碼之後寫文章也不錯,有時候你以為自己讀懂了,真提筆要寫一個模組分析的時候,突然發現還有東西是模糊的,或者前後邏輯串起來是矛盾的,這種事也常有。於是我一直認為,能真正寫出一篇讓人看得懂,沒有問題的分析文章,才真的算是讀懂了一個模組。


相關文章