我见过太多人把开源贡献等同于 GitHub 的绿色格子。认识一个朋友,连续九十天每天提交代码,就为了把 contribution graph 刷成一片深绿。后来他确实被一家大厂 HR 注意到了,但进公司不到三个月就暴露了——只会在 issue 被分配清楚的时候写几个函数,一旦涉及代码评审沟通、跟维护者来回对齐需求,他就崩了。反过来,社区里真正说话有分量的人,反而不怎么刷绿格子。Linux 内核的维护者 Greg KH 一年要 review 几千个 patch,他自己写的代码量可能还不如那些营销号吹出来的“全栈工程师”。这让我开始怀疑:我们是不是把开源贡献这件事理解得太狭隘了?
如果把开源比作一个生态系统,代码提交只是地面上的枝叶,真正的土壤是各种没人愿意干的杂活。比如 Triaging(对 issue 分类、复现、补充信息),一个项目如果没有好人做 triage,维护者会淹没在几百条内容重复的 bug 报告里,连修 bug 的时间都没有。还有文档维护,Vue 的文档贡献者数量比核心代码贡献者多一个量级,但很多人根本不会在 commit message 里署名的——可没有高质量的文档,Vue 早把初学者劝退完了。更别提那些做 release-note、翻译、整理 changelog 的人。你去看 GitLab 的贡献者统计,除了代码,alphanumeric 的翻译字符串、is_component 这类基础配置改动,往往占了一半以上。这些工作没有“算法复杂度”,没有“架构亮点”,但少任何一环,项目都会变成一盘散沙。
有一个很反直觉的现象:很多核心维护者其实希望你别直接提交代码,而是先静下心把 issue 写清楚。有一次我在某个 Go 项目的仓库里提了一个 PR,自认为完美解决了一个内存泄漏问题。结果维护者根本没有看 diff,先问我:“你是在什么场景下发现的?怎么复现?内存增长曲线有吗?是不是用了 perf 抓过?”我当时心态崩了,心想我代码都写好了你还要什么自行车。后来才知道,项目的 issue 模板里明确规定——任何一个 bug 修复的前提是要能证明 bug 真实存在,不然改了也是盲修。那一瞬间我意识到,真正训练一个人的不是写代码,而是学会在开源协作里“负责任地”表达问题。我后来把自己的一堆不成熟 PR 全部撤回,改成去给别人的 issue 补充环境信息、贴出最小复现步骤,结果反而被维护者 @ 了。
另一种被严重低估的贡献,是“在场”——意思是长期稳定地回应问题、参与讨论。很多人只看见 Linus 在邮件列表里的爆粗口,却忽略了他对每一个不合理的 patch 给出的详细理由。代码仓库里的贡献是离散的,而社区里的陪聊、解释、辩论,维系了项目的一致性。我有一个朋友在 Apache 某个子项目里当 committer,他承认自己过去一年提交的代码行数不超过两千行,但他在邮件列表里回复了八百多封邮件。很多新人问他“这个报错怎么办”,他会耐心贴 stack trace,然后告诉对方去查哪个模块。如果有人问他这算不算贡献,他会说算,因为 committer 被选举的其中一个标准,就是你有没有在公共讨论中表现出足够的判断力。代码谁都能写几行,但把项目往正确的方向上带的那些判断,才是最难复制的东西。
说了这么多,我并不是想否定代码贡献本身,而是想给那些“想用开源给自己加分”的人一个提醒:如果你的目的只是找工作,那刷 PR 确实还有点用;但如果你想真正成为一个开源项目的“成员”,你得先找到自己跟项目之间的非对称关系——什么意思?就是找到只有你能做、或者你特别擅长而别人不太愿意做的事。喜欢写作的人去补文档和教程,擅长沟通的人去维护 Discord 或者邮件列表,会设计的人去改进 logo 和交互稿。我见过一个视力障碍的开发者,给某个著名的 UI 库提交了无数条关于键盘导航和屏幕朗读器的改进建议,他几乎没有给项目贡献过什么核心组件代码,但那些建议每一项都被采纳了,最终他被邀请成为 invited collaborator。开源不是一条单方向的代码流水线,它更像一个集市——有人卖菜,有人修屋顶,有人负责赶走小偷,有人摆摊讲笑话。每个人都能找到适合自己摆的位置,关键是别只盯着那一棵写着“commit”的树。