如何參與一個頂級開源項目

前言

最近個人事情比較多(搬家、換工作、短暫休息)所以一直也沒有顧得上博客更新,恰好最近收到一封郵件提醒了我。

也是時候寫一篇文章來聊聊參與開源項目的事(最近也確實進入了筆荒期)。

ps:第一次收到這樣的中秋節禮物,加上 Dubbo 社區的活躍及阿里的重視度,還在做 PRC 或微服務技術選型的朋友可以考慮 Dubbo

參與開源

現在具體來聊聊參與開源的事;

日常幾乎所有的開發者都會享受到開源項目所帶來的便利甚至是收益,受限于環境早在十幾年前甚至幾年前開源活動一直都是有國外開發者主導。

但這幾年國內互聯網公司逐漸國際化擴大影響力也很大程度的提高了我們的開發水平,以 BAT 為首出現了許多優秀的開源項目。

現在甚至參與開源項目還能另辟蹊徑的拿到大廠 offer,所以其實不少朋友都想參與其中,可能這事給人的第一感覺就不太容易,所以現在還卡在第一步。

具體步驟

以下是以我個人經驗總結的幾大步驟:

  • 發現問題或自薦 feature
  • fork 源碼。
  • 本地開發、自測。
  • 發起 pull request
  • 等待社區 Code Review
  • 跟進社區意見調整代碼。
  • 審核通過,合并進 master 分支,完成本次貢獻。

下面我會結合最近一次參與 Dubbo 的流程來具體聊聊。

發現問題或自薦 feature

首先第一步自然要搞清楚自己本次貢獻的內容是什么?通常都是解決某個問題或者是提交一個新的 feature ;前者相對起來更加容易一些。

當然這個問題可以是自己使用過程中發現的,也可以是 Issues 列表中待解決的問題。

以本次為例,就是我在使用過程中所發現的問題,也提交了相關 Issue 并寫了一篇文章記錄并解決了該問題:What?一個 Dubbo 服務啟動要兩個小時!

值得注意的是在提交 Issue 之前最好是先在 Issue 列表中通過關鍵字檢索下是否已經有相關問題,避免重復。

同時提交之后也許社區會進行跟進,被打上 invalid 標簽認為不是問題,或者是使用姿勢不對也是有可能的。

fork 源碼,本地開發

當確定這是一個待修復的問題時就可以著手開發了。

首先第一步自然是將源碼拷貝一份到自己倉庫中。

接著只需要 clone 自己倉庫中的源碼到本地進行開發。

先回顧下我遇到的這個問題。

簡單來說就是啟動 Dubbo 服務非常緩慢,經過定位是 main 線程阻塞在了獲取本機 ip 處。

所以當時我提出的方案是:在獲取本機 ip 時加上超時時間,一旦超時便拋出異常或者是再次重試,但起碼得有日志方便用戶定位問題。

問題是主線程會一直阻塞在此處 InetAddress.getLocalHost().getHostAddress(),但又需要知道它阻塞了多久才好判斷是否超時。

所以只能再額外開啟一個線程,定時去檢測 main 線程是否已經完成任務了,以下便是我第一次 pr 的內容。


這次的重點不是討論這里具體的技術細節,所以簡單說下步驟:

  • 額為聲明了大小為 1 的線程池。
  • 再聲明了一個 volatile 標志用于判斷主線程是否有完成任務。
  • 聲明了一個 condition 用于新線程做等待。
  • 最后只需要運行這個線程用于判斷這個標志即可。

如何自測

開發完成后下一步就是自測,由于這類項目是作為一個基礎包依賴于其他的項目才能運行的,所以通常我們還得新建一個項目來配合做全流程測試(單測除外)。

這里我覺得還是有幾個小技巧值得注意。

第一個是版本號;因為在本地測試,所以需要使用 mvn clean install 將包安裝到本地才能在其他項目中依賴進去進行測試。

但由于我們從官方拉出來的代碼版本都已經發布到了 maven 中央倉庫中(不管是 release 還是 snapshot),所以我們本地倉庫中肯定已經存在這幾個版本的 jar 包。

一旦我們執行 mvn clean install 將自己修改的代碼安裝到本地時,大概率是會出問題的(也可能是我姿勢不對),這樣就會導致新建的項目中依賴不了自己新增的代碼。

所以我通常的做法是修改版本號,這個版本號是從來沒有被官方發布到中央倉庫中的,可以確保自己新增的代碼會以一個全新版本安裝到本地,這樣我們再依賴這個版本進行測試即可。

不過再提交時得注意不要把這個版本號提交上去了。

發起 pull request

自測完成后便可發起 pull request 了,不要大意,這里還得有一個地方需要注意,那就是代碼換行符的問題。

一旦換行符與源倉庫的不一致時,git 會認為這次修改是刪除后重來的,這樣會給 code review 帶來巨大的麻煩。

就像這樣,明明我改動的行數并不多,但 git 確認為你是推翻了重來,導致審核起來根本不知道你改了哪些地方。

最簡單的方法就是設置自己 git 的全局配置,可以參考這里

# 提交時轉換為LF,檢出時轉換為CRLF
git config --global core.autocrlf true

# 提交時轉換為LF,檢出時不轉換
git config --global core.autocrlf input

# 提交檢出均不轉換
git config --global core.autocrlf false

確認沒問題后便可點擊這里發起 pull request,后面按照引導執行即可。

當然各個項目之間還會有自己定制的貢獻流程,最好就是查看官方的貢獻指南。

http://dubbo.apache.org/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html

Code Review

pr 發起后便可等待社區審核了。

在這過程中要充分和社區進行交流,有可能你的方案和社區的想法并不一致。

比如像我這次:



最終通過溝通加上自己后面的思考覺得還是社區的方案更加輕便合理一些,達成一致之后社區便將這次 pr 合并進 master 中。

其實整個過程我覺得最有意義的便是 code review 的過程,所有人都可以參與其中頭腦風暴,其中也不乏技術大牛,不知不覺便能學到不少東西。

類似案例

雖然我之前的方案沒有被采納,但類似的用法(一個線程監控其他線程)還是不少,正好在 Dubbo 中也有用到。

便是其中核心的服務調用,默認情況下對使用者來說這看起來是一個同步調用,也就是說消費方會等待 PRC 執行完畢后才會執行后續邏輯。

但其實在底層這就是一個 TCP 網絡包的發送過程,本身就是異步的

只是 Dubbo 在你不知道的情況下做了異步轉同步,這樣看起來就像是一個同步方法。

如圖中的紅框部分,Dubbo 自身調用了 get() 方法用于同步獲取服務提供者的返回結果。

邏輯其實也挺簡單,和我上文的方案類似,只是這里的 isDone() 函數返回的是是否已經拿到了服務提供者的返回值而已。

總結

本次總結了參與開源的具體步驟,其實也挺簡單;就如官方所說哪怕是提個 Issue,修改一個錯別字都算是參與,所以不要想的太難。

最后還簡單分析了 Dubbo 調用過程中的異步轉同步的過程,掌握這些操作對自己平時開發也是很有幫助的。

你的點贊與分享是對我最大的支持

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 五篇隨筆 2014-11月-12月在加拿大《信報》發表的五篇散文 一嫁給姐夫的女人 嫁給姐夫的女人,個子高高的,人...
    唐山鳳池閱讀 690評論 1 0
  • 昨晚在思維訓練營群里得到了共讀《王者速讀法》的消息,趕緊報了名,交了押金,開啟一周的共讀。這個書名真霸氣啊!是不是...
    陶醉了醉了閱讀 419評論 1 0
  • 出差去車站路上,跟出租車司機聊起來,司機是個女司機,從臉上表情看起來心情不好。問起情況,司機說被兒子氣的,兒子畢業...
    逄格亮閱讀 234評論 0 0
  • 2017年10月4日 星期三 晴 秋意濃,晚風拂,明月高掛,圓又亮。然他鄉一人,晚風似越涼,思情如甘甜,又甜又...
    糯小玉閱讀 297評論 2 0
  • 孩子們漸漸熟悉起來,盡管有時也叫錯名字。他們從各自的地盤走出來,隨便找個地方玩耍。 他們懂得了玩具應該與其...
    羞蓮閱讀 325評論 1 5