上週受到一位 CppJieba 使用者的郵件諮詢所啟發 (我也很好奇為什麼那麼多人還是偏向於郵件諮詢,而不是通過issue發問。), 重構了CppJieba的程式碼,高度整合了一下各個api, 對於使用者來說使用起來更加簡單,更容易上手了。 然後趁機把 CppJieba v3.0.0 和 NodeJieba 1.0.0 都發布了。
這兩者是我在GitHub上面star數最多的兩個專案, 維護到現在也快兩年的時間了, 除了能讓自己的GitHub更好看之外, 收穫還是非常大的。 GitHub是整個IT界的知識寶藏, 這幾年讓我學到最多知識的,幾乎都是在GitHub上面的開源專案。
經常會有同學問我如何去學習開源專案, 所以剛好寫篇博文來談談學習開源專案的一些方法。
最開始都是非常簡陋的
那天我發了一個微博關於Node.js程式碼考古:
軟體考古真的很有意思,checkout到很舊以前的版本, 看到node最開始時候的Makefile, 突然感覺好像開啟了遊戲的簡單模式。
當時有股很賤的興奮感,因為我發現Node.js的一開始也是非常的簡陋。 但是簡陋往往代表著簡單,就比如說,一開始的Node.js是使用Makefile管理。 所有可編譯檔案都一清二楚。而不是現在的node-gyp,一大坨一大坨的原始碼, 光看明白這些檔案相互之間的關係就要看很久。
這些和我剛開始寫CppJieba的時候一樣, 因為C++這門語言標準庫的缺陷,C++11普及的不咋地, 然後很多常見功能的庫,大家都是使用boost之類的庫。 不知道有沒有很多人和我有同樣的感受, 就是每次使用一個C++的程式碼,最噁心的就是需要安裝各種依賴程式碼, 而且還經常因為依賴的程式碼的版本問題,導致安裝失敗。 這種情況在Linux上面特別嚴重,以至於vczh還諷刺過在linux安裝軟體:“看的不是使用說明,而是使用攻略。”
所以我一開始就決定不依賴任何第三方庫, 遇到需要用的函式都自己寫, 所以因此也誕生了我自己常用的一個C++庫limonp。 雖然一開始程式碼寫的很簡陋, 但是起碼,我的程式可以直接在不需要安裝任何依賴庫的情況下執行,超輕量。 當然單元測試依賴了gtest,不過是將gtest的原始碼歸併進自己的專案程式碼中。
事實證明,這個非常重要。 還是那句話:沒有依賴,就沒有傷害。 而且後來我看到的ideawu的SSDB也是如此。 這樣的開源專案,才是重視使用者體驗的開源專案。
善於積累自己的程式碼片段
我有一個專案叫practice, 用來積累自己的程式碼片段, 當我在接觸一些新的技術的時候, 我需要寫一些小練習程式碼, 我就會將練習程式碼放入這個倉庫。 其實有時候,這些小片段就是大專案的種子, 就好像Node.js程式碼考古中其實就可以看出來, 剛開始的Node.js也是作者的實驗性的程式碼, 就是一種使用JavaScript編寫非同步IO服務的實驗性程式碼。 (剛開始程式碼只實現了當服務接收到請求的時候,就讀取js原始碼檔案,然後將執行結果返回,這樣而已。)
比如我自己寫的一個簡單HTTP伺服器, 也是從一些小實驗性程式碼拼湊起來,比如socket的收發, HTTP包頭的解析,使用BlockingQueue構造執行緒池等。 這些都是常見程式碼,但是組裝起來,就是一個專案。 而且寫這些程式碼片段,對自己學習新技術,非常有幫助。 事後還可以回頭翻看,現在有GitHub這個好社群真的比以前學習程式設計的時候方便太多了。
善於站在前人的肩膀上
這個很好理解,就是善於藉助別人的分析文件。 就好比如果要深入閱讀Redis原始碼的話, 不妨先看一遍《Redis設計與實現》再去看原始碼。 就好像在走迷宮的時候,別人給了你一幅地圖, 就輕鬆多了,還能沿途欣賞風景。
但是不理解的是不太明白為什麼很多人喜歡硬啃, 我除非遇到很新的開源專案,搜不到相關前人的文件, 才不得不硬啃。 但是現在其實開源專案的作者都很重視文件了, 一般都很自覺寫了一些原始碼文件。
從學習的角度來說,開源專案不是star數越多越好
開源專案不是star數越多越好,而是對你來說越容易讀懂越好。 一般和你當前所做工作越相近的就越容易讀懂。 和你所做工作相近的時候,閱讀原始碼能帶來一些開發或者是重構的靈感。 甚至光看看一些檔名、類名、原始碼註釋, 就可以知道使用了什麼技術, 然後去搜相關技術的文章論文等來詳細研究。 這些都是非常有幫助的。
如果閱讀的原始碼和自己工作內容牛頭不對馬嘴, 理解的也不透徹,然後沒幾天就忘了。 基本上只剩下裝逼時候吹牛用了。
一味追求看高效能的程式碼其實並不好, “程式碼是寫給人看的,順便能在機器上執行而已。” 但是很多明星開源專案因為效能太重要了, 有時候不得不略微犧牲一點可讀性來實現高效能。 而且star數量大的明星專案,考慮的東西多, 相容性,易運維性等都是不小的程式碼量。 而這些其實並不是專案的核心。 閱讀原始碼,應該是越容易讀懂核心越好。
一點感想
感覺最近開源專案作者越來越受熱捧, 讓開源專案變得越來越功利了。
希望不要忘了開源專案的初衷, 是為了知識更好的分享和傳播。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!