1. 程式人生 > >如何向開源專案做貢獻(以incubator-dubbo為例)

如何向開源專案做貢獻(以incubator-dubbo為例)

Github 上有眾多優秀的開源專案,大多數 IT 從業者將其當做了予取予求的工具庫,遇到什麼需求,先去 Github 搜一把,但有沒有想過有一天自己也可以給開源事業做一些貢獻呢?本文將會以 incubator-dubbo 專案為例,向你闡釋,給開源專案做貢獻並不是一件難事。

1 為何要給開源貢獻力量

為開源專案做貢獻得到的收益是多方面的,為了讓你有足夠的信心加入到開源專案中,我在文章最開始列舉出它的諸多好處。

1.1 鞏固技能

無論你是提交程式碼,撰寫文件,提交 Issue,組織活動,當你切身參與到一個開源專案中,相關的技能都會得到歷練,並且在開源專案中找到自己的位置。一方面,日常工作中我們中的大多數人接觸到的是業務場景,並沒有太多機會接觸到基礎架構元件,開源專案為我們提供了一個平臺,在這裡,你可以盡情挑選自己熟悉的專案為它添磚加瓦(以 Dubbo 為例,並不是所有 IT 公司都有能力自研服務治理框架);另一方面,你所提交的程式碼,會有管理員協助稽核,他們會給出專業的建議,更好的程式碼規範以及更優的程式設計思路最終都會變成你的經驗。

1.2 結交朋友

開源社群為你提供了一個平臺,在這裡,你可以認識很多純粹的技術愛好者,開源貢獻者是最符合 geek 定義的那群人,你所接觸到的往往是某個領域最厲害的那批人。

1.3 建立口碑

這是一個很好的展示個人實力的地方,俗話說:talk is cheap,show me the code. 作為技術人員,沒有什麼比一個漂亮的 Github 主頁更有說服力的了。如果你能夠為開源專案做出可觀的貢獻,你也將收穫到業界的知名度,此時開源專案的成就和你是密不可分的。

1.4 傳承開源精神

只有源源不斷的貢獻者給開源專案添磚加瓦,才可以為 Github 一類的開源社群形成良好的開源風氣。否則,只有輸出沒有輸入,開源會失去活力。

1.5 養成習慣

相信我,一旦養成了每天提交程式碼的習慣,就像你不想中斷打卡一樣,你絕不想中斷 commit。不止有英語打卡,健身打卡,還有開源打卡!

2 貢獻程式碼時的一些疑難雜症

如果你是一名開源界的新手,可能會對貢獻的流程心生畏懼。比如:我該怎麼修改程式碼並提交?我的程式碼要是存在bug怎麼辦?我的程式碼別人會不會很 low?我該如何尋找合適的開源專案?開源社群那麼多的工具和詞彙都是什麼意思?

文章的第二部分將從一個 小白 的角度,介紹一下開源中的一些常見問題。

2.1 git 常規操作

一般而言,我們選擇使用 git 來作為版本管理的工具,你不一定要非常熟練的使用它,在我看來掌握 clone,add,commit,pull,push 即可,遇到複雜的場景,你還有谷歌。

fork 與 clone

如果你只是想下載原始碼,檢視他的原始碼實現,使用 Clone or download 按鈕即可。

如果你想要給開源專案做改動,並且最終請求合併,讓開源專案存在你貢獻的程式碼,就應該使用 fork。

fork 將會複製一份當前主分支的程式碼進入到你的倉庫中,之後你所有的修改,應當基於自己的倉庫進行,在功能開發/bug 修復之後,可以使用你的倉庫向源倉庫提交 pull request。只有源倉庫的管理員才有權利合併你的請求。

一些可能對你有幫助的高階指令。

# 設定源倉庫
git remote add upstream https://github.com/apache/incubator-dubbo.git
# 拉取源倉庫的更新
git fetch upstream
# 將自己倉庫的主分支合併源倉庫的更新
git checkout master
git merge upstream/master

pull request

pull request 經常被縮寫為 PR,指的是一次向源倉庫請求合併的行為,如上是我 fork 了 incubator-dubbo 的倉庫之後才存在的操作按鈕。

源倉庫視角的 pull request

管理者會對 pull request 涉及的改動進行 review,以確保你的程式碼是符合規範的,邏輯沒有沒偏差,以及符合框架的功能需求。

2.2 Travis CI

一些自動化的 CI 流程被植入在每一次 pull request 的構建之中,用於給開源倉庫去校驗提交者的程式碼是否符合既定的規範,如:是否有編譯問題,單元測試是否通過,覆蓋率是否達標,程式碼風格是否合規等等。

一般情況下,必須通過 CI,你的 pull request 才會被管理 review。

2.3 Mailing list

每個開源專案都會有自己的貢獻規範,可以參考首頁的 Contributing,來獲取具體的資訊。incubator-dubbo 作為一個孵化中的 apache 專案,遵守了 apache 的傳統,在 Contributing 中描述道:當你有新特性想要貢獻給 Dubbo 時,官方推薦使用 Mailing list 的方式描述一遍你想要做的改動。

Mailing list 簡單來說,就是一個郵件通知機制,所有的 Dubbo 開發者都會訂閱該郵箱: [email protected] 。有任何新特性的改動,或者什麼建議想要通知其他開發者,都可以通過向該郵箱傳送郵件來達到這個目的,相同地,你也會收到其轉發的其他開發者的郵件。

或者你是一個 Dubbo 的使用者,你想要得知開發者的改造方向,也可以訂閱,這個 指南 可以幫助你訂閱 Dubbo 的 Mailing list。

作為一個 modern developer,你可能覺得 mailing list 的交流方式存在滯後性,這樣的溝通方式不是特別的高效,但它作為 apache 專案的推薦交流方式存在其特殊的原因,在此不多贅述。總之遵循一個原則:bug fix或者討論,可以在 github issue 中進行,影響較大的特性和討論則推薦在 mailing list 中展開。

3 其他貢獻形式

不僅僅只有貢獻程式碼,修復 bug 等行為才算作為開源做貢獻,以下這些行為也屬於主要形式:

3.1 撰寫文件

Dubbo文件 是其開源組成成分的重要一環,其內容原始檔位於: https://github.com/apache/incubator-dubbo-website。同樣也是一個 Git 倉庫,任何你想要對 dubbo 知識點的補充,都可以在這兒提交 pull request,只需要一些 markdown 的語法知識,和一些可有可無的 npm 語法即可。如果你覺得貢獻程式碼對於現在的自己仍然有點難度,不妨從貢獻文件開始接觸開源。

3.2 ISSUE

無論是 Github 中的 Issue 還是 mailing list 中的討論,無論是提出問題,彙報 bug,還是回答問題(bugfix 則不僅僅需要 Issue 了),協助管理者 review pull request,都是貢獻的一種形式,勿以善小而不為。

3.3 其他行為

任何你能夠想到的,可以幫助開源專案變得更好的的行為,都屬於開源貢獻。例如,給每個 Issue 打上合適的 tag,關閉重複的 Issue,連結相關聯的 Issue,線下組織沙龍,回答 Stack Overflow 上相關的問題,以及文件中一個錯別字的修改等等。

4 開源最佳實踐

4.1 有效溝通

無論你處於什麼樣的目的:僅僅是一次性的貢獻,亦或是永久性的加入社群,都的和他人進行溝通和交往,這是你要在開源圈發展必須修煉的技能。

在你開啟一個isse或PR之前,或者是在聊天室問問題之前,請牢記下面所列出的幾點建議,會讓你的工作更加的高效。

給出上下文以便於讓其他人能夠快速的理解。比方說你執行程式時遇到一個錯誤,要解釋你是如何做的,並描述如何才能再現錯誤現象。又比方說你是提交一個新的想法,要解釋你為什麼這麼想,對於專案有用處嗎(不僅僅是隻有你!)

:innocent: “當我做 Y 的時候 X 不能工作”

:cry: “X 出問題! 請修復它。”

在進一步行動前,做好準備工作。不知道沒關係,但是要展現你嘗試過、努力過。在尋求幫助之前,請確認閱讀了專案的 README、文件、問題(開放的和關閉的)、郵件列表,並搜尋了網路。當你表現出很強烈的求知慾的時候,人們是非常欣賞這點的,會很樂意的幫助你。

:innocent: “我不確定 X 是如何實現的,我查閱了相關的幫助文件,然而毫無所獲。”

:cry: “我該怎麼做 X ?”

保持請求內容短小而直接。正如傳送一份郵件,每一次的貢獻,無論是多麼的簡單,都是需要他人去查閱的。很多專案都是請求的人多,提供幫助的人少。相信我,保持簡潔,你能得到他人幫助的機會會大大的增加。

:innocent: “我很樂意寫 API 教程。”

:cry: ” 有一天我駕駛汽車行駛在高速公路上,在某個加油站加油的時候,突發奇想,我們應該這麼做,不過在我進一步解釋之前,我先和大家展示一下。。。”

讓所有的溝通都是在公開場合下進行。哪怕是很不起眼的小事,也不要去給維護者發私信,除非是你要分享一些敏感資訊(諸如安全問題或嚴重的過失)。你若能夠保持談話是公開的,很多人可以你們交換的意見中學習和受益。

:innocent: (評論) “@維護者 你好!我們該如何處理這個PR?”

:cry: (郵件) “你好,非常抱歉給發信,但是我實在很希望你能看一下我提交的PR。”

大膽的提問(但是要謹慎!)。每個人參與社群,開始的時候都是新手,哪怕是非常有經驗的貢獻者也一樣,在剛進入一個新的專案的時候,也是新手。出於同樣的原因,甚至長期維護人員並不總是熟悉一個專案的每一部分。給他們同樣的耐心,你也會得到同樣的回報。

:innocent: “感謝查看了這個錯誤,我按照您的建議做了,這是輸出結果。”

:cry: “你為什麼不修復我的問題?這難道不是你的專案嗎?”

尊重社群的決定。你的想法可能會和社群的優先順序、願景等有差異,他們可能對於你的想法提供了反饋和最後的決定的理由,這時你應該去積極的討論,並尋求妥協的辦法,維護者必須慎重的考慮你的想法。但是如果你實在是不能同意社群的做法,你可以堅持自己!保持自己的分支,或者另起爐灶。

:innocent: “你不能支援我的用例,我蠻失望,但是你的解釋僅僅是對一小部分使用者起作用,我理解是為什麼。感謝你的耐心傾聽。”

:cry: “你為什麼不支援我的用例?這是不可接受的!”

以上幾點,要銘記在心。開源是由來自世界各地的人們共同協作實現的。面臨的問題是跨語言、跨文化、不同的地理為止、不同的時區,另外,撰寫文字的溝通更是難上加難,無法傳達語氣和情緒。請讓這些會話都充滿善意吧!在以下情形中請保持禮貌:推動一個想法、請求更多的上下文、進一步澄清你的立場。既然你在網際網路找到了自己的所需,那麼請嘗試讓它變得更好!

4.2 建立 issue

你應該在遇到下列情況下,去建立一個 issue:

  • 報告你自己無法解決的錯誤
  • 討論一個高階主題或想法
  • 期望實現某新的特性,或者其它專案的想法

在 issue 的溝通中幾點實用的技巧:

  • 如果你剛好看到一個開放的issue,恰是你打算解決的, 新增評論,告訴他人你將對此展開工作,並及時響應。這樣的話,可以避免他人重複勞動。
  • 如果說某個issue已經開放很久了, 這可能是已經有人正在解決中,又或者是早已經解決過了,所以也請新增評論,在打算開始工作之前,最好是確認一下。
  • 如果你建立了一個issue,但是沒多久自己解決了, 也要新增評論,讓其他人知道,然後關閉該issue。記錄本身就是對社群的貢獻。

4.3 建立 pull request

在下面的情形時,請你務必使用 PR:

  • 提交補丁 (例如,糾正拼寫錯誤、損壞的連結、或者是其它較明顯的錯誤)
  • 開始一項別人請求的任務,或者是過去在issue中早就討論過的

一個 PR 並不代表著工作已經完成。它通常是儘早的開啟一個PR,是為了其他人可以觀看或者給作者反饋意見。只需要在子標題標記為“WIP”(正在進行中)。作者可以在後面新增很多評論。

如果說專案是託管在 GitHub上的,以下是我們總結出的提交RP的建議:

  • Fork 程式碼倉庫 並克隆到本地,在本地的倉庫配置“上游”為遠端倉庫。這樣你可以在提交你的PR時保持和“上游”同步,會減少很多解決衝突的時間。(更多關於同步的說明,請參考 這裡 .)
  • 建立一個分支 用於自己編輯。
  • 參考任何相關的issue 或者在你的RP中支援文件(比如. “Closes #37.”)
  • 包含之前和之後的快照 如果你的改動是包含了不同的 HTML/CSS。在你的PR中拖拉相應的圖片。
  • 測試你的改動! 若測試用例存在的話,跑一遍,以覆蓋你的更改,若沒有的話,則建立相應的用例。無論測試是否存在,一定要確保你的改動不會破壞掉現有的專案。
  • 和專案現有的風格保持一致 盡你最大的努力,這也就是意味著在使用縮排、分號、以及註釋很可能和你自己的風格大相徑庭,但是為了節省維護者的精力,以及未來他人更好的理解和維護,還請你容忍一下。

5 成為一個開源貢獻者

如果你有志於參與開源事業,可以嘗試從自己最熟悉的專案開始,開源並不是屬於高階開發者的專屬詞彙,它就是由你我這樣的人在需求,修復,構建中演進下去的。Let’s try it !

如果你現在在JAVA這條路上掙扎,也想在IT行業拿高薪,可以參加我們的訓練營課程,選擇最適合自己的課程學習,技術大牛親授,7個月後,進入名企拿高薪。我們的課程內容有:Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點。如果你想拿高薪的,想學習的,想就業前景好的,想跟別人競爭能取得優勢的,想進阿里面試但擔心面試不過的,你都可以來,q群號為:856443934

注:加群要求

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
 

相關推薦

如何開源專案貢獻(incubator-dubbo)

Github 上有眾多優秀的開源專案,大多數 IT 從業者將其當做了予取予求的工具庫,遇到什麼需求,先去 Github 搜一把,但有沒有想過有一天自己也可以給開源事業做一些貢獻呢?本文將會以 incubator-dubbo 專案為例,向你闡釋,給開源專案做貢獻並不是一件難事。

如何開源專案貢獻

不要問國家能為你做什麼 要問你能為國家做什麼 採坑步驟: 1.為專案做貢獻的方式是pull request 在issue裡面可以找到一些開放的任務或者標籤。 維護者會在issue加上一些標籤,你可以很容易發現一些沒有分配的任務。 2.有些牛逼的專案不接受任何的貢獻。 但是通常都有一個CONTRIBUTING.

git 怎麼開源專案貢獻,怎麼有效管理貢獻者的提交

,當作為專案貢獻者時,我們該怎麼做才能方便維護者採納更新;或者作為專案維護者時,又該怎樣有效管理大量貢獻者的提交。 5.1  分散式工作流程 同傳統的集中式版本控制系統(CVCS)不同,開發者之間的協作方式因著 Git 的分散式特性而變得更為靈活多

flask和django在建立專案了和配置上的區別(hello world

對比flask和django建立專案: flask確實簡單: # 匯入庫 # 例項化一個app # 定義一個檢視函式 # 建立templates模板(這裡需要注意的是templates檔案的目錄需要和有(app.run())的檔案要是在同一級目錄,不然會報模板找不到) #啟動

構建有無環圖(DAG)模型解決矩形巢狀問題 (nyoj16

 DAG(Directed Acyclic Graph):在圖論中,如果一個有向圖無法從某個頂點出發經過若干條邊回到該點,則這個圖是一個有向無環圖(DAG圖)。有向無環圖上的動態規劃是學習動態規劃的基礎。很多問題都可以轉化為DAG上的最長路和最短路或計數問題。 分析

1、利用介面實現動態的建立物件[選題] 1.1 建立4個類: 蘋果 香蕉 葡萄 園丁 1.2 在三種水果的構造方法中列印一句話. 蘋果類

package javademo9; import java.util.Scanner; interface Fruit{ } class Apple implements Fruit { public Apple() { System.out.println("建立了一個蘋

10大機器學習開源專案推薦(Github平均star1385)

翻譯 | suisui出品 | 人工智慧頭條(AI_Thinker)本文推薦的10大機器學習開源專案是由Myb

移動平臺播放器ijkplayer開源框架分析(IOS原始碼)

p_prepare_async_l呼叫stream_open,stream_open中建立了視訊渲染執行緒,該執行緒主要是進行視訊渲染工作,並對視訊進行同步,同步相關邏輯主要在這個執行緒裡面,同步的大概思路就是:有一個絕對時間作為同步起點,然後計算當前幀與上一幀時間差,然後與當前絕對時間基準源比較,如果不到時

如何給專案配置域名(此處部落格

配置域名的一般步驟: 1.按照以下路徑找到hosts,在裡面新增bolg.com域名 2.然後按照以下路徑找到httpd.conf,去掉# 3.然後到同級目錄下的extra下配置虛擬主機。引入到

uboot中 make xxx_config 的作用(make smdk2410_config

mdk nbsp xxx cpu clu samsung uboot 作用 頭文件 1、創建到目標板相關文件的鏈接 ln -s asm-arm asm ln -s arch-s3c24x0 asm-arm/arch ln -s proc-armv asm-arm/pr

基於TI Davinci架構的多核/雙核開發高速掃盲(OMAP L138),dm8168多核開發參考以及達芬奇系列資料user guide整理

uwa 全部 dap setting pos eclips develop serial ger 基於TI Davinci架構的雙核嵌入式應用處理器OMAPL138開發入門 原文轉自http://blog.csdn.net/wangpengqi/article/de

解決jenkins下使用HTML Publisher插件後查看html報告顯示不正常 jmeter報告

com 顯示不全 rip lis support https ima 註意 jenkins jenkins 配置使用html publisher查看jmeter html報告時,發現顯示不全,很多東西顯示不了。 項目配置: 查看html報告異常(很多資源無法加載)

更新CentOS Mysql到官方較新版本[6.5]

生成 inux 依次 font fig 目前 http line spa 需求來源: CentOS: 6.9 x64 自帶mysql版本較舊,需要卸載後安裝到5.6版本. 1.查看目前mysql 版本 2.如果發現有系統自帶mysql,而且比想要裝的5.6舊。果斷

大堆文字不如幾張圖片-論信息傳遞的方式NodeMCU入門

3-9 信息 nbsp mcu 入門 logs 文字 src 圖片 大堆文字不如幾張圖片-論信息傳遞的方式以NodeMCU入門為例

LINUX下PHP編譯添加相應的動態擴展模塊so(不需要重新編譯PHP,openssl.so

down get 階段 很多 習慣 lin 模塊 臨時 操作 本文轉自:原文鏈接 http://www.cnblogs.com/doseoer/p/4367536.html 網上我看到有很多相關的文章都是簡述這個問題的,但畢竟因為LINUX版本眾多,很多LIUNX命令或路

C#語言中數組與集合的區別(List集合

類型 添加元素 list 添加 一個 保存 操作方法 適用於 length 數組用於保存固定數量的數據,定長,占用內存少,遍歷速度快; 集合保存的數據數量,可以在程序的執行過程中,不斷發生變化,不定長,占用內存多,遍歷速度慢; 在功能上,數組能實現的所有功能,集合都能實現;

虛擬機訪問互聯網的方法 -- RedHat系

路徑 網絡連接 p地址 註意 ipad etc 不能訪問外網 正常 情況下   在虛擬機的三種網絡模式中(Host-Only、橋接、NAT),能夠實現虛擬機訪問互聯網的只有橋接與NAT模式,而Host-only主能實現虛擬機與主機兩者間的通信。 下面以RedHat系虛擬機系

微信識別圖片功能實現(讀取銀行卡)

支付 ref gb2312 sta mil img 身份證識別 manager his 一,需求講解 如圖所示,掃描圖片的時候,實現銀行卡號和銀行名稱自動回填。 二,代碼 2.1,html頁面 1 <input type="file

配置Nginx反向代理WebSocket,代理NoVNC

websocket nginx novnc linux 什麽是Nginx?Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在

BZOJ 2002 學習有根樹LCT(Link-Cut Tree)

接下來 int 操作 sel com char 如何實現 etc 慢慢 以BZOJ 2002 彈飛綿羊為例學習有根樹LCT(Link-Cut Tree) 註:本文非常簡單,只涉及有根樹LCT,對於無根樹,LCT還有幾個本文沒有提到的操作,以後慢慢更新 =v= 知識儲備