原文链接: https://gist.github.com/chitchcock/1281611 Stevey's Google Platforms Rant
中文翻译
我在亚马逊工作了六年半,如今我在谷歌也有这么长时间了。关于这两家公司,我能想到的第一件事——也是我差不多每天都在想的一件事——就是亚马逊把所有的事情都做错了,而谷歌全都做对了。虽然有点夸张,但这个说法出奇的准确。真是不可思议。你大概有一百或者两百种方法比较这两家公司。如果我没记错的话,除了3个方面,谷歌在所有方面都超过了亚马逊。我之前还真做过一个表格,但是法务是绝对不会允许我给别人看的,虽然招聘经理肯定会特别喜欢。
我用一个简单的例子来说,亚马逊的招聘流程从根本上就是有问题的——他们让各个团队自己招聘,这导致团队之间的招聘标准严重不一致,即使他们想尽各种办法也无法弥补。他们的运维也很乱套——基本没有SRE,研发什么都得干,没什么时间来编码。当然不同团队的情况也很不一致,看你的运气了。他们根本不在乎慈善或者帮助有需要的人,从来不做给开源社区贡献代码一类的事。除了可能会用来嘲笑一番,根本没人提这种事。他们的办公室都是一堆脏兮兮的鸽子笼,不肯在装修或者公共区域上多花一毛钱。他们的薪水和福利太差了,只是最近才因为谷歌和脸书的竞争压力才有不少改善。但是他们没有任何补助和其它福利——他们只按录用通知书上的数发钱,其余免谈。他们的代码库是个灾难,没有统一规范,除了一些团队自行定义的规则。
公平地讲,他们的版本库系统还是很不错的,是我们正经应该仿照的;还有他们的发布/订阅系统也比我们的强不少。但总的来说他们只有一堆蹩脚的工具,只会从关系型数据库中读写状态机。大部分东西就是白给我们都不会要。
我觉得亚马逊比谷歌强的三个方面之中,发布订阅系统和版本库系统是其中的两个。
我猜你可能会说亚马逊对尽早发布和迭代的执念是他们的另外一个优势,但这同时也是劣势。尽早发布在亚马逊是第一优先级,而相比之下保留人才、开发规范和其它长期目标就不重要了。所以虽然这种做法可以让他们在市场上有一定的竞争优势,但也带来了不少问题,只是表面风光而已。
但是有一件事情他们做得的的确确非常好,差不多弥补了他们在政策、原则和技术上所有的问题。
杰夫·贝索斯是个出了名的微观管理者,他对亚马逊商城网站的每个像素都要过问。他把拉里·特斯勒招入亚马逊,后者是前苹果公司的首席科学家以及可能是全球最知名、最受尊重的人机交互专家。然后在接下来的三年中,他对拉里说的任何事情都不予理睬,直到拉里最后(明智地)离开了公司。拉里做了全面的可用性研究,并无可辩驳地展示了没人能搞懂亚马逊商城那见鬼的网站,但是贝索斯就是没法放弃那些像素,首页上那些用sementic实现的数百万像素。他们就像贝索斯的数百万个宝贝疙瘩。所以他们还一直在那里,只是拉里不在了。
顺便说一下,微观管理并不是第三个亚马逊比我们强的方面。我的意思是,确实他们的微观管理做得不错,但是我不会把这个算成强项或类似的东西。我这只是一个铺垫,帮助你来理解之后发生的事情。我们在谈论一个人,这个家伙在各种公开场合郑重其事地宣称:在亚马逊工作,你应该付钱给我。当有人和他意见不同时,他会递给你一张写有他名字的黄色小贴纸,提醒你“谁才是这家公司的主人”。这家伙是一个典型的,呃,史蒂芬·乔布斯,大概是吧。就差一点时装或者设计的感觉。别误会我,贝索斯超级聪明。他只是让普通的控制狂比起来象喝多了的不良青年。
有一天杰夫·贝索斯下达了一个任务。当然他一直都这么干,每一回下面的人都像热锅上的蚂蚁一样乱成一团。但是这一次——我想大概是2002年前后——他下达了一个如此奇特,如此庞大以及繁重得令人瞠目的任务,以至于别的任务比起来就像让人惊喜的同事小红包。
他的宏伟任务大概有这么几条:
-
所有团队从今天起用服务接口暴露他们的数据和功能。
-
团队之间必须用这些服务接口通信。
-
除此之外不允许其他任何形式的进程间通信:不允许链接库,不允许直接访问其他团队的数据,不允许共享内存,不允许有后门或者类似的东西。唯一允许的通信方式是通过网络调用服务接口。
-
用什么技术实现不重要。 HTTP,CORBA,发布/订阅,自定义协议 —— 不重要。这些贝索斯不管。
-
所有的服务接口必须从第一天开始就必须设计为可用于外部的,没有例外。这就是说,团队必须按照对外部暴露接口进行规划和设计。没有例外。
-
做不到就走人。
-
谢谢,祝您有愉快的一天!
哈哈,你们有150来个从亚马逊过来的人当然会马上意识到第7条是我自己加上去的,因为贝索斯最不关心的就是你今天过得怎么样。
不管怎么说,第6条可不是闹着玩的。大家开始干活。贝索斯任命了几个首席烈犬来监督执行,以保证进度,由哮天犬瑞克·达尔泽尔总负责。瑞克是前美国陆军游骑兵,西点军校毕业生,拳击手,前沃尔玛首席酷刑官兼CIO,一个和蔼又可怕的大块头,口头禅是“强化的接口”。瑞克本人就是一个活生生的强化接口,不用说,所有人都有可观的进展并确保瑞克清楚这一点。
在接下来的几年,亚马逊的内部转变成了面向服务的架构(译注:SOA)。他们从这个转变过程中学到的东西是难以估量的。坊间已经有很多关于SOA的文档和故事,但是相对于亚马逊这么大的规模,这些文档看起来就像告诉成龙怎么过马路。亚马逊的开发团队在这个过程中有很多发现,举其中几个微不足道的例子:
-
电话告警开始变得困难,因为一个工单可能要打20个电话才能找到最终的责任人。如果一个电话需要一个团队15分钟的响应时间,等到最终找到问题可能已经过去几个小时了——除非你搭建好一系列的辅助手段,以及监控数据和监控报告。
-
每一个和你打交道的团队突然变成了潜在的DOS(译注:Denial of Service, 拒绝服务)攻击发起方。除非每个服务都认真地实施配额和限速,否则没人能真正能向前推进。
-
监控和QA(译注:Quality Assurance, 质量控制)成了同义词。如果不是为了实现一个庞大的SOA,你绝不会想到这一点。但是当你的服务声称“啊对,我很好”的时候,很有可能只有那个一直在用愉快的合成语音回答“我很好,收到,收到,结束,再见”的模块是唯一正在工作的模块。为了辨别服务是否真的在响应,你需要一个一个地去确认。这个过程需要一层一层地执行下去,直到你的监控系统对你的全部服务和数据实现了全面的语义检查。到了这个时候,监控和自动化QA已经没有差别了,它们已经成为连续的一体。
-
如果你有数百个服务,并且你的代码和别人的代码只能通过这些服务通信,这意味着除非使用服务发现机制,否则你没法找到这些服务。同样地,如果没有一个服务注册机制也不行,而这又是一个服务。所以亚马逊有一个通用的服务目录,在这个目录里面你可以(用程序)找到所需的所有服务,它所包含的API以及服务是否可用和服务的访问地址。
-
调试别人代码中的问题变得特别困难,除非有一个通用的沙箱机制用于调试服务,否则根本不可能。
这些只是一些很小的例子。亚马逊还系统性地发现了数十个,也许是上百个类似的专门知识。其中在服务外部化过程中有不少奇特的发现,但也许没有一般人想的那么多。按照服务来划分组织架构教会了团队不能相互信任,就像他们不应该信任外部的开发者一样。
当我2005年中离开亚马逊加入谷歌的时候,这项工作还在进行,但是已经有很不错的进展了。从贝索斯颁布他的法令开始到我离开之前,亚马逊从文化上转变成为了一家万事以服务(接口)为先的公司。现在这已经成为他们所有设计的基础,包括那些永远没有机会对外公开的内部设计。
到这个时候,他们已经开始自觉地做这件事了,而不是因为惧怕被解雇。我的意思是,他们仍然惧怕被解雇——在土匪贝索斯手下做事的每一天差不多都是这样。但是他们现在去做这件事是因为他们明白服务化是正确的。毫无疑问SOA有利也有弊,有些弊端还很棘手。但是总的来说这是件正确的事,因为以SOA驱动的设计造就了平台。
当然这就是为什么贝索斯坚持他的法令。他一向一点都不关心团队是否过得好,也不关心他们用什么技术,除非你搞砸了,否则他根本不关心任何业务实现细节。但是在大部分亚马逊人明白之前,贝索斯就意识到亚马逊需要成为一个平台。
你不会真的以为一个在线书店有必要是一个可扩展的,可编程的平台,不是吗?
好吧,贝索斯意识到的第一件大事就是他们用来卖图书和杂货的基础设施可以被改造为一个优秀的多用途计算平台。所以现在他们有亚马逊EC2云主机,亚马逊EMR大数据平台,和亚马逊RDS关系型数据库,以及一大堆列在aws.amazon.com网站上的其它服务。有很多知名公司使用这些服务作为后端,其中包括我很喜欢的Reddit.
贝索斯的另一个重大发现是他不能保证一直打造正确的产品。我猜当拉里·特斯勒说他的妈妈不会用那见鬼的网站时,贝索斯也许有所触动。前面指的是谁的妈妈并不是特别明确,并且也不重要,因为任何人的妈妈都不会用那见鬼的网站。其实我个人也觉得那个网站令人心烦,望而生畏,要知道我在那里工作了6年。我刚刚学会如何让眯起眼睛,只关注页面中间的一百万个像素而忽略掉下面折叠的内容。
我不确定贝索斯怎么意识到这一点的——领悟到他没法打造一个适用于所有人的产品。但这不重要,他意识到了。事实上这个现象有一个正式的名称:可达性(accessibility)。这是计算机领域最重要的事情。
最!重!要!的!事!情!
如果你也在想,“呃,你说的是为盲人和聋哑人设计的可达性吗”?不是只有你这么想。我后来意识到有很多人和你一样:因为这个概念对你来说不具可达性,所以这个概念没有到达你那里。不理解它并不是你的错,就像身为盲人、聋哑人、行动不便或其它残疾不是你的错一样。当一个软件——或一种理念——由于任何原因不能触达到某个人,这是这个软件或者理念的问题。这是一个可达性失败。
就像生活中所有大而重要的东西一样,可达性有一个邪恶的双胞胎兄弟。因为从小不能得到父母的爱,他成为与可达性同样强大的仇敌之中的一个(是的,可达性有不止一个仇敌)——他的名字叫安全性。伙计,他们是那么的不和。
但是我要说实际上可达性比安全性更重要,因为如果没有任何可达性意味着你根本没有产品,而没有安全性你还可以有个相当成功的产品,比如说PSN(Playstation Network)。
就是这样。我其实可以就这个话题出一本书,以防你没注意到这一点。一本厚厚的书,里面都是我工作过的那家公司中蚂蚁和热锅的故事。但是这样的话我的这些胡言乱语就不会发表,你也没机会看到这些,除非我把话说完。
这最后一个谷歌做得不好的地方是平台化。我们不懂平台。我们没有领悟平台。你们中有一些人懂,但这些人是少数。这是我在过去的六年里的痛苦领悟。我一直幻想我们可以感受到微软、亚马逊还有最近的脸书的压力,能让大家觉醒并开始推行通用的服务。不是用那种头痛医头,半途而废的方式,而是多少和亚马逊类似的方式:一次性的,动真格的,实实在在的,并且从此作为我们的最高优先级任务。
但是不行。这大概是我们第十或十一优先级。或者是第十五,我不知道。反正非常低。有几个团队认真地对待这个问题,但是大部分团队要么根本不考虑,从来都不,要么只有很少的一部分人在非常小的方面上考虑这个问题。
就算是让大部分团队提供一个stubby服务(译注:基于谷歌grpc的服务端点)用于向外部提供数据和算法的编程访问,大部分团队也是不情愿的。大部分人认为他们在做产品。Stubby服务是一个非常蹩脚的服务。翻一下上面那个不完整的亚马逊经验列表,看看哪一条是Stubby原本能做到的。让我来说的话,一条都做不到。Stubby是不错,但是它就像汽车零件,而你需要的是一辆车。
没有平台的产品是没用的。更准确的说服是,一个没有平台化的产品最终会被一个平台化的同样的产品所替代。
Google+是一个绝佳的例子,显示了我们从最高管理层(嗨,拉里,谢尔盖,埃里克,维克,你们好)到最底层码工(嘿,说你呢)都完全不理解平台。我们全都没有领悟。平台化的首要原则就是吃自己的狗粮。Google+是一个可悲的遗憾。在发布时根本没有API。我上次去看的时候,我们只有可怜的一个API接口。在发布后,他们团队中的一个人告诉了我这件事。我问:“是Stalker(译注:一个视频流中间件) API吗?”,她郁闷地说“是的”。我本来是在开玩笑,但是别呀...,我们提供的唯一的API接口是为了获取用户的视频流。所以我猜我才是那个可笑的人。
微软以狗粮规定闻名已经有至少20年了。这已经嵌入到他们整整一代人的文化之中。你不能一边吃宴席一边让你的研发人员吃狗粮。这么做是在牺牲你的长期利益来换取短期收益。平台化意味着长期主义。
Google+是一个短期思维的案例。它是一个膝跳反射,基于一个错误的想法:脸书的成功是因为他们做成了一个优秀的产品。但这不是他们成功的原因。脸书的成功是因为他们允许别人的参与而构建了一个丰富的产品系列。所以脸书对每个人来说都是不同的。有些人整天玩黑手党战争,有些人整天玩开心农场。有几百个也许是几千个高质量高粘性的应用,每个人都能找到适合的东西。
我们的Google+团队研究了一下市场分析数据说:“嗬,看起来我们需要一些游戏。我们找些公司,嗯,给我们写游戏”。你现在发现这个想法有多么离谱了吗?问题在于我们试图去预测用户想要什么并提供给他们。
这是不可能的。这无法真正、可靠地实现。在全世界,从有计算机的那一天到现在,只有区区几个人可以一直这样做。我们这里没有一个史蒂夫·乔布斯。我很遗憾,但是我们没有。
拉里·特斯勒也许说服了贝索斯他不是史蒂夫·乔布斯。但是贝索斯意识到不需要成为乔布斯也可以给所有人提供正确的产品:那就是他们喜欢易用的接口和流程。他只需要能让第三方开发人员去使用,这件事就会自动地实现。
我现在说的这些对你们当中有(相当多)的人来说是再明显不过了,我要向这些人道歉,你懂的。这太特么明显了,但我们就是不这么干。我们不理解平台,我们也不理解可达性。这两个其实是一个东西,因为平台解决了可达性。平台就是可达性。
是的,微软领悟到了。我和你一样认为这是多么神奇的一件事,因为他们实际上从没真正搞明白过什么事情。但是他们领悟到了平台,这是一个意外收获,因为他们一开始就做提供平台的生意。所以他们在这个领域有30多年的学习时间。如果你打开msdn.com,花点时间浏览一下。如果你以前没看过,小心不要被吓到——因为这是一个惊人庞大的平台。他们有成千上万,成千上万个API。他们有个庞大的平台。事实上太庞大了,因为他们没做出什么拿得出手的东西,但至少他们一直在这么做。
亚马逊领悟到了。亚马逊的AWS (aws.amazon.com) 很厉害。去看一下吧,随便点点。有点令人尴尬。他们有的我们都没有。
苹果显然领悟到了。他们一开始就决定要封闭,特别是他们的移动平台。但是他们理解可达性以及第三方开发者的能量,并且他们吃自己的狗粮。你知道吗,他们的狗粮很不错。与微软相比,他们的API要干净得多,自古以来就如此。
脸书领悟到了。这是我最担心的。这是我为什么要打起精神写这些东西。我厌恶写博客。我厌恶...plussing(译注:指在Google+上发文)或者你随便怎么描述在Google+上长篇吐槽。这个平台实在不怎么样,但是你还是要用它,因为终究你真心希望谷歌会成功。我是真心的。我是说,脸书想要挖我过去,对我来说是很容易的事情。但是谷歌是我的家,所以我还是要把这个家务事拿出来说,虽然有点不太舒服。
在你对微软、亚马逊也许还有脸书(我没研究脸书,因为我不想太抑郁了)提供的平台感到惊奇之余,去developers.google.com浏览一下吧。差异巨大,是不是?就像你5年级的外甥为了完成作业而展示的大型平台原型,用于证明如果这家公司只有一个5年纪小学生的话,能把这个平台做成什么样。
不要误会,我的确知道我们的开发、发布团队是经过斗争才争取到对外发布这些资源。他们一直在努力,因为他们真正领悟了平台。并且他们一直在英勇地努力创建一个平台。而他们所在的环境,说好听点是对平台漠不关心,说得难听点是对这个理念的公开的敌意。
我至少在坦诚地描述对一个外人来说developers.google.com看起来是什么样的。看起来很幼稚。鬼知道地图API在哪?其中有一些东西是实验性项目。我点击的所有的API都很差劲。他们显然是狗粮,甚至不是有机的。和我们的内部API比起来这些简直就是下水。
也不要误解我对Google+的看法,他远不是唯一的反例。这是文化问题。我们内部正在进行一场战争,一方是不被看好的少数平台派,几乎注定要败给财力雄厚的自信的产品派。
任何一个认同这个理念的团队——从一开始就应该成为一个对外开放编程接口的平台——都是另类。我能想到的是地图和谷歌文档,我还知道GMail也在向这个方向发展。但是他们很难得到预算,因为这不是我们的文化。Maestro(译注:查不到,看起来象谷歌文档的API)微不足道的预算和微软的Office平台的巨额投入比起来就像小白兔和霸王龙。谷歌文档团队知道除非他们有和Office一样的脚本工具,否则他们永远也没法和Office竞争。但是他们得不到任何资源的青睐。我的意思是,这是我的猜测,因为App Script现在只支持电子表格,并且API中甚至不支持快捷键。在我看来那个团队不很招人喜欢。
具有讽刺意味的是,Wave(译注:谷歌在线文档合作平台)是一个优秀的平台。愿他们安息吧。但是把一个东西做成平台不等于你就立刻成功了。一个平台需要一个杀手级应用。脸书——他们提供了照片墙朋友圈什么的——就是脸书平台的杀手级应用。如果下结论说没有平台脸书App也能一样成功,这将是一个非常严重的错误。
你知道人们总是说谷歌很傲慢吗?我是谷歌员工,所以当人们这么说的时候,我和你一样恼火。总的来说我们并不傲慢。我们的傲慢含量大概只有1%。我的确在这篇文章前面——如果你努力回忆的话——提到了谷歌“所有的事情都做对了”。我们的确想把事情做好。大多数时候当人们说我们傲慢的时候只是因为我们没有雇用他们,或者他们不满意我们的策略,或者其它类似的事情。他们拿傲慢说事,因为这样能让他们感觉良好。
但是当我们表示我们知道如何为所有人设计完美的产品时,信不信由你,我听到很多人说我们是笨蛋。你可以把这个归因到傲慢,天真,或随便什么——到头来这不重要,因为这就是笨。从来没有一个产品令所有人都满意。
然后我们设计了一个不能设置缺省字号的浏览器。这是对可达性的冒犯。我是说,当我年纪大了,我的视力越来越差了。说真的,我几乎一辈子近视。一旦你到了40岁,离得近一点的东西就看不太清楚了。所以字体选择是一个至关重要的功能:这个功能会使你彻底放弃这个产品。但是Chrome团队是十足地傲慢:他们想设计一个完全不需要配置的产品,对这一点他们毫不隐瞒。如果你是盲人或者聋哑人,见鬼去吧。后半辈子在访问每个页面时你将不停地按Ctrl_+(译注:放大字体的快捷键)。
这不只是他们,而是所有人都这样。问题在于我们是彻头彻尾的产品公司。我们提供了广受欢迎的产品——我们的搜索——这个巨大的成功蒙蔽了我们的眼睛。
亚马逊曾经是一个产品公司,是不相干的影响让贝索斯明白了需要一个平台。这个影响是他们逐渐蒸发的利润。他无路可走,必须找到一个出路。但是他所拥有的只有一群工程师和一堆电脑——如果他们能用来赚钱的话——你就会后知后觉他是怎么创建AWS的。
微软从一开始就是一个平台,所以他们有非常多的经验。
但是脸书不同,我最担心的是他们。我不是专家,但是我很确信他们是从产品开始的,并一直很成功。所以我不知道他们是怎么完成平台化的转变的。这已经是比较早的事情了,因为必须先有平台才会有象(现在看已经很古老的)黑手党战争这样的东西。
也许他们只是看到我们之后发问:“我们怎么才能打败谷歌?有什么是他们所缺少的?”
我们面临的问题是巨大的,因为我们需要文化上的重大改变才能赶上去。我们内部没有面向服务的平台,外部一样也没有。这意味着整个公司普遍没有“领悟”:PM没有,工程师没有,产品团队没有,没有人领悟。就算有某个人领悟到了,就算你领悟到了,除非我们把它当成全员紧急事件,否则这一点用也没有。我们已经尝试过了,这样行不通。
平台化的首要原则,“吃自己的狗粮”,换一种说法就是“从平台出发,然后应用到所有地方”。你没法在事后弥补。不管怎样说,这当然是不容易的——问一下任何一个做过微软Office平台化的人,或者任何一个在亚马逊做过平台化的人。如果你一开始不做好,你之后将会付出超过10倍的代价。你不能作弊,你不能为内部应用获取特殊权限而开启秘密通道,任何理由都不行。你需要在最开始就把困难的问题解决掉。
我不是说我们已经太晚了。但是我们等的时间越长,我们就越接近太晚了。
坦白地说我不知道怎么收尾。今天我要说的基本都说了。这个帖子我准备了6年。如果我不够斯文,或者我误会了某些产品、团队或什么人,或者我们实际上正在做大量的平台工作而碰巧我和我问过人都没有听说过,如果是这样的话,我很抱歉。
但是我们需要开始把这事情做正确。