对个人来说,开源是方法;对公司来说,开源是契约。
by 梁辰晔,华为开源能力中心专家。
本期访谈嘉宾介绍
梁辰晔,华为主任工程师,从事容器相关的开发以及社区组织工作。现为华为容器社区(EulerOS iSula)的负责人,拥有10多年的社区布道、社区开发和商业产品的交付经验。先后活跃于 GNOME 社区、openSUSE 社区,对开源开发、开源到商业的转换有深入的理解。
公司介绍:华为是全球领先的信息与通信技术(ICT)解决方案供应商,专注于 ICT 领域,坚持稳健经营、持续创新、开放合作,在电信运营商、企业、终端和云计算等领域构筑了端到端的解决方案优势,为运营商客户、企业客户和消费者提供有竞争力的 ICT 解决方案、产品和服务,并致力于使能未来信息社会、构建更美好的全联接世界。
职业发展经历
孙远:辰晔,你好。谢谢你接受本次采访,能否介绍一下你的职业发展经历?我相信这会对其他人有借鉴意义。
# 毕业之后从事开源工作 #
梁辰晔:我现在在华为工作,工作内容涉及到容器、云计算相关的开源软件开发,以及开源社区的运营。来华为之前,我在 SUSE 工作了8年多的时间,从事 SUSE Linux 企业版的开发工作,也参与了一些架构设计和需求分析等工作。
毕业之后我接触开源社区的机会比较多。在工作之外,我积极地参与了国内和国际上的一些开源活动,这包括线上和线下的活动。在国内主要是参与了国内一些开源社区的建设,有时去做一些技术分享。
# 刚开始接触开源时的感觉 #
孙远:毕业后能够有这么多机会参与开源,组织了那么多活动,真是不错。能否介绍一下你是什么时候开始接触开源的,刚开始接触开源时有什么感觉呢?
梁辰晔:其实最早接触开源是在大学的时候,我们学校的 Linux 氛围很好,学校的教授对 GNU/Linux 特别推崇,同学里面也有一些痴迷的爱好者。大学的时候我觉得这些东西比较神秘,相比较 Windows 傻瓜式的点击操作界面,感觉 Linux 更像一个极客要做的事情,所以误打误撞就进了开源社区。毕业之后找的就是与 Linux 相关的工作。
孙远:那我理解是不是因为对 Linux 开源的这种热爱,才能驱动你这些年一直在不断的投入到开源社区的贡献当中?
梁辰晔:对,可以这么说。这个东西其实纯粹就是工程师的一些偏好,对于就业考虑得会偏少一些。
# 从 Suse 到华为 #
孙远:你以前在 Suse 工作,后来跳槽去了华为,这次工作的转换是出于什么考虑呢?
梁辰晔:由于 IT 发展阶段不一样,国内公司绝大多数是“使用者”,包括现在很多技术比较前沿的创业公司,精力也都投在集成、方案部署方面,真正参与甚至主导开源项目的凤毛麟角。这些年,国内开源方面做的比较纯正、能保留原汁原味上游社区玩法的还是一些外企,包括英特尔中国、Suse 中国等等。国内能和上游社区真正接洽的企业多是一些大公司,如华为、阿里、百度等。
为什么选择国内公司呢?第一个就是外企天花板有限,国内公司发展很快。从发展规律来看,国内的 IT 公司一直在跟随国外,如果这个规律对于开源也成立的话,在2020年开源会成为国内公司的一个常态,被理性、广泛的认可。所以我想来国内的公司试一试,和国内的开源一起成长。
为什么选择华为呢?华为的软件服务重点围绕基础软件展开,开源的土壤比较好。基础软件的特点是通用、标准化,对接更多的上下游软件,当然现在大家都喜欢说“生态”,所以,基础软件比较适合开源。事实也是这样,我们现在能想到的火热的开源项目多半是基础软件。
给读者的启示:
国内的企业在开源方面发展的潜力更大。
# 华为运作开源社区的方式 #
孙远:你在华为开源能力中心工作,能否介绍一下华为是怎么运作开源社区的?
梁辰晔:华为的开源跟社区的开源有不一样地方,以商业为导向。如果开源了一个项目讲不清商业价值,那从公司角度来说会观望,不提倡把这样的开源当成公司行为。华为相对来说比较的谨慎。
华为有一套比较严谨的开源软件方法论,从“为什么某某项目要开源”、“为什么要参与某某项目”、到“怎么投入开源”、“投多少人、什么人”,都有对应的流程和方法。其实这些流程不是专门针对开源,其他事情的决策也是这样。
给读者的启示:
在商业公司中,投入开源是为了服务公司的商业利益,不能为了开源而开源。
# 在华为参与的开源社区 #
孙远:你现在在华为主要参与哪些开源项目呢?
梁辰晔:我现在在参与华为操作系统的一个叫 iSula 的容器社区。我的微信和好友的头像,就是我们社区的一个标志,这是我们华为自己的一个社区。当然也希望未来能够成为大家认可的一个去公司化的纯社区。除了这个以外,我也会参与一些上游容器社区,比如 OCI 社区,Kata 社区, CNCF 社区。
印象最深刻的开源的事情
孙远:你参与了很多开源项目,哪些开源的事情让你印象最深刻?
梁辰晔:我讲下亲身经历的几件事情吧,其实都不是大的事情,那我按照时间顺序来讲。
# 不应一视同仁的对待公司开源和社区开源 #
先讲第一件事,我刚工作那会,我跟很多人都分享过这件事。有次国外的老板过来检查我们的工作,我就把我的问题单给他列了一下,有一些是我们内部的一些 Bugzilla 的问题单,有些是社区 Bugzilla 中的问题单。他当时就很有点不是特别高兴地问我,为什么你要改社区的一些问题?这个事情一下子就把我刚毕业的心态稍微地转了转。因为刚毕业的时候,我觉得参与开源时,公司开源和社区的开源应该都是一视同仁的。但那次之后呢,我觉得即便你是一个以开源产品为基础的商业公司,对内跟对外的一些工作,还是不一样的。
后来我跟其他前公司的同事也交流过,这些同事的工作是针对公司内部的,但他们工作之余可能会比较多的参与社区开发。所以,回想起来这件事,我觉得我当时应该给老板看的是一些公司内部的工作,社区参与方面的内容可以在私下里和老板交流,这样更合适一些。
孙远:公司运作开源是需要有商业利益的,和开源爱好者参与开源是有很大不同的。
梁辰晔:对,这个肯定要弄清楚的。拿现在比较火的 Docker 社区举例,你参与 Docker 社区的开发,贡献了一些特性。但这未必是公司想要的,即便你的贡献很多,给公司在社区的名声有一个比较好的积累。公司想要的是你在 Docker 上面的开发工作能够支持公司的一些业务,这个才是公司想要的。所以这里面会有一些细微的差别。
给读者的启示:
在公司中自己投入开源社区时要与公司的业务方向相一致。
# 要及时向社区反馈自己的代码 #
第二个事情是在公司继续工作一段时间后,我对公司的一些工作已经上手了,但又被公司领导说了。领导说,你为什么在公司项目中做了这么多开发工作,却没有直接回馈到社区里面?每次社区版本升级,你不得不基于最新的社区版本重新适配你早先已经完成的开发工作。现在刚好是自己在维护这几个升级版本,今后如果别人来接管这项工作,他怎么来维护你的 patch?这样工作量会越来越大。
公司内其他同事大多是直接参与社区开发的,他们会觉得“你改了一些软件功能,却没有将代码回馈到社区里面的事情”挺不可思议的。我当时也没有多想,等到现在回过头看,就是社区里面的开发其实是最好的一个开发方式,需要往社区里面提交一些代码。这样做对公司不会有太大影响,同时有利于社区的发展。
所以一些工作上的补丁需要及时向社区里回馈或者是往社区的 bug fix 版本去提交,这是一个比较明智的做法。这种方式也是红帽公司提倡的,它认为运作开源只有一种方式,就是向社区里回馈,任何拿私有代码去进行维护的方式,都不会得到红帽公司的认可。红帽的模式未必适合所有公司,但值得借鉴。
# 保留有核心竞争力的私有代码 #
接下来说下第三个事情,等到再过一段时间又会发现一些思想上的转变。每个公司基于开源社区方面的运作,都有一些比较明显的业务场景作为导向。因此比较现实的情况是,不是所有人都能够往社区合入代码,尤其有些代码的合入是讲策略的。
举个例子,A 公司、B 公司和 C 公司的开源策略都不一样。那社区怎么办?如果社区项目的特性比较好解耦当然是最完美的,更多情况下没法解耦,社区只能选择其中一个比较通用的策略。在这种情况下,你需要私有保存一些代码。
首先这导致了一些私有代码没法完全社区优先。其次,虽然我之前理解一些带有商业属性的自研特性,往社区合入是没问题的。但是在一些场景中,我们研发的特性会涉及到公司的创新投入,而且在许可证允许的情况下,客户还是很认可这些特性的。因为这些自研特性还是具有一些竞争力。
所以从商业公司角度来讲,投入这么大的精力去做一个有核心竞争力的特性,如果纯粹的贡献给上游社区,是不可接受的。这种情况不光在华为存在,我跟其他公司的朋友也了解了一下,如果他们将有核心竞争力的特性代码直接贡献给开源社区,就会被老板直接一棒打死。老板会问,为什么我们辛苦研发的代码就直接拱手让给社区了。
所以,对于开源社区的运作,需要根据你的商业模式进行一个取舍。有些特性代码可以往社区合,有些东西还需要保留着。对于如何有效的保留私有化代码,这就属于开源方面的一个硬能力了。
孙远:好的。这是不是说在运作开源时既要保持社区影响力又要保持核心竞争力?
梁辰晔:我认可核心竞争力,但参与开源未必是为了保持开源社区影响力。这个就涉及我刚才提到的开源理解阶段的三个事情。这是向社区贡献代码和保存私有代码的两种方式能否结合起来的问题,向开源社区贡献代码构建影响力是一个过程。开源更多是一个方法,你做了一个开源的贡献,是一个双赢的事情。影响力的构建是过程中自然积累的。如果是为了构建影响力而开源,这个可能会走偏。
如何理解开源
孙远:你是如何理解开源的?
梁辰晔:我理解开源经历了几个过程。
# 开源很厉害,自己不敢碰 #
在第一个过程中,我觉得开源很厉害,自己不太敢碰。我相信很多人在刚刚接触开源时也是这样的。早先的开源社区里面会有一些传奇的故事,包括 Linus 和 RMS,他们都是有鲜明的个性,技术上非常厉害,他们开发一个软件时可以很快做出原型,并被大家认可和推崇。
在工程师圈子里,拥有这种能力是很难得的。工程师其实跟文人一样,有一些自尊心,很少会直接说自己心服口服的觉得自己比别人差。但是有些大牛在社区里面,就不得不承认的确不如人家,这种与大牛的差距包括各方面能力。尤其在刚毕业的时候,会觉得这个社区特别神秘,我只能远观。发邮件都有些战战兢兢,自己不是那么有自信。因此有些想法可能不是特别敢跟别人去讲,这就是第一个阶段。
# 开源社区中的那些人不过如此 #
下面说一下第二阶段,就是如果不碰开源了,那反过来纯做一些软件产品。在这一阶段中,感觉开源社区中的那些人,有点傻乎乎的。你做的开源软件总是有些漏洞,而且你做开源社区时,你的贡献并不能够直接转换成金钱。而我们在基于社区版本做一些改进、改良的时候,我们产品质量可以超过社区的软件版本,并且可以卖给用户。这个时候就会产生一种错觉,觉得开源贡献者的技术也不过如此,我可以做的比他们更好。
# 开源就是开发方法 #
经历了第二个阶段之后,尤其在参与了多个开源项目之后,我就进入了第三个阶段。开源对开发者来说,就是一种开发的方法。不存在我用开源模式进行软件开发就比不开源的开发模式要强的情况。软件开发代码的能力好和不好,完全是个人能力决定的,跟开源本身是没有任何的关系的,开源软件和闭源软件的开发都会对个人的技能有一个提升。
不一样的地方是,开源代码有很多双眼睛看着。有一些对代码近乎偏执的人会要求提交者反复修改,而企业里面有时为了赶进度牺牲质量。这种折磨下,代码能力的确会提高的快。另外,社区人群不一样,大家的技能各有所长,能够学到的东西更多。而公司一个团队的人其实看什么书会什么方法都趋同。
如何选择开源项目
孙远:面对众多的开源项目,你是如何选择的?
梁辰晔:开源选型会有很多评判标准,我们看它的成熟度、质量、用户量等;另外也要看它未来的发展,这个开源项目是不是在可预见的未来是否能够持续的有人或公司在推动。
因此比较偷懒的一个方法是看这个开源项目背后主导的人或公司是不是可信赖的。对于小公司或者在开源方面投入比较短的公司,他们推出的开源项目可能会发展的很快,但是指不定什么时候会因为自身的业务变化而中断开源项目。
相反对于大公司,其主导的开源项目本身就是跟他们业务强相关的,只要他们的业务不倒,开源项目会一直做下去。选择开源项目时,需要考虑它开源背后的主导者。如果你觉得主导者比较靠谱,那你可以选择这个开源项目。反之就需要进行风险评估,例如他是否会长期维护这个项目。
参与开源需要的能力
孙远:参与开源的人员应该具备哪些能力或特质?
# 从内心热爱开发 #
梁辰晔:参与开源需要的第一个特质就是,你喜欢开源这个事情。开源社区主要还是开发者社区,大家聚到一起是共同完成一个项目的。社区里面光说不做的大有人在,很难脱颖而出,所以还是老老实实的提交 commit 吧。如果打算参与开源,首先你自己要有一定的动手能力,能够把一个想法实践出来。这个实践很难立刻转换成收入,所以如果把开源当成寻求利益的手段,会很痛苦。
我看到这样一种现象,国外的一些参与开源的技术人员会真的做一些东西,即使年龄较大(40岁以上)但仍然会一直写代码。之前我跟他们一起出去玩或出去开会回到酒店后,看到他们还记着写代码,并且写的代码不一定是工作要求的,而是自己的兴趣爱好。他们写代码就跟我们刷微博、发朋友圈一样,当成了一种习惯。所以对于第一个特质,我认为是对代码的热爱吧。如果一个团队工程师文化不好,那么开源肯定做不好。
给读者的启示:
参与开源需要那代码说话,而不是只提想法而不去实践。
# 需要可以在社区中与其他人顺畅的交流 #
第二个特质就是能够比较顺畅的跟别人交流,这种交流是依托于你对项目的理解。这个时候不妨可以主动去交流,没有什么好害羞的,反正我的感觉是社区的人一般比商业的人要更加的友好。
你去跟社区里的人交流、请教问题,或者给他们一些反馈,他们在大部分情况下还是乐意的,至少他们会觉得自己的技术能力被认可了。不会像我们商业公司里面,你找一个人问问题时,别人有时一下子就冷脸贴过来了或者爱搭不理的。因为回复你不是他们的KPI。
所以第二个特质就是可以进行比较好的主动交流,而这个交流不仅仅是在开源社区中,公司工作等其它方面也是需要主动交流的。总体来讲,工程师往往有一些劣项,所以如果你在劣项里面可以主动跟别人交流,你就会很快补上短板。
我之前看过一些心理学教授的研究过一个问题,一个团体里面交流的问题是不是需要“深思熟虑”,“蠢”问题太多好不好。我记得研究的结论就是过于谨慎的团体氛围不利于个人和整体的提高。保持一个有错误但是活跃的社区,对个人对社区都是有好处的。当然问的话要真诚一点、礼貌一点。这涉及到社区礼节,通过网上搜索可以获取更多的内容,比如问问题的艺术、社区参与的艺术都会有的。如果你能够合理的问问题,大家都会愿意帮助你的。你是在一两个人面前暴露了自己的缺点,但是马上你就会把这些知识变成自己的,往往之后你在更多人面前展现的就是一个全能的形象。
# 需要进行良好的社区合作 #
下一个特质是能够与社区进行很好的合作。开源社区是合作的,而不是竞争的。不是说我们同时有不同的设计方案,那我们两个就是竞争者,我必须把你 pk 下去,我就要把我的代码提交上来,这样做肯定不可取。通过合作,我们共同把这个事情做好,因此在社区里交流相对来说就应该要友好一点而不是你死我活的。社区肯定需要牺牲,所以第三个特质就是合作态度要好。
如何在 Github 中拼出一片天地?
孙远:对于刚接触开源的人,如何在 Github 中拼出一片天地?
梁辰晔:我觉得最主要的是坚持,并且是坚持一两个方向,这样才可以。以前经常有句话这样讲,“伤其十指不如断其一指”。是说你的方向要始终坚持下去。
社区不缺热点和追热点的人,热点出来后,各个社区、会议会雨后春笋般出现,昙花一现,大赢家其实是会务组。现在国内一些 Github 上比较厉害的都是在一两个方向上始终如一,包括像 Go 语言的一些开发者或者容器的一些开发者,包括数据库的开发者,都是这样子的。所以,我觉得可能坚持加专注是必要的。因为目前来看,只有拥有这两个特质的人和公司才能良性发展。
# Github 对程序员的影响 #
再来说下 Github 对程序员的影响,我2014年的时候就跟一些人在研究 Github,当时很多人预测 Github 会成为程序员未来的个人简历的一个天然的场所。现在看呢,这真的会慢慢成为一个趋势,这个原因是因为无论是互联网还是传统行业里面,开源软件的使用越来越多了,你是避不开的。
大部分公司会要求你对某项技术,比如说云计算、人工智能等有一定的深入理解和改造能力。改造能力体现在你在 Github 上的一些参与,包括上游社区代码贡献。我认识一些大公司的招聘团队、猎头,选择候选人时就直接看 Github。因为其他的属性是完全不可测的,你不能只听别人做几次演讲,就说他特别好或不好。还是用代码来说话最靠谱。
如何运作开源技术社区
孙远:能否讲下你是如何运作开源技术社区的?
梁辰晔:我在以前的公司和华为都在参与社区的运作。这还是跟如何在 Github 中打拼一片天地的想法是一样的。就是你要比较专注的做一件事情。社区比较忌讳的是,投入一段时间后就撤了。这样做对你的损害会非常大,因为社区相对于公司最大的优势,你可能会在社区中走远一点。
从这个角度来讲,运作一个开源社区,你就得报着起码持续投入四五年以上的这个态度和决心参与到里面去。不然的话,就肯定会失败。
在国内,我自己参与过的比较成功的开源社区就是 Gnome Asia 社区,从2008年开始到现在。当然定义开源社区成功与否是比较难的。按照社区同仁的说法,如果一个社区能够在创始人完全不参与的情况下,时刻保持一定的活力,这就是一个成功社区。
目前很多社区是由商业或媒体宣传组在推广,所以火的会更快一点,这属于新形势下开源社区一个方式,原来的开源运作方式比较慢一些,这种商业跟开源结合的方式能够更快的推广开源社区。
如何成为开源社区 maintainer?
孙远:你现在是 OCI 社区的 maintainer。能否分享一下你从开始接触 OCI 社区到成为 OCI maintainer 的奋斗过程?
梁辰晔:成为 maintainer 的时候还是有点开心的,但仔细想想也没什么可以炫耀的,maintainer 就是一个社区角色,总会有人是 maintainer,也不是离了我就不行了。我参与的 OCI 项目也是公司的一个投入,所以是利用工作时间投入社区的,这就比大多数利用自由时间投入开源的人占优势。投入这个社区既让自己攒点社区影响,同时完成了公司的任务,划算。
现在大部分的开源社区还都是由公司投入的开源,你自己私下的时间去投入开源的情况逐步在减少。这不是我拍脑袋想的,根据 Github 统计的热点项目,80-90%以上的参与者都是公司的投入,纯个人爱好少,这是一个明显的标志。
我个人建议是,想投入开源的人,要么你在学校的时候或者是自由时间多的时候可以参与进去,要么你就加入那些开源氛围比较好的一些公司,比如华为、阿里、百度或者一些外企,这样才能在时间上有充分的保证。
我是在 OCI 项目启动后不久参与到这个项目中的。我之前只知道一些技术,但是对 OCI 这个项目到底是什么也不是特别的清晰,所以参与的过程也是一个从零发展的过程。在这个过程中我们同事和我也经常大量讨论,遇到一些问题不耻下问,就是前面说的稍微主动一点。现在回过头来看有些问的问题或有些想法,是明显错误的,但很多 OCI 社区中的人及时纠正了我的错误。后面我们团队几个人都可以跟上社区的节奏,理解社区在做什么以及未来的方向。参与社区是个人提升的一个手段,反正从我个人角度来讲,参与社区真的是非常值得的。
在社区里面,是否能够成为 maintainer 会看你的一些关键性贡献,那就不是经常不耻下问就能够获得 maintainer 的,需要你至少能够积极的参与这个项目的开发与维护,尤其希望你能够给这个项目带来方向。另外需要花时间与精力真正认真的看待这个项目,理解这个项目,使项目的发展方向能够跟社区想要的方向一致,这样就可以名正言顺的成为 maintainer 了。
对开源软件前景的看法
孙远:能否分享一下你对开源软件前景的看法?
梁辰晔:开源作为一种开发方法,我认为它的未来是非常光明的。因为至少我看到的是越来越开放、更越来越合作。从一个软件开发者的角度来讲,开放式的开发应该是未来的一个主流,原因也比较简单,是因为大部分的基础工作是可以共同来做的,不需要去重复造轮子。
对于使用开源软件赚钱的问题是有争议的。因为之前我们也看过社区中有一些文章讲到在公有云场景下利用开源赚钱是比较难的,因为公有云的入口是公司,很多支付软件都要归它受控的,不像以前私有云的时候可以基于开源软件做一套方案出来卖钱。现在基于 Linux 赚钱都很难了,因为入口被公有云给占走了。
小结
1. 不应一视同仁的对待公司开源和社区开源。公司想要的是你在社区的开发工作能够支持公司的一些业务。
2. 从商业公司角度来讲,投入这么大的精力去做一个有核心竞争力的特性,如果纯粹的贡献给上游社区,是不可接受的。
3. 开源代码有很多双眼睛看着。有一些对代码近乎偏执的人会要求提交者反复修改,而企业里面有时为了赶进度牺牲质量。这种折磨下,代码能力的确会提高的快。
4. 参与开源需要的能力:从内心热爱开发、可以在社区中与其他人顺畅的交流、需要进行良好的社区合作。
5. 你去跟社区里的人交流、请教问题,或者给他们一些反馈,他们在大部分情况下还是乐意的,至少他们会觉得自己的技术能力被认可了。
6. 想在 Github 中拼出一片天地,就需要在一两个方向上坚持。国内一些 Github 上比较厉害的开发者都是在一两个方向上始终如一的坚持。
7. Github 会成为程序员未来的个人简历的一个天然的场所。一些大公司的招聘团队、猎头,选择候选人时就直接看 Github。
8. 想投入开源的人,要么你在自由时间多的时候可以参与进去,要么你就加入那些开源氛围比较好的一些公司,比如华为、阿里、百度或者一些外企,这样才能在时间上有充分的保证。
9. 是否能够成为 maintainer 会看你的一些关键性贡献,需要你至少能够积极的参与这个项目的开发与维护,能够给这个项目带来方向,使项目的发展方向能够跟社区想要的方向一致。
本篇摘自孙远《赢在开源》访谈系列,开源社独家首发。转载请注明出处。
孙远,阿里巴巴测试开发专家,目前在阿里巴巴从事阿里开源容器 pouch 的质量保障工作。参与编写了《Docker 进阶与实战》,曾多次受邀在国内技术会议上发表演讲。曾先后就职于美国风河系统公司和华为技术有限公司。