译者 | 核子可乐、蔡芳芳
2000 年 3 月的一天,谷歌公司最顶尖的六位工程师齐聚某临时“作战指挥室”。当时的谷歌,正面临着前所未有的紧急状况。
前一年 10 月,谷歌用于爬取 Web 以建立网络内容索引的核心系统宣告停止工作。虽然用户仍然可以通过 google.com 网站进行结果查询,但他们收到的结果实际上已经过期了五个月。
由此引发的利益冲突远超工程师们的想象。
谷歌公司的联合创始人 Larry Page 以及 Sergey Brin 当时正在与雅虎就为后者的搜索引擎提供支持进行协议谈判,而且这两位大佬承诺的索引规模要比当时谷歌索引的实际规模大上十倍——这将是一套能够随时跟进万维网内容变化的整体性索引。就在当时,互联网的体量在一年之内增长了一倍。
因此,一旦修复失败,那么 google.com 仍将停留在五个月之前,而与雅虎之间的交易也可能因此失败——谷歌公司为此次谈判投入的一切都将付之东流。
在这间阶梯会议室里,工程师们把门板放在木头架子上搭成简易办公桌,就在这里装上电脑开始干活。当时 27 岁的 Craig Silverstein 坐在远处,他身材矮小但嗓门却相当洪亮。Silverstein 是谷歌公司的第一位员工:早在 Brin 把自己的客厅当成办公室时他就已经加入了谷歌,并新手重写了大部分代码。
经过四天四夜的努力,他和另一位名叫 Bogdan Cocosel 的罗马尼亚系统工程师感到一筹莫展。Silverstein 回忆道,“我们所做的任何分析都没有什么意义。一切都出了问题,但我们找不到其中的原因。”
Silverstein 当时几乎彻底忽略了安静坐在他左后方的 33 岁麻省理工学院毕业生 Sanjay Ghemawat。这位浓眉黑发的工程师在几个月之前(1999 年 12 月)才刚刚加入 谷歌公司。他是跟着 Digital Equipment Corporation(简称 D.E.C)的同事,31 岁的 Jeff Dean 一同跳槽的。Jeff 比 Sanjay 早十个月离开 D.E.C,两个人的关系一直很好,而且非常享受结对编写代码的工作方式。
在作战室里,Jeff 把椅子搬到了 Sanjay 的办公桌前。在 Sanjay 敲打键盘的同时,Jeff 就在旁边侧身观看,并时不时提点修改意见,就像制片人通过耳机对新闻主播耳语一样。
程序员们有时会将自己的软件概念转化为层次结构,一般以顶层用户界面为起点,逐步下降至愈发基础的层级。而在结构底层则存在着软件与硬件的过渡结构,在这里天马行空的代码序列开始转向由电与硅组成的实体世界。
在作战室中度过的第五天,Jeff 与 Sanjay 开始怀疑其中的问题不是出在逻辑层面,而属于物理范畴。他们将混乱的索引文件转换为最原始的表示形式:二进制代码。更具体地讲,他们想了解机器到底看到了什么。
Sanjay 的显示器上出现了一系列粗体的 0 和 1,每一行代表一个索引词。Sanjay 发现,其中某个本应是 0 的数位却显示成了 1。接下来,Jeff 与 Sanjay 将所有错误排序的词语汇总了起来,并发现了其中的共通模式——每个词语都存在相同的问题。他们机器上的内存芯片发生了故障。
Sanjay 不由自主将目光投向 Jeff。几个月以来,谷歌一直在经历各种各样且持续增加的硬件故障。问题是,随着谷歌业务的快速发展,其计算基础设施也在不断扩大。计算机硬件发生故障的概率一般是很低的,因此问题堆积起来之后,一下子引发了破坏性的影响。电线磨损、磁盘损坏、主板过热。相当一部分设备根本无法一次性成功启动,也有一些莫名其妙地速度变慢了。
与此同时,让人始料不及的环境因素也必须考虑在内——超新星爆炸时,爆炸波会产生指向各个方向的散射高能粒子。科学家们认为,其中一种被称为宇宙射线的粒子确实有极小的机率会击中地球上的计算机芯片并引发破坏——即导致目标出现从 0 到 1 的翻转。因此,美国宇航局、各大金融企业等重量级机构所使用的强大计算机系统会采用具备单 bit 状态转换容错能力的特殊硬件。但这时的谷歌仍然采取初创企业的运营模式,即购买大量不具备这种能力的低成本电脑设备。而事实证明,到这时谷歌已经迎来了发展的拐点——其计算集群已经变得无比庞大,因此发生硬件故障开始成为一种必然事件。
之后的几天,Jeff 与 Sanjay 全力编写代码以修复发生故障的机器。新的索引很快构建完成,作战室也正式解散。但这时的 Silverstein 却陷入了沉思。他是一位出色的调试人员,他很清楚发现错误的关键在于识别出问题的根源。在这方面,Jeff 与 Sanjay 显然做得更好。
在 2000 年 3 月索引崩溃事件之前,谷歌公司的系统一直以其创始人在斯坦福大学研究生院中编写的代码为基础。Page 与 Brin 并不是专业的软件工程师,他们只是来自学术界的搜索技术实验研究员。因此,在他们的网络爬取程序发生崩溃时,系统不会给出任何有意义的诊断信息——屏幕上只会显示“Whoa,horsey!”这样的感叹。谷歌公司的元老级员工们把 Page 与 Brin 编写的 BigFiles 软件称为 BugFiles,戏谑其中充斥着无数 bug。那时候,谷歌最重要的索引代码需要数天才能处理完成,而且一旦遇到问题就必须从头开始重新启动。按照硅谷通行的说法,谷歌的系统不具备“可扩展性”。
我们都会使用“搜索 Web”或者“搜索网络”的说法,但实际上这种表述并不准确。实际上,我们的搜索引擎遍历的是 Web 的索引——或者说地图。在 1996 年还在使用 BackRub 这个名号时,谷歌的索引地图还很小,足以安装在 Page 宿舍中的个人电脑里。但到 2000 年 3 月,其规模已经超出了任何超级计算机的处理能力。
要跟上如此迅猛的发展速度,谷歌公司唯一的方法就是购买消费级设备并将其组成一个集群。由于消费级设备当中有半数成本来自对谷歌公司毫无意义的“垃圾”——包括软盘驱动器与金属机箱,因此他们决定直接订购主板与磁盘并将其连接起来。谷歌在加利福尼亚州圣克拉拉市的一栋楼里将 1500 套这样的设备堆到了六英尺高; 但由于硬件故障,其中只有 1200 套设备能够正常工作。另外,随机发生的故障也在不断破坏着这套系统。为了维持业务运转,谷歌方面必须将这些计算机构建成一套无缝且具备弹性的整体。
面对这项工作,Jeff 与 Sanjay 再度携手出击。
曾效力于苹果公司参与 Macintosh 机研发的 Wayne Rosing 于 2000 年 11 月加入了谷歌,负责管理其百人工程团队。他回忆道,“这两位是真正的领导者。”他们每周工作九十个小时,全力编写代码,希望在不影响整体系统的情况下解决单一磁盘驱动器可能出现的故障。他们在网页爬取过程中添加了检查点,以便整个流程能够实现中途重新启动。通过开发新的编码与压缩方案,他们使得系统容量增加了一倍。他们同时也是毫不妥协的优化者。
在汽车拐弯时,轮胎外侧必然更多地接触地面; 磁盘驱动器也是同理,其在运转时外边缘的移动速度要高于内边缘。谷歌公司已经将最常访问的数据移动到外边缘处,从而加快读取磁头的执行速度。但在这种情况下,存储碟片内侧往往会被留空。Jeff 与 Sanjay 将这部分空间利用起来,存储常用搜索查询的预处理数据。
到 2001 年,他们用了四天时间证明谷歌索引应该采用快速随机存取内存,而非相对较慢的磁盘存储——这一发现颠覆了谷歌的经济理念。Page 与 Brin 都很清楚,能够即时提供答案的服务将受到用户的热烈欢迎,但问题在于这样的速度水平需要强大的计算能力支持,而计算能力是要花钱的。面对这样的困境,Jeff 与 Sanjay 利用软件解决了问题。
在 Rosing 于 2005 年离职之后,Alan Eustace 成为谷歌公司工程团队的负责人。Eustace 回忆道,“核心矛盾在于,我们必须了解最微小的细节,才有可能解决规模化问题。”Jeff 与 Sanjay 对于计算机的工作原理非常熟悉,能够立足 bit 层级进行思考。Jeff 曾经整理出一份《每位程序员都应该了解的那些延迟数字》清单。虽然名为“每位程序员都应该了解”,但大多数从业者对这些数字其实非常陌生——例如一级缓存引用通常需要半纳秒,或者从内存中顺序读取 1 MB 大概需要 250 微秒等等。但这些数字已经直接烙进了 Jeff 与 Sanjay 的大脑当中。凭借着他们对谷歌核心软件的多次重写,该系统的容量已经提升至新的数量级。与此同时,在谷歌庞大的数据中心之内,技术人员也开始遵循不规划工作路线——根据软件生成的指令来更换磁盘驱动器、电源以及记忆棒。如此一来,即使部件不断损耗甚至需要清退,整体系统仍能够蓬勃发展。
如今的谷歌工程师们身处从 1 级开始的庞大存在链当中。最底层的 1 级代表 IT 技术支持人员,2 级为大学新生,3 级则通常是拥有硕士学位的员工。达到 4 级往往需要数年实践周期,或者拥有博士学位。大多数员工的职业晋升都停留在第 5 级。6 级为工程师,代表谷歌公司前 10% 的卓越人才,他们的技术能力直接决定着项目的成败。7 级则代表着拥有长期实践经验的 6 级工程师。8 级为首席工程师,他们的工作与各主要产品及基础设施紧密关联。9 级为杰出工程师,在很大程度上已经成为一种尊称。而 10 级代表谷歌院士,这是一种终身性的荣誉头衔。谷歌院士是全球所在领域内毋庸置疑的佼佼者,Jeff 与 Sanjay 则是谷歌高级院士——该公司最初也是唯二的 11 级员工。
谷歌园区坐落在距离山景市中心仅几分钟路的高速公路旁,这里排布着装有深色窗户、毫不起眼的数座建筑。去年夏天的一天,在共同完成了上午的编程工作之后,Jeff 与 Sanjay 在名为 Big Table 的园区自助餐厅里共进午餐。实际上,餐厅的名称就源自他们在 2005 年协助开发的系统——这套系统负责将无数计算机作为一个数据库进行处理。Sanjay 又高又瘦,穿着复古味十足的深棕色夹克、灰色裤子还戴着一副窄框眼镜。他看中了一张露天餐桌,轻快地走了过去,撑起遮阳伞在阴凉处坐了下来。当然,他也没有忘记把另一把椅子搬到太阳下头。只过了一分钟,Jeff 随后赶到,穿着短袖衬衫和时髦的运动鞋。
就像老夫老妻一样,Jeff 和 Sanjay 各自讲述着自己记忆中的细节,共同回顾他们亲身参与的那些早期项目。
Sanjay 表示,“我们当时还是手写代码。”他的眼镜在阳光下自动变换着颜色。“我们也会进行代码重写,这种感觉像 「哦,好像跟我们上个月写的东西也差不多。」”
Jeff 则补充道:“或者说,只是其中的索引数据略有不同。”
Sanjay 接过话头:“那么,到底有多大的不同?这就是我们需要弄清的——”
Jeff 再次接上:“本质问题。”
Sanjay 最后做出总结,“这是我们工作的常规模式。”
Jeff 咬了一口手中的披萨。他的手指粗糙、骨节分明、皮肤坚韧。而 Sanjay 看起来则有一种截然相反的儒雅感,真的很难想象这样的两个人会成为挚友。Sanjay 说道,“我也不知道当初是怎么决定在一起合作的。”
Jeff 说道,“但早在加入谷歌之前,我们就是搭档了。”
Sanjay:“但我不知道我们为什么会觉得一起在同一台计算机前面琢磨,会比分头行动效果更好。”
Jeff 则表示,“我宁愿走过两个街区,也想从自己的 D.E.C 研究实验室赶到他的研究室去。两个实验室中间有家冰淇淋店。”
Sanjay 开心地叫道,“所以,应该就是冰淇淋店养成了我们的这种习惯。”
Sanjay 一直没有结婚,但他经常跟 Jeff 本人、他的妻子 Heidi 和两个女儿一起度假。Jeff 的女儿们会称他为 Sanjay 叔叔,他们五个人也经常在周五相约聚餐。Sanjay 和 Jeff 的大女儿 Victoria 关系相当要好。Sanjay 相当骄傲地表示,“我可是看着他的女儿长大的。”在 2004 年谷歌上市之后,他们搬到了仅相隔四英里的新住处。Sanjay 住在山景市旧城区一间不起眼的三居室中,Jeff 则在帕洛阿尔托市设计了自己的房子,还在地下室安装了一架蹦床。在设计房子时,他发现虽然自己很喜欢这方面工作,但却没有耐心听取 Sanjay 在建筑方面提出的那么多细化意见:主梁、螺栓以及承重等大量细节信息,会彻底破坏 Jeff 的宏观构想。
对于结对编程,Sanjay 表示:“我不太理解为什么大多数人不愿意这么做。”
Jeff 表示,“你需要找到一个能够与你的思维方式兼容的人,这样两个人在一起才能形成互补的力量。”
每个人都会有灵感枯竭的时候,但两个人却很少同时身陷困境。纵观过去三十五年,大约一半的诺贝尔生理学或医学奖都被颁发给这样的科学合作搭档。
经过多年共同的工作与生活,两个人之间甚至发展出了专用的交流语言,就像是一对双胞胎一样。他们会模仿彼此的穿着与习惯,共享对方的幽默风格,并建立起共通的信念。但是,这种程度的合作在软件开发中其实非常罕见。虽然开发人员们有时也会谈到“结对编程”——即两名程序员共享同一台计算机,一人负责“驾驶”而另一人负责“导航”——但 Jeff 与 Sanjay 的伙伴关系远比这密切得多。如果说普通程序员间的友情类似于协作飞行员,那么 Jeff 与 Sanjay 更像是同一个大脑的两个半球。他们发表的不少著名论文都是共同署名的,他们的经理之一 Bill Coughran 回忆道,“他们是如此多产,工作如此高效,我们经常会以他们为中心建立团队。”
1966 年,System Development Corporation 的研究人员们发现,最出色的程序员在工作效率方面往往达到最差程序员的十倍以上。从那之后,是否存在这种“10x(十倍效率)程序员”就一直是争议性话题。面对庞大且必须以集体形式进行的软件项目,这一思维显然是在强调个人成员的重要性。在编程领域,很少有成就能够独立存在。但即使如此,颇为讽刺的是,很多程序员都将 Jeff 与 Sanjay 共同完成的工作视为 10x 程序员确实存在的铁证。
Jeff 于 1968 年 7 月出生于夏威夷,他的父亲 Andy 是一位热带病学研究员,母亲 Virginia Lee 则是一名通晓六种语言的医学人类学家。出于兴趣,父子二人对一台 IMSAI 8080 计算机进行编程探索。他们将升级程序焊接在机器上,并深入研究了这台设备的每一部分构造。
Jeff 和他的父母经常搬家。十三岁时,他提前结束了自己八年级的学业,随家人一同来到索马里西部的某难民营。后来在就读高中时,他开始为流行病学家们编写一款名为 Epi Info 的数据收集程序; 这一成果最终成为野外工作的标配工具,推出了十几种语言的版本并发行了数十万份。
Jeff 后来在明尼苏达大学遇到了妻子 Heidi,那时的他还没有将自己的生活与编程紧密联系起来。她回忆道,“他从来不会吹嘘自己取得的这些成就。你得想尽办法才能引导他开始讲述。”两个人的第一约会是共同观看一场女子篮球比赛,那天 Jeff 在啦啦队里扮成了一只金花鼠吉祥物。
eff 的博士学业专注于编译器,这是一种将人们编写的代码转换为针对计算机进行优化的机器语言指令的软件。Allan Eustace 指出,“如果从乐趣出发,那么编译器本身非常无聊。”但在另一方面,这项工作却能让人“与机器走得更近”。在谈到 Jeff 时,Sanjay 不停用食指按着自己的太阳穴。“在你编写代码时,他会组织出一套模型。他会提醒「这些代码的性能如何?」他几乎能够以半自动方式考虑所有可能出现的情况。”
Sanjay 在 17 岁进入康奈尔大学之前从来没有接触过计算机。他于 1966 年出生于印第安纳州西拉斐特市,但在印度北部工业城市哥打长大。他的父亲 Mahipal 是一位植物学教授,母亲 Shanta 负责照料 Sanjay 和他的两个哥哥姐姐。这是一个典型的知识分子家庭:他的叔叔 Ashok Mehta 曾经买过一本 Frederick Forsyth 撰写的《豺狼之日(The Day of the Jackal)》的复印本。书已经快要散架了,但孩子们仍然把它拼起来读完了。Sanjay 的哥哥 Pankaj 成为了哈佛商学院有史以来获得终身教职的最年轻的教师(目前在纽约大学担任教授)。Pankaj 与 Sanjay 就读于同一所大学,而且被誉为“全才”。Sanjay 表示,“其实我多少有点生活在哥哥阴影之下的感觉。”因此,Sanjay 一直非常谦和低调。2016 年,当他入选美国人文与科学院(American Academy of Arts and Sciences)时,他甚至没有通知自己的父母; 两位老人是从邻居们那里听到这个好消息的。
在麻省理工学院的研究生院,Sanjay 找到了一群志同道合的好朋友。但他很少约会,直到现在也“很少很少”与异性往来。Sanjay 表示,他并不是拒绝组建家庭,只是事情顺其自然地发展到了现在这样。他的密友们已经习惯了不打扰他的生活,而父母也早就接受了自己儿子做出的永远当个单身汉的决定。也许正是因为他总是生活在自己的世界中,谷歌公司内的其他员工觉得他身上笼罩着一种神秘感。他以安静而深刻著称——这是一个深思熟虑且不同寻常的人。在他的桌子上,还保留着一堆近二十年前写下的 Mead 组合笔记,其中写满整洁的清单与图表。他习惯于拿起笔来快速记下自己的思路。虽然很少引用笔记中的内容,但他认为书写有助于思考。
他在麻省理工学院攻读硕士时的导师是 Barbara Liskov,一位颇具影响力的计算机科学家,专攻复杂代码库的管理。在她看来,最好的代码应该像是一篇杰出的文章。其中需要拥有一套精心实现而成的结构,且每个字句都应有其意义。但以这种方式编程,要求创作者与受众共情。另外,这也意味着创作者不仅要将代码视为达成目的的手段,也要把它作为艺术品。Craig Silverstein 表示,“我认为他最擅长的是系统设计类工作。看到 Sanjay 所编写的代码文件,你会发现这就如同一尊比例匀称的美丽雕像。”
在谷歌,Jeff 的名头明显更响亮一些。事实上,好事者甚至依照动作影星查克·诺里斯给 Jeff Dean 编了不少段子。(例如「查克·诺里斯能数到无穷大……而且数了两次」; 「Jeff 的简历只需要列出他没做过的事,因为这样篇幅更短」。)但是,对于那些非常了解二人的人们来说,Sanjay 的才能绝对不逊于 Jeff。曾经长期与二人共事的 Wilson Hsieh 表示,“Jeff 非常善于提出疯狂的想法以及原型设计,而 Sanjay 则是那种能够一路完成开发工作的人。”在生活当中,Jeff 更为外向,而 Sanjay 则比较内敛。在代码层面,情况却恰好相反。Jeff 的编程结果往往令人头晕目眩——他能够迅速勾勒出令人吃惊的想法,但由于整个过程太快,所以其他人往往无法理解。而 Sanjay 的代码则非常亲和友好。
Silverstein 指出,“有些人的代码太过松散,也就是一屏代码当中包含的信息太少。这意味着你总得来回滚动才能看明白这些代码到底要表达什么含义。但也有些人编写的密码太过密集,看着它会有那种「呃,好吧,我不打算继续看下去了」的感觉。Sanjay 在这两者之间找到了平衡点。面对他的代码,你会觉得「没问题,我可以看懂」,但同时里面又包含着大量内容。”Silverstein 同时补充道,“每当我打算为 Sanjay 的代码添加新功能时,总会发现其中的 hook 似乎已经留好了。我能理解其中的伟大之处,而且弄不清楚这样的代码是怎样编写出来的。”
今年春天的一个早上,Jeff 和 Sanjay 站在 40 号楼的小厨房里——这里正是谷歌人工智能部门的所在地。他们身后的白板上写满了矩阵代数;桌子上则摆着一篇关于无监督对抗网络的论文。Jeff 穿着一件褪色的 T 恤与牛仔裤,看起来就像一个刚刚找回生活方向的流浪汉;Sanjay 则穿着毛衣和灰色裤子。明亮的窗户外露出一大片高耸的松树,远处还有一片田野。无论何时,只要在工作阶段,Jeff 永远离不开意式浓缩咖啡。在小厨房的吧台上,一台三英尺宽的 La Marzocco 咖啡研磨机正在嗡嗡作响。Sanjay 一边盯着那台机器一边说,“我们迟到了。”这时候是上午 8 点 32 分。
在咖啡时间结束后,他们走到了自己的电脑前。Jeff 从自己的办公桌边抓过一把椅子——他的办公桌很脏,而 Sanjay 的桌子则永远一尘不染。他把一只脚搭在文件柜上,向后仰过去; Sanjay 则在他面前查看屏幕。显示器上打开了四个窗口:左边是网络浏览器与终端,用于运行分析工具; 右边则是文本编辑器 Emacs 中的两个文件——一个是待办事项列表与 notebook,另一个则是色彩斑斓的代码。Sanjay 把自己的笔记本放在了 Jeff 的台式机旁边。
“好了,我们都做了些什么?”Sanjay 打开了话题。
Jeff 表示,“我觉得我们正在研究 TensorFlow Lite 的代码规模。”
这是一个与机器学习相关的重要软件项目,Jeff 与 Sanjay 都担心它的体积会无限膨胀; 正如图书编辑一样,他们需要想办法精简内容。为此,两位构建起一款“瘦身”工具,而工具自身同样需要优化。
Sanjay 表示,“所以我在尝试弄清它到底有多慢。”
Jeff 回应道,“那可是相当慢。”他向前侧了侧身,但仍然非常放松。
Sanjay 接言道,“所以这代表的是 120 KB,大概有 8 秒钟那么慢。”
Jeff 则回应,“是 12 万次堆栈调用,可不是 120 KB。”
Sanjay 说道,“好吧,KB 指的是文本量,大概是。”
Jeff 回道,“哦,对,抱歉。”
Sanjay 发问,“我不太明白应该为单元大小取怎样的阈值。0.5MB 怎么样?”
Jeff 表示“应该可以。”Sanjay 开始敲击键盘,而 Jeff 被吸引到了屏幕上。“所以你的意思是,如果比 0.5MB 大,那我们就应该……”他的话还没说完,Sanjay 就用代码做出了回应。
Sanjay 在开车的时候会把手放在十点和两点方向,而后专注地盯着前方——现在他在操作键盘,姿态也完全一致。他的双脚分开与肩同宽,仍然保持着自己最熟悉的状态。他细长的手指轻轻划过各个按键,并逐渐吸引到几位年轻程序员的围观。
不久,他们达成了阶段性的胜利,Sanjay 输入一条命令来测试目前的进展。略显疲惫的他在命令运行的同时检查了一下电子邮箱。测试结束了,但他没有第一时间注意到。
“嘿,”Jeff 打了个响指,手指向屏幕。虽然在日常谈话中 Jeff 总是非常轻松和蔼,但当他和 Sanjay 一起坐在电脑前时,就会瞬间变成一个自以为是、粗鲁且总爱唱反调的家伙。Sanjay 对此早就习以为常了。在他认为 Jeff 的思路太快时,他会把手从键盘上抬起来比个手势,好像在说“等一会儿。”(一般来说,Jeff 就像油门,而 Sanjay 则是刹车。)虽然两个人似乎马上就要吵起来了,但在过去二十年当中,他们从来没有真正彼此吼叫。
Sanjay 滚动屏幕,把新的代码挪到屏幕正中。Jeff 看了看,“这些都可以加入常规流程,不是吗?”
“嗯,”Sanjay 表示同意。
Jeff 扳了一下手指关节,“似乎没问题,那现在就添加?”
Sanjay 更为谨慎,“不,我……”
Jeff 则显得有些急躁,“这里有我们还没发现的问题?”
“那倒不是,我的意思是,我们得先弄清目前的状况。我们可以先做点笔记,对吧?”
“好,没问题,”Jeff 又放松下来,他的情绪总是说变就变。他们一起整理出一张便条。
接近午餐时间,他们工作了两个小时,期间休息了十分钟,工作时大部分时间都在交流。(年轻的程序员看到他们的工作状态应该会记忆深刻,因为这两个人的对话从不会停止,甚至连停顿都没有。)在标准工程实践当中,大家需要将你的代码交给另一名程序员审查。但 Jeff 与 Sanjay 跳过了这一步,只是在记录中写下“lgtm”,意思是“looks good to me”——我觉得可以。从某种意义上说,他们可能会被细枝末节所淹没。然而,他们的代码开发工作需要充分考虑到谷歌自身庞大的业务规模。他们所担心的 KB 以及微秒延迟可能在世界各地的数据中心之间成倍增加,最终增长至十亿倍之巨。这些庞大且持续发热的机房中塞满无穷无尽的处理器机架,需要可观的水冷资源进行冷却。就是在这样看似平淡的工作当中,Jeff 曾轻松写意地回到家中,告诉女儿们“Sanjay 和我今天把谷歌搜索的速度提高了 10%。”
在 2003 年的四个月当中,Jeff 与 Sanjay 帮助谷歌完成了创立以来规模最大的一次升级。他们所使用的软件,就是后来赫赫有名的 MapReduce。这次升级的灵感,来自他们在对谷歌爬取工具与索引器进行第三次重写的过程。他们意识到,每一次他们解决一个重要问题,所面向的都是地理分布广阔且个别设备可能不太可靠的无数计算机上协同运行。因此,只有对解决方案进行全面推广,才能避免一次又一次重复面对同样的问题。更具体地讲,应该创建一款工具,确保谷歌公司的每一位程序员都能够利用其运行数据中心内的机器——换言之,将谷歌的所有基础设施视为一台硕大无朋的整体计算机。
Jeff 与 Sanjay 在办公室的角落里编写出了 MapReduce。办公室窗外对着一个池塘。MapReduce 的意义在于把可能令人费解的复杂流程整理得井然有序。在 MapReduce 出现之前,每一位程序员都必须弄清楚要如何对数据进行分割与分发,分配工作并自行负责硬件故障的处理。
MapReduce 为编程人员提供了一种用于考量此类问题的结构化方法。正如厨师在食材下锅之前要先对其进行分类一样,MapReduce 也要求程序员将自己的任务分成两个阶段。首先,程序员需要告诉每台机器如何完成任务的“Map”阶段(比如计算某个词语在网页中出现的次数); 接下来,程序员要编写指令以实现全部机器结果的“Reduce”(例如将上述结果相加)。MapReduce 可以处理分发工作的细节,从而帮助程序员摆脱这些复杂且枯燥的任务。
在接下来的一年当中,Jeff 与 Sanjay 以 MapReduce 任务的形式重写了谷歌的爬取与索引系统。很快,当其他工程师意识到 MapReduce 的强大力量后,他们也开始利用其处理视频并在谷歌地图上渲染图块。MapReduce 非常简单,能够轻松消化各类新型任务。谷歌的业务有着明确的所谓“昼夜使用曲线”——即白天的流量比晚间更多,而 MapReduce 任务则开始使用闲置部分的容量。正如生物会在梦中回顾白天的经历,现在谷歌也在利用同样的方式处理自己的数据。
很早开始,就有一系列迹象表明谷歌其实是一家伪装成搜索公司的 AI 公司。2001 年,与 Jeff 及 Sanjay 同一办公室的 Noam Shazeer 就曾因谷歌从其它厂商处获取的授权拼写检查器而身心俱疲:这款工具不断犯下令人尴尬的错误,例如提醒输入了“TurboTax”的用户,正确内容可能应该是“Turbot ax”——这太离谱了,turbot 是一种生活在北大西洋海域的比目鱼。拼写检查器的表现取决于其使用的词典,Shazeer 也深深意识到,谷歌公司完全能够立足网络获取有史以来规模最大的词典。他编写了一个程序,能够利用网络文本的统计属性来确定哪些词语更可能出现拼写错误。该软件学习到,“pritany spears”与“Brinsley spears”,实际上都属于“Britney Spears”——也就是小甜甜布兰妮的常见误写。在 Shazeer 参加谷歌每周举办的 T.G.I.F 聚会(公司每周五下午定期组织的放松活动)并展示这款程序时,其他员工开始进行测试,并发现这东西确实精明得很。在此之后,通过与 Jeff 以及另一位工程师 Georges Harik 的合作,Shazeer 将类似的技术应用到了网页的关联广告当中。定向广告成了一棵取之不尽的摇钱树,而谷歌则将这棵树植根在自己的计算基础设施之上。这就是良性循环的开端——规模化成就了谷歌的智能化,而智能化为谷歌带来了大笔财富,这些财富又进一步推动谷歌实现规模壮大。正是这样的发展体系,使得谷歌公司占据着无法动摇甚至令人不安的主导地位。
越来越多富有进取心的程序员们利用 MapReduce 发掘谷歌数据中的洞察见解,由此积累下的结论使得转录用户的语音邮件、回答客户问题、自动完成查询以及翻译各国语言逐渐成为可能。更重要的是,这些系统都是利用复杂度相对较低的机器学习算法开发而成的。Jeff 总结称,“即使是非常简单的技术,在配合大量数据之后,也能带来良好的效果。”而在“数据、数据、数据”成为谷歌的最高指导原则(利用 BigTable、MapReduce 及其后续技术存储并处理这些数据)之后,谷歌基础设施的全球扩展能力也变得更加无缝化与灵活化。更重要的是,Jeff 与 Sanjay 打造的这些技术能够通过智能化方式进行管理,从而确保普通程序员也能够编写分布式程序,最终让谷歌在这些新的技术领域中占据先发主导地位。即使是普通用户,可能也注意到了某些悄然出现的趋势:谷歌云正在变得越来越聪明。
2004 年,考虑到这些技术可能对需要处理大量数据的天文学家、遗传学家乃至其他领域的科学家们具有重大意义,Jeff 与 Sanjay 共同撰写了一篇论文《MapReduce:立足大型集群简化数据处理(MapReduce: Simplified Data Processing on Large Clusters)》并公开发表。这篇 MapReduce 论文的出现时机可谓恰到好处。
当时,成本愈发低廉的硬件与网络服务、互连设备正快速普及并带来巨量数据,但只有极少数企业拥有能够处理这些信息的软件。在经历了艰难的小型搜索引擎 Nutch 的扩展挑战之后,Mike Cafarella 与 Doug Cutting 两位工程师清楚认识到了 MapReduce 的重要性,并决定从零开始为其创建一套免费克隆版本。他们最终将自己的项目命名为 Hadoop,这个名字源自 Cutting 儿子最喜爱的一只毛绒小象。
Hadoop 快速发展成熟,目前已经被半数全球财富五十强企业所采用。事实上,Hadoop 几乎成为大数据的代名词。众所周知,Facebook 公司就利用其所谓“Hadoop MapReduce”存储及处理用户元数据——包括用户的点击、点赞、广告查看等行为的信息。Facebook 一度拥有世界上规模最大的 Hadoop 集群。此外,Hadoop MapReduce 还有力支撑起了 LinkedIn 与 Netflix 的业务体系。前美国国家安全局技术主管 Randy Garrett 就曾经向国安局局长 Keith Alexander 上将演示过这项技术。Hadoop 执行分析任务的速度可以达到原有系统的 18000 倍,这使其成功催生出一种全新的情报收集方法——亦有部分观察家将其称为“collect it all”方法。
Jeff 天生不愿安于现状:一旦看到问题解决方案的轮廓,这个问题对他而言也就失去了吸引力。2011 年,在全世界都向云计算张开怀抱时,他开始与来自斯坦福大学的计算机科学教授吴恩达合作。吴恩达教授当时在谷歌公司负责领导一个关于神经网络研究(即利用虚拟「神经元」构建计算机程序)的秘密项目。Jeff 曾在本科求学阶段接触过神经网络,但那个时候还无法解决真实世界中的问题。吴恩达告诉 Jeff,情况正在快速发生改变。在斯坦福大学,研究人员们发现向神经网络提供大量数据之后,即可取得一系列激动人心的结果。吴恩达认为,在谷歌庞大的业务规模支撑之下,神经网络不仅将在实用性层面有所提升,更会变得无比强大。
神经网络与传统计算机程序截然不同。与通常的方法不同,神经网络的行为并非由程序直接指定,而是通过输入与反馈自行“学习”到的。自从本科毕业之后,Jeff 的神经网络知识就一直停滞不前,于是 Heidi 很快发现家里的卫生间中摆满了相关教材。Jeff 决定每周拿出一天了解这个被称为“谷歌大脑(Google Brain)”的项目。谷歌公司内部有很多人对这项技术持怀疑态度,Alan Eustace 回忆道:“这简直是在浪费人才。”就连 Sanjay 也对 Jeff 的举动无法理解,他认为“你的工作在于管理基础设施,整那些没用的干啥?”
在接下来的七年时间里,谷歌大脑团队开发出了远超以往最佳方案的机器翻译以及语音与图像识别神经网络。最终,这些神经网络模型取代了谷歌最重要的搜索结果排序与定向广告算法,这也使得谷歌大脑团队成为公司内增长速度最快的部门之一。2001 年加入谷歌公司的工程师 Claire Cui 提到,Jeff 的参与标志着谷歌内部人工智能开发工作的历史性转折点:“当时有人相信这项技术,也有人不信,但 Jeff 证明了它确实有效。”
事实证明,人工智能以规模化为前提,而 Jeff 这位系统工程师正是规模化实现的好手。他的一项重要努力在于领导了 TensorFlow 项目的开发——目标是为人工智能创造出与 MapReduce 相似的简化方案。TensorFlow 极大降低了将神经网络分配至多台计算机的门槛,从而将大量计算设备视为统一的庞大主脑。2015 年,TensorFlow 正式亮相,并成为人工智能领域的客观标准。谷歌 CEO Sundar Pichai 最近骄傲地宣布谷歌是一家“AI 优先”的企业,并任命 Jeff 领导公司内的所有 AI 开发项目。
Jeff 现在每周拿出四天时间管理谷歌大脑团队,包括团队中的三千名成员。他到处发表演讲,每周召开一次关于新型计算机芯片(即专为神经网络设计的张量处理单元,简称 TPU)的例会。此外,他还参与到 AutoML 的开发协助当中——这是一套尝试利用神经网络设计其它神经网络的系统。在如此繁重的工作压力之下,如今他每周与 Sanjay 一同编写代码的机会只剩下一次。
工程技术总是在人们难以察觉的幕后悄然演变。十八世纪伟大的探险家 James Cook 与 George Vancouver 取得辉煌成就的背后,是投入数十年努力发明出海上经度计算装置的约克郡木匠 John Harrison。
最近,Jeff 与 Sanjay 相约到他们最喜爱的墨西哥餐厅 Palo Alto Sol 享用塔可卷饼。Jeff 掏出了手机,“还记得 Gmail 是什么时候上线的吗?”手机回答道,“2004 年 4 月 1 日。”Sanjay 不喜欢在吃饭的时候分心,但 Jeff 却对语音助手的表现非常满意。谷歌现在拥有一系列能够与用户对话、倾听并回答问题的程序,这些程序同样隐藏在幕后,在世界各地数据中心的支持下为无数应用程序提供支持。
当前,Jeff 与 Sanjay 两人的角色已经大不相同。在谷歌,Sanjay 属于那种“个人贡献者”——他独自干活,不涉及任何管理工作。他对这种状态非常满意。他说,“我可不想像 Jeff 那样工作。”他目前正在开发一款帮助工程师轻松组合并控制几十种程序(用于获取新闻、图像与价格等信息)的软件,这个软件将在用户在谷歌搜索框内输入文本时开始运行。另外,他每周定期与一群“区域技术负责人(Area Tech Leads)”开会,这可以说是谷歌工程开发方面最高级别的会议——他们共同制定的方针会影响整个公司的技术决策。如果把谷歌比作一栋房子,那么 Jeff 负责设计新的房间,而 Sanjay 则在身后调整结构、加固大梁、拧紧螺栓。
与此同时,在每周星期一的共同编程中,Jeff 与 Sanjay 又鼓捣出了一个新的 AI 项目。Jeff 说这是一种尝试,要训练出一套“巨型”机器学习模型来执行成千上万种不同任务。Jeff 多年来一直在考量这个思路,并在最近意识到这可能并非天方夜谭。他和 Sanjay 打算构建一套原型,然后组织起团队围绕其做开发。在软件世界里,最好的领导方法就是用代码说话。
Jeff 的妻子 Heidi 说:“我觉得他们都很想念对方。”当合作机会减少时,他们开始相约在周五晚上聚餐。
今年 3 月的一个星期天,Jeff 与 Sanjay 一起去库比蒂诺郊外远足。天气凉爽干燥,但阳光晒在身上已经有了点暑意。Jeff 开着一辆蓝色的特斯拉 Roadster 来到了山口,车子的保险柜上贴着 Bernie 2016 的贴纸。Sanjay 则开着自己的红色特斯拉 Model S 紧随其后。那天早上,Sanjay 一直在看书,而 Jeff 跑去踢足球(小腿上的设备显示他总共跑了 7.1 英里)。在“三月索引”事件的 20 年之后,Jeff 黝黑的皮肤让他看起来像个已经退役的长跑运动员,但 Sanjay 却显得非常年轻。
远足的路线总长 6 英里,途中要穿过一片茂密的丛林。Jeff 在前面带路,两个人在林子里追忆了谷歌快速发展的历程。Sanjay 想起在谷歌的第一个快速发展阶段,曾有个管道工一次性为男厕所安装了两个厕位。他说,“我还记得 Jeff 是怎么讲的,他说「这就叫双管齐下」。”
他们走出丛林,面前是一片荒地,还有一只秃鹰从头顶飞过。
Jeff 说道,“这山比我想象的还陡。”
Sanjay 回应道,“不是说这次远足的路很好走吗?”
Jeff 根本不接茬:“怪不得另外一侧没有自行车道呢。”
他们再次扎进丛林。在通过一段之字形的上坡时,Jeff 往外瞥了一眼:“我们应该找个地方远眺一下。”
他们脚下的山路直通山顶,那里高峻敞阔,没有树木遮挡,正是远眺的好位置。虽然山间蒙着一层薄雾,但他们仍然可以看到南边的圣克鲁斯山与东边的米逊峰。Jeff 遥指,“Sanjay 快看,你的办公室在那!”他们并肩而立,目光穿过幽长的山谷。
英文原文
https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge