標籤:

哪些項目的源代碼最值得閱讀?


(前面有人提到了 Redis、Lua 和 nginx,這些我也推薦)

讀代碼可能有兩種原因,一是對這個東西某處不滿意想改,二是想學習其中的設計實現思路,前者動力更直接一些,如 @陸亦斌 所說,後者則不好選,因為純粹泛泛地看跟你實際環境關係不大的代碼,其實不太容易學到東西。而且現代軟體設計其實也充滿了許多妥協和折衷,大家最常用的軟體,往往不是代碼最乾淨的,而是做了許多妥協折衷的。比如最明顯的有 Linux Kernel,有很多風格不一致的代碼 (但這並不減弱它的學習價值);mplayer 的代碼是我見過的最醜陋但又非常實用的,在這樣的代碼基礎上為啥能夠活躍發展到今天,也很值得研究;vim 代碼打滿了各種 #ifdef,你看了也會很驚訝為啥一個人能維護如此錯綜複雜的代碼這麼多年。我們有句老話,叫做水至清則無魚,軟體設計其實很多時候是在受限的條件下解決問題的本事。Beautiful Code [1] 介紹了很多精彩的代碼,Beautiful Architecture [2] 介紹了很多值得學習的架構。下面還可以補充一些:

  • git
  • FreeType
  • fontconfig
  • cairo
  • NetBSD 的用戶空間代碼
  • DTrace
  • WebKit
  • Mac OS X 的 launchd

從擴展思路的角度來說,一個程序員應該好好讀過這樣一些代碼:

  • 一個操作系統內核
  • 一個編譯器
  • 一個解釋器
  • 一個資料庫
  • 一個 Web 伺服器
  • 一個 Web 瀏覽器
  • 一個編輯器

因為這些都是幾十年來被頻繁地反覆實現的代碼,無數天才的程序員在這些領域發揮智慧,所以在它們各自領域「state of the art」的代碼,可想而知質量是很高的。

[1] http://oreilly.com/catalog/9780596510046
[2] http://oreilly.com/catalog/9780596517984


個人感覺redis和lua的代碼都不錯.據說nginx也很好.


Lua的代碼很好。但是問題也是太好,太乾淨。就Lua要解決的問題來說,這是很好的:有良好邊界的純符號問題或者純策略配置(說白了,前者就是數學,後者就是膠水)。不過我推薦看臟一點的代碼,也別太臟。Linux kernel就行。


  • Android學習之路Android學習之路
  • 別人整理的幾個框架值得推薦的android開源框架
  • 別人整理的一些Android項目Trinea/android-open-project · GitHub
  • android最佳實踐:futurice/android-best-practices · GitHub

我本人並不推薦那些太大的項目,像 linux 內核或者 webkit 很多人看不下去。
作為編譯器方面的我建議看 Larceny 項目,這是一個高效的 Scheme 編譯器,生成 x86 和 SPARC 機器代碼、C 代碼或者 CIL 用於 .net。作者是 William D. Clinger,Scheme 標準組成員。
(其實我最想看的是 Chez Scheme 的代碼,可惜人家收費)

另外 Nodejs 的基礎庫 libuv 的代碼也值得一讀,尤其是怎樣在錯綜複雜的系統 API 上構建出一組統一的非阻塞 IO API。


只看過c的開源代碼,這裡最推薦nginx和lua,他們不管是組織,風格還是性能,都可以說是登峰造極了。而且代碼都不是怎麼長,特別lua,只有幾萬行代碼。

話說最好的代碼,一般來說開發者都是很少的,或者說只有一個人的。


Lua, Python, Nginx..代碼有序結構良好,值得一看恩


有些開源軟體的代碼很亂,比如net-snmp,當年看瘋了。
現在看MySQL的,組織的也不好。
反而個人主導項目的代碼nice一點,比如redis,nginx。

我發現在 reddit 上很多人 推崇 sqllite,這裡沒人提到。


視頻方面:
ffmpeg,live555,mplayer,ffdshow,mpc-hc


我可以說lucene么,,我讀的第一個源碼。。


如果你是java工程師,spring的源碼一定要讀!個人感覺可以讓你上一個檔次!


postfix 的代碼很乾凈漂亮; Mozilla 的代碼因為群體太大所以很混亂了但是結構還清楚; Linux 的代碼質量遠不如 FreeBSD; apache 其實也很亂; reactOS 的代碼值得一讀; 應該還有不少, 只是想不起來了, 想起來的時候再來加吧...


我來說點實在的,分享一下個人讀Redis源碼的親身經歷。分享三個經驗:

(1)挑自己熟悉的、平常經常使用的開源工程入手,這樣你才能有的放矢。Redis在我們公司內部的存儲和緩存架構中佔有很重要的地位,既然經常使用,就必然會對內部實現產生興趣,所以決定讀一讀源碼,這樣也能對平常的運維和使用加深理解。
(2)不要讀完就完了。要把體會記下來,總結下來,比如寫成博客。在自己總結的過程中,你會發現理解又加深了一層,而且不容易遺忘,如果讀得仔細甚至還能發現源碼的bug。
(3)如果發現你讀的源碼有bug,或者有不夠優化的地方,不要遲疑,馬上給開源工程提issue或者pull request。比如我在讀Redis源碼的過程中,就給Redis主工程代碼和文檔工程代碼提交過pull request,這是個很自然的過程。

現在Redis的源碼我個人還在閱讀過程中,第一階段的閱讀關注點在於內部數據結構的實現(包括dict, sds, robj, ziplist, quicklist, skiplist)。最近兩個月在寫一些源碼閱讀的總結,還沒寫完,正在持續的更新中。如果題主也想選擇Redis源碼讀一讀的話,可以參考我的文章。這裡是入口:

Redis內部數據結構詳解(1)——dict
Redis內部數據結構詳解(2)——sds
Redis內部數據結構詳解(3)——robj
Redis內部數據結構詳解(4)——ziplist
Redis內部數據結構詳解(5)——quicklist
Redis內部數據結構詳解(6)——skiplist
Redis內部數據結構詳解(7)——intset


沒人說Qt,我不服啊。

往大了看,除了能看其中的設計模式,還有API的設計哲學。
往小了看,可以看到一些小功能的基本演算法(類似圖像抖動這些)。
再往小看,也可以看一些類似寫時拷貝這種很多地方都能用到的小技巧。


linux性能監測工具 oprofile

linux內核trace工具 KGTP 國人出品,維護者叫茶水 。
(忽然發現維護者就在知乎@teawater):P


我本身是不推薦「讀源代碼」這種學習方法的,所以我讀過的源代碼很少,C代碼推薦 lua 實現、python 代碼推薦 trac 代碼。


別忘了unix


大家都推薦上層的歪

我推薦個 uC/OS II ,作為一個 RTOS 代碼非常不多,分層也挺清楚的,反正我覺得挺受用的。


想寫出漂亮代碼的可以讀 Backbone


android sdk源碼。


推薦閱讀:

中國開源現狀如何?
什麼樣的軟體適合開源?

TAG:開源 | 源代碼 |