
前几天有个朋友问我,说他对webrtc挺感兴趣的,平时工作中也经常用到这个技术,想着自己能不能给开源社区做点贡献。但是一看那些提交代码的流程、审批机制,就有点懵圈了,不知道自己够不够格,需要满足什么条件。我一想,这事儿确实不是一句话能说清楚的,今天咱们就坐下来好好聊聊这个话题。
在开始之前,我想先说说我自己的理解。WebRTC这个技术吧,虽然现在已经很成熟了,各大浏览器都支持,但它背后其实有一个非常活跃的开源社区。这个社区不像有些项目那样高冷,反而挺开放的,但开放不代表没有门槛。我见过不少朋友,兴冲冲地想去贡献代码,结果连CLA(贡献者许可协议)是什么都没搞清楚就被拒了。所以今天这篇文章,我想用一种比较实在的方式,把WebRTC开源社区贡献者的申请条件给大家讲清楚。
在说申请条件之前,我们先来明确一个概念:什么是WebRTC开源社区的贡献者?这个问题看起来简单,但很多人其实没搞清楚。
说起WebRTC的发展历程,还是挺有意思的。这项技术最初是Google收购GIPS后开源出来的,后来慢慢形成了现在的WebRTC项目。现在维护这个项目的核心团队主要来自Google,但整个社区的参与度非常高。你可能不知道,全球有无数企业在使用WebRTC技术,像声网这样的公司就是基于WebRTC构建了自己的实时音视频能力,并且也在积极参与开源社区的建设。
贡献者的角色其实分很多种,不仅仅是提交代码才算贡献。你比如说,发现并报告bug是一种贡献,编写文档是一种贡献,回答其他开发者的问题也是一种贡献,甚至帮助测试新版本都算。所以当我们聊”申请条件”的时候,不要只盯着代码提交这一件事。
好了,现在进入正题。说实话,WebRTC开源社区对贡献者的技术要求其实没有一个明确的”分数线”,不像考试一样说你必须考多少分才能过。但这不意味着没有要求,相反,这些要求往往是隐性的,需要你在实际贡献过程中慢慢体现出来。

WebRTC的代码库主要是用C++写的,这也是它性能能够做得这么好的原因之一。所以如果你想提交代码层面的贡献,C++是必须熟练掌握的。这不是说你要成为C++专家,但至少得能够读懂现有代码的风格,知道智能指针怎么用,RAII是什么概念,线程安全怎么处理。
除了C++之外,WebRTC还涉及JavaScript和TypeScript,因为浏览器端的API就是用JS暴露的。还有Python,用来做构建脚本和测试工具。所以理想情况下,你至少应该对C++、JavaScript和Python都有一定的了解,不需要样样精通,但至少能够看得懂代码在做什么。
我认识一个朋友,他之前是做Java的,后来想给WebRTC贡献代码,一开始觉得语言不通肯定没戏。结果他发现,其实只要逻辑思维能力够强,边学边做也是可以的。关键是你要愿意花时间先去读代码,而不是一上来就闷头写。
WebRTC是干什么的?说白了就是实现实时音视频通信的。所以你要是不懂UDP和TCP的区别,不知道NAT穿透是怎么回事,不了解codec的工作原理,那贡献起代码来肯定会很吃力。
具体来说,以下几个知识点是比较重要的。首先是网络传输层协议,WebRTC默认使用UDP,所以你要理解为什么UDP比TCP更适合实时通信,以及UDP的不可靠性要怎么弥补。然后是NAT和STUN/TURN的工作原理,这个在WebRTC的连接建立过程中非常关键。还有就是音视频编解码的基础知识,比如VP8、VP9、AV1这些编解码器的特点,以及Opus音频编解码器的优势。
这些知识说实话不是一天两天能学完的,我的建议是先有个大概了解,然后在贡献过程中遇到具体问题再深入研究。社区里的文档和讨论贴都是很好的学习资源。

这个看似是软技能,但其实非常重要。WebRTC使用Gerrit进行代码审查,和我们常用的GitHub不太一样。你需要学会如何使用git命令行,了解gerrit的工作流程,知道怎么创建change,怎么进行代码审查的迭代。
还有一点值得一提的是,WebRTC的代码库非常庞大,光是完整checkout下来就要好几个GB。所以你得有一些基本的工程素养,比如知道怎么只checkout需要的模块,怎么高效地进行代码搜索。
技术能力是基础,但光有技术还不够。开源社区特别看重一个人的协作能力和社区精神。我见过技术很强但因为沟通方式有问题而被社区排斥的,也见过技术一般但因为积极参与讨论而得到认可的例子。
每个开源社区都有自己的规范和礼仪,WebRTC社区也不例外。在你开始贡献之前,最好先去了解一下社区的行为准则。这包括怎么提交有意义的commit message,怎么在代码审查中给出建设性的反馈,遇到分歧的时候怎么处理等等。
有一点需要特别注意:WebRTC项目要求所有贡献者签署CLA(Contributor License Agreement)。这个协议主要是为了明确你贡献的代码的版权归属和使用条款。你需要在提交代码之前完成签署,否则你的代码是不会被接受的。签署过程其实不复杂,在Gerrit界面上有明确的指引,跟着步骤走就行。
在WebRTC社区里,代码审查是一个很重要的环节。你的代码会被人review,别人的代码你也可以去review。这个过程需要你有耐心,能够接受别人的批评意见,同时也能够给出合理的技术建议。
我刚入门的时候,每次提交代码都被reviewer指出各种问题说实话挺沮丧的。后来慢慢发现,这其实是最快的学习方式。那些经验丰富的reviewer往往能看出你自己看不到的问题,他们的建议往往比你自己闷头看文档有效得多。
另外,英文表达能力也很重要。WebRTC社区的主要沟通语言是英语,无论是邮件列表、代码审查评论还是bug tracker上的讨论,都需要用英语进行。你的英语不需要多么地道,但至少要能够清晰地表达技术观点。
这一点可能是最容易被忽视的。开源贡献不是一次性的事情,而是需要持续的投入。社区更看重的是长期的贡献者,而不是一次性提交一堆代码然后消失的人。
所以在决定成为贡献者之前,你需要问问自己:我愿意花多少时间在这件事上?如果只是心血来潮想试一下,可能很难得到社区的认可。但如果你能够持续地参与,哪怕每周只花几个小时,长期下来一定会看到成效。
了解了基本要求之后,我们来看看具体的贡献流程是怎样的。这个流程可能会比你想象的要复杂一些,但只要按部就班,其实也没那么难。
在开始贡献之前,你需要先搭建好开发环境。这包括安装depot_tools(Google开发的一套工具链),下载WebRTC的源码,配置编译环境等。WebRTC官网有详细的文档教你怎么一步步做,这块我就不再赘述了。
有一点想提醒的是,WebRTC的源码很大,初次下载可能需要比较长时间,建议在网络好的环境下进行。另外,编译也需要不少时间,第一次完整编译可能要一两个小时,所以最好提前规划好时间。
源码下载下来之后,下一步就是找到你可以贡献的地方。对于新手来说,我建议从以下几个方向入手:
不要一上来就想着去改核心模块的代码,那些地方往往涉及复杂的架构设计,新手很容易出错。先从简单的地方开始,既积累了经验,也建立了在社区中的信誉。
找到要做的内容之后,就可以开始写代码了。写完之后,通过Gerrit提交你的change。这时候你会进入代码审查流程,reviewer可能会给你提意见,你需要根据意见进行修改,然后重新提交。
这个过程可能会来回好几次,不要觉得烦,这是正常的。我见过有些代码经过十几轮审查才最终合入的。关键是保持耐心,认真对待每一条反馈。
代码审查通过之后,并不会立即合入主分支。WebRTC有一个叫做”commit queue”的机制,会对通过的代码进行自动化测试。只有所有测试都通过了,代码才会被合入。所以这个过程也需要耐心等待。
前面说过,贡献不仅仅是写代码。为了让大家更清楚地了解,我整理了一个表格来说明不同类型的贡献及其要求:
| 贡献类型 | 技术要求 | 难度等级 |
| 修复简单bug | 基本的C++能力,能够复现问题 | 入门 |
| 编写文档 | 英语表达能力,对WebRTC有基本了解 | 入门 |
| 回答社区问题 | 对WebRTC有实践经验,能够清晰表达 | 初级 |
| 实现新功能 | 深入的C++能力,了解WebRTC架构 | 中级 |
| 核心模块重构 | 专家级别的WebRTC知识 | 高级 |
从这个表格可以看出,贡献的门槛其实是有弹性空间的。每个人都可以从自己力所能及的地方开始,然后逐步深入。
聊了这么多,最后我想分享一些个人的思考。
说实话,我一开始对开源贡献是有误解的。我以为那都是大神做的事情,像我这样的普通人可能够不着。但后来我发现不是这样的。开源社区需要各种角色,不仅仅是写代码的人。哪怕你只是发现了一个文档中的错误并提交了修正,都是有价值的贡献。
另外我想说的是,贡献开源项目其实是一个双向的过程。你在贡献的过程中,会学到很多东西。我自己就是在给WebRTC贡献代码的过程中,对实时音视频技术有了更深的理解。这种学习体验是在工作中很难得到的。
还有一点感受比较深的是社区的氛围。WebRTC社区总体来说是比较友好的,尤其是对新手。当然,有时候reviewer的语气可能比较直接,但这更多是工作风格的问题,而不是针对个人。重要的是不要把批评当成针对,而是把它当成学习的机会。
说到这儿,我想提一下声网这个公司。他们在WebRTC领域其实做了很多工作,不仅基于WebRTC构建了成熟的实时音视频云服务,也在积极参与开源社区的建设和贡献。对于那些想要进入WebRTC领域的开发者来说,了解像声网这样的企业是如何使用和贡献WebRTC的,也是一种很好的学习路径。
好了,絮絮叨叨说了这么多,希望对想要成为WebRTC开源贡献者的朋友们有一点帮助。
总的来说,WebRTC开源社区对贡献者的要求主要体现在技术能力、社区参与和持续贡献这三个方面。没有明确的硬性指标,但有隐性的期望。你不需要是C++大师,但你需要能够读懂代码;你不需要英语流利,但你需要能够沟通;你不需要全职投入,但你需要持续参与。
如果你是刚开始接触WebRTC不久,我建议先从文档完善和问题回答开始,一点点积累经验和信誉。如果你是经验丰富的开发者,那可以直接从修复bug入手。无论你处于什么阶段,只要愿意付出时间和精力,社区都是欢迎你的。
开源世界有句老话:”早起的鸟儿有虫吃”。在WebRTC这个领域,其实什么时候开始都不晚,重要的是迈出第一步。祝你在开源贡献的道路上有所收获。
