如何有效率地、循序漸進地閱讀開源軟體代碼?

閱讀高質量的代碼當然是學習編程的一個很重要的途徑,但循序漸進是很重要的,作為菜鳥,究竟應該先找一些小型的開源項目進行全局性的閱讀,還是先找些大型的軟體並選擇其中的某一功能模塊進行閱讀分析(其實大型小型的區分界限我也不是很清楚,難道就是代碼量的多寡) ?像Linux內核又應該在什麼水平閱讀效果最好?

因為貌似除了Linux內核有很多相關的代碼解析方面的書籍,其他開源軟體很少,所以請推薦你所贊成的軟體項目閱讀次序以及關於代碼閱讀的心得經驗(因為我是信息安全專業的學生,所以最好是相關開源軟體吧)


首先,我認為你應該先Google一下:如何閱讀代碼

其次,一般知識的學習和知識體系的建立過程都可以分為:自頂向下和自下而上的學習,例如《計算機網路》這個專業知識領域。代碼的閱讀方法可以依葫蘆畫瓢,自頂向下者,從功能、概念出發,先閱讀代碼的feature list、架構設計文檔、API手冊、業界測評等,了解代碼的優點和缺點之後,有的放矢的深入閱讀局部代碼。自下而上者,找到代碼入口,抽絲剝繭,一個分支、一個分支的去"肉眼"跟蹤、"大腦"執行。當然,自下而上者如果能讓代碼運行起來,單步跟蹤著看代碼是最省腦子不過了。

對於代碼選擇來說,不建議初學者直奔Linux內核,內核代碼由於要兼容多種硬體平台,充斥著各種各樣的條件編譯代碼、宏代碼等,找到核心業務代碼對於初學者來說有如霧裡看花。初學者如果一定閱讀開源代碼,GNU Coreutils的源代碼(Linux命令行小工具集,例如cat、wc、sort等)應該是可行的首選。

信息安全專業這個詞對於代碼閱讀選擇決策上有點大,信息安全專業本身細分領域也很多,Windows安全 VS. Linux安全,逆向工程,Web安全,軟體同源性鑒別等等。我身邊的信息安全行業朋友有不少都沒有任何產品經驗,他們就是專攻逆向工程,打交道最多的是彙編代碼。考慮到你的這個問題的標籤提到了C,那麼我就提2個C語言相關、可以閱讀的開源項目,供參考閱讀:

* Google出品的Web掃描器:ratproxy

* Nmap工具集:nmap、ncat、nping

以上代碼,需要結合相關信息安全專業知識進行代碼閱讀,收貨可能性更大一些。如果要脫離業務背景知識,還是推薦閱讀GNU Coreutils的源代碼。

補充一下代碼閱讀工具,Windows上Source Insight最佳,Linux下的GUI工具沒有特別好的,我自己用vim+cscope+ctags,不過Linux上的代碼同樣可以在Windows上用Source Insight來看。


「閱讀高質量的代碼當然是學習編程的一個很重要的途徑」

發現,很多程序員把閱讀代碼這件事「神聖化」了,不是說閱讀代碼不重要,而是閱讀代碼在「追求神乎奇技的程式設計之道」上,不是核心出發點。

之所以這樣說,因為,發現一些如下所述的想閱讀代碼的人:

1. 連操作系統頁面替換演算法有哪些都說上不上人,就問如何閱讀 Linux 源碼。

2. 不完整學習前端知識(html, css,javascript)的人的,想閱讀 webkit和v8 的源碼。

3. 連& 都沒看過的人,想去閱讀 tomcat 或者 glassfish 的代碼。

... ...

類似這種的人,實在太多了,連原理都不了解的人,你閱讀什麼代碼?裝13?

所以,說到「閱讀源代碼」這事,政治方向不能錯:

1. 學習編程,語言語法和語言庫層面的門檻,從業者很容易跨過去。但是優雅優秀地設計,編碼去實現相關的產品需要經驗,需要不斷學習,需要不斷償試。

2. 對於特定的源碼,得明白,代碼只是產品,描述的是特定的問題領域,背後是相應的原理,思想。學習相關領域之後,了解到這個領域中,有哪些問題,有哪些解決方案,有哪些產品,這些產品各有什麼特點,這些產品中,有哪些是開源的?整體的設計思路是什麼?這些問題在閱讀源碼之前都應該回答!

3. 在這樣的前提下,才能說能通過閱讀代碼來學習提高。你了解了這份源碼要實現的功能,了解這份源碼產品的特點。作為想閱讀代碼的你,你肯定會有你自己相應的設計實現。這樣,通過對比自己的想法不斷和源碼印證。這樣才有收穫。

所以,在宏觀上,上面已經回答了問題。

------------------------------

閱讀高質量的代碼當然是學習編程的一個很重要的途徑,但循序漸進是很重要的,作為菜鳥,究竟應該先找一些小型的開源項目進行全局性的閱讀,還是先找些大型的軟體並選擇其中的某一功能模塊進行閱讀分析(其實大型小型的區分界限我也不是很清楚,難道就是代碼量的多寡) ?

如何選擇,看你的感興趣的方向。

像Linux內核又應該在什麼水平閱讀效果最好?

嘿嘿... 操作系統你掌握有多深了?有多少個細分領域?進程,線程,內存管理等等相關的論文看了哪些?

(PS: 為什麼要閱讀 Linux 內核代碼?為什麼!!!無論從時間經濟效益或者能力上來說,有必要麼?)

因為貌似除了Linux內核有很多相關的代碼解析方面的書籍,其他開源軟體很少,所以請推薦你所贊成的軟體項目閱讀次序以及關於代碼閱讀的心得經驗(因為我是信息安全專業的學生,所以最好是相關開源軟體吧)

信息安全專業」也是一個很大的方向。你對這個領域內哪些問題感興趣?若深入了解這領域,你就不會問這樣的問題。


我個人閱讀一個新的項目(或者開源軟體)的代碼時的原則是由入口找到功能點,由功能點找出流程線,由流程線擴展成功能面。

首先,讀一下它的用戶手冊,了解一下它是做什麼的,都具有哪些功能,從中找出一個自己最感興趣的部分。

其次,在調試模型下運行起程序,找出它的入口函數,然後調試著一步一步看它載入了哪些模塊進入了主界面/主功能。然後搞清楚這些模塊的功能。這是找到了功能點。

然後搞清楚這個軟體有幾個模式、幾個穩定狀態。從中找出自己最感興趣的部分是在什麼模式/狀態下,把這個狀態的相關模塊和代碼搞清楚,這樣你就理解了一個項目中最基本流程的運行流程和相關技術點。這是找到了功能線。

剩下的由點到面就很簡單了。


先按自己的想法寫一個出來,再對照,否則看了人家的代碼也不知道好在哪裡

而且說不定會發現人家寫的還沒有自己的好呢


推薦閱讀:

CS 和 BS 架構的優缺點分別是什麼?
Win7下面的拖動窗口到左/右側自動對齊的功能在XP下面能夠通過軟體來實現嗎?
如何尋求一個乾淨的64位Windows 7 系統?
Windows PC 用戶應在哪裡下載非流氓軟體?
Windows 7 上有哪些值得推薦的桌面管理軟體?

TAG:軟體 | C編程語言 | 開源 |