查看原文
其他

悟空刘歧:技术瑕疵不除不快,开源社区代码说话

OSCHINA OSC开源社区 2023-01-30
出品 | OSC开源社区(ID:oschina2013)
每个人爱上开源社区都有自己特别的理由,对于刘歧来说,这里是一个技术控的天堂。
玩过音视频技术的同学对悟空这个名字一定不陌生。悟空刘歧,FFmpeg 官方顾问、Maintainer,FFmpeg 社区最活跃的贡献者之一,《FFmpeg 从入门到精通》作者。
FFmpeg—— 老牌开源项目,万能播放器的根基。刘歧 —— 喜欢技术、只想讨论技术问题的程序员。
二者之间的 “羁绊” 来自于刘歧对于一个技术 “瑕疵” 的不满,为了解决自己眼中 FFmpeg 的一个不合理功能,刘歧开始了在 FFmpeg 社区的征程。FFmpeg 社区的治理属于 Liberal Contribution(自由贡献)模式,个人影响力取决于贡献多寡,重大决策基于共识决定,一切靠代码说话。毫无疑问,对于只爱技术的刘歧来说,这是一个好地方。和社区成员们一起讨论技术,共同解决 Bug,时不时提交些新的代码成了刘歧在工作与生活之外独特且有效的放松方式。就这样,刘歧慢慢在开源社区扎根、成长……

初入开源社区


大学毕业,刘歧到一家做空中充值终端机的公司工作。在这里,他正式踏上了自己的开源之旅。
当时刘歧所在公司自研的电路板移植了 Linux 操作系统,刘歧参与了给系统写驱动的工作,自然他也遇到了所有程序员都会遇到的各种 Bug,为了解决随时可能出现的问题,刘歧开始向前辈们寻求帮助。Linux Kennel 中文邮件列表成为刘歧的求解渠道。
Linux Kennel 中文邮件列表给刘歧留下的初印象是 “热情”:“基本上你发一个问题,大伙马上就回复了。可能是因为邮件列表刚建立不久,大家看到终于有一个新人加入进来问问题,肯定特别开心,立刻就想回复。” 出于一种整体良好的社区体验和对技术的热情,刘歧开始长期在这个开源软件的邮件列表社区中潜水学习,偶尔遇到问题会向大伙请教。
如果说第一份工作给了刘歧一个进入开源社区的缘由,那么第二份工作则是为他带来了扎根在社区的契机。
刘歧在第二份工作中主要做图形图像处理。一次偶然机会,和同事在聊天过程中,刘歧发现对方在许多技术基础知识、技术视野等方面与自己非常不同,“感觉他的技术很扎实”。个中原因就是这位同事深度参与了 BSD 的代码开发与维护。
这激起了刘歧想要深度参与一个开源项目的兴趣 —— 不仅仅和自己的同事交流技术、不仅仅是局限于自家公司的业务范围,而是可以和更多的人在一起讨论更广泛的技术问题,由此来提升自己的技术视野。
对于一家商业公司来说,代码的要求往往是满足当下业务需求,很少去考虑这些代码是否能有更长的生命周期,是否足够优雅等等。但在开源社区,来自千行百业的程序员相互交流、碰撞,便给了软件一个不断成长的温床。
有了深度参与开源项目的念头之后不久,刘歧开始做云存储、云转码系统工作,用到了 FFmpeg,遇到问题时,刘歧会像在 Linux Kennel 中文社区解决 bug 的方式那样,去 FFmpeg 社区搜索是否已经有人遇到过同样的问题,该怎么解决这些问题,“遇到问题的第一个感觉就是,这个问题我肯定不是第一个遇到,那我在网上或者邮件列表里肯定能搜到相关内容或 Patch。”
同时,刘歧也开始尝试深度参与 FFmpeg 社区,他会观察社区中的成员间是如何交流沟通的,提 Patch 的流程是怎样等等。用他自己的话来说,就是 “光是了解这个社区我就花了 2 年。” 逐渐他发现,许多问题在社区中还没有被解决或是提及。机会,在这个时候到来。


发现问题


2014 年上半年,刘歧接触了一个客户,需要用 FFmpeg 做 HLS 切片。彼时用 FFmpeg 在切片时,有个参数对 CDN 不够友好。当时 FFmpeg 的切片原理会按照顺序生成 1、2、3、4 片,第 4 片结束后会回滚到第 1 片。每片的时间长度是 2 秒,所以第 8-10 秒的视频切片就会被标记为序号 1。这就导致在 CDN 里,缓存时间长度出现问题。当用户播放完 0-2 秒的 1.ts 之后,第 1 片视频应该被刷新掉,但实际上并没有,那么用户播放到 8-10 秒的 1.ts 时,播的依旧是 0-2 秒的内容。加上时间戳精准度的影响,视频就会卡住,一段时间之后再跳转到新的画面,非常影响用户观感。
“这是一个不标准的处理方式。” 实际上,这个问题刘歧并不是第一次遇到,他会尝试和客户反馈,建议不用回滚,而是按照递增的方式去生成。但这带来新的问题 —— 占存储。回滚的方式是为了节省存储,不会无休止的往里写新文件。
不仅如此,客户还认为,既然 FFmpeg 里提供了这个操作选项,存在即合理,就可以沿用。
刘歧此前也试过向 FFmpeg 社区提改进意见,“往 flv 里提 hevc,在 2013 年年底的时候,国内很多公司就开始使用这个技术了,但是我往 FFmpeg 社区提这个 Patch 的时候,社区里的人是反对的,因为没有相应地参考标准,所以不接受这个方式。”
在一个技术控眼里,这种技术功能上的 “瑕疵” 不除不快,FFmpeg 社区拒绝改进的理由也并不能让刘歧让步。
“我那时的观念就是,FFmpeg 也是人写的,选项是人来定的,那么我就有可能是那个人。” 于是,刘歧立志要加入 FFmpeg 维护者列表,然后 “干掉那个选项”。


删掉一个小功能需要几年? 


想要删掉功能,要先成为维护者。
在 FFmpeg 社区,一名维护者通常需要先频繁地提交高质量的代码,在社区 “混脸熟”,获取一定的认可度。接下来才可能会被大伙邀请成为维护者,或者自行申请成为维护者。
按照这个路径,刘歧开始刷 Patch。频繁的代码提交行为吸引了时任 FFmpeg 首席维护者 Michael 的目光。不过,Michael 的关注对此刻的刘歧来说是一种 “折磨”。
“他频繁地找我麻烦,不断地否定我,在我提 Patch 的时候经常测试不通过。” 这对刘歧的打击非常大。现在当我们提到要营造一个良好的开源社区氛围、留住新鲜血液时,往往认为需要给新加入的贡献者更多的耐心、更细致礼貌的指导、适当的鼓励等等。很显然,当时的刘歧遇到的是高难度剧本:“那种环境,基本上相当于你在故意刁难我,放到很多人身上肯定就不干了。但我当时的目标非常明确,我就是要成为维护者,就是要把这件事做成,随你怎么刁难我。”
Michael 的 “刁难” 在事后看来更像是刘歧进阶路上的测试。比如指出问题的时候,Michael 也会关注刘歧是否有解决问题的能力,在刘歧解决不了的问题上会耐心的指导。一来二去,两人的交流渐渐多了起来,刘歧对 FFmpeg 的掌握能力也在日渐精进。
有一天,Michael 问刘歧:有没有兴趣成为维护者?
“诱惑力这么大的事情,我怎么可能拒绝!” 兴奋中的刘歧还特意把这 “历史性” 的时刻截图发给朋友。
就这样,刘歧成为了维护者中的一员。他想起了曾经看过的一个小故事,当你拔萝卜发现某根特别难拔的时候,这个萝卜可能是一个非常大的萝卜,而你,把它拔出来以后也将会有很大的收获。“当时想成为维护者,可能就是在拔那个最难拔的萝卜。”
2016 年,刘歧成为维护者的第一年,他做的第一件事就是把切片功能标记为 “弃用”。到这里,已经花了他 2 年的时间。
按照 FFmpeg 社区的规定,弃用某项功能时,需要提前警告用户,并且等到下一次大版本更新的时候,提供替换解决方案,同时旧版本不会下线。刘歧提供了几个新功能:比如直播时可以删除旧的片,这样就无需用回滚的方式,这样也能节省储存空间。但是对用户来说,替换新版本、新功能需要时间,直到今天,还有 FFmpeg 用户在使用老的 API 接口。对刘歧来说,这是一场持续了 8 年并且还在继续的战斗……


成为顾问


在 “弃用” 切片功能的过程中,刘歧在 FFmpeg 社区一直没闲着。从频繁提交 Patch,到成为单一模块的维护者,慢慢随着维护的模块越来越多,刘歧逐渐成为了一个通用维护者,2017 年,被推选为 Maintainer 和顾问便成了顺理成章的事情。
相较于各个模块的维护者,Maintainer 的权限更广,会帮助不同模块的维护者一起 Review。而相较于 Maintainer,顾问的身份除了在社区内部是一个身份标,更重要的是可以代表 FFmpeg 社区去接一些顾问形式的工作,比如面向全球提供付费咨询服务等等。
2017 年意大利有一家做意甲联赛版权内容制作的公司在制作视频内容时用到了 FFmpeg,遇到一个接口上的问题,于是发邮件给刘歧寻求帮助。此类的咨询刘歧陆续还遇到了一些,费用每小时两百美金左右,当然,有时候也会免费提供帮助。
这让刘歧看到了在线音视频剪辑工具的需求,便萌生了做一个专门的剪辑工具的想法。2017 年,来自朋友的合伙邀约让这个想法开始落地,刘歧与朋友成立公司一起做剪辑工具,当时,某央媒是他们的客户之一。虽然这次创业以快手的收购收尾,但在这之后,FFmpeg 社区毫无疑问成为刘歧作为一个技术人精神上的 “世外桃源”。
再次成为商业公司程序员队伍中的一份子之后,刘歧更多时候专注在公司本身音视频基础技术支持上,短暂地从 FFmpeg 社区 “消失”。
“过了一段时间发现太累,就会到 FFmpeg 社区看看最新的架构,代码的发展等等,或是看看是不是有可以增加的功能,我就会给支持上。” 每次关注 FFmpeg 社区的时候,刘歧会频繁提交代码,“相当于在刷屏。因为你写代码的时候,能够专注地去思考,写完之后提 Patch 之后可以和大伙一起交流的过程是很享受的,那是很过瘾的,我真的很上瘾的。”
“社区中很多人都是这个状态。”FFmpeg 的维护者中很多是像刘歧一样的业余维护者,做这个开发的人来自从事各个专业,比如量子物理博士、大学老师等等。当大家为了同一个技术聚集在一起时,便产生了对个体的强大吸引力,“开源最吸引我的就是跟别人讨论技术,因为我这个人比较话痨,喜欢和人交流,在和别人交流的时候能刷新自己的认知,学到很多东西。”
2019 年,刘歧首次接受 FFmpeg 赞助费用参加 GSoC Mentor Summit,与 FFmpeg 元老 Carl Eugen 合影


开源,一个可以纯技术交流的土壤


“坦率地讲,FFmpeg 社区没有治理。” 刘歧不喜欢过多讨论技术之外的东西,恰好,FFmpeg 社区也很对他的胃口。
这个有着 20 多年的老牌开源项目社区一直以来都非常低调,发展平稳,就连唯一的一次 “分裂” 都以双方的握手言和收场。FFmpeg 是法国程序员 Fabrice Bellard 在 2000 年发起的项目,Fabrice Bellard 提交了首个 Commit。FFmpeg 单词中的 “FF” 指的是 “Fast Forward(快速前进)”,MPEG 是制定国际标准的组织,负责制定影音压缩及传输的规格标准。
从 2004 年到 2015 年间,Michael Niedermayer 担任首席维护者,拥有社区的最高决策权。但 Michael 的管理渐渐引起了一些人的不满,2011 年,部分维护者出走,另建分支 Libav。后来 Libav 逐渐发展成 PC 播放 4K HDR 蓝光最好的解决方案。分裂带来的负面效果是:FFmpeg 项目进入到了一个不确定的时期,分支 Libav 一度比 FFmpeg 更活跃更有活力,于是 Debian 及其衍生发行版都切换到了 Libav。
但到了 2015 年,Debian 项目布重新用 FFmpeg 取代 Libav,主要原因是 FFmpeg 更新更及时。当时,Libav 项目开发者指责 Michael 将 Libav 的代码合并到 FFmpeg,盗用了他们的成果。导致 Libav 在和 FFmpeg 的竞争中是失败。当然,Michael 的支持者并不同意这个说法。
因为不想看到两个项目彻底分裂,这次事件最终以 Michael 的辞职收场,Michael 在辞职信中称,他希望两个社区最终能合并,Libav 能重新加入 FFmpeg。
“慢慢地,好多人陆陆续续的回来了,两个社区的代码开始合并。” 当时的刘歧见证双方最终的和解。而从那以后,FFmpeg 社区也再没有设立首席维护者这一位置。
在刘歧看来,社区中的成员聚集在一起是为了让 FFmpeg 更好,没有商业目的、也没有利益可言,因此,决策与发展全靠技术说话。
“你想做一件事,代码咔咔提上来之后,大伙没有明确提出意见就直接合并。” 刘歧介绍,大伙没有管理理念,只会去判断这件事能不能做,如果有人对提交上来的代码有反对意见,往往会指出具体哪里不好,如果建议合理,提代码的人则会去修改。
FFmpeg 社区也曾想过建立一些社区规则。
和大多数开源社区一样,人人都可以发表看法和意见必然带来争吵。据刘歧回忆,FFmpeg 社区的氛围非常开放的,但是以前会更和谐,随着后来加入的人多起来,成员间文化背景不同,经常会出现一些人格上的攻击,在交流的时候会出现毫无原因否定他人的工作成果的状况时有出现。
所以,在 2019 年,FFmpeg 社区成员东京线下交流会时,大家觉得应该成立一个社区委员会,专门去调和这种矛盾,同时再成立一个技术委员会去讨论技术选型。
这两个想法后来也比较佛系的执行着,用刘歧的话来说就是 “还没到那个地步。” 同样佛系的还有 FFmpeg 耻辱柱。
FFmpeg 提供了视频解码、编码、后期处理等一系列功能,对世界上千奇百怪的视频音频编码有着完善的支持,强大的功能使它成为市面上的许多视频播放器的解决方案。但是,FFmpeg 也成为了代码被盗用得最严重的开源软件之一,不少著名的播放软件都是 FFmpeg 代码的偷窃者。FFmpeg 会将发现的那些不遵守开源协议的软件名称公开发布,其列表便被称为 “耻辱柱”。FFmpeg 社区并没有实际去追究违规项目的责任,“耻辱柱” 也在 2011 年停止了更新。
在刘歧的视角里,FFmpeg 社区实际上对于此类技术之外的事件并不十分在意。在他个人看来,开源项目用户数量巨大,如果追究太多可能会涉及十几亿的用户,况且 FFmpeg 的许多新功能抄袭者无法复制,“所以对这个事情,我们都比较佛系。”
FFmpeg 社区对刘歧的馈赠也体现在许多方面。比如前文提到的 FFmpeg 社区交流氛围中常常火药味十足,但是对刘歧大多数情况下是非常友好的,而且很坦诚、很直接地去指出问题。比如刘歧的代码某个地方逻辑确实没考虑周全,他们就会很清晰地告诉他这个地方的逻辑没考虑清楚,并不是攻击。“火药味我接触得还比较多,只不过我是一个不太在意甚至可以忽略不计自尊心的人,很多时候我觉得火药味浓一些是好事,至少大伙对我还是比较尊重的,不会有特别严重的人格攻击。”
在开源社区,刘歧还交到了很好朋友,“这些朋友也会给我提供很多帮助,比如我需要某些信息的时候,通过社区,大伙会提供给我我想知道的信息,我想做某个功能的时候,也可以和大家交流,他们也很乐于给我提供一些支持。”
总而言之,这个属于技术控的开源故事,正在快乐进行中。
2019 东京线下交流会期间 FFmpeg 社区成员合影
【溯源】在每一场对话中,追溯关于开源的故事,认识那些极客、自由,并坚持着的开源人。

OSCHINA 推出的开源人物专访栏目【溯源】。

溯源,意指向源头追溯,为开源求解。问渠哪得清如许,为有源头活水来。每一个开源参与者,都是掀起开源浪潮最鲜活的源泉。所有开源故事,共同构建着我们今天看到的开源世界。

开源刚出现的数十年里,为开源奔走的黑客团体都在遭受来自社会主流的冷漠和排斥。即便现在的软件行业已经大喊出“拥抱开源”的口号,问题也依然存在。

我们不知道开源贡献者、开源布道师,以及所有参与开源的人还会面临多少阻碍,但给予我们信心的是,更多的人在投身开源事业。

所以 OSCHINA 希望面向开发者社区,寻找每一个积极参与开源、对开源有想法的人,了解他们以及他们的开源故事,窥探故事中的开源事业发展规律。



往期推荐



微软高管:下一代Windows将由AI驱动

Google宣布支持使用Rust开发Chromium

Java之父偏爱函数式编程,称自己的代码风格被队友批评



这里有最新开源资讯、软件更新、技术干货等内容

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存