投稿人:行癫
部门:淘宝产品研发中心
04年的七月,那个缺电的夏天,淘宝网全都挤在华星二楼。正是在那里,开始了我的淘宝生涯,并有机会目睹淘宝的技术变迁。
我的位置在一个角落里,边上是一堆开着的服务器,吹出比七月烈阳下更热的风。因为限电,空调基本上只能看。 刚到一个新环境的时候,大部分人的情形是差不多的就是不知道做些什么好,眼睁睁地看着一大群人忙忙碌碌,却不知道他们在干啥,也不知道能帮上什么忙。
那时淘宝的节奏是非常快的,我记得小宝有一次说,当时网站如果要改点什么,只要跑到多隆那儿说一下,当你回到自己座位上打开页面的时候,就已经是你要的结果了。
多隆是一个奇怪的人。他总能以很快的速度解决一些别人看起来奇形怪状的问题,哪怕他以前从未接触过。他日复一日年复一年地坐在电脑前忙个不停,一坐就是七年。现在想起来,除了当时晚上下班与多隆一起骑车回家外,没见他怎么闲下来过。
另一个接触比较多的人就是宝宝了。宝宝是我认识的人中为数不多的具有框架级代码编写能力的大拿,这种能力不是程序写多了就能具备的。宝宝总是胸有成竹地坐在那里,不紧不慢地把每一件事做得尽善尽美。如果说多隆的特点是一碰到问题就立即帮你解决,那么宝宝就是碰到问题给你解决一堆类似的问题的人了。
当时的淘宝已小具规模。然而我们的数据库还在DELL服务器上,DBA很担心有一天再也撑不下去了。所以,采购更好的服务器已迫在眉睫。服务器的好坏,光听厂家介绍是肯定不行的。所以,在完成了我的第一个任务,解决了商品缩略图的压缩质量与性能问题之后,第二个任务就是配合DBA测试服务器。
在04年10月,DBA的七公、测试的郭芙和我就去了北京,准备测试IBM的小型机和HP的小型机,时间是一周。到了北京才发现,这次任务比我想像的困难的多。每次测试都需要装上十多台的服务器,每一台服务器的操作系统、淘宝的环境等等都需要安装调试。然后七公再安装数据库、导数据,郭芙做压力测试、记录数据。一周的时间测试两家公司的系统,显然是过于紧张了。每天基本上都要十二点之后才能睡觉。尽管遇到过很多的困难,但无数次的安装环境,令我更加地熟悉了淘宝的整体环境与系统,以后想忘记估计也不太可能了。另一个意外的收获是,通过压力测试很清楚地知道如何解决系统的性能问题。
很快半年过去了。04年底的时候,淘宝决定要把整个淘宝的后台管理系统从PHP迁移到JAVA环境下。尽管之前零零碎碎地做了一些事,但这一次看上去不一样,需要完整地做一个系统。事实上,之前我的很多认识还是局限于企业级的应用系统,对门户网站级的系统如何构建认识的不够深刻。这两者之间有一些细小的差异,如果没有弄清楚这些差异,要设计出一个高性能的网站就会遇到很多的困难。
很幸运地是我有足够的时间与宽松的环境来做这些事情。从刚到淘宝最初的主管丁典与后来的三丰。他们给了我最宽松的环境与最大的信任。前者使你有充足的时间做一些研究测试性的工作,后者使你有机会让你的设想成为现实。
项目启动前,大约花了整整二个月的时间在做系统选型工作。基本上细致地比较了每一项我认为关键的技术。到最后方案的形成的时候,基本上觉得可以试一下了。与此同时,多隆也花费了相当长的一段时间研究CACHE的问题,他也做了大量的分析与测试,在最后还是决定自己写了一个系统。
淘宝的后台系统,我们将WEBLOGIC换成了JBOSS,这是一个重大的决定。简单地说一个是收费的(而且是很多很多钱),而另一个是免费的。当然换系统并不像换轮胎这么简单,后台系统到四月份的时候上线了,但是很快碰到了一个致命的问题,服务器运行一段时间之后内存就用光了,想了很多办法都不能解决。我基本上束手无策了,难道要换回来么,还是告诉用户,这个系统每天都需要重启一次?五一长假,到处查资料,仍然劳而无功。差点就要绝望了,五月十二日,再一次上JBOSS的官网发现他们发布了一个新版本,专门解决这个问题的。下载安装之后,等到第二天第三天都没有发现问题。现在,基本上可以安心了。
看上去架构基本上没有大的问题,它似乎运行得很好。但只是一个后台,没有多少用户量。仍然没法说明问题。五月份,淘宝陈旧的用PHP做的论坛再也撑下不去了,基本上每天下午都要DOWN机一段时间。我们计划做一个新的BBS系统,用JAVA。
BBS系统看上去似乎很简单,随便找一个程序员,估计他就写过某一种BBS系统。我们也有多种方案,包括购买一个商业化的产品。花了一段时间研究了各类 BBS系统之后,我发现,基本上都不太能适合淘宝的情况。关键就是淘宝的浏览量太大了。事实上很多门户级别的BBS系统都是专门开发的,比如百度的贴吧等等。但问题是,这些系统的奥秘到底是什么呢,他们做了一些什么样的关键性的工作呢?在这个问题上,尽管各人解决问题的方法各不一样,但他们解决的问题倒是同一个。就是性能与扩展性。怎么样提高性能有很多种办法。我们选择了其中的一种,就是大量地使用CACHE来缓冲对数据库的压力。明白了问题所在之后,就去解决问题好了。这次,设计了一个通用的CACHE框架,但数据最终存到哪里呢?我其实没有解决方案,起初打算拿几个开源的过来用用。同时,对多隆说了,我需要一个高性能的CACHE存储系统。说实在的,我起初并没有抱多少希望。
这个系统范遥作了项目经理,以后一个重要的项目招财进宝他还要再次出场,他有很出色的项目协调能力。代码基本上外包给恒生的同事开发。仅用了一个多月的时间,就基本上完成了开发任务。不过那些开源的CACHE系统根本经受不住我们的压力测试,幸好多隆的那个后来大名鼎鼎TBStore完工了。反正死马当活马医被拿来测试了,切上去之后,稍作调整,就发现完全能满足我们的要求,他总是一次又一次地给人以惊喜,这就是所谓的四分–超出期望吧。
很多的时候,项目正式立项之后,仍然有一些问题没有得到很好的解决,尽管有风险,但也是一种压力,在一定的压力环境下工作,往往有更高的效率与更好的结果,尽管这不是开发方法论上所提倡的事情。看上去每一次我们都似乎跌跌撞撞,但总之,我们顺利地上线了。
每一次的发布,基本上都要一个通宵,然后迎着初升的朝阳骑着自行车穿越半个城市回家。最令人感动的是,每一次发布,即便在凌晨,总会有会员上来询问。
05年半年多的实践,不仅积累了经验、积累了一些基础性的框架。更重要的是似乎基本能掌握大规模系统的设计方式。这对任何一个人都是一个很大的鼓励。
下半年的时候,便计划对淘宝的核心系统做一番改造。当然,这是有风险的,特别是对一个已经能正常工作的系统去修改,万一有个三长两短,改得不能工作了那就麻烦了。这个时候,是最需要找个人支持一下的时候。宝宝出现了。有些人总是在适当的时候出现。宝宝不但出现,而且计划跟我们一起做这件事。于是,持续了大约半年的对淘宝框架的改造启动了。我们把这项工作分成了四个阶段来做,争取不影响日常的工作。第一期顺利完成的之后,宝宝因为其它工作,不能再继续了,不过这个时候已经不重要了。很多事情只是开头很难,有了良好的开始,以后只要顺路走下去就行了。接下去我们顺利地完成了接下去的三个阶段的改造。这期间,像黄裳、万剑等等更多的人参与了进来。非常难得是的这次大规模地改写代码,在我们的测试、配置、发布等部门的密切配合下。几乎没有什么大的BUG。
现在,从技术上而言,淘宝基本上长得比较像我们想要的那个样子了。
要特别说一下的是,这期间,黄裳带领的一个开发组,完成了淘宝的类目属性的改造工作,这是一个开创性的工作。为现在的淘宝的商品分类奠定了基础。影响极为深远。从业务系统的角度来说,这也是至今淘宝区别于其它EBAY、拍拍的关键性的地方。
大约05年底的时候,又接到了一个配合YAHOO做P4P系统的任务。这个项目本身没有技术架构上的复杂性。起初我只当作是一个普通的项目。后来发现 P4P系统对于其处理的业务来说,正是目前互联网的核心赢利模式:竞价排名。一个多月的时间,使得有机会完整地了解这种系统的技术与业务情况,这是非常难得的。这也是后来做招财进宝的技术上的基础。不过,当时,也不知道即使了解了这些系统对于你有多少帮助。事实再一次说明,只要你学习了一件事情,总是有它发挥作用的时刻。
06年初,招财进宝项目启动了。当然这是最后才想出来的名字。这是一个很特别的项目,正式启动前,我们的项目运营方乔峰、小宝还有我们技术方三丰等等就一起讨论把这个产品做成什么样。一次又一次设想方案,论证可行性,常常会讨论一整天。当大家对产品终于了一个朋大概的想法的时候,我们的PDM浅雪加入了项目组,与浅雪之前合作过一个CRM的重构项目,给我留下了深刻的印象。她具有一种互联网企业的产品设计最重要的能力:创新能力。什么是创新能力呢,说一个故事就知道了,小时候都听说过司马光砸缸救人的故事,一般人的想法是把人从水里捞出来,让人离开水,司马光不一样,他的做法是让水离开人,所以砸破了缸,这是一种逆向思维,而逆向思维是一种创造性思维。反正我已经没有了。UED的承志老是说左脑右脑的,不过我觉得他也是一个有很多想法的人,只是我们一直没有多少机会合作项目。
浅雪富有效率的工作很快将项目的工作向前推进了一大步。这个时候,我觉得我们已经走在了驶向目标的大道上。一点一点地看着产品慢慢成形。技术部作为最终的技术实现方,我觉得,从技术而言基本上可以控制住整个项目了。我个人很喜欢这个项目的组织方式,淘宝的大多数部门都投入到了这个项目中来了,产品本身经历了很长时间的构思、探讨、分析,最后是快速开发完成。
可以立项了。我们的项目经理范遥花费了很多的心血,为项目起了一个寓意深长的名字:GENESIS。直译可以叫做起源,据说《圣经》里的第一章 创世纪,就叫GENESIS。毫无疑问,这确实是一个很好的项目名。
起初我们只用了三名开发人员黄裳、子柳、进宝,他们富有成效的工作使项目基本上没有大的波折就完成了开发。
项目预定在五月十日正式上线。五一节的最后一天,五月七日,项目组提前一天回来做了最后一次的测试。八日进行了预发布。九日晚上正式发布。
曾经以为,这一次,我们依然能享受喜悦。但看上去,这一次有点特别。
首先,对于参与的人数估计不足,没有想到一下子会这么多的用户来参加,使得完全没有时间对产品进行调整。林彪在打锦州的时候说过一句很经典的话,准备了一桌菜,结果来了两桌人。这个是很令人为难的,有时候,用户太多似乎也不是一件好事。何况来了这么用户其实是鱼龙混杂,什么样的人都有,一堆别有用心的人混在中间,又没有办法有效地区别开。
技术上,由于我们采取一个复杂的算法来决定排名,很快竞价引擎成了瓶颈。数据库负载居高不下,无法将排名结果应用到除了类目之外的属性。看上去到处都很脆弱。我们首先得解决技术问题。现在,多隆又一次出现了,及时地将竞价引擎从基于数据库迁移到了基于搜索引擎,并且部分地解决了实时更新搜索引擎的问题。这已经足够了,至少技术上现在是没有大的问题了。
接下去的一个月时间,虽然不断地对产品进行调整。但是很多事情已经超出了项目本身的范围。产品六月份下线,运营了一个月的时间。对于一个产品而言,一个月的时间实在是太短了,但对于项目组而言,这一个月是无比漫长的。
失败是什么,没有什么,只是更接近一步成功。
最后,乔峰说,以后淘宝要收费了,一定要他来说,大声说:淘宝开始收费了!也许这一天并不是很遥远。无论如何,我们都得想办法让他、也让我们自己实现这个愿望。
失败之后再干点什么是很重要的事情。满怀希望到失望之后,生活很容易失去重心。工作也一样,也会茫然。
但是生活要继续,06年的下半年,我们开始逐步对业务系统进行了重构。很多人提出了很好的想法。其实业务系统比纯粹性的技术上的架构更为复杂。
淘宝是一个很特别的市场,打个比方就是以EBAY的方式在做AMAZON做的事情。因此,要平衡两者之者的关系显得更为复杂。我们的交易组做了一个交易与商品分开的项目。走出了业务系统改造的第一步。同时,另外启动了一个叫产品库的项目,希望能规范淘宝的产品,不用用户一件一件独立地分布商品。仔细分析一下,从不同需求驱动的产品,其实有一个共同的目标,这个目标时而清晰,时而模糊,我深信EBAY不是我们的目标。回过头来想想,06年的下半年,至少我还无法把握这样规模的系统的开发。这中间一定有某种联系,而将这种联系平台化,还有许多的工作要做。
技术上,06年底至07初的时候,逐渐形成了服务平台化的思路。并且做了第一个项目,类目与属性的服务化。并将核心应用系统进行分拆,以便缩小应用的规模,使之易于控制。这一次,我们有更多的新人成长起来了,他们以令人惊异的速度与创新能力完成一个个复杂的任务。常常让人有一种长江后浪推前浪的感慨。
多隆继续在书写着自己的神话。很偶然的机会,听说NETAPP不太稳定,我恰好在看一个JAVA的分布式文件系统,便让多隆研究研究。看了一阵之后,多隆说还不如自己写一个。说实话,尽管他常常给人以惊喜,不过,这次我实在是有点怀疑。不过,试试看吧。我们很快制定了产品的关键性指标,并定出了关键性的时间点。既然他说行,就一定能行。没过多久,他便完成了原型,一共花了三个月时间,就提供了一个能够运行的产品。而这一切,基本上是他一个人独立完成的。更难得的是,做这一切工作的时候,还要完成平时的事务性工作!这个系统就是现在淘宝的TFS,淘宝的文件系统。成功地解决了大量小尺寸文件分布式存储的可靠性与读写的性能问题。我相信,今后,我们会有一堆的以T字开头的产品运行在淘宝的生产环境中。
在我眼中,淘宝网没有奇迹,淘宝到目前所取得的每一个小小的成绩,我们每一个工程师,每一个小二无不为之付出了心血与汗水。
淘宝今天拥有了绝对领先的市场份额,在互联网,规模非常重要,但绝对不是决定因素,EBAY已经作了很好的解释。我觉得,C2C仍是一个没有经过充分竞争的市场,而且很多人想证明这一点。未来,就看谁能更好地理解用户,谁能设计出更加满足用户的产品。作为产品研发中心的我们,选择了技术,尤其是选择了互联网的技术,这就意味着你要不断地学习,不能有偏刻的松懈。这可不是林子祥跟叶倩文唱的“你选择了我,我选择了你”,这里没有浪漫,没有似水的柔情。但是,这里,你的梦想一定会实现。
今天,淘宝的研发中心人才济济,我们拥有了一大批优秀的工程师。 我们既有王文彬博士这样业界顶级的专家,也有路鹏博士这样多年资深的管理人员。我们有了一个良好的开端,我们更乐于相信,我们的未来会更美好!