在这篇文章里,我想和你分享我对开源的理解。

让我们先从简单的开始。

你知道什么是产品吗?你日常轻松购买的某种东西就是产品,比如餐馆里的卷饼。但是要制作这款产品就需要遵循一定的步骤:在餐馆里,懂食谱的厨师熟练地使用相同的配方和相同的成分,确保每份卷饼味道可口。

你不仅可以通过贡献开源来进入某个技术领域,实现职业转型或促进现有职业的发展,还能以此来帮助社区!

在大多数餐馆,如果你走进去询问厨师:“我非常喜欢您做的卷饼,可以把制作配方给我吗?”,他们通常都会拒绝——因为配方并非开源。开源就是除了产品本身,你还能够获得制作产品的食谱和配方,然后你在家里也可以制作出同样的卷饼。

image-2
图片来自 Pixabay,作者 samuelfernandezrivera

现在假设你开始制作卷饼了,但你不想吃那么多肉,于是用鳄梨取而代之。在这种情况下,你拿到了食谱并用鳄梨代替了肉,接着完全按照剩余的步骤进行下去,然后看看做出的卷饼是什么样子的。

结果可能是你做的卷饼比餐馆里的还要好吃。如果餐馆是以开源项目的形式运作的,你就可以对厨师说:“嘿,你的卷饼很好吃,但我加了一些鳄梨之后味道更棒了!可以把这个配方加入到你的食谱中哦。”

此时厨师就扮演了产品维护者的角色,他们可能会接受你的建议,也可能认为添加鳄梨是个坏主意,不符合餐馆的理念。无论如何,通过分享对项目的修改,你成为了一名开源贡献者。

恭喜你!

可以为开源项目做哪些贡献?

Firefox 浏览器就是开源项目的一个范例。它是由数千行源代码和如何将此源代码转换为可用产品(如 Web 浏览器)的指令组成。这些代码是公开的,每个人都能获取、阅读、评审或构建它。每个想要修改 Firefox 的人都可以更改源代码并构建自定义版本。不仅如此,每个人还可以将自定义的修改反馈给项目维护者。

然而,代码并不是开源项目的全部,还有用户界面和图形设计。没错,即使像 Vim 这样的终端程序也有自己的图形界面。

你无需编写代码即可为开源做贡献!

除了界面,还有用户交互、可用性和用户体验(UX)等等——这些在近几十年来越来越重要。如果你拥有设计背景,精于艺术或心理学,你就可以在 UI/UX 领域施展能力。产品的另一个组成部分是媒体,包括声音、图形或视频,这些元素虽然不是所有项目必备的,但也挺常见。

文档是项目中经常被忽视的一部分。改进文档也是向开源社区做贡献的一种方式。如果你热衷于文字创作、文章编辑或翻译,那你也能成为开源社区的贡献者。

此外,开源项目经常缺少市场运营人员,如果你能解决运营问题,整个社区都会随之受益,因为这会吸引更多潜在的贡献者。

最后还有法务工作者,这类人群在普通开源项目中相当罕见,多见于大型项目。有很多律师为开源项目处理法务问题,而他们中的大多数都是志愿者。

如果你可以写散文、画画、制作音乐,是一个好的营销人员,或者是律师,那么,开源社区需要你!

如果你觉得自己无法胜任设计、修改代码、编写许可证等工作,不必担心,你依然可以做出贡献,比如报告一个错误或提出修改建议。

最好的状态是这样的:每个成员都贡献出一点点时间、一点点努力、一点点经验,整个社区协作产出一款出色的产品,而且通常是一款免费产品!

觉得自己不是一位创造者?去发现 bug、或者向程序猿提需求吧!

为什么值得我花时间?

2

为什么向开源社区做贡献是值得的?为什么你要在提建议、写代码或翻译文章上花费时间,而不是出去走走玩玩?有很多理由, 所有理由的前提是:对开源社区做出的贡献是公开可见的,每个人都能看见其他任何人所做的事情,这种感觉非常棒!

提升竞争力

当你在编写代码,设计界面,或者绘制图形时,你就是在学习,这对那些正在寻求职业转型的人来说是很好的锻炼机会。在开源世界,没有人会在意你是一个资深开发人员还是一个园艺工人,真正重要的是你所做贡献的质量。当你在开源项目中证明了自己,你将获得宝贵的经验,不用再觉得自己是刚从训练营毕业的新手,你已经是社区的正式成员,所有人都看得到你的贡献。

当你在某项技术工作中遇到困难,想要转型做别的,那么参与开源贡献是一个很好的途径。比如,你是一名 COBOL 开发者,想要成为一名 UX 设计师 ,那么从现在开始尝试改进 Firefox 的交互体验,为开源做出贡献吧。如果你的建议被社区接受,那么你就可以在简历中新增一项工作经历:Firefox 交互设计师。像这样,你既能学到有用的知识,又能丰富自己的经历,一箭双雕。

提升知名度

加入开源社区之后,你会很快地认识新的小伙伴,接触共事的团队成员,你可以向他们学习并与他们交流想法。

另一个加入开源社区的好处是你会自动地获得更多的曝光机会。举个例子,有人通过访问你所在的开源项目找到你的 YouTube 频道,或者通过 LinkedIn 为你提供工作机会。

目前 IT 行业招聘人员们寻找人才的一个重要渠道就是 GitHub,把你的代码发布到 GitHub 就相当于编写了一份所有人都能验证的简历,而无需联系你之前的雇主或者客户。如果你的个人 GitHub 资料包含了跳转到领英或个人主页的链接,那么你找到梦想中工作的机会将大幅增加。

记住,你甚至都不必拥有特定领域的从业经历,对于招聘者来说,你对开源的贡献就是你具备经验的最好凭证!

寻找工作机会或新的客户

如果你真的很优秀,你将会获得为开源项目工作的有偿 offer。这主要是指那些有稳定财务来源的开源项目,可能是获得公司或者非营利组织的支持。

招募贡献者

你还可以招募到一些有潜力的新人。如果你做了一些酷炫且有用的项目,请毫不犹豫地把它开源,这样就有机会让其他人帮你改进。

帮助他人

另一个参加开源的好处是,你将有机会为他人做一些有意义的事情并且获得尊敬。你收到的所有“感谢”将让你觉得你所花费的心血都是值得的,而且你也拥有了参与一些很棒项目的经历。

有机会接触到很棒的统计数据

很多人很喜欢统计数据,对他们而言,GitHub 就是一块宝藏。我们在 GitHub 上的每一次提交,都会在一个日历上产生绿色方块标记,每天的提交数越多,对应方块的颜色越明亮。当我们连续几天都有提交时,类似于每天打卡,GitHub 会保留分数以供将来参考。

image-3
GitHub 贡献数据(不是我的)

如何找到你的第一个项目?

你可以通过多种方式找到想要贡献的项目。首先,像火狐和安卓这样的重量级项目拥有庞大的用户基数,需要大量的修改和优化。一旦你向这种项目提交了代码,你的修改将会被数百万人看到。你可以访问 GitHub 看看有哪些流行的仓库,比如,目前 GitHub上拥有最多 star 的项目是 freeCodeCamp

image-4
GitHub上拥有最多 star 的仓库

如果你是个新手,我不会推荐上面第一种方式。一个庞大项目最大的优势往往也是它最不好的地方。每个人都想做出贡献,但是维护人员的数量是极为有限的。如果你真的想产生影响,不如试试一些小规模的、处于上升阶段的项目。GitHub Trending 就是一个好的方法。

image-5
GitHub上的热门项目

另一种方式是选择 awesome 项目作为第一次贡献者,这是比较节省精力的方法。awesome 项目是一个链接列表的大集合。比如,awesome-shell 列出了一些酷炫的命令行工具,而 awesome-JavaScript 列出了每天涌出的优秀 JS 框架, 当然还有 Mind Expanding Booksawesome_lists 等等。

为什么说这是个好办法?因为给这些项目做贡献的门槛比较低,而贡献的成就感更容易刺激产生多巴胺,多巴胺又会刺激做下个贡献。一旦皮球开始滚动,就很难让它停下来了。

我推荐的最后一个方法是参加大型开源活动,比如每年十月举办的 Hacktoberfest,参与者需要提交5次 Pull Request(即 5 次贡献),每个完成任务的参与者都会从赞助方那里领取到精美的礼物(T恤或贴纸)。为了让降低参与门槛,活动网站上会列出一些入门的示例项目以供选择。

另一个类似的活动是 Google Summer of Code。你可以参考往期的项目列表,也许这回给你带来灵感!哦对了,这里还有一个 Awesome First PR Opportunities 列表。

如果你希望持续不断地参与开源,你需要先找到适合的项目,这样的话对你自身的提高大有裨益,也能保证高质量的工作。

如何做出有价值的贡献?

image-6
图片来自 Unsplash,作者 rawpixel

我们现在了解了为什么贡献开源以及在哪里参与开源,现在我们讨论一下如何让我们的贡献变得有价值。毫无意义的贡献是不会被接受的,所以最好有所准备。

我们需要尊重工作须知

首先,我们需要尊重他人制定的工作须知。在许多项目中,你可以找到像 CONTRIBUTORS.md 这样的文档,它说明了做贡献的首选方式。如果项目中没有 CONTRIBUTORS.md,你也可以阅读 README.md 或项目 wiki 页面,熟悉并理解这些规则,然后按照规则参与开源。

如果你没有遵循开发指南列出的规则,很可能在 review 之前就被拒绝。那些规则就是为了节省维护者的时间的,如果你不遵守,那么维护者会认为你对待其它工作的时候也经常粗心大意。

思考你的贡献对他人有着怎样的价值

当我们知道了怎样参与开源,下一步让我们思考一下我们的贡献究竟对他人有着怎样的价值。想象有一家生产定制西服的公司,你在门店里买了一套西服然后穿着它去了酒吧。你突发灵感,把开瓶器挂在了西服上,这样每次去酒吧喝酒的时候,你都能随时使用衣服上的开瓶器打开啤酒了。

于是你把这个“伟大的想法”告诉了裁缝,让他在制作西服时顺便挂上一个开瓶器。然而,无论你的想法多么具有独创性,裁缝都是不可能同意的,就像开源项目的维护者不会接受一个与其观念不同的代码提交。这并不是说你的工作很差或者毫无价值,而是你提交的功能特性仅仅适用于极小部分用户,不能代表大部分用户的需求。既然每个功能都需要维护成本并确保其稳定性,项目维护者自然就需要确保每个功能点都能为大多数用户带来价值。

详尽沟通

如果你提交的不是功能点的修改,而是一篇报告,那么你一定详细描述,尽可能地把问题的背景解释清楚。这点建议当你在报告 bug 时格外有用。你描述得越详细,别人在修复问题时就会更容易直击要害。请记住,列出可能的用例和预期的行为,忽略与报告不相关的任何细节。比如,你想让某个元素变成绿色,因为这能够与竞品相匹配,那么你长篇累牍地描述竞争的背景则会显得有点多余。

运行、测试、校验,提交前仔细检查

在提交代码之前要详细地检查和测试,确保你的更改针对的是当前的开发版本,而不是某个历史版本。记住你只需运行一次测试,而项目维护者需要每天运行各种各样的测试,为了节省他们时间,你需要确保一切都运行正常。这也体现出你严谨的态度,而不是马马虎虎地提交一份半成品。

直面批评

image-7
图片来自 Unsplash,作者 Wes Hicks


请记住这点:你每次在网上发布一些东西的时候,都是把自己暴露在攻击之下。不管你发布的是一句评论,一张照片,一篇文章,还是一份代码,你都可能受到批评。所以,请对批评的声音持开放的态度,这样会有助于你的成长。

有些批评甚至是毫无根据的。因此,在你分享自己的工作之前,需要想想如何处理各种各样的批评,这样你才会为那些终将到来的批评做好准备,而不是每次都默默地慢慢消化。

我们的最佳想法并非对所有人都是最佳的

首先,你能想到的最佳想法可能并不是对所有人都是如此,请千万记住这点。当有人告诉你开瓶器跟西服根本就不搭的时候,不要觉得受到了冒犯。如果这是项目维护者的观点,你一定要尊重,这将会是你下次参与开源项目的宝贵经验。或者你也可以参与那些接受你的“最佳想法”的项目。

我们最好的作品可能并不符合标准

尽管话很难听,但你的最佳作品可能并不符合标准。我亲身经历过这种事情,我参与了一个项目,本想在第一次提交时就做到完美(但只是我认为的“完美”),毕竟我知道需要注意哪些事情。但是结果我收到了一份指导我如何写出好代码的教程——我发送了代码,过段时间收到了答复,几乎每一行代码都被高亮标记出来,有趣的是,所有的评论都是有理有据并且准确的。我眼中的完美在专家眼中却并非如此。我根据批注做出了修改然后重新提交了代码,这次我只收到了五个批注。

即使你已经做得很好了,仍会有人推动你去做得更好,这就是代码 reviewer 的目的。他们并不是在批评或责怪你,而是在帮助你,请记住这点!

即使我们做到了能做的一切,还是可能被拒绝

有时你仅仅得到一个简短直接的回复, “no”,这让你感觉无能为力。你仍然坚信把开瓶器挂在西服上是个好主意,这时该怎么办?是时候创造你自己的项目了。在开源世界里,在已存在项目的基础上创建新项目的行为叫作“新建分支”。

相应的,新项目被称为原项目的“分支”。比如,Ubuntu 就是 Debian 的一个分支。如果维护者拒绝把你的代码合入他的项目,你可以考虑新建一个分支,自己成为项目维护者。当然只在极端情况下才应这样做,因为这不仅给两方维护者带来负担,也会给社区造成困惑。如果你不幸恰好收到了 “no”,你应该好好想想得到这个答复背后的原因,这将会成为你未来宝贵的经验。

网络暴力无处不在

现在来谈谈网络暴力。

互联网给人一种匿名感,涌现了一种亚文化:“键盘侠”(或者“网络喷子”)以故意诋毁他人为乐。这种亚文化被称为“网络暴力”。我自己还没遇到这种情况,但我推荐你阅读 Ragen Chastain 写的文章 “The Complete Guide to Understanding and Dealing With Online Trolls”,它将帮助你为这种令人不适的遭遇做好准备。

通过开源赚钱

image-8
图片来自 Unsplash,作者 rawpixel

如果你已经读到了这里,你可能会想是不是有可能在为开源项目工作的同时赚点外快。

当然可以!

虽然软件本身通常是免费使用的,但是会有其它方式让你利用开源项目赚钱。赚钱是一门艺术,因为一些办法只适用于你自己,在别人那里却不管用,它是门“伪科学”。

普遍适用的方法

我最喜欢的方法就是“捐款”按钮,你可以在我的一个叫 Songcorder 的项目中看到这是怎样的。捐款人可以通过 PayPal 支付大于 15 美元的捐款,或者点击 Buy me a Coffee 支付小于 15 美元的捐款。

(你也可以在这里 https://www.freecodecamp.org/donate 为 freeCodeCamp 捐款,你的每 1 美元捐款将为全世界人们提供 50 小时免费的编程教育机会。)

image-9

除了通用的按钮之外,还有一些开源项目专用的方法,比如 Gittip/Liberapay(后者经常换名字)。有趣的是,Liberapay 所支持的最受欢迎的仓库是 awesome

这与 Flattr 很类似。你可以选择每月要捐的金额,当你认可某些作品时,作品的作者将获得捐款的一部分。也就是说,如果你决定每月向开源项目捐 5 美元,在某月你认可 4 个项目的工作(通过 star 或者点击 Flattr 按钮),那么每个项目的作者将会得到 1.25 美元。就是这么简单。

image-10
与 Liberapay 关联的仓库

除了支持整个项目,你也可以直接(近乎直接)向开发者捐款。Tip4Commit 就是以这种方式运作的,支持者向某项目的账户存入一定数量的比特币,然后每个开发者就可以从这个账户分到一笔钱了。

另一个可能的方法是 Patreon,支持者将固定金额的现金分配给他们选择的任何开发者,而不是平均分配预算。如果你想了解这种方式是否适合你,可以阅读 Erika Sauter 写的文章《Why Patreon is Dope AF for Creators》。享有盛誉的 Sindre Sorhus 就是最主要的开源维护者之一,而像 HomebrewLinuxbrew 这种颇具规模的项目同样也使用 Patreon 筹集资金。

如果你把开源视为业余爱好,那么你可以尝试上面提到的所有方法。幸运的话,它们甚至可以让你将兴趣变成全职工作。然而,实际上,如果你想使开源项目成为你的日常工作,一个常见的方式是提供咨询服务,比如向企业客户出售专业功能或者帮助企业客户部署和定制产品。很多企业缺乏利用开源项目解决其内部需求的能力,而谁又能比原始项目的维护者更能胜任这项工作呢?

如果你在帮助别人的同时能够获得报酬,那就这样去做吧!

众筹

为开源项目筹集资金的一种流行方法是众筹,有很多提供这类服务的平台。比如, Kickstarter 为开源语音助手 Mycroft Mark II 筹集了启动资金。另一个平台 Indiegogo为电子邮件客户 Geary 主持了一场众筹活动,但很可惜,这个项目未能达成它的预期目标。MediaGoblin 甚至在没有任何第三方的情况下启动了自己的 众筹系列活动

如果担心你无法找到很多众筹者,那么你可以尝试融资。在我的印象中,有至少两个提供融资的基金会,其中一个是著名的 Travis CI 公司旗下的 Travis Foundation,另一个是开发了 Firefox 浏览器的Mozilla 基金会。

目前我介绍的大多数工具和方法都是适用于开源项目维护者的,而开源贡献者也可以通过做“悬赏任务”来赚钱。项目方在某个平台发布需求,贡献者完成这些需求即可获得奖励。目前 Bountysource 似乎是最受欢迎的众包平台。

如果你更喜欢将加密货币作为付款方式,Gitcoin 是一个与众包具有相似原理的平台。想做更多的了解,可以看 Vivek Singh 写的文章《Everything You Need to Know About Gitcoin》。

带薪实习是另一个有效的方法,有两个备受欢迎的选择:

或者,如果你真的对开源充满激情,为什么不加入一家专注于开发开源软件的公司呢?有很多这样的选择,就像咨询一样,你将获得报酬,并同时能够为社区做点事情。

这是一个双赢的选择!

更多方法

如果你还想寻找更多通过开源赚钱的灵感,可以看看 GitHub 上的 lemonade-stand 项目,或者在那里留下你的看法。开源,一切皆有可能!

遇到志同道合的人

12
图片来自 Unsplash,作者 “My Life Through A Lens”

到目前为止我尚未提到的是:无论产品、项目还是技术,都是整个开源活动的一小部分,开源最重要的组成部分是丰富多彩的社区!当你开始为开源做出贡献,你会很快结识很多新朋友,你可以向他们学习,可以为他们提供帮助,也可以与他们交换思想。

每个项目都有专属的社区,而且也有很多地方让众多拥有不同背景的开源爱好者聚集起来。

你可以加入一些在线交流社群,比如领英的 Linux & Open Source。你也可以加入很多有趣的 Gitter 频道,Gitter 是为开源社区打造的即时通讯软件。当然,还有一些邮件组、论坛或平台(如 GitHub)让大家互相协作和交流。但是,如果你想亲自结识志趣相投的人,请考虑访问或加入线下黑客空间。

在黑客空间,人们将对实践的热爱传递到软件世界之外。不管你是对软件、硬件还是 DIY 和手工制作感兴趣,都可以去这些空间。有一个维基百科页面专门列举出了所有的黑客空间,找到离你最近的那个,去拜访他们,你将被思想与行动碰撞所迸发的火花点燃!

原文:The Definitive Guide to Contributing to Open Source,作者:Piotr Gaczkowski