开源对你来说,意味着什么?
从武汉大学软件工程研究生毕业后,杨璇的第一份工作就从事开源软件的开发。除了为开源向量数据库 Milvus 做贡献外,她还负责维护 PyMilvus 项目,业余时间还是上海 GDG (谷歌开发者社区)成员及资深志愿者。从用户到开发者、维护者,身份的转变改变了她对开源的看法,而多个开源社区的辐合影响更是让她有了广阔的视角。
在第六届中国开源年会分论坛-开源女性论坛上,杨璇分享了她的心路历程。让我们一起来看看吧!
完整视频请戳 https://www.bilibili.com/video/BV1Jb4y187Mp
去年 7 月,我加入 Zilliz,开始参与开源向量数据库 Milvus 的研发。今年年初,我还正式接手了 PyMilvus 项目的维护工作。「开源」可以说是我这一年多来工作的主题。 在学生时代,我曾有过一些使用开源软件的经验。当时,我的角色是一个开源软件的用户;而如今,随着我的角色由用户转为开发者和维护者,我对开源的看法也发生了巨大的改变。接下来,我将和大家分享一些我的经验与思考。
开源 = 免费?
我第一个接触的开源软件是 Linux 系统,当时使用的是 Ubuntu 16.04 桌面版,没什么特别的原因,师兄说你需要一个 Linux 系统做开发,我就随大流选择了一个。当时我还没有意识到,我在 Ubuntu 上使用的大部分软件都是开源的。我只看到了「免费」这一个点,因此我当时对 Ubuntu 唯一的看法是:嗯,免费就行。后来我需要用一些研发工具,由于 JetBrains 公司会给学生免费认证,因此我当时所有的研发工具都是用的是他们公司的产品,比如 IDEA、PyCharm、CLion、GoLand。
学生时代的我,把开源和免费画上了等号,再加上「便宜没好货的」粗暴想法,我的内心其实有这样一个观念:免费虽好,不如白嫖付费的好,付费的产品肯定比免费的要好。
在这一年多来的工作过程中,我发现自己之前的观点是一个巨大的偏见。首先,开源从来就不仅仅意味着免费。使用 Ubuntu 作为开发系统后,我接触到了 Git、Vim、Make、CMake 等优秀的开源软件,我逐渐意识到:它们虽然是免费的,但是它们非常好用。 可以说,Linux 系统这个媒介为我的代码生涯开了扇窗,让开源的光照了进来。
开源意味着一切!
工作之后,要说什么开源软件影响我最深,那一定是 Vim 和 CMake。
从 IDE 移到 Vim 的过程,痛并快乐着。 让我放弃 IDE 的原因很简单:我需要同时开发几个 Python 项目,而 PyCharm 实在太占内存资源了,64G 内存的电脑都经不起内存怪兽的吞噬,我需要一个更轻量的代码编辑器。这时候 Vim 出现在我的眼里。 Vim 的学习曲线非常陡峭。学习使用传统软件的套路并不适用于 Vim:有图形界面的软件,至少我可以点点看看,实在有不明白的使用方法 Google 一下就能学到;没有图形界面的,如 Git,一篇文章就足以入门其基本操作。然而,Vim 的学习曲线至少有三个难点:一是习惯 Vim 的基本操作;二是使用研发必备的 Vim 的插件;三是设置自己习惯的快捷键。除了这三点,还有一个隐含的学习点:命令行工具。 使用鼠标点击一下就能编译运行调试的操作已经成了过去,我必须牢记每种语言的编译运行和调试方式,使用命令行来完成进行调试,这又让我接触到了更多的开源工具。
学习 Vim 感触最深的是,搜索引擎搜索出来的 Vim 教学,远不如 Vim 官方入门文档 vimtutor。如果你的机器上安装了 Vim, 在命令行可以直接敲出 vimtutor 来激活这个入门文档。强烈建议正在使用 Vim 而没有使用过官方 vimtutor 的人过一遍这个文档,一定会让你有所收获。
那么这里引出了两个问题:
- 当你想要学习一个开源软件时,你看开源软件的官方文档吗?
- 学习命令行工具的使用方法时,你会使用 man 查看官方文档还是会在搜索引擎上搜索?
我来先给出我的答案,我会看开源软件的官方文档,使用 man 命令查看命令行工具的使用方法。 我更希望学生时代的我给出的答案也能是这个,但可惜的是,我在学生时代很少阅读官方文档,在学习过程中重度依赖搜索引擎。 为什么我认为阅读开源软件的官方文档是更好的学习方式?因为,除了非常流行的开源软件,其他的开源项目几乎只有官方文档资源是最新的。CMake 的例子就是典型,CMake 官方的版本已经演进到了 3.21,而搜索引擎上搜索出来大量的入门教学竟然是 3.12 以前的……
无论是什么样的开源评判标准,文档一定是被纳入其中的考核对象。诚然,比较流行的的开源项目也会有配套的书籍在售,这些书籍也是不错的选择。
说回 Vim,学会 Vim 的基本操作之后,接下来就是选择和学习使用插件了。
Vim 的插件数不胜数,且都是开源的,在挑选 Vim 插件时我就感受到了什么是开源世界的参差。当带上目的去挑选插件的时候,优秀的开源插件就能轻松的脱颖而出。比如我希望这些插件有这样几个特点:活跃度高、使用 Vim8 的异步 IO、文档详细丰富、支持多语言等。按照这些条件筛选一遍,虽然能打的 Vim 插件就不剩几个了,但是这几个插件正是我目前开发最依赖的插件。除了经久不衰的大型插件,我还关注了一些比较新的插件,有一个文件搜索跳转插件 LeaderF 非常好用,我试用了之后就立马抛弃了老牌插件 ctrlP,奔向了 LeaderF。
在搜寻好用的 Vim 插件过程中,我还发现了文本搜索工具 grep 的替代品 Ripgrep,这算是一个小惊喜。当然,我也遇到了自己很喜欢但是用起来有点不舒服的插件,果断 fork 过来自己私人订制了一下。
讲到这里,其实很多人就能看出来 Vim 对我的影响有多大了。它把我领入了 Vim 这个开源圈子里,让我深刻认识到这样一个事实:Vim = Vim + Plugin。一个软件的开源并不只是软件源代码本身被开放,它还包括了这个软件辐射到的所有开放的内容。
在探索 Vim 的社区时,我不仅发现了很多优秀的插件,也发现了很多疏于维护而慢慢不再有人使用的插件,这激发了我推广 Vim 的使命感。机缘巧合,我在公司内部做了一个 Vim 使用方法的分享,成功安利了很多同事开始使用 Vim。不过就像我前面所说的,Vim 的学习曲线过于陡峭,有一些人坚持不到感受 Vim 真正的魅力的程度,也有一些人坚持下来了。但是就算是从 Vim 转为其他 IDE 开发的人,他们也会在那个 IDE 装上 Vim 插件,模拟 Vim 的操作,也算是推广成功了。
另一个对我影响深刻的开源软件是 CMake,这就跟我的工作有了一定的关系。
来到公司之后,第一个月的新人培训中,我发现向量数据库 Milvus 的编译代码难以阅读、难以维护、编译速度缓慢并且还存在明显的重复编译问题,第三方库文件下载缓慢且没有缓存。
于是,我提出来,“我想要优化这些编译”。
当时我的 leader 翔宇说,干。
说干就干,我首先就从学习最新的 CMake 语法开始。
没错,当时的我并不会 CMake,但这丝毫没有阻挡我尝试解决这个问题的决心。一个月后,我把项目的编译优化完毕,优化的结果是大幅缩短 CI 运行时间,从之前的 CPU 30分钟、GPU 50 分钟的 CI 平均运行时间缩减到了 CPU 10 分钟之内、GPU 15 分钟之内。第三方库的管理也变成了可插拔的方式,可维护性可阅读性大大增强。
讲到这里可能有人会想,这不就是你的工作吗?
是的,但由于这是我在公司做的第一件工作,而且与我之后的工作内容差别很大,因此在我内心留下了很深刻的印象:你看到了开源软件的缺陷,就可以尝试去解决它,即便你最开始不知道如何去解决它。
这也对我之后维护 PyMilvus 项目提供了不少启发。
开源,与人建立联系
自从接手了 PyMilvus 项目的维护工作,我第一次拥有了一个开源项目的决策权。这时候我才发现让一个项目永葆生命力有多难。 PyMilvus 是 Milvus 这个开源向量数据库的 Python SDK,是开发者想要通过 Python 语言来使用 Milvus 时会使用到的包。目前在 GitHub 上有 300 多颗星,拥有 49 个贡献者, 被 139 个开源项目使用。
成为了项目的维护者之后,我不单是从开发者视角来看待这个项目,我开始关心与这个项目相关的一切开源方面的内容,比如文档的完整性、代码风格和质量、发布流程、开发流程、问题回答等等。
循着自己之前使用开源软件的经验,我把文档放在了第一位。虽然 PyMilvus 的用户参考文档非常全面,但是缺乏开发者文档,很多项目约定的准则都得我亲自去和开发者沟通。
为了吸引更多的人来贡献代码,我还尝试着把 PyMilvus 的 Issue 分类,将解决起来不超过 30 分钟的 Issue 聚合在一起,标记为「good first issues」,吸引熟悉 Python 但不熟悉 PyMilvus 源码的人来贡献。这么做的效果确实非常不错,简单易上手的 Issue 非常吸引贡献者,尤其是初次贡献者。PyMilvus 最近参加的 Hacktoberfest 活动,我遇到了很多新面孔给项目做贡献。他们都非常的礼貌,愿意遵循这个开源项目的规则。和他们交流时,我发现他们都拥有着超强的开源项目贡献意愿,有时回复延时,他们也会耐心等待,或者去我们的 slack 上寻求 review 帮助。
我遇到一个哥们,中秋前提了一个 PR,以我的标准他这个 PR 几乎得打回去重做,因此这个 PR 就暂时搁置,我打算专门找个时间和他探讨如何解决这个问题。没想到这一搁置,就到了国庆结束。他在这期间一直没有放弃和我们研发团队沟通,时不时就会冒头戳一下,询问这个 PR 的进展和优化方向。他坚持不懈的态度让我们印象深刻,虽然最后这个 PR 还是被关闭了,但由于他和我们建立了密切联系,他依旧对我们项目抱有很高的积极性。
项目维护过程中,大部分贡献者都像刚才这个哥们一样礼貌、遵循规则。但是我也遇到有贡献者的行为则令人哭笑不得。近期就碰到了这么一个贡献者,他贡献了一个 266 个文件修改共 29000 多行 diff 的 PR。先不论修改是否正确,这么多文件改动的一个 PR,几乎不可能被合进项目中。
以开源为主题的工作环境,促使我参与了其他一些项目的贡献,比如 uber-go/guide,CockroachDB 等。有的项目,维护者的反馈非常的实时,我贡献体验就非常好。从我自身的体验来讲,贡献代码时我并不在意项目的规则繁琐与否,我会在意贡献时维护者的反馈态度和速度。如果我得到了快速且积极的反馈,即使我这个 PR 需要有很大的改动,我也会充满干劲地去做。而如果我的 PR 和 Issue 是石沉大海,我会迅速对这个社区失去兴趣。总体来说,与贡献者无延迟的沟通就是最有效的联系!
项目之外……
除了日常工作,我还把自己对开源的兴趣扩展到工作之外的各种活动。在开源之夏,我作为 mentor 来带领一位学生来参与开源项目的贡献;在 Hactoberfest,我通过宣讲来鼓励大家贡献代码;我还是 GDG(谷歌开发者社区)上海核心志愿者成员,帮助 GDG 举办各种大大小小的活动。
在我眼中,并不是只有贡献代码才算走进了开源世界。
开源之夏是中科院软件所专为学生办的活动,该活动为高校学生准备了丰富的开源工程项目,帮助学生的同时也帮助开源社区扩大影响力。Milvus 社区今年与开源之夏进行了合作,我很荣幸地帮助一名学生参与了 Milvus 社区的代码贡献。除了在技术上答疑之外,我还成功地给学生心中种下开源的种子。他在结项报告中说,“导师在在未来发展上也给了我很多很好的建设,让我对开源领域有了浓厚的兴趣,并愿意在里面努力做出一些贡献和工作...”
Hactorberfest 是每年十月都会举办的开源十月盛典活动,鼓励大家在十月份给开源的项目做贡献。这个项目在国外的影响力非常大,但是在国内不太火。为了激发国内开发者的贡献热情,Milvus 社区专门利用一期 Office Hour,面向国内开发者举办了一场如何参加 Hactorberfest 的直播活动,我在此次直播中详细介绍了 Milvus 社区贡献的规则。
我个人还是一名 GDG(Google developer group)志愿者,GDG 基于地域创建,方便这个城市的人能够参加 GDG 举办的丰富的线下活动。GDG 吸引我的原因是,我发现活动的组织方全部都是志愿者,这是一个完全自愿贡献的团体。活动的经费都是志愿者自己拉的赞助商,所有的组织方在整个过程中没有任何的金钱回报。大家都是在用爱推动 Google 社区的发展。
今年 GDG 组织的线下活动中,从主持人到嘉宾接待,从 PPT 到公众号文章撰写,从摄影到直播团队,从设计到活动策划,全部都是有技术背景的志愿者。分享嘉宾也是无偿分享。今年十一月底还会有 GDG 上海每年最盛大的活动 GDG DevFest,如果有朋友参加这场盛会,说不定能在志愿者中发现我的身影。
我希望自己的所作所为能够帮助到一些人,让没有接触过开源的人感受到开源的魅力,让开源社区的人获得更多的知识,把开源的理念传播得更远,让越来越多的人投身开源事业。谢谢大家!
Zilliz 以重新定义数据科学为愿景,致力于打造一家全球领先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的隐藏价值。
Zilliz 构建了 Milvus 向量数据库,以加快下一代数据平台的发展。Milvus 数据库是 LF AI & Data 基金会的毕业项目,能够管理大量非结构化数据集,在新药发现、推荐系统、聊天机器人等方面具有广泛的应用。