从技术小白成长为有着Apache member、Apache spark PMC、Apache Livy PPMC等头衔的国际顶级开源大牛,邵赛赛用了十年。
在回答是什么让这位鹅厂技术大牛十年如一日贡献开源的时候,他的回答是“爱和坚持”。
刚接触Apache开源社区时,邵赛赛时常看着邮件列表陷入迷茫,这种上世纪90年代流行的互联网沟通方式,在20年后已经让新生代的程序员们有些看不懂了。如何订阅、回复还有邮件要发给谁,都是他感到疑惑的问题。
更加令他疑惑的还有各种英文缩写,虽然认识每个英文字母,但组合在一起却像是天书,过了好一段时间他才搞明白,原来“LGTM”是“looks good to me”,而“PTAL”是指“please take a look”。
多年后,当他看到“YYDS”,别人告诉他这是“永远的神”时,熟悉的感觉立刻就回来了。
持之以恒,“鱼”就会到来
2010年毕业的邵赛赛,多少有一些“生不逢时”,大学他学的是模式识别与智能系统, 这个看似前沿的专业在当时看来还是太超前了,市场上相关的公司太少。
于是只好去做后台开发。由于工作中涉及了大量数据分析,此时大数据技术方兴未艾,英特尔在国内开始投入大数据相关的研发,他便去了英特尔,后来又去了“Hadoop三驾马车”之一的Hortonworks,一直做大数据开发。再后来因为腾讯大数据的体量和业务场景,加入了腾讯。
也因此,他开始了与开源的不解之缘。
说是不解之缘,因为大数据和开源就像是一枚硬币的两面,无论是早期的Hadoop还是之后的Spark等大数据基础软件,体量都庞大到一家公司难以支撑其演进,需要全球化的组织来共同推动。
“任何一家公司单独去做这个东西,它的生命力都是有限的,但开源会让更多的人不断投入进去,它的生命力就是无限的,要做大数据,就要投身到开源的领域去。”邵赛赛说。
在Hortonworks,所有的软件或代码都是开源的,工程师的工作也都在开源的项目里进行,公司主要的盈利模式是为开源软件提供解决方案。大数据行业里,绝大多数的底层组件都源自开源社区,也因此,大数据工程师们的工作离不开开源,“不管是去开源社区提patch,还是了解开源社区的进展,参与开源社区的讨论,都是工作不可分割的一个部分。”
通过参与开源项目,参与者也能获得对应的头衔,比如参与Apache社区的大数据项目,贡献代码、文档和问题可以成为contributor(贡献者),这是开源项目基本的参与角色。
第二阶段是committer(提交者),committer能够将contributor贡献的代码或文档提交到代码的分支里去,并且日常review代码,帮助将patch尽快“核”进去,维护项目更好地发展。
第三阶段就是PMC member——项目管理委员会成员,PMC member所要做的事情,首先是决策项目未来的发展;其次是在contributor中遴选出优秀的个体,然后将他们推选为committer。总之,通过决策开源项目的每一个点来推动项目发展,这个就是PMC成员。
在PMC member之上,还有PMC chair(项目管理委员会主席),通常是项目的发起者或是领军人物。
而邵赛赛目前的头衔——Apache member、Apache Spark PMC和Apache Livy PPMC,在知名的Spark社区,他贡献了197个patch,排名33位,在Livy社区贡献了102个patch,排名全球第1位,这些足以体现他在开源社区的影响力。这些的头衔来之不易,尤其在比较知名或行业影响力较大的社区,要得到大家的认可,成为committer或者PMC,需要经历长时间的考验。
正如文章开头所说,一开始进入社区,邵赛赛连英文缩写都看不懂,更遑论了解开源社区的规矩和做贡献了,这也是许多中国人面对开源的第一道坎儿。邵赛赛用《老人与海》中长时间没有渔获的老人做比喻,许多人接触开源时,会有这样一段艰苦的时期,就像一个人去爬山,然后迷失了方向。
“你找不到更好的可以贡献的东西了,也不知道做什么好,有的人可能就放弃了,但经历一段时间的摸索和寻找,你会逐渐发现有一些潜在的可以投入的点,可以做出贡献,这两种状态会周期性的交替出现。”在邵赛赛看来,成为Apache member,最重要的并不是技术要有多牛,而是热爱这个社区,愿意在社区上做更多的贡献,帮助社区的项目更好的发展。
持之以恒,“鱼”就会到来。
“慢工出细活”
国内软件公司由于起步较晚和注重实际业务,普遍追求遇到问题就解决问题、快速迭代的方式,但开源社区却更讲究“慢工出细活”。
比如一名contributor发现了一个问题,他首先要分析这个问题到底是什么,分析出原因后,要去说服社区的大佬,因为自己分析出来的原因可能并不是深层次的原因,要继续分析。真正的原因分析出来后,还要做出解决方案,而且不是短平快的解决方案,是相对长期的解决方案。
这个时候开始,要写设计文档,列出几套解决方案,讨论出一套最合适的,然后开始写代码,每一行代码的风格也都要符合社区的标准。写完代码提交后,会有比较完善的单元测试或集成测试,社区会反复review好几轮,包括注释的拼写错误都要修正,最后再由committer核入。如果patch比较大,整个过程的周期会长达几个月甚至一两年都有可能,这在许多国内公司看来效率太低。
而且许多国内的程序员,习惯的是公司内部有人会为自己的工作兜底,自己只需要埋头做事就行,强调与人交流对程序员来说甚至有些“不务正业”。这与开源社区存在极大的不同,做开源需要注重沟通。社区是人形成的圈子,由于社区的成员之间不存在强联系,也不存在必须负责的义务,如果成员自顾自地提交代码,可能根本不会有人看,代码也就不了了之了;而当一名成员和社区的人更加熟悉后,提交patch会得到更多人更快地响应,整个流程也能够大大加速。长远来看,善于沟通的人,在开源社区做事的效率要更高。
邵赛赛认为,目前国内开源和国外开源比较大的区别,是国内外对开源的理解不同。国内绝大多数人或企业对开源的理解,仅限于把代码放出去,让别人知道这个代码是我或我们组织开源的,认可这个代码很厉害,这样就完了。开源之后,可能就没有持续的贡献了,开源的回馈或收益很低,或者是只有影响力层面的回馈,这就是国内开源绝大多数时候的现状。
相对来说,国外对于开源的理解就比较成熟。首先,为什么要开源?开源并不仅仅是为了影响力,开源也是一种商业行为或者说是商业模式,目前国外已经摸索出来一套比较好的方案,比如红帽这样的大公司,通过开源软件来教育用户,之后通过加强的商业版本收费。
还有许多利用开源创业的公司,尤其在大数据领域,这是非常主流的一种方式,它们通过将开源的产品进行重新包装、打磨,形成商业版的能力然后收费,即使是小公司,也可以依托开源社区去把核心功能做得更好。就像Hadoop三驾马车中的Cloudera和Hortonworks就先后上市又进行合并,还有Spark方向的Databricks,现在估值已经达到了380亿美元。
至于像谷歌这样的大公司,更是利用开源来形成相应的生态或标准,比如谷歌开源安卓,最终在移动互联网时代成为两大操作系统之一。相比之下,国内绝大多数公司和组织,对于如何通过开源获取影响力,如何有针对性地去开源,如何利用开源来构建生态,如何利用开源获得商业利益,不说是脑子里一团浆糊,也是“知其然不知其所以然”的。
但国内并非没有做好开源的潜力,比如目前在开源领域非常活跃的腾讯,本身就拥有着海量的数据需要处理,这对其内部技术的要求极高。腾讯同样从开源社区获取了不少的帮助,这些对问题的解决方案如果反馈到开源平台,也会推动社区的发展。另一方面,腾讯在大数据领域的基础技术已经基本完善和成熟,因此也有更多的意愿,去做更加前沿的技术研发,这也是大公司独有的优势。
尤其是腾讯930变革以来,开源成为公司级的技术战略之一,并在内部成立了开源管理办公室,下设项目管理委员会、腾讯开源联盟和开源合规组三大组织,旨在自上而下地传递腾讯开源策略,自下而上地落地开源技术生态。同时,通过开放的开源评审平台,孵化和培育优秀的自主开源项目。
三年过去,目前腾讯已经对外开源了140+个项目,有数千位贡献者,Star 数超过40万,开源贡献居于全球前列。在内部腾讯已组建和孵化了117个开源协同小组,涵盖了计算、存储、数据等所有互联网技术基石。全公司内部代码开源率达到85%,不仅给腾讯带来巨大的效能提升和成本节约,同时通过腾讯云不断助力越来越多的生态伙伴,并源源不断将经过内部大量业务沉淀和检验的优质项目对外开源。
比如,致力于大数据领域的天穹Oteam,将各事业群的大数据最佳实践复制到了各个场景,实现平台互通,功能复用,大幅提升了通用性能与资源利用率。
做开源的“爱与坚持”
做开源需要怎样的特质?
邵赛赛认为,首先是要有毅力,能够持之以恒。开源项目都是需要长期投入的,只有长期投入后,才能有更多的回报。对于像Spark社区这样要求较高的开源社区,从contributor到成为committer,至少需要持续贡献三年或更久,其中有的社区大牛,从自己的青年一直贡献到中年。做开源如果没有对开源项目真正的热爱,没有持之以恒的毅力,而是追求短期的回报,那么很容易就会放弃了。
其次是有强大的自驱力,支撑自己持续不断地投入到发现问题、解决问题、贡献代码的过程中去。发现问题和解决问题对开源至关重要,但这两种能力并不是每个人都拥有的,很多贡献者在使用的过程中发现了几个问题以后,贡献完之后不知道还能继续做什么,这个时候就需要依靠自驱力以及相应的方法论,去持续发现问题和不停地进行改善。
邵赛赛对寻找值得贡献的点的经验是,首先,要找到一个方向,这个方向要具备很多的潜在可以做的点,在这个方向上去寻找可以做的点;其次,在做这个方向的时候,如果发现很多公司在实际应用中有很多问题,证明代码的成熟度有限,那么就去构建一套测试框架或是测试集,然后去测试,测试出了问题就解决问题,最终还是会寻找到一条能够挖掘出更多可做点的路。
而这样的自驱力又建立在对项目的认可上,只有认可了项目,才会想做更多的贡献,并在社区头衔和影响力上获取相应的成就,尤其是在全球知名的开源社区获得影响力,对贡献者来说也能够进一步激励自己。
通过持续对开源做贡献,开源社区较高的核入门槛,可以让贡献者更加系统深入地去思考问题,提出真正能解决问题的方案,而非“短平快”、“头疼医头脚疼医脚”的解决方案,并且和全球不同文化背景的人沟通,也能让解决方案更加清晰和面面俱到。“我在review很多代码的时候,尤其是国内一些贡献者代码的时候,他们的patch是不错的patch,但是没有准确地描述出为什么要提交这个patch,究竟解决了什么问题,这也会造成贡献没有很好很快地被人接纳。在社区中,不但要做事,还要跟人有效的沟通。”邵赛赛说。
开源是一件伟大的事情,让全世界的智慧能够汇合在一起,并无偿地反馈给全世界。但对于开源社区的贡献者来说,做社区贡献,就像是一个人默默去爬山,既孤独又艰巨。曾经邵赛赛在做Spark贡献时,很长的一段时间里,国内没有多少人在做这个,相互间不多的交流也仅限于在社区上,说不辛苦,那是不客观的。
但他的开源贡献最终带来的长期价值也是巨大的,甚至不仅仅是一个Apache Spark PMC的头衔所能概括的。对有志于做开源的人来说,“路漫漫其修远兮,吾将上下而求索”。