作者:kiritomoe
来源:Kirito的技术分享
Github 上有众多优秀的开源项目,大多数 IT 从业者将其当做了予取予求的工具库,遇到什么需求,先去 Github 搜一把,但有没有想过有一天自己也可以给开源事业做一些贡献呢?
本文将会以 incubator-dubbo 项目为例,向你阐释,给开源项目做贡献并不是一件难事。
为开源项目做贡献得到的收益是多方面的,为了让你有足够的信心加入到开源项目中,我在文章最开始列举出它的诸多好处。
无论你是提交代码,撰写文档,提交 Issue,组织活动,当你切身参与到一个开源项目中,相关的技能都会得到历练,并且在开源项目中找到自己的位置。一方面,日常工作中我们中的大多数人接触到的是业务场景,并没有太多机会接触到基础架构组件,开源项目为我们提供了一个平台,在这里,你可以尽情挑选自己熟悉的项目为它添砖加瓦(以 Dubbo 为例,并不是所有 IT 公司都有能力自研服务治理框架);另一方面,你所提交的代码,会有管理员协助审核,他们会给出专业的建议,更好的代码规范以及更优的编程思路最终都会变成你的经验。
开源社区为你提供了一个平台,在这里,你可以认识很多纯粹的技术爱好者,开源贡献者是最符合 geek 定义的那群人,你所接触到的往往是某个领域最厉害的那批人。
这是一个很好的展示个人实力的地方,俗话说:talk is cheap,show me the code. 作为技术人员,没有什么比一个漂亮的 Github 主页更有说服力的了。如果你能够为开源项目做出可观的贡献,你也将收获到业界的知名度,此时开源项目的成就和你是密不可分的。
只有源源不断的贡献者给开源项目添砖加瓦,才可以为 Github 一类的开源社区形成良好的开源风气。否则,只有输出没有输入,开源会失去活力。
相信我,一旦养成了每天提交代码的习惯,就像你不想中断打卡一样,你绝不想中断 commit。不止有英语打卡,健身打卡,还有开源打卡!
如果你是一名开源界的新手,可能会对贡献的流程心生畏惧。比如:我该怎么修改代码并提交?我的代码要是存在bug怎么办?我的代码别人会不会很 low?我该如何寻找合适的开源项目?开源社区那么多的工具和词汇都是什么意思?
文章的第二部分将从一个小白的角度,介绍一下开源中的一些常见问题。
一般而言,我们选择使用 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,以确保你的代码是符合规范的,逻辑没有没偏差,以及符合框架的功能需求。
一些自动化的 CI 流程被植入在每一次 pull request 的构建之中,用于给开源仓库去校验提交者的代码是否符合既定的规范,如:是否有编译问题,单元测试是否通过,覆盖率是否达标,代码风格是否合规等等。
一般情况下,必须通过 CI,你的 pull request 才会被管理 review。
每个开源项目都会有自己的贡献规范,可以参考首页的 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 中展开。
不仅仅只有贡献代码,修复 bug 等行为才算作为开源做贡献,以下这些行为也属于主要形式:
Dubbo文档是其开源组成成分的重要一环,其内容源文件位于:https://github.com/apache/incubator-dubbo-website。同样也是一个 Git 仓库,任何你想要对 dubbo 知识点的补充,都可以在这儿提交 pull request,只需要一些 markdown 的语法知识,和一些可有可无的 npm 语法即可。如果你觉得贡献代码对于现在的自己仍然有点难度,不妨从贡献文档开始接触开源。
无论是 Github 中的 Issue 还是 mailing list 中的讨论,无论是提出问题,汇报 bug,还是回答问题(bugfix 则不仅仅需要 Issue 了),协助管理者 review pull request,都是贡献的一种形式,勿以善小而不为。
任何你能够想到的,可以帮助开源项目变得更好的的行为,都属于开源贡献。例如,给每个 Issue 打上合适的 tag,关闭重复的 Issue,链接相关联的 Issue,线下组织沙龙,回答 Stack Overflow 上相关的问题,以及文档中一个错别字的修改等等。
无论你处于什么样的目的:仅仅是一次性的贡献,亦或是永久性的加入社区,都的和他人进行沟通和交往,这是你要在开源圈发展必须修炼的技能。
在你开启一个isse或PR之前,或者是在聊天室问问题之前,请牢记下面所列出的几点建议,会让你的工作更加的高效。
给出上下文 以便于让其他人能够快速的理解。比方说你运行程序时遇到一个错误,要解释你是如何做的,并描述如何才能再现错误现象。又比方说你是提交一个新的想法,要解释你为什么这么想,对于项目有用处吗(不仅仅是只有你!)