章文嵩:谈LVS及阿里开源背后的精彩故事
| 2013-06-28 08:34
阿里集团副总裁、高级研究员章文嵩是Linux内核开发者,LVS项目的发起人,同时,也是淘宝开源委员会负责人。
章文嵩早在读书时代就开始做LVS,其背后有哪些精彩的开发故事?他与开源之间又有着怎样的不解之缘?他有怎样的宝贵经验分享给正在从事或准备从事开源项目的开发者呢?《程序员》杂志2012年8月刊就个人和企业参与开源项目等话题对章博士进行了访谈。
收获开源的乐趣
《程序员》:请你谈谈开发LVS的经过。
章文嵩:LVS是我在1998年5月开始做的,那时我还在读书。在那之前,我写过很多软件,但出于种种原因,那些软件的生命周期并不长,LVS是我目前写过的软件中生命周期最长的一个。
我在1995年底开始接触Linux,并不算早,当时只是装机器给同学们玩儿,并没真正在Linux上写过代码。不过因为使用Linux,便开始接触到互联网上的开源思想,我也读过Richard Stallman的故事,对他的观点很认可。
在我1997年硕士毕业时,曾问老师能否把硕士课题的成果开源出来,但老师说这是国家课题,不能开源。所以,那个软件只能锁在抽屉里,至今也没有发挥出更大作用。
一开始写LVS,我只花了两个星期的时间,完成了一个很简单的版本。它是我的个人项目,与学校无关,所以不需要做任何申请,我就能决定将它开源。
因为我接触互联网较早,所以自己搭建了网站并将源代码放上去。一个星期后,LVS就被一家澳大利亚小公司用起来了。这家公司为社区提供上网服务,那时互联网的带宽比较贵,它通过正向代理服务器缓存之前用户访问的数据,并提供给后来的用户。这样到海外的流量只有一次,对ISP来说可以节约很多成本。但随着社区上网人数增多,一台机器已经忙不过来了,这时它们发现了LVS,然后立刻用起来。公司的负责人写邮件感谢我,说效果很好。我觉得这件事挺有意思,因为自己写的软件被别人用起来了,为他人创造了价值。
在软件的整个开发过程中,逐渐有许多其他人参与。比如一开始,项目的英文介绍过于简单,这时一位美国朋友帮我写了英文的HowTo,后来有其他开发者陆续加入进来,有人贡献过一两个Patch;也有人持续了很长时间,帮助我一起做LVS。
LVS进入官方内核之后,维护工作就相对简单了。以前,每个版本发布我都需要检查与系统其他部分的兼容性。进入官方内核之后这些工作有更多人完成,其上的开发也要照顾到LVS。目前,我们正在实现一些新功能,比如对IPV6的支持是Google的两个工程师帮我完成的。我们也正在把对SCTP协议的处理加进来。这是开源项目的好处,不需要所有事情一个人单干,可以在全世界范围聚集一群有相同兴趣的人一起完成。
《程序员》:LVS是你在读书时完成的,在学校,你是怎样了解到生产环境中真实用户的需求呢?
章文嵩:我认为对于一个开源的项目来说,搜集需求很重要,因为真正有用的软件来源于实际应用,不同于闭门造车想象出来的功能。
我确实是见到这样的问题,才有了开发LVS的想法。我在国防科大学读书之余,也帮湖南电信做一些系统集成项目,见到许多服务器忙不过来的情况。这时就需要考虑负载均衡。那时业界也有一些商用方案,常用的是思科LocalDirector。我希望在Linux内核上写点东西,又知道思科LocalDirector的工作原理。所以我当时就花了两个星期写了一个最简单的版本,那是1998年5月。LVS网站上最早的一个Logo,是一个箭头进来分成三叉,跟思科的LocalDirector差不多,只不过我在上面又添了一只企鹅。后来这个Logo变成一群企鹅,是别人给我的启发,因为软件是关于Linux集群的。
在开发LVS的过程中,我收集了很多来自真实用户的需求。即使我没有接触到某些应用场景,但会有其他能接触到这些场景的用户协助我进行测试,这种方式把软件的开发成本降低了很多。
《程序员》:你为什么决定将LVS开源,而不是像思科LocalDirector一样,也做成商业产品?
章文嵩:一套LocalDirector当时价值几万美元,我那时心里有疑问——这东西并不难写,为什么卖那么贵?而我做开源项目纯粹是为了好玩,只要有人用我就很开心,哪怕有时跟用户交流到很晚,需求来了,我半夜还在写程序。
2000年前后,收到了许多用户的感谢邮件。也有公司给我捐送服务器,有个瑞士用户寄了一大包饼干来感谢我。我把饼干拿回家,被丈母娘看到了,她说原来你半夜这么辛苦地工作,就是为了一大包饼干啊。
做这些事是很有成就感的,更多的是乐趣。
《程序员》:对于正在从事或准备从事开源项目的开发者,你有哪些建议和经验希望分享?
章文嵩:我觉得做开源项目,迈出第一步很重要。代码不在于多与少,项目也不在于大与小,先开源了再说。因为开源是指整个的开发过程,并不单单指代码。代码开源只是一个结果,更关键部分还在于整个开发过程。在LVS的开发过程中,虽然没有很多金钱回报,但其他方面回报是有的。比如出国参加演讲一般会有人资助,可以全世界跑一跑。在整个开源的过程中,我自己学到很多东西,比如与人交流,因为这是一个世界舞台,有机会接触到世界上第一流的编程高手。
想想看,当年我只花两个星期写出的代码,会很复杂吗?但就像埋下一颗种子,只要继续投入,就有可能生根发芽,长成大树。
《程序员》:你是怎么想到一开始就把项目文档写成英文?又是如何推广的?
章文嵩:我接触互联网时,很多资料是英文的,自然而然也想到用英文写项目文档。那时候的社区都是通过邮件列表交流,语言也是英文。当我完成了这个项目,就希望请大家看看LVS有没有价值。于是想到发邮件到社区上推广。否则仅是建立一个网站,可能没有人知道,必须要寻找一个渠道,让更多人看一看。
我们从中学就开始学英语,写一些简单的英文不会很困难,只要把想到的东西用英文列出来,大部分老外都能看得明白。当然,现在国内整个技术发展氛围也越来越好,写中文文档我觉得也不是问题。
比如我们的Taocode、盛大和金山卫士的开源平台背后都有公司支持,肯定会长久做下去。即使在Github上用中文交流也没问题。因为国内受众也很多,用中文交流有时候更直接。当然,如果想发展国际用户,需要写英文文档。
让企业拥抱开源
《程序员》:你在工作中同时负责商业化和开源方式开发的软件,对比这两种方式,你觉得哪种效率更高、质量更好?
章文嵩:我认为开源方式的效率更高、质量更好、成本更低。
在淘宝、阿里我们主要做底层的基础平台开发,其上承载着上千个应用。在完成这个任务的同时,我们将其中一些基础软件项目开源。一方面是为了与同行交流技术,也便于在校学生看到真实系统中的软件是什么样子,对学生来说,还能让他们更多地了解公司。
以TFS来说,中兴通讯的研究员曾经在《程序员》杂志上发表过关于它的技术文章,新浪微博也利用TFS做图片存储。用户在使用的过程中,对软件中存在的Bug进行反馈,这对我们提高软件的可靠性、性能都有作用。
另一方面,开源软件项目对软件开发人员也是一种激励,因为过去公司开发的闭源项目,往往在满足业务需求后,就停滞不前了。
2010年3月,我们确定了第一个开源项目——淘宝分布式缓存跟对象存储系统Tair。当时我们的开发人员表示,需要给他们一段时间,把代码好好整理一下再开源。因为在开源的时候,会标明每位开发者的贡献,每个文件是谁写的,他的名字、邮箱都会标注在代码和文档中。3个月之后,项目正式开源时,事实证明我们的开发人员确实也把代码写得更好。这对整个项目代码的质量是有促进的。此外,外部用户的反馈对软件是巨大的促进,形成了一个良好的循环,因为软件在一家公司面临的需求相对单一。
淘宝内部有一些开源活动,公司给予一定的经费支持,我们也设立一些奖项,比如“开源达人”,颁发奖状、奖牌。这些奖励多是精神层面的。
《程序员》:商业公司是否应该将内部的软件项目开源?你觉得什么样的项目适合开源?
章文嵩:商业公司最终还是要实现赢利,才能在市场竞争中要占据有利地位。选择开源或不开源,与一家公司的商业模式有很大关系,如果一家公司的所有核心竞争力都在某个软件—比如Oracle,它不可能把Oracle数据库开源。另一方面,我们也看到很多真正的互联网公司发起了很多开源项目—比如Facebook,因为其核心竞争力并不在于软件。当然,软件是互联网公司的重要能力之一,但其核心竞争力有可能在其他方面—比如公司的运营模式或数据。
对于阿里来说,最大的价值在于数据。因为数据是日积月累才获得的,别人拿不走。打个比方,建立一个小规模的电子商务网站,技术实现并非十分困难。但完成之后,其上没有任何数据。在淘宝上,每个人有很多交易行为,这些历史、信誉记录会让大家觉得交易更可靠。而在一个全新的平台上,用户交易的可能性会低很多。按照马云的说法,淘宝、阿里未来是一家数据公司,数据才是最有价值的。
《程序员》:淘宝确定项目开源的流程是怎样的,在项目的开源过程中有哪些值得注意的地方?
章文嵩:我们成立了淘宝开源委员会,通过这个委员会管理项目的开源流程。将公司的一个产品开源,首先要得到直接主管的许可,提出书面申请后还需要公司另外几个技术主管的书面认可。开源委员会会对许可证的选择、代码测试的程度、文档的程度给出建议并进行备案。淘宝的开源项目中,使用GPL许可的比较多,当然有些开发者比较喜欢用Apache许可,我们也不反对。
在对外开放的过程中,我们内部的技术部门还建立了审核机制。安全团队负责审核代码开源后是否会被他人滥用,对我们现有系统发起攻击。比如一些密钥,或者加密的方法,就不适合放在开源的系统中。在我们的实践过程中,证明这样的流程是可以保证现有系统安全的。