编者按:关于好的架构是设计而来还是进化而来,众说纷纭莫衷一是。今天InfoQ有幸请来前Google全球研发总监Tiger做客,看看他又持有怎样的看法。
InfoQ:2003年的时候,您就从PhD辍学,并加入Google,而当时Google还只是家创业公司。能介绍下这段经历吗?
Tiger:在今天看来,很多人会说当初我辍学,放弃PhD进入Google是个非常明智的选择。然而,2003的Google还只是一家很小的公司。
当时很多人说拿了PhD学位安安稳稳的进研究院多好,不是每个辍学的人都能成为扎克伯格或者比尔盖茨。但我很庆幸自己的人生第一次抉择选对了。
知道谷歌是因为那时候,有人在偶尔提起时说,“你搜一个什么东西可以试一下,那个名字很难记的G开头的网站。”
那时候市面上还没有什么真正好用的搜索引擎。经学长推荐用了Google,一旦你用了,就像吸了鸦片一样,根本停不下来。
于是当我想要做点事情的时候,首先想到了这家公司。
InfoQ:那当时,我想你应该还有很多选择吧,比如IBM、微软之类的大公司,选择Google是为了梦想?为了爱好?为了改变世界?你认为这是冒险吗?我想现在很多人也面临和你当你一样的选择,能给点建议吗?
Tiger:同一时间发给我入职offer的,还有微软研究院、IBM研究所等成名已久的大公司。但我却选择加入Google,当时看来就像是放弃去住五星级酒店而选择去住地下车库一样。
其实做出这个选择很简单,因为微软、IBM面试时,面对的都是一群头发花白,60多岁的老爷爷,中规中矩却有些死气沉沉。
但在谷歌面试我的是副总裁艾伦·尤 斯塔斯(Alan Eustace),我记得两年前全世界媒体还报道了他从4万米高的平流层完成了个人高空跳伞,打破三项世界纪录。
这就是Google带给我的感觉,年轻、活力,充满了可能。稳定的背后是不变,不确定的背后,是无限种可能。
我相信,在重要的时间节点和选择上,抛开更多的“应该”和“最好”,跟着自己的感觉走,至少不会给自己留有遗憾。
直到我入职那天,才知道我要去做广告后端系统,现在是Google商业化的核心,但当时我们团队就只有四个人。
然而今天,Google全球有超过五万名员工。短短十几年里,公司的规模至少增长了五十倍。
InfoQ:Google总是能在技术上先别人一步,你想过里面的原因吗?如果生活三个最关键的点,您认为是什么?
Tiger:如果回头来看的话,我认为可以总结三个点:
第一个是,需求导向。产品需求、业务需求、用户需求给谷歌创造了一个前所未有的机会。
谷歌当时刚好就站在了那个风口浪尖上,因为他做搜索这样的产品,互联网正好处于这种爆炸增长的阶段!所以对于搜索这个产品的使用率和产生的数据都是前所未有的,之前没有人见过这样大的数据。这个需求就会要求谷歌不能去从现成的这些解决方案中去找一个答案,没办法找一个现成的产品把它拼凑起来。
所以我觉得这一点谷歌从一开始就看得很清楚,就是市面上没有任何一家现成的产品能够解决我们所需要处理问题的这种规模。所以我们必须要把这个推倒重来,重新自己从无到有搭建一个合适的系统。因此,日后很多的技术领先,都是基于这个前提下的。
第二个是,技术的思考高度,和对于基础架构的重视。
当时谷歌是有一些很具体的问题需要去解决。但是它并不是真是对于这个问题,它还是尽量的把这个东西做的非常的通用。比如说其实当时谷歌最早的那一批人,他们站的高度还是挺高的,他们并不局限于这个东西只是为了要解决谷歌今天面对的问题,而是要搭建一个非常强大的,之前没有任何人做出来的一个大规模的数据中心。
从数据中心到集群,就是服务器的集群它都是从头做起的。这样其实,就已经走在了很多其他公司的前面,其实谷歌的这一步是走的非常超前的。在有了这么大一个硬件的基础之上,有一批非常厉害的人,在上面开发出了这样一些非常有深远影响的基础架构。
第三个是人,选用最好的人,即便做最普通的工作。
不管在哪里,人的问题我觉得这一点还是挺重要的。谷歌一开始招的那些人,就把招聘的标准放的非常高。就是可能招进来的人做的工作并不是特别高级的工作,但是他一直招聘的理念就是说我把最好的人招进来让他做最平凡的工作,他也是能做出闪光点的。这样才能保持公司持续的创造力。
在谷歌,就是每天都有很多事情要做,还有很多新东西要学。我觉得Google做的很好的一件事情就是招聘非常严格,非常注重少而精的模式。比如说我们做AdWords系统,一共四个人,如果配合得好,每个人都非常的productive。如果一百人搞这件事情,速度肯定会慢很多。还有GFS,就是三个人写出来的。
InfoQ:你怎么看业务驱动和技术驱动?在Google内部,是技术驱动还是业务驱动?
Tiger:我觉得业务驱动、技术驱动,其实不如理解为商业模式的创新,和技术创新。但在实际工作中,我觉得没有固定的模式,不同的产品会有不同的需求。
例如,搜索显然是一个技术跑在前面的产品,可能因为搜索本身并没有什么业务模式。它就是一个完全免费的给用户使用的工具,这完全依靠技术驱动。正是因为谷歌发明了全新PageRank的算法,能够比当时所有的搜索引擎的结果要好,于是,技术驱动产生了这么个效果。
但谷歌的广告系统,就变成了一个商业模式创新驱动的产品。技术创新可以解决实际的问题,但如果连问题都没有找到,那技术本身没有实际意义。
最早我们开始搭建谷歌广告系统的时候,首先在想的是,这应该是一个怎样的商业模式,在大家经过讨论和商量后找到了大致的方向,然后在这种前提下,去想技术可以如何实现。当我们希望将广告的相关性做的和搜索一样,在此之前没有任何一个系统能做到这点,于是意识到需要一个强大的信息学习系统,这个信息学习系统所需要的处理的数据量的规模是之前从来没有人看到过的。在这个思路下,我们先打造这样的一个基础架构,然后再把这个广告系统当成一个应用在上面来解决。
将业务和技术分开来看,可能是因为目前国内的大多数互联网公司,采用产品和技术分离(至少是两个团队)的方式来工作。而在谷歌早先,我们并没有那么明确的划分。Google AdWords系统,当时也就是我们十个人不到的团队负责,从思路、商业模式搭建、技术实现,都是在共同讨论实现的。
因此具体是哪个优先,还是要以产品的属性和需求来看。
InfoQ:业内某位同行曾经说过,好的架构是进化来的,不是设计来的。你认同这句话吗?你怎么看架构的演化?
Tiger:我不认同,我认为好的架构,都需要经过这么几个过程:设计 – 进化 – 进化 …… – 被推翻 – 再设计,是这样循环往复的过程。最开始的架构,肯定是从无到有,根据产品的需求和当时的业务的需求设计出来的。
我觉得,一个系统的演化,一般会经过这样的阶段:第一个系统肯定是under-engineer的,从无到有被设计出来后,肯定是不完善的;第二个版本,一般是over-engineer的,因为随着之前那个版本的使用,积累了一定量需求后,会发现想要增加很多内容在上面;到第三个版本,应该是最恰当的,减去了一些没必要的设计之后,更合适。但当到了某一个时间点,发现现有的系统架构已经没有办法再维持下去,跟不上需求增长时,就需要推到再重新设计。
拿谷歌的广告系统来说,我03年加入了Google,当时的架构还是比较简单的,只分为两层,web serving层和存储层。所有的数据都存在MySInfoQL里,前端的web server会把用户搜索的关键词转化成一个数据库的query,然后把所有的查询结果做聚合和排序。
但很快就遇到了问题。我们有两个customer,一个是eBay、一个是Amazon,他们什么关键词都买,所以他们一家就要占用一个独立的数据库,他们的量还不断往上涨 当时的解决方案呢,就是多做一层分离,把存储数据和需要响应在线搜索的数据通过分开,增加一层cache server。
后来很快用customer做分片也不足够了。我们就转为了用keyword的fingerprint做shard key,从增长最快的数据着手解决。其他还做了的包括异地容灾,多套primary数据中心同时运行等等,都是后来的升级了。架构的演进,一般是这样一个周而复始的循环过程。
InfoQ:Google AdWords从最初到现在的稳定,经历了哪些重大的调整和优化?有哪些是国内公司可以借鉴的?
Tiger:除了我刚才说的,还有过一次升级,大概是在04年到05年之间。这一次在结构上有更加根本的改变,主要是考虑了geographical的redundancy。因为那时候赚的钱已经很多了,服务一旦down掉后果是非常严重的。虽然我们是从数据存储上有很多replica,但是primary还是很容易down掉的。我们后来就建了两套primary,在primary的更新会被push到其他所有的replica datacenter去。
一旦某一个primary DC出了问题,比如地震之类的,我们可以很快switch到另一个DC去,正常情况下两套系统会同时运行。我们的每个replica datacenter也会有两套不同的stream,data也分别来自于不同的primary。这两套stream是完全独立的,一旦一个stream出现问题,可以很快的switch上另一个stream上去。
当时也没有成熟的Auto failover的机制。当时能买到的就是Oracle,但是没办法scale到那种程度的 。理论好像有了很多年了,但是真正在实践中一个在很多Master中投票,选出winner的算法也是没有的。这个也是Google当时才实现出来的。其实还有很多底层问题,也有一些比较有意思的事情。
比如说当你有五十个datacenter的时候,你怎么把data push过去,也是一个挺大的问题,因为数据量很大。当时我们也没有用现成的solution,也没有任何的现成的solution可以用,我们就自己研究了一套。说白了它就是一个pub-sub或者说是一个multi-cast的问题吧。
一开始的时候,data push的latency是用小时来计算的,就有人利用了这个延时长的缺陷刷了很多广告的impressions。因为我们的replica DC需要几个小时才能知道某个customer的预算已经用完了。后来经过了一系列的优化,我们才把跨DC的latency做到了分钟级别,如果是同一个DC,那就是秒级别了。
InfoQ:可否分享下您这些年在架构方面积累的经验?
Tiger:首先,我觉得没有一种general purpose solution是可以拿过来就能用的。尤其在Google我们当时很清楚地意识到我们将会面临的挑战是其他人都没有遇到过的,而且用那样的方式一定是行不通的。但是,Google的经验确实可以帮助把握好大的技术方向。
比如说,从一个rule-based的推荐系统切换成一个model-based的系统,一定会有一个比较大的提升。之后的算法还可以优化,也会带来提升,但可能很难再超越之前的提升幅度。具体的算法实现、优化就得靠团队里的这群年轻人了。
InfoQ:能不能谈谈您这一路走来,对人生、行业的一些认识和感触?
Tiger:去年年底,我加入小红书,从无到有的过程对我来说,就像当年在Google重塑广告系统一样,令人兴奋。
每一次转型,都是逼着自己跳出原先的舒适圈,在面对和探索全新领域的过程中,也在不断的学习和试探自己的潜力边界。如果给二十几岁的我一些只言片语,或许我会在四十一岁的档口,对自己说:
InfoQ:你后续的职业规划是怎么样的?
Tiger:2014年,为了把Google重新带入中国市场,我开始做了一系列针对国内互联网环境的调研。
这个调研的目的,是为了向Google高层建议,应该在中国开展一些什么业务,不过在调研过程当中,我越来越深地感受到:未来几年里,在社交、移动电子商务、智能硬件、移动支付领域,全球的leader会从中国出现,而不是美国。
我在谷歌13年,接下来,就想在中国市场,找下一个Google——未来很长一段时间,我相信小红书会成为我接下来的全部。
InfoQ:就您这些年的从业经验,能否给中国程序员一些建议?
Tiger:有人曾经问我,该如何定义一个好的技术人才?
我觉得这没办法给出一个统一标准,如果用Google的文化来衡量,那就是能否把一个以前从来没有接触过、或是完全不会的东西,在很短的时间内学会,并且做得很好,这是一个很重要的因素。和学习能力相比,个人经验就显得并没有那么重要。
这一点我相信放在哪里都同样适用,但同时,随着回国组建团队,开始慢慢发现中国工程师和美国工程师的一些差异。
中国的工程师有一些明显的长处,例如说,很擅长做一些理论基础很强的事情,算法、基本功、计算机能力都很强,能一件事情做得很工整、很好。
但不一样的地方在于,中国工程师的思维发散程度明显不如美国的工程师们。我们可能特别习惯于被分配一个工作,把这件事情做好。然而那些硅谷的工程师,他们每天中午吃饭、或是喝咖啡的时候,随便聊天都是在说,我应该做一件什么样的事情去改变世界。他们对这些事情,特别感兴趣。
嘉宾介绍
郄小虎(Tiger)于2003年从普林斯顿CS辍学加入Google AdWords核心团队,负责广告系统核心技术和产品的开发,因为对广告系统的突出贡献,两次获得Google创始人奖。2007年,tiger回国开始建立Google上海办公室,其后任Google上海研发总经理。去年年底,tiger加入小红书担任CTO。
InfoQ 是一个有内容的技术社区,本文原创首发于 InfoQ 微信公众号,ID:infoqchina。(点此原文链接) 转载请联系微信:infoqzone。