本文出自字节跳动基础架构流式计算方向的工程师李本超同学专访。李本超从2022年3月开始参与 Apache Calcite 社区贡献,主要贡献了包括子查询优化、Join 优化、JSON 函数优化、JDBC Adapter、通用的表达式优化等。于2023年1月正式受邀成为 Apache Calcite PMC。
十个月,由初识到热爱
在过去几年,我主要是负责 Flink SQL 相关的工作。 在不断深入参与到 Flink 的开发贡献的过程中,也逐步的了解到了背后的 Calcite。 因为 Flink SQL 本身也是基于 Calcite 提供的核心能力进行构建的,可以把一些常见但是又复杂的事情交给底层的 Calcite 框架来做,比如 SQL 的解析、校验、优化等。 由此,我开始逐渐接触到 Apache Calcite。
我发现 Apache Calcite 属于比较典型的 “纯技术社区”,也就是没有商业化相关的公司在背后推动;而它本身又是一个足够复杂,具有极高技术挑战性的一个项目。它的出现解决了众多项目需要支持 SQL 但又成本太高的问题。直接利用 Calcite 的现成的能力,可以快速让一个系统具备比较完备的 SQL 支持能力,这给 Apache 的其它项目带来了巨大的便利。Calcite 项目被众多重量级的 Apache 项目用来实现 SQL 引擎的能力,比如 Apache Beam / Druid / Hive / Kylin / Flink / Drill / Phoenix 等,当然也包括一些商业产品。而我也在对 Flink SQL 进行更深度的优化的时候,开始逐渐接触到很多 Calcite 的核心概念。
在学习过程中,我发现 Calcite 里面有非常多的经典设计和思想,而且对于 SQL 引擎这个领域,Calcite 可以说是非常权威的。也是这些原因逐步的吸引着我更加深入的了解,也一步一步走向对 Calcite 社区进行贡献的道路。
我的第一个 PR 是 22 年的 3 月份,当时正值疫情隔离在酒店,周末闲来无事就浏览一些技术相关的社区,刚好看到 Calcite 社区有人提出了 JSON 函数的缺陷,我们当时内部也在考虑在 Flink 上支持 JSON 函数,所以就尝试帮 Calcite 社区解决一下这个问题,没想到第一个 PR 在一个小时内就被合入了,当时感觉到社区小伙伴真的太热心了。受到社区氛围感染,我就开始了 Calcite 的贡献之旅。很快另一个惊喜又来了,在 6 月份就收到了成为社区 Committer 的邀请。在拿到 Committer 身份之后,我发现社区的 review 资源其实是非常匮乏的,虽然很多 PR 都可以得到较快的响应,但是仍然存在一些 PR 得不到及时的处理,所以我就把更多精力放到了辅导其它贡献者上。到 23 年 1 月份,又收到了成为社区 PMC 的邀请。回首这 10 个月,是整个社区小伙伴们长期的奉献精神鼓舞着我一直坚持下来。
目前我对 Calcite 社区的贡献方向较为广泛,包括像子查询优化、Join 优化、JSON 函数优化、JDBC Adapter,也包括一些通用的表达式优化等等;除了代码贡献之外,我也比较关注社区的技术讨论、用户提问、PR Review等等,每个方面都有一些不同程度的贡献。
在现代化的数据领域,SQL 无疑是最重要的表达方式之一。而 Calcite 在这个领域深耕多年,有着深厚的积累,且在很多重量级的项目当中得到了反复的验证和打磨。相信未来,Calcite 会有更加广阔的市场空间,社区也会在逐步的在众多贡献者的推动下越来越好。
谈到收获。从一开始接触到开源、参与 Flink 社区,到至今很荣幸又受邀成为了 Apache Calcite PMC。一路走来,参与开源确实让我收获颇丰。
首先,最大的收获是技术能力的提高,在参与的过程中,需要跟这个领域最权威的一批同学一起讨论解决问题,需要对整个项目的架构有足够深的理解才能做得到;而且大家在讨论的过程中,也会碰撞出来更多的想法,提高自身的技术水平。在这个过程中,技术视野的提升是非常大的。
其次,是收获到了一批志同道合的社区小伙伴,能够逐步在社区中得到认同,进一步再把这种社区文化传递下去是一件非常幸福开心的事情。
最后是一些个人影响力的提升,比如拿到社区的 Committer 或 PMC,也是社区小伙伴对你能力的肯定。
目前,我主要参与的开源项目是 Apache Calcite 和 Apache Flink,主要关注这里面关于 SQL 生态、优化、效率、流批一体、Streaming Warehouse 等相关的事情。
一些建议
“参与开源”已经是一个老生常谈的话题了,网上也有很多同学分享过经验。我这里也谈一下自己的感受:
参与开源的过程其实是一个“持续学习”的过程,尤其是对于像 Calcite 这种入门曲线相对陡峭的项目来讲,保持持续不间断的学习,是非常重要的。面对社区里面众多的问题、issue、讨论,很多人一开始会觉得难以入手,这个时候可能就是需要针对某个 issue 做一些深入的研究,然后再逐步的参与进来。虽然我现在已经是 Calcite 社区的 PMC 了,但是这个项目里面仍然有大量的需要我不断学习成长的内容,我也会持续坚持下去。
很多时候参与的方式并不只是代码,代码只是其中一部分。参与到开源社区,要把这个项目作为自己的项目去维护它,所以从这个角度来看待贡献,就是“不挑活”,所有有利于社区变的更好的事情,都是一种贡献,比如用户问答、代码 review、文档的维护、不稳定测试的修复、build 系统的提升、code review、技术讨论、release等等。
大家在参与开源社区贡献的时候,社区的 PMC 成员会观察大家的每一个行为,最终通过综合考虑,比如贡献度、专业度、是否遵循 Apache Way 等方面来考虑是否邀请成为 Committer / PMC。整个过程其实就是一个建立“信任”的过程。
对个人来讲,贡献社区最直接的回报就是可以跟该领域最权威的团队一起工作,学习和成长,并且逐步成为这个家庭的一员。当然能够在社区拿到 PMC/Committer 等身份,也是对个人能力和贡献的认可。
对团队来讲,我们需要提升团队对于技术的标准和要求,同时对最前沿的技术保持敏感,贡献社区就是最直接的方式之一。
对公司来讲,虽然贡献社区不会直接对公司的业务产生收益,但是从公司的对外的技术影响力会有一些帮助。对于企业,尤其是大企业来讲,从使用开源社区的软件,到反哺开源社区,才会让开源软件有一个更加良性的循环、持续保持“生命力”。
对社区来讲,开源社区就是由一个一个的独立贡献者组成的虚拟组织。尤其是对于像 Calcite 这种背后没有商业公司支撑的开源项目来讲,所有贡献者都是用自己的时间对社区进行贡献,也正是这些贡献力量在不断维持社区的正常运转,并且不断前进。
希望每位同学都能在开源社区愉快玩耍。
保持热爱,奔赴山海。
往期推荐
👇 点击「 阅读原文 」,参与技术交流