继百度、阿里、华为以后,如何成为下一个进入 Apache 的中国公司?
可以说,Apache 软件基金会已然成为现代开源软件系统的基石。但是,你了解 Apache 软件基金会嘛?你知道 Apache 软件基金会是如何运作的吗?
本次 TGO 鲲鹏会邀请到华为开源软件部技术专家、前红帽软件主任工程师、Apache 软件基金会会员 姜宁和腾讯大数据总监、开源联盟主席 、TGO 鲲鹏会深圳会员 堵俊平,他们将带你走近 Apache 软件基金会的幕后,一探其背后的运作机理。以下,Enjoy~
Apache 基金会算是世界上最大的一个开源基金会,因为它大概共有 300 多个项目,旗下的 committer 大概有 7000 多个。
Apache 基金会成立的主要使命是为公众利益免费提供软件。说起来简单,做起来难——首先你需要解决法律的问题,因为开源的许可协议是开源软件的根基,Apache 很大程度上是为了程序员建立了一个法律体系。同时,Apache 还为他旗下很多项目提供了基础设施,包括邮件列表、对应代码库等等。另外,还有大家常常使用的进项仓库,都是需要投入资源、资金进行维护的。
我认为 Apache 相对来说是一个比较草根的组织,也是一个中立的组织,因为它不偏向于任何一个厂商,并允许大家使用商业友好的许可协议,从而帮助软件和开源不断地向前发展。
值得一提的是,Apache 为项目治理提供了一个比较好的指导:
第一,协作式的开发方式。 在 Apache 基金会里有很多项目开发人员是分布在世界各地的,彼此间很难见面,但是大家可以通过 E-mail 等异步的方式交流、协作。同时,大家在交流过程中,也会互相尊重,并真诚地以技术为基础进行交流。
第二,持续提供高质量的软件。 虽然 Apache 基金会开源项目很多,但是质量也是有所保障的。
第三,开源项目安全性。 这也是 Apache 非常重视的一项,这部分也有专门的安全管理委员会进行管理;同时他们也会常常和 PMC 之间进行协调,并致力于标准的实现。
同时,在 Apache 基金会里还有很重要的一点——社区大于代码,我认为这部分是国内开放项目做得不太好的地方。国内大多数开发项目者都认为只要把代码开放出来就可以了,但是实际上远远不止这一点。简单来说,我们会分为 3 个方面:
第一,精英之治,个人通过工作积累功绩。 实际上,我们在这个过程中是有个相应的阶梯——User、Contributor、Committer、PMC、Member,这每一步都是需要依靠你在给基金会项目做贡献的过程中,让你所做的贡献得到大家的认可。在此基础上,你就可以逐步地成长起来。
Apache 基金会在很大程度上用这种机制,让你能被别人看到、得到他人的认可,间接地让你得到相应的权利和影响力。
第二,透明度,当前国内项目在保证透明度仍有一定的缺点。 在 Apache 里,你可以找到所有会议的记录,同时你们在邮件交流的过程中,也会有一定的存档内容。这样的方式有利于任何人在任何时间都可以直接了解到大家正在讨论什么内容。
第三,大家对开源的理解还只停留在公开代码的阶段,而实际上社区一直在 强调社区健康是首要的。
接下来,我将给大家分享比较重要的部分——如果你想自己的项目进入 Apcahe,主要需要经历哪几个流程?
第一,撰写项目提案。实际上,这一步就是把你项目的内容、目标、进度,以及和其他项目之间的关系描述清楚。
第二,找到 Champion 和 Mentor。Champion 相当于一个 Apache 基金会 接口人,他对 Apache 的规则比较了解,同时能帮助项目找到 Mentor,以及为项目提供相应的帮助。
进入 Apache 其实是一个沟通、交涉的过程,因为你需要用项目吸引到 Mentor 来帮助你。一般来说,一个 Apache 项目大概需要 3-4 个 Mentor;如果算上 Champion 的话,你至少还需要再找 2-3 个 Mentor。
第三,当提纲投票通过后,孵化器会给你创建一个孵化项目,后续需要签各式各样的法律文书——SGA、CLA、iCLA。因为需要你保证代码的来路是清晰的,不能把别人的东西说成自己的,这个过程也是一个很重要的基石。
第四,项目名称,这是一个很重要的点。因为项目捐献给 Apache 基金会,意味着项目的名称和商标也会捐献给 Apahce 基金会,同时 Apache 基金会还会要求项目的相关专利也要授权给基金会使用。另外,如果你的名称和其他项目冲突的话,会存在改名的风险。因此,在进入 Apache 之前最好做名称的搜索,如果有条件的话,最好做一些商标的申请,以便于保护相应的权益。
在基本流程之后,我们的开发过程会与 Apache 的基础设施进行整合。在 Apache 里有一句常说的话——如果这件事情没有在邮件列表进行讨论的话,它就是没有发生。
为什么这么说呢?因为邮件列表是沟通工具,也是证据,后续有什么纠纷的话,我们可以通过邮件列表进行调查。另外,邮件列表还起到了问题跟踪和知识共享的作用。
在进入 Apache 以后,除了基础设施之外,还需要对社区的发展负责。关于社区,我主要想给大家分享几个内容:
第一,社区的角色。社区的角色主要分为:
用户——用户是项目存在的意义,没有用户意味着项目失去了存在的根基;
贡献者——项目依赖于来自社区的贡献者们。贡献者参与完成了及时反馈 Bug、邮件讨论,并对 Bug 进行改正,增加文档等社区任务;
代码提交者——以功绩为参考项,杰出的贡献者们能够成为代码提交者;
项目管理委员会会员——项目委员会 (PMC) 负责制定项目的方向,批准发布以及对新的代码提交者和 PMC 会员投票。
另外,在社区交流的过程中,大家都需要遵循友善、尊重、信任和谦虚的方式进行交流,这也是我们的行为准则。
在 Apache 孵化器孵化的过程中,你可能会接触到各种各样和你类似的项目,但是大家都是可以互相协作的。同时在社区发展的过程中,我认为一个项目的好坏和社区活跃程度有很大的关系。因为社区是项目发展的一个源泉,如果你的社区比较活跃的话,会有很多人会帮助你提升项目水平、修改 Bug 等等。
最后,想和大家分享如何从 Apache 孵化器毕业,也就是达到什么样的情况才能毕业。
第一,当你的相关文书、法律协议已经签署,名称没有问题,同时你也展示了自己的自我管理和发布管理的能力。另外,你也展示了自己能够建立一个开放多样性的社区,也符合 Apache 项目成熟度模型,你的项目具备了 Apache 版本发布标准能力。实际上,这个过程还是很具备挑战性的,因为很多项目在最开始的版本发布阶段很难一次做成功,大多要经历好几次的发布准备。
在上述过程中,Apache 也会给你提供社区成熟度模型的问卷表,帮助你分析自己的优势和不足。
第二,建立好的法律框架。
第三,公开透明地运作项目。
满足这 3 点以后,恭喜你,你的项目基本就能从 Apache 孵化器中毕业了。
什么是成功的开源项目
开源项目?
今天我主要想和大家分享,站在从 Apache 基金会和企业开源负责人的双重视角来看成功的开源项目是什么样的。
实际上,要定义成功的开源项目也没有太多的可以量化的标准,更多的可能是包含一些主观因素的事实衡量标准:
广泛的使用
有些项目可能会需要看下载量、分发量、部署量,以及引用量和调用量来判断它的成功。当然,这些不一定是非常绝对的量化指标,但是整体给人的感受是,当你这个产品或者项目得到广泛的使用时,那么它就会有比较大的价值。
给世界带来巨大的价值
这种情况就类似于 Hadoop 项目,它能给业界带来所谓的大数据革命。或者说,这个项目(例如 Android)、产品能使我们生活变得更加容易,得到巨大的助力等等。
社区和技术影响力
这方面主要是指项目的开发者、用户数量拥有一定的基数。同时,它是具有强大生命力的,在社区里有一个庞大的优秀团队,包括能为我们的工程师、技术人提供一些津津乐道的话题。
构建完善的生态
因为所有的开源项目,很多时候都需要和其他项目来配合,尤其是偏原子性的项目即解决某一狭窄领域问题,这些项目能为我们提供一些垂直性的原子能力。现在有很多开源项目都是这样,需要在一起合作,构成一个生态。这样一来,也就是变成一个相互连接的上下游关系。因为现在几乎没有项目会真正从第一行代码开始,即使是闭源的项目,很多时候也是基于开源的项目原型来开发,所以如果你的项目能构建起一个完善的生态链条,形成辐射上下游项目的强大影响力,那么也意味着这个项目很大意义上是成功的。
成功的商业化
实际上,商业化并不是判断该项目是否成功的标准,因为很多成功的开源项目也未必合适做成商业化落地的模式。但是,如果一个开源项目能够成功做成商业化,那么显然它具备了很多成功开源项目的因素。比如,它肯定是很有价值的,它一定是拉动了相应的资源和规模化的落地使用,不管从市场、技术,还是使用者的角度上看,它一定是得到了一定程度的推广。
在我看来,成功的开源项目会构建起一个项目和社区的正向促进循环,即成长飞轮。
刚开始,我们可能拥有一个很有潜质的项目。比如,我们能看到一个有想象力的技术和功能空间,或者是一片领域,这个项目可以创造性的解决某些问题等等。然后就汇聚了一个比较强大的创始团队,做了一个初创版本,即 First release,然后提供一些有价值的功能。
当产生具备一些有价值的功能后,就会慢慢吸引更多的用户来使用。因为市场上可能还没有出现类似的产品,或者类似的产品非常昂贵等等。那么这个开源项目或开源产品,就可以帮助很多公司、用户实现它的业务价值。积累多了,自然也会有更多的用户慢慢地变成开发者。
一方面,是因为用户觉得这个软件有价值,对技术细节感到好奇,想参与一起来贡献;另一方面,用户会觉得毕竟这款产品不是为他 / 她量身定制的,可能希望它能实现更多的功能。
随着用户量和开发者的数量增长,我们可以看到开源社区里有很多自发产生的技术布道者,帮助这个项目产生更大的影响力另一方面,更多的用户开发者和影响力,最终会帮助这个项目发挥潜力,帮助吸引更多的研发测试落地等资源进来,实现更多更好的功能。
实际上,就是这样一个项目和社区的成长飞轮,让我们不断看到一些刚开始功能还不太齐全的小项目,慢慢地变得羽翼丰满,最后有可能成长为参天大树。
回到第一个环节,开源项目有很多,那么我们该如何判断一个开源项目是否具备潜力呢?或者我们该如何挖掘自身开源项目的潜力呢?
当我们决定要去贡献一个开源项目,或者是做一个开源项目,亦或者是要加入一个开源项目时,你在项目中的身份不同,可能关注的点也不一样。
以 Hadoop 项目为例,我认为最重要的可能有 3 点:
技术潮流和趋势;
用户痛点;
市场前景。
Hadoop 第一个版本大约是在 2006 年发布的,它展示的技术潮流和趋势正好是大数据行业发生技术革命的时期。在 Hadoop 出现前后的 2-3 年内,产生了一大批重磅级的新型互联网公司,这些公司的新型业务产生了大量的社交数据、互联网数据等等,这种数据规模、数据潮流可能是传统的数据库和数据仓库解决不了的,所以业界需要一些新的技术解决。
因此,当 Hadoop 发布时,它所代表的技术潮流和趋势和当时业界的整体需求是完全吻合的,同时也能解决当时的用户痛点,所以它所具备的市场前景是非常广阔的。
基于这几点看开源项目,我们可以发现即使它在刚发布时功能不完全,亦或者还没有一个完整的解决方案,但是它仍然具备强大的生命力。这是很重要的方面,也是突显它潜力的地方。
优秀项目的自我突破
想要将开源项目从有潜力变成一个很有价值的产品,那么它是需要优秀项目来实现自我突破的,而这个优秀项目的自我突破来源于什么呢?
创始团队的核心技术开发能力;
业务场景与挑战;
开源项目经验;
解决问题的普遍性(格局);
团队早期的稳定性。
这也是开源项目是否成功的第二个关键阶段,从所谓的有潜力项目发展成一个有价值的开源产品,上述的 5 点也非常重要。
如果当它已经发展成一个有价值的开源项目时,下一步又该如何吸引用户呢?这就来到了开源项目发展的第三个阶段——一个有价值的项目,如何吸引到更多的用户。我觉得有如下几点:
第一,加强项目建设,包括项目入口、网站、文档等引流方式的建设。因为如果这些入门级的使用和开发文档有问题的话,造成软件实际使用困难的话,很可能会影响到项目的早期用户来持续使用开源软件。
第二,社区支持。凡是软件总会有 Bug, 这些开源项目在使用过程中多多少少会暴露一些问题。当然,这些问题不一定全部是 Bug,可能是设计上让用户不理解的地方。如果我们能维护起一个用户和开发者在一起的社区,我们就能得到一些良性的建议,并加以改善,得到更多用户的支持,同时我们就能拥有一个强大的持续支持的、良性增长的社区。比如,在一个活跃的社区邮件列表里,你的问题通常可以得到很快的解答。
第三,社区运营与推广。因为刚开始的时候,项目的潜在用户可能都不了解这个项目,所以可能没有多少人会来试用。因此,这种情况可以尝试多做一些社区运营与推广,让更多的人了解到项目的亮点。比如,在有影响力的技术峰会(从几百到几千人不等)上介绍,亦或者构建自己的社区用户墙等等来展现用户与场景。
第四,商业化运营与服务。实际上,商业化是另外一个方向,主要是通过市场推广,或者服务产品化的手段吸引用户,这种与传统软件推广或运营的手段比较类似。
第五,生态构建。也就是说与其他项目关联成 End-to-end 的解决方案,让你的项目能拥有更多的更广泛的用户,解决更大的问题。
如何吸引更多的开发者
有了用户以后,我们也需要更多的开发者。对于开源项目来说,开发者社区是至关重要的。我们通常认为开源项目的第一性原理是,社区优于代码。
实际上,我对开源社区的本质理解是,以项目的代码为载体所构成的人与人的连接。
那么我们该如何吸引到社区的开发者,让更多人连接起来呢?
首先要形成一个好的共识机制。在寻找共识的过程中,刚开始我们可能会有一些认知差距,但是慢慢地大家大多都是在寻找一个共同的立场与认知;如果实在不能达成共识,那么就会相互妥协,找到一个可以共存、共赢的方案。
同样,如果想吸引更多的社区开发者,那么项目就需要构建一个积极正向的社区,让大家在社区里都有参与度,从而吸引最下面的用户群体向上,或者由开发者向核心开发者转化。在整个转化的过程中,不仅可以构建一个更开放的社区,也能吸引到更多社区开发者。
当有了用户和开发者以后,我们该如何进一步打造项目影响力呢?我认为主要可以分为 8 点:
创始人、创始团队的能量;
社区的发酵与酝酿;
持续的创新,不断的拓展场景和功能,优化性能;
行业的广泛采纳以及学术领域的肯定;
加强技术布道与 PR;
与用户和开发者建立广泛与密切的联系;
与生态项目构建起更紧密的联系。
创始人、创始团队的能量,这一点是很重要的,因为只有项目的核心团队拥有不断推动技术创新、改变世界的热情和决心,才能让开源项目能够持续发酵,后续加入的 Committer、PMC 和开发者也能被这些 Rock Star 带动起来,继续发光发热。
然后项目本身也需要持续创新,一个开源项目如果停下了创新的节奏,那么慢慢就会有很多开发者陆续离开,转向一个更酷、更新的技术社区。
另外,你的开源项目影响力如果能得到学术领域的肯定,那么一定是很好的。因为它有助于新生力量的加入,比如学生、教授、科研机构等等。这样也有利于项目的长远发展,包括新领域的探索。
除此之外,像技术布道与 PR,这都是非常正常的推广方式。但是比较重要的一点是,开源项目和传统软件技术还不太一样,开源项目需要与用户开发者建立一个长期且密切的联系,因为这些开发者会帮助项目不断的创新,所以保持社区的热度是很重要的。
最后,我们再来谈谈开源项目和商业化的关系。实际上,开源和商业化是没有直接联系的,而我们想说的是,开源项目指的是项目开发的方式,而商业化指的是项目的商业价值变现,或者说是商业行为。但是,这两个问题往往又很难剥离开,因为这里会涉及到既是开发者,又有商业化诉求的团队和公司。
因此在这个问题上,我们可以站在两个角度来看待问题,一种是站在开源的角度看商业化;另一种是站在商业化角度看开源。
首先,我来说一下站在开源的视角看商业化。和个人开发者相比,商业化团队往往是以组织的方式参与的,这种有组织有计划的参与方式可以摆脱个人参与的自发性和随意性。我认为,这是一件非常好的事情,因为有组织加入时,它能保障项目的开发和运营资源,同时也有创新的动力。同时,为了保证开源项目的商业化价值,商业化的组织通常会有更多的资源做技术推广。
但是一旦商业化团队加入以后,也可能会对项目造成一些负面的影响。比如因为商业化公司的本质是追求利润,所以往往从公司利益的角度出发,他们可能会倾向于把控社区。另外,因为这样的商业化团队可能会面临商业压力,所以极端情况下会做出一些比较短线的,甚至杀鸡取卵的事情。实际上,这些都是不利于开源项目发展的行为,需要一个强大的社区来加以限制。
其次,我再来说说站在商业化的角度看开源的问题。比如,我们现在是一个公司,或者是一个创业公司的高管,我们通常在考虑是否用开源的方式来做软件,主要会看中 3 点收益:
第一,软件开源是一个大的趋势,当前绝大部分软件和项目都是基于开源项目来创造的,项目开源会越来越主流;
第二,通过开源的方式可以有效降低创新的投入,并提高开发效率;
第三,用户推广的门槛低,一旦决定开源,那么你的项目就会比闭源的方式更容易得到推广。通过社区的推广和口碑传播,开源技术和项目可以取得类似病毒式营销的效果;而后者以往是需要公司的销售团队挨家挨户来推广的,推广成本高、速度慢。
另外,从商业化看开源也存在 2 个问题:
第一,你需要不断地创新,因为只有创新才能留下来,才能在商业化领域形成一个竞争优势;
第二,因为开源是免费的软件,所以直接收费会比较困难,设计好自己的商业模式就显得至关重要。
回顾整体,我们可以发现:如果想要打造一个所谓成功的开源项目,本质是要让项目的发展飞轮快速成长起来。如果这其中任何一个环节出现了问题,那么整个飞轮就无法高速的转动。
同时,我们也看到,想要构建一个成功的开源项目是一件非常不容易的事情,需要考虑和推动的因素也很多,而且对个人或者团队的考验都是一个非常全面的过程。