
上週受到一位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數量大的明星項目,考慮的東西多, 兼容性,易運維性等都是不小的代碼量。 而這些其實並不是項目的核心。 閱讀源碼,應該是越容易讀懂核心越好。
一點感想
感覺最近開源項目作者越來越受熱捧, 讓開源項目變得越來越功利了。
希望不要忘了開源項目的初衷, 是為了知識更好的分享和傳播。
轉載請註明:開發者關係 »