【伯乐在线导读】:对程序员而言,参与开源有着难以置信的回报,比如有一个自己的出色开源项目,在技术面试能增色很多,极大加分。所以,越来越多的人在参与到开源运动中来。但对应很多新手来说,如何参与开源做出第一个贡献,如何发起一个新项目,却成了一个问题。
2月14日,GitHub 官博发文宣告正式推出「开源指南」,旨在方便想参与到开源的个人和组织。「开源指南」是一个系列集合,内容简洁明了,分了 10 个方面。伯乐在线在本文中翻译了首篇。
想为开源做贡献吗?这是一份写给新手和老手的开源贡献指南。
在 freenode 的工作使我学到了很多技能,后来我将它们运用到我的大学学习和实际工作中。我认为在开源项目中的工作对我的帮助和它对项目本身的帮助一样大!— @errietta,《为什么我热爱为开源软件做贡献》
为开源做贡献是学习、教学和在你能想象的任何技能上积累经验的有益途径。
为什么人们为开源做贡献?有许多理由!
不管是写代码、用户界面设计、平面造型设计、写作,或是规划,如果你在寻找实践机会,在开源项目中总有适合你的任务。
拥有热情而友好的团体组织的开源项目使人们在多年以来常常回访。许多人通过参与开源成了一辈子的好朋友,无论是在会议中碰面还是深夜里线上聊玉米煎饼。
在共享的项目中与他人一起工作,意味着你必须解释你做事的方式,此外还要寻求他人的帮助。学习和教导,对参与其中的所有人都是一种满足的活动。
根据定义,你的所有开源工作都是公开的,这意味着你得到了免费的样本,可以带到任何地方,作为你能做事情的证明。
开源提供了练习领导才能和管理技能的机会,比如解决冲突、组织不同团队的人,和给工作排优先级。
你不一定要成为终生的贡献者才能享受参与开源的乐趣。你是否曾在网站上看到一个拼写错误,希望某人会修正它?在开源项目中,你就能做到这点。开源帮助人们在他们的生命中和他们对世界的体验中感受到力量,这本身是令人满足的。
如果你是一个开源贡献方面的新人,这个过程可能是令人生畏的。怎么找到合适的项目?不会写代码怎么办?某件事出岔子了会怎样?
不用担心!有各种各样的方法参与开源项目,并且有几个诀窍会帮你最大程度地运用你的经验。
关于为开源做贡献,一个常见的误解是你必须贡献代码。事实上,常常是项目中非代码的部分大多被遗漏和忽视了。通过参与提供非代码的贡献,你会给项目做出巨大的帮助!
我因为在 CocoaPods 中的工作出名,但大多数人不知道实际上我在 CocoaPods 工具本身上并没有做任何实际的工作。我在这个项目上花费的时间,大部分是在做诸如文档和品牌推广工作之类的事情。— @orta,《默认转向开源软件》
即使你是一名开发者,非代码贡献也是参与项目并结识其它团体成员的极好方式。建立那样的关系,将给予你在项目的其它部分工作的机会。
我初次接触 Python 开发组(也叫做 python-dev)是在 2002 年 6 月 17 日,我就接受我的补丁事宜向邮件列表发电子邮件。很快我发现了开源中的一个 bug,并决定把这个错误写成邮件摘要汇报给小组。我对这个主题做了澄清,他们为麻烦我做这件事而表示了大大的歉意。但更关键的是,当某人指出的某些东西需要修正时,我能够看到的。— @brettcannon, “Maintainer Stories”
说真的,“文档”极其重要。到目前为止,Babel(Kittens 的开源项目)的文档一直很棒,已经成为了它的杀手级特性。但是肯定还需要做一些工作加以完善,甚至加一些段落上去,对此我非常感激。— @kittens,《需要贡献者》
虽然“开源”通常指软件,但你可以在任何事情上协作。有书籍、食谱、清单和课程是作为开源项目开发的。
例如:
即使你是一名软件开发者,在文档项目上的工作也能帮你在开源方面起步。在与代码无关的项目中工作常常不那么令人生畏,而且协作的过程将增强你的自信和经验。
如果你去看一个 Issue 追踪器,发现事情看起来令人困惑,并不是只有你这样。这些工具需要大量的隐性知识,但人们能帮你驾驭它,你也能向他们提问。— @shaunagm,《怎样为开源做贡献》
对任何超过修正拼写错误的事情来说,为开源做贡献就像在社交聚会上走向一群陌生人。如果当他们正在深入讨论金鱼时,你开始谈论美洲鸵,他们可能有点奇怪地看着你。
在带着你自己的建议盲目投入以前,先从学习怎样观察聚会中的人,参与他们讨论的话题开始。这样做能增加你的想法被注意到和听取的可能性。
每个开源团体都是不同的。
在一个开源项目中花了若干年时间意味着你已经了解了一个开源项目。转向一个不同的项目,你可能会发现词汇、规范和沟通方式完全不同。
即便如此,许多开源项目遵循着相似的组织结构。理解不同的团体角色和总体过程将帮你迅速熟悉任何新项目。
一个典型的开源项目有以下几类人:
大的项目可能还有下属委员会或工作组,他们致力于不同的任务,比如工具、分类(triage)、团体节制(community moderation)和活动组织。在项目的网站上寻找“team”页面,或者在仓库(repository)里寻找治理文档(governance documentation),来找到此类信息。
项目也有文档。这些文件通常列在仓库(repository)的顶层。
最后,开源项目使用以下工具来组织讨论。通读档案文件将为你很好地描绘该团体是怎样思考和工作的。
既然你已经弄明白开源项目是怎样工作的,是时候找到一个要做贡献的项目了!
如果你之前从未为开源做过贡献,听听美国总统约翰·F·肯尼迪的建议,他曾经说:“不要问你的国家能为你做什么-问问你能为你的国家做什么。”
为开源做贡献在所有层面和不同项目间都能发生。你不必对你的第一个确切的贡献是什么,或它看起来是什么样想得过多。
相反地,从考虑你已经在使用的或想要使用的项目开始。你会积极地做贡献的项目正是你发现自己会回访的项目。
在那些项目里,无论何时你发现自己想到某件事可以变的更好或不同,按照你的直觉行动吧。
开源不是一个排外的俱乐部;它是由和你一样的人做出来的。“开源”只是一个花哨的术语,为了把世界上的问题都作为可修正的来处理。
你可能会细看一份自述文件,发现一个断开的链接或一个拼写错误。或者,你是一个新用户,你发现某样东西毁坏了,或是一个 Issue 你认为实际上应该在文档中。与其忽略它并继续,或请求其他人修正它,不如看看你能不能参与帮忙。这就是开源的真谛!
对开源的非正式贡献中,有28%是文档,比如拼写错误修正、重排格式,或翻译。
你也可以使用下列资源之一来帮你发现新项目:
当你找到一个你想要做贡献的项目,做一个快速的浏览来确认该项目适合接受贡献。否则,你的努力工作可能永远得不到回应。
这是一份便于使用的检查表,用来评估一个项目对新贡献者来说好不好。
满足开源的定义
项目积极地接受贡献
看看主分支上的提交活动。在 GitHub 上,你可以在仓库的主页上看到此信息。
下一步,看看项目的 Issue 。
现在对项目的 pull requests做同样的动作。
友好而热情的项目标志着他们乐于接受新的贡献者。
无论何时你看一个长的讨论帖,抽查一下较晚进入这个帖子的核心开发者的反应。他们是否作出建设性的总结,在做出决策和付诸实施时,是否同时还保持礼貌?如果你看到发生许多口水仗,那通常表明精力用在了争论而不是开发上。— @kfogel,创作开源软件
你已经找到一个你喜欢的项目,并且你已经准备好作出贡献。最后!这里告诉你怎样以正确的方式作出你的贡献。
不管你是一次性的贡献者或是试着加入一个团体,与他人一起工作是你将在开源中发展的最重要的技能之一。
作为一个新贡献者,我很快认识到,如果我想要能关闭 Issue ,我必须提问。我浏览了代码库。一旦我对发生的事有了一些认识,我请求更多的指点。就是这样!在得到我需要的所有相关细节后,我能解答 Issue 了。— @shubheksha,一个新手在开源世界中的颠簸旅途
在你打开一个 Issue 或使用pull request,或是在聊天中提问以前,记住这些要点可以使你的想法有效地被别人理解。
给出上下文。帮助他人快速赶上进度。如果你遇到一个错误,解释你正准备做什么和怎么重现它。如果你提出一个新主张,解释为什么你认为它对项目有用(不只是对你!)。
😇 “当我做 Y 时 X 没有发生”
😢 “X 坏了!请修好。”
事先做好功课。不懂没什么,但要表现出你试过了。在求助之前,务必查看项目的自述文件、文档、 Issue (开放的或关闭的)、邮件列表,并且在因特网上搜索答案。当你证明你在试着学习时,人们会表示赞赏。
😇“我不确定怎么实现 X。我查过了帮助文档,没找到哪里有提到。”
😢“我怎么做 X?”
请求要简短而直接。和发送电子邮件很像,每一个贡献,不管多简单或多有帮助,都需要某个其他人的审查。许多项目收到的请求比能提供帮助的人多。简明一点。你会提高某人能帮到你的可能性。
😇“我想写一份 API 教程。”
😢“前几天我正在高速公路上开车,停下来加油,然后我对我们应该做的事情有了这个惊人的想法,但在我解释这个想法之前,让我向你展示……”
交流要对公众可见。尽管有点诱人,但不要私下联系维护者,除非你需要分享敏感信息(比如安全问题或严重的违反行为)。当你使对话对公众可见时,更多的人能从你的交流中学习并受益。讨论本身也可能是一种贡献。
😇(作为评论)“@-maintainer 你好!我们在这个 pull request 功能上怎么继续?”
😢(作为一封电子邮件)“你好,抱歉通过电子邮件麻烦你了,但我不知道你有没有可能审查我的 pull request ”
可以提问(但要耐心!)。每个人在某个时刻都曾是项目的新人,而且即使有经验的贡献者查看新项目时也需要赶上进度。由此类推,即使长期贡献者也并非总是对项目的每个部分都熟悉。对他们表现出与你希望他们对你表现出的同样的耐心。
😇“谢谢你研究这个错误。我按你的建议做了。这是输出结果。”
😢 “为什么你不能解决我的问题?这不是你的项目吗?”
尊重团体的决定。你的想法可能与项目的优先考虑或愿景不同。他们可能提供反馈或决定不执行你的想法。你应该讨论并寻求妥协,而维护者必须花比你更长的时间适应你的决定。如果你不同意他们的方向,你总是可以致力于你自己的 fork 或启动你自己的项目。
😇“我对你不能支持我的用例感到失望,但既然你已经解释了它只影响一小部分用户,我理解为什么了。谢谢倾听。”
😢“为什么你不支持我的用例?这无法接受!”
最重要的是,要优雅。开源由来自世界各地的合作者组成。上下文在跨越语言、文化、地理和时区时会丢失。另外,书面交流使得传递语调或心情更困难。假设这些对话的意图都是好的。礼貌的把想法推后,要求更多的上下文,或进一步澄清你的态度,这些都是好的做法。使因特网成为比你发现它时更好的地方。
在做任何事之前,做一个快速的检查,确保你的想法没有在其它地方被讨论过。略读项目的自述文件、 Issue (开放的和关闭的)、邮件列表和 Stack Overflow。你不一定要花几个小时检查一切,但对几个关键词的快速搜索会大有帮助。
如果你在其它地方找不到你的想法,你已经准备好开始行动了。如果项目在 GitHub 上,你多半会通过开启一个 Issue 或使用 pull request 来沟通:
在你开启一个 Issue 或 使用 pull request 以前,检查项目的贡献文档(通常是一个叫做 CONTRIBUTING 的文件,或者在自述文件里),看看你是否需要把特定的东西包含进去。例如,他们可能要求你遵照一个模版,或是要求你使用测试。
如果你想做一个实质的贡献,在着手以前先开一个 Issue 提问。一个有帮助的做法是,在着手进行可能不被接受的工作以前,先对项目观察一段时间(在 GitHub 上,你可以点击“Watch”来获取所有会话的通知),并且了解团体成员。
找一个你经常使用的项目,在 GitHub 上“ Watch”它,阅读每个 Issue 和使用 pull request,你能从中学到很多。— @gaearon 参与项目
通常,在以下情况下你应该开一个 Issue :
Issue 沟通的诀窍:
通常,在以下情况下你应该使用 pull request:
使用 pull reques 并不一定代表已完成的工作。在早期开一个 pull request 往往更好,这样其他人可以观察你的进展或给予反馈。只要在主题行里把它标记为“WIP”(进行中的工作)。以后你总能添加更多的提交。
如果项目是在 GitHub 上,这是怎样提交一个 pull request 的方法:
如果你第一次使用 Pull Request,查看“ 做一个 Pull Request ”,这是 @kentcdodds 创建的,可作为一个免费的演练资源。
你做到了!祝贺你成为一名开源贡献者。我们希望这是许多次中的第一次。
在你提交贡献之后,会发生以下情形之一:
但愿你在做贡献以前检查过项目的活跃迹象。然而,即使对一个活跃的项目来说,也有可能你的贡献得不到回应。
如果超过一星期了你还没有得到回应,有理由在同一个线程(thread)中礼貌地回复,请某人做审查。如果你知道审查你的贡献的合适的人的名字,你可以在线程中@-提到他们。
不要私下接触那个人;记住,公开的交流对开源项目来说至关重要。
如果你做了一个礼貌的“碰撞”,还是没人回应,那可能永远也不会有人回应。这种滋味不好受,但不要因此气馁。每个人都经历过这种事!你没有得到回应可能有很多原因,包括可能不受你控制的个人境况。试着找到另一个项目或方式做贡献。如果有什么理由来解释为什么在其它团体成员投入这个项目此并作出回应前不要在贡献项目上投入太多时间的话,这就是很好的一个。
你常常会被要求对你的贡献做改动,无论是对你的想法范围的反馈,还是对你代码的改动。
当某人要求做改动时,要作出响应。他们花了时间审查你的贡献。开了一个 pull request 然后就走掉是不好的表现。如果你不知道怎样做改动,研究该问题,然后如果需要的话寻求帮助。
如果你不再有时间在该 Issue 上工作(例如,如果会话已经进行了几个月,你的境况发生了变化),让维护者知晓,这样他们就不再期待一个回应。其他人可能乐于接手。
最后,你的贡献可能会,也可能不会被接受。但愿你没有在那里面做太多的工作。如果你不确定它为什么没被接受,要求维护者的反馈和说明是完全合理的。然而最终,这是他们的决定,你需要表示尊重。不要争论或怀有敌意。如果你意见不同,始终欢迎你 fork 并在你自己的版本上工作。
好极了!你成功地做了开源贡献!
不管你刚刚完成了你的第一个开源贡献,或者你正在寻找新的贡献方式,我们希望你收到鼓舞并采取行动。即使你的贡献没有被接受,当维护者付出努力帮助你时,不要忘了说声谢谢。开源正是由像你一样的人造就的:选一个 Issue 、开 pull request 、评论,或逐一举手击掌。