Linguista

缔造谷歌庞大帝国的友谊「纽约客:Jeff Dean 和 Sanjay Ghemawat」

通过在同一台电脑前共同编程,Jeff Dean 和 Sanjay Ghemawat 改变了公司乃至互联网的进程。

作者:James Somers 2018年12月3日

Jeff Dean 和 Sanjay Ghemawat 的插画 公司顶尖的程序员们如同一个大脑的两半。插画:David Plunkert

2000年3月的一天,谷歌最优秀的六名工程师聚集在一个临时的作战室里。公司正面临前所未有的紧急状况。去年10月,其核心系统——负责抓取网页以建立“索引”的系统——停止了工作。尽管用户仍然可以在 google.com 上输入查询,但他们得到的结果是五个月前的旧数据。工程师们当时并未意识到,事情的风险远比他们想象的更大。谷歌的联合创始人拉里·佩奇(Larry Page)和谢尔盖·布林(Sergey Brin)正在谈判一项为雅虎(Yahoo)提供搜索引擎支持的交易,他们承诺交付一个比当时大十倍的索引——一个能够跟上万维网发展速度的索引,而万维网在去年规模已翻了一番。如果他们失败了,google.com 将继续停留在过去,雅虎的交易很可能泡汤,公司也将面临耗尽资金直至湮灭的风险。

在一个靠近楼梯的会议室里,工程师们把门板架在锯木架上,摆好了电脑。克雷格·西尔弗斯坦(Craig Silverstein),一个身材瘦小、声音尖细的二十七岁年轻人,坐在靠远墙的位置。西尔弗斯坦是谷歌的第一位员工:他在公司办公室还在布林的客厅时就加入了,并亲自重写了大部分代码。经过四天四夜的奋战,他和一位名叫波格丹·科科塞尔(Bogdan Cocosel)的罗马尼亚系统工程师一无所获。“我们做的所有分析都毫无意义,”西尔弗斯坦回忆道。“一切都坏了,我们不知道为什么。”

西尔弗斯坦几乎没有注意到他左后方桑杰·格玛沃特(Sanjay Ghemawat)的存在。桑杰是一位安静的三十三岁麻省理工学院毕业生,浓眉,鬓角已开始发灰。桑杰几个月前,也就是12月份才加入公司。他是跟随他的同事——一位名叫杰夫·迪恩(Jeff Dean)的高个子、精力充沛的三十一岁年轻人——从数字设备公司(Digital Equipment Corporation, DEC)过来的。杰夫比桑杰早十个月离开DEC。他们关系异常密切,并且喜欢一起写代码。在作战室里,杰夫把椅子滑到桑杰的桌旁,留下自己的空位。桑杰操作键盘,而杰夫则靠在他身边,像新闻主播耳边的制作人一样纠正和引导。

杰夫和桑杰开始仔细研究那个停滞的索引。他们发现有些词丢失了——搜索“mailbox”(邮箱)却没有任何结果——而另一些词则顺序混乱。几天来,他们一直在代码中寻找缺陷,沉浸在其逻辑中。逐段检查,一切似乎都没问题。他们找不到那个错误(bug)。

程序员有时会将他们的软件概念化为一个层次结构,从顶层的用户界面,向下延伸到越来越基础的层面。深入到这个结构的底层,即软件与硬件交汇之处,意味着从柏拉图式的代码秩序转向其所依赖的电力和硅的元素世界。在作战室的第五天,杰夫和桑杰开始怀疑他们寻找的问题并非逻辑上的,而是物理上的。他们将混乱的索引文件转换为其最原始的表示形式:二进制代码。他们想看看他们的机器看到了什么。

在桑杰的显示器上,出现了一列密集的1和0,每一行代表一个索引词。桑杰指着:一个本应是0的数字变成了1。当杰夫和桑杰把所有排序错误的词放在一起时,他们看到了一个模式——每个词都出现了同一种小故障。他们机器的内存芯片不知何故损坏了。

桑杰看着杰夫。几个月来,谷歌经历的硬件故障越来越多。问题在于,随着谷歌的发展,其计算基础设施也在扩张。计算机硬件很少出故障,除非你拥有足够多的硬件——那时它就会一直出故障。电线磨损,硬盘崩溃,主板过热。许多机器从一开始就不能工作;有些会莫名其妙地变慢。奇怪的环境因素也开始起作用。当超新星爆炸时,冲击波会产生高能粒子并向四面八方散射;科学家认为,这些被称为宇宙射线的迷途粒子有极小的概率击中地球上的计算机芯片,将0翻转为1。世界上最稳健的计算机系统,如NASA、金融公司等,使用能够容忍单位比特翻转的特殊硬件。但谷歌,当时仍像初创公司一样运作,购买的是缺乏该功能的廉价计算机。公司已经到达了一个拐点。它的计算集群变得如此庞大,以至于即使是罕见的硬件故障也变得不可避免。

杰夫和桑杰一起编写了代码来补偿那些出问题的机器。不久之后,新的索引完成了,作战室也解散了。西尔弗斯坦感到困惑。他是一个优秀的调试者;找到错误的关​​键在于探究问题的根源。杰夫和桑杰则探究得更深。

在三月份索引崩溃事件之前,谷歌的系统根植于其创始人在斯坦福大学读研究生时编写的代码。佩奇和布林并非专业的软件工程师。他们是进行搜索技术实验的学者。当他们的网络爬虫崩溃时,没有提供信息的诊断消息——只有一句“Whoa, horsey!”(喔唷,小马!)。早期员工将佩奇和布林编写的一个名为 BigFiles 的软件称为 BugFiles(充满错误的文件)。他们至关重要的索引代码需要数天才能完成,并且如果遇到问题,就必须从头开始。用硅谷的行话来说,谷歌当时不具备“可扩展性”(scalable)。

我们说我们“搜索网络”,但实际上并非如此;我们的搜索引擎遍历的是网络的索引——一张地图。当谷歌在1996年还叫BackRub时,它的地图小到可以装在佩奇宿舍里的电脑上。到了2000年3月,已经没有足够大的超级计算机来处理它了。谷歌能够跟上发展的唯一方法是购买消费级机器并将它们连接成一个集群。由于这些计算机一半的成本在于谷歌认为是垃圾的部件——软盘驱动器、金属机箱——公司会订购裸露的主板和硬盘,并将它们像三明治一样叠在一起。谷歌在加利福尼亚州圣克拉拉的一栋建筑里,将一千五百台这样的设备堆叠成六英尺高的塔架;由于硬件故障,只有一千二百台能工作。故障似乎随机发生,不断破坏系统。为了生存,谷歌必须将其计算机联合成一个无缝、有弹性的整体。

杰夫和桑杰并肩负责了这项工作。韦恩·罗辛(Wayne Rosing)曾在苹果公司参与麦金塔电脑前身的工作,于2000年11月加入谷歌,负责管理其百人工程师团队。“他们是领导者,”他说。他们每周工作九十个小时,编写代码,使得单个硬盘故障不会导致整个系统瘫痪。他们在爬取过程中添加了检查点,以便可以在中途重新启动。通过开发新的编码和压缩方案,他们有效地将系统容量翻了一番。他们是无情的优化者。当汽车转弯时,外侧轮子必须覆盖更多地面;同样,旋转硬盘的外边缘比内边缘移动得更快。谷歌已将最常访问的数据移到外部,以便数据位可以在读写头下更快地流动,但内部一半是空的;杰夫和桑杰利用这个空间存储了常见搜索查询的预处理数据。在2001年的四天里,他们证明了谷歌的索引可以使用快速的随机存取存储器(RAM)而不是相对较慢的硬盘来存储;这一发现重塑了公司的经济模式。佩奇和布林知道用户会涌向能够即时提供答案的服务。问题在于速度需要计算能力,而计算能力需要花钱。杰夫和桑杰用软件巧妙地解决了这个问题。

艾伦·尤斯塔斯(Alan Eustace)在罗辛于2005年离开后成为工程团队的负责人。“要解决规模化问题,矛盾的是,你必须了解最微小的细节,”尤斯塔斯说。杰夫和桑杰在比特层面上理解计算机。杰夫曾分发过一份名为“每个程序员都应知道的延迟数字”的列表。事实上,这是一份几乎没有程序员知道的数字列表:L1缓存引用通常需要半纳秒,或者从内存中顺序读取一兆字节需要二百五十微秒。这些数字已深深烙印在杰夫和桑杰的大脑中。在他们帮助引领谷歌核心软件的几次重写过程中,系统的容量按数量级扩展。与此同时,在公司庞大的数据中心里,技术人员现在沿着蛇形路线行走,遵循软件生成的指令更换硬盘驱动器、电源和内存条。即使其部件磨损和失效,系统依然蓬勃发展。

如今,谷歌的工程师存在于一个从一级开始的“存在巨链”(Great Chain of Being)中。底层是IT支持人员。二级工程师是刚毕业的大学生;三级工程师通常拥有硕士学位。达到四级需要几年时间,或者一个博士学位。大多数人的晋升止步于五级。六级工程师——前百分之十——能力出众,可以说是一个项目成功的原因;七级工程师是拥有长期优异记录的六级工程师。首席工程师(Principal Engineers),即八级工程师,与某个主要产品或基础设施相关联。杰出工程师(Distinguished Engineers),即九级工程师,被人们尊崇地提及。成为谷歌院士(Google Fellow),即十级工程师,是赢得一项将伴随你一生的荣誉。谷歌院士通常是各自领域的世界顶尖专家。杰夫和桑杰是谷歌高级院士(Google Senior Fellows)——公司首批且仅有的十级工程师。

谷歌园区坐落在山景城市中心几分钟路程外的高速公路旁,由一系列低矮、不起眼、带有有色玻璃窗的建筑组成。去年夏天的一个星期一,在共同编程一个上午后,杰夫和桑杰去了一个名为“大桌子”(Big Table)的园区自助餐厅吃午餐,这个名字来源于他们在2005年帮助开发的一个系统,该系统用于将无数台计算机视为单一数据库。桑杰个子高瘦,穿着一件旧的栗色亨利衫、灰色裤子和小号金属框眼镜。他在外面发现了一张桌子,快步走过去占住,打开遮阳伞,在阴凉处坐下。他把另一把椅子搬到阳光下留给杰夫,杰夫一分钟后到达,肩宽,穿着短袖衬衫和时髦的运动鞋。

就像一对搭档,杰夫和桑杰通过各自贡献片段来共同讲述故事。他们开始回忆早期的项目。

“我们当时是手写代码,”桑杰说。他的眼镜在阳光下变暗了。“我们会重写它,然后感觉,‘哦,这似乎和我们上个月写的差不多。’”

“或者是我们索引数据中一个稍微不同的处理过程,”杰夫补充道。

“或者稍微不同,”桑杰说。“这就是我们如何找出——”

“这就是本质,”杰夫说。

“——这就是共同的模式,”桑杰总结了他们的想法。

杰夫咬了一口他拿的比萨。他有着水手般的手指,关节粗大,皮肤粗糙;桑杰相比之下几乎显得纤细,他想知道他们俩怎么会成为一对。“我不太清楚我们是如何决定这样做会更好,”他说。

“我们在谷歌之前就这样做了,”杰夫说。

“但我不知道为什么我们当时决定在一台电脑前做比在两台电脑前更好,”桑杰说。

“我会从我的DEC研究实验室走两个街区到他的DEC研究实验室,”杰夫说。“中间有一家意式冰淇淋店。”

“所以是因为那家冰淇淋店!”桑杰高兴地说。

桑杰未婚,他会和杰夫、杰夫的两个女儿以及他的妻子海蒂(Heidi)一起度假。杰夫的女儿们叫他桑杰叔叔,他们五个人经常在周五共进晚餐。桑杰和杰夫的大女儿维多利亚(Victoria)开始一起烘焙。“我看着他的女儿们长大,”桑杰自豪地说。在2004年谷歌IPO之后,他们搬进了相距四英里的房子。桑杰住在山景城老区一个朴素的三居室里;杰夫则在帕洛阿尔托市中心附近自己设计了他的房子,并在地下室安装了一个蹦床。在建造房子时,他发现虽然他喜欢设计空间,但他对建筑中他所谓的“桑杰导向的方面”没有耐心:那些确保宏伟设计不会垮塌的横梁、螺栓和承重的细节。

“我不知道为什么没有更多人这样做,”桑杰谈到与伙伴一起编程时说。

“你需要找到一个与你的思维方式兼容的人来进行结对编程,这样你们俩在一起就能形成互补的力量,”杰夫说。

他们从桌子旁起身,去寻找软冰淇淋,漫步穿过“大桌子”餐厅和其中穿梭的谷歌员工。两人之中,杰夫更热衷于阐述,走路时他分享了他的软冰淇淋策略。“我用挤压法。我认为向上推的方法增加了稳定性,”他说。桑杰则满意而专注地将巧克力和香草混合口味旋入他的蛋筒冰淇淋中。

社会学家迈克尔·P·法瑞尔(Michael P. Farrell)在他2001年的著作《协作圈:友谊动力与创造性工作》(Collaborative Circles: Friendship Dynamics and Creative Work)中,研究了紧密的创意团体——法国印象派画家、西格蒙德·弗洛伊德及其同时代人。“奠定新视野基础的大多数脆弱见解,并非在整个团体聚在一起时出现,也不是在成员独自工作时出现,而是在他们成对协作并相互回应时产生的,”他写道。正是莫奈和雷诺阿在1869年夏天并肩工作,才发展出了后来成为印象派的风格;在催生立体主义的六年合作期间,巴勃罗·毕加索和乔治·布拉克常常只在画布背面签名,以掩盖哪幅画是哪个人完成的。(“一幅画布直到我们俩都觉得它完成了才算完成,”毕加索后来回忆道。)在《二的力量:在创意搭档中寻找创新本质》(Powers of Two: Finding the Essence of Innovation in Creative Pairs)一书中,作者乔舒亚·沃尔夫·申克(Joshua Wolf Shenk)引用了约翰·列侬在1971年的一次采访中的话,列侬解释说,通常是他或保罗·麦卡特尼会“写出好的那部分,容易的部分,比如‘我今天读到了新闻’或诸如此类的。”其中一人会卡壳,直到另一个人到来——然后,列侬说,“我会唱一半,他就会受到启发写出下一部分,反之亦然。”每个人都会陷入创作低谷,但两个人很少同时陷入。

在新科学或艺术的“理论构建”阶段,广泛探索而不陷入死胡同非常重要。与雅克·莫诺(Jacques Monod)共同开创基因调控研究的弗朗索瓦·雅各布(François Jacob)指出,到二十世纪中叶,分子生物学这个不断发展的领域中的大多数研究都是两人合作的结果。“两个人比一个人更擅长构思理论和构建模型,”雅各布写道。“因为有两个大脑共同处理一个问题时,思想会更快更多地涌现。它们在伙伴之间来回传递。它们像树枝嫁接一样相互结合。在这个过程中,幻想会更快地被扼杀在萌芽状态。”在过去三十五年中,大约一半的诺贝尔生理学或医学奖授予了科学合作伙伴关系。

经过多年共享工作生活的二人组,有时会像双胞胎一样发展出一种私密语言。他们模仿对方的衣着和习惯。幽默感从一方渗透到另一方。在他们之间分配功劳变得不可能。但这种强度的伙伴关系在软件开发中并不常见。尽管开发者有时会谈论“结对编程”——两个程序员共享一台计算机,一个“驾驶”,另一个“导航”——他们通常将这种伙伴关系视为冗余备份,好像这对搭档是同一航班上的副驾驶。相比之下,杰夫和桑杰有时看起来像是一个大脑的两半。他们一些最著名的论文有多达十几位合著者。尽管如此,他们的经理之一比尔·考夫兰(Bill Coughran)回忆道,“他们作为一对搭档工作效率极高,效果显著,以至于我们经常围绕他们组建团队。”

1966年,系统开发公司(System Development Corporation)的研究人员发现,最好的程序员比最差的程序员效率高出十倍以上。所谓的“10倍程序员”的存在从那时起就备受争议。这种观点崇尚个人,而软件项目往往是庞大且集体性的。在编程中,很少有成就是孤立存在的。即便如此——或许具有讽刺意味的是——许多程序员将杰夫和桑杰共同完成的工作视为10倍程序员存在的证明。

杰夫于1968年7月出生在夏威夷。他的父亲安迪(Andy)是一位热带病研究员;他的母亲弗吉尼亚·李(Virginia Lee)是一位医学人类学家,会说六种语言。为了好玩,父子俩一起编程一台IMSAI 8080套件计算机。他们给机器焊接升级部件,学习它的每一个部分。

杰夫和他的父母经常搬家。十三岁时,他跳过了八年级的最后三个月,去索马里西部的一个难民营帮助父母。后来,在高中时,他开始为流行病学家编写一个名为Epi Info的数据收集程序;它成为了实地工作的标准工具,最终分发了数十万份副本,支持十几种语言。(美国疾病控制与预防中心维护的一个网站“Epi Info的故事”中,有一张杰夫高中毕业时的照片。)杰夫在明尼苏达大学读大学时认识的海蒂,多年后才知道这个程序的重要性。“他从不吹嘘那些事,”她说。“你得从他那里套话。”他们的第一次约会是去看一场女子篮球赛;杰夫当时穿着地鼠吉祥物服装在做啦啦队。

杰夫的博士研究专注于编译器,即将人类编写的代码转换成优化过的供计算机执行的机器语言指令的软件。“就吸引力而言,编译器几乎是最无聊的东西了,”艾伦·尤斯塔斯说;但另一方面,它们让你“非常接近机器”。桑杰在描述杰夫时,用食指在太阳穴旁打转。“在你写代码的时候,他脑子里就有一个模型在运行,”他说。“‘这段代码的性能会怎样?’他几乎是半自动地思考所有极端情况(corner cases)。”

桑杰直到十七岁去康奈尔大学才接触计算机。他于1966年出生在印第安纳州的西拉斐特,但在印度北部的工业城市科塔长大。他的父亲马希帕尔(Mahipal)是一位植物学教授;他的母亲珊塔(Shanta)照顾桑杰和他的两个哥哥姐姐。他们是一个书香门第:他的叔叔阿肖克·梅塔(Ashok Mehta)记得买过一本弗雷德里克·福赛思(Frederick Forsyth)的《豺狼的日子》(The Day of the Jackal),书的装订磨损严重,他看着格玛沃特家的孩子们一起读这本破书,读完一页就传递下去。桑杰的哥哥潘卡伊(Pankaj)成为哈佛商学院有史以来获得终身教职的最年轻的教员。(他现在是纽约大学斯特恩商学院的教授。)潘卡伊和桑杰上同一所学校,并以博学多才(Renaissance man)闻名。“我有点活在我哥哥的阴影下,”桑杰说。成年后,他仍然保持着一种自我谦逊的天赋。2016年,当他入选美国艺术与科学学院时,他没有告诉父母;是他们的邻居把消息告诉了他们。

在麻省理工学院读研究生时,桑杰找到了一个关系紧密的朋友圈。不过,他从未约会过,现在也只是“非常非常偶尔”才约会。他说他并非决定不要家庭——只是事情自然而然地发展成了这样。他的密友们已经学会了不再为此事烦扰他,他的父母也早已接受了儿子将成为单身汉的事实。也许因为他非常注重隐私,谷歌内部围绕着他有一种神秘感。他以安静但深刻而闻名——一个思考深入且异常清晰的人。在他的办公桌上,放着一叠可以追溯到近二十年前的米德(Mead)牌作文本,里面写满了整齐的列表和图表。他用钢笔以草书书写。他很少参考旧笔记本,而是通过书写来思考。在麻省理工学院,他的研究生导师是芭芭拉·利斯科夫(Barbara Liskov),一位有影响力的计算机科学家,她的研究领域之一是复杂代码库的管理。在她看来,最好的代码就像一篇好的文章。它需要一个精心构思的结构;每个词都应该发挥作用。以这种方式编程需要对读者有同理心。这也意味着将代码不仅仅视为达到目的的手段,而是其本身就是一件艺术品。“我认为他最擅长的是设计系统,”克雷格·西尔弗斯坦说。“如果你只是看桑杰写的一个代码文件,它的美就像一座比例匀称的雕塑那样美。”

在谷歌,杰夫的名气要大得多。网上流传着关于杰夫·迪恩的段子(meme),模仿查克·诺里斯(Chuck Norris)的那些。(“查克·诺里斯数到了无穷大……两次”;“杰夫·迪恩的简历列出了他没做过的事情——那样更短。”)但是,对于同时认识他们俩的人来说,桑杰是同等的天才。“杰夫擅长提出疯狂的新想法和制作原型,”他们的长期同事威尔逊·谢(Wilson Hsieh)说。“桑杰是那个构建持久系统的人。”在生活中,杰夫更外向,桑杰更内向。在代码方面,则正好相反。杰夫的编程令人眼花缭乱——他能迅速勾勒出惊人的想法——但因为是在探索精神下快速完成的,可能会让读者跟不上。桑杰的代码是社交性的。

“有些人的代码,”西尔弗斯坦说,“太松散了。一个屏幕的代码信息量很少。你总是需要来回滚动才能弄清楚发生了什么。”另一些人写的代码则过于密集:“你看一眼,就会觉得,‘呃。我可不期待读这个。’桑杰不知何故做到了折中。你看他的代码,你会觉得,‘好的,我能弄明白这个,’而且,你仍然可以在一页上获得很多信息。”西尔弗斯坦继续说,“每当我想在桑杰的代码中添加新功能时,似乎接口(hooks)就已经在那里了。我感觉自己像萨列里(Salieri,莫扎特的对手)。我理解其伟大之处。但我不明白它是如何做到的。”

今年春天的一个周一早上,杰夫和桑杰站在40号楼的小厨房里,这里是谷歌大部分人工智能部门的所在地。他们身后的一块白板上写满了矩阵代数;桌子上放着一篇关于无监督对抗网络的论文。杰夫穿着一件褪色的T恤和牛仔裤,看起来像个改过自新的沙滩浪子;桑杰穿着一件毛衣和灰色裤子。明亮的窗户透出外面一片高大的松树林,远处是一片田野。无论杰夫在谷歌哪里工作,意式浓缩咖啡机都会随之而来。小厨房的台子上,一台三英尺宽的 La Marzocco 咖啡机嗡嗡作响。“我们要迟到了,”桑杰一边操作咖啡研磨机一边说。时间是八点三十二分。

喝完卡布奇诺后,他们走向各自的电脑。杰夫从自己凌乱的办公桌旁拖了一把椅子到桑杰一尘不染的桌子旁。他把一只脚搭在文件柜上,向后靠着,而桑杰则审视着面前的屏幕。屏幕上开了四个窗口:左边是一个网页浏览器和一个用于运行分析工具的终端;右边是文本编辑器Emacs中的两个文档,一个是待办事项列表兼笔记本,另一个则充满了彩色代码。桑杰的一本组合笔记本放在电脑旁边。

“好了,我们刚才在做什么?”桑杰问道。

“我想我们正在看TensorFlow Lite的代码大小,”杰夫说。

这是一个与机器学习相关的重要新软件项目,杰夫和桑杰担心它过于臃肿;就像图书编辑一样,他们正在寻找可以删减的部分。为了完成这项任务,他们构建了一个新工具,而这个工具本身也需要优化。

“所以我当时想弄清楚它有多慢,”桑杰说。

“它相当慢,”杰夫说。他身体前倾,但仍然很放松。

“所以那个是一百二十千字节(kilobytes),”桑杰说,“然后大概花了八秒钟。”

“是一百二十万次堆栈调用(stack calls),”杰夫说,“不是千字节。”

“哦,是的,抱歉,文本大小是千字节——大约,”桑杰说。

“哦,是的,抱歉,”杰夫说。

“我不太确定我们应该为单元大小选择什么阈值,”桑杰说。“半兆(Half a meg)?”

“似乎不错,”杰夫说。桑杰开始打字,杰夫的注意力被吸引到屏幕上。“所以你的意思是,如果它大于那个阈值,我们就只采样……”他没有说完;桑杰用代码回答了他。

当桑杰开车时,他把手放在方向盘的十点和两点钟位置,专注地注视前方。他在键盘前也是如此。双脚分开与肩同宽,看起来像是在矫正姿势。他细长的手指轻轻地在键盘上移动。一些年轻的程序员开始陆续进来。

很快他们达成了一个小小的里程碑,桑杰输入了一个命令来测试他们的进展。他似乎有些疲惫,在程序运行时查看了一下电子邮件。测试完成了。他没有注意到。

“嘿,”杰夫说。他打了个响指,指向屏幕。虽然在交谈中他喜欢讲冷笑话和双关语,但当他和桑杰一起坐在电脑前时,他会变得固执己见、直言不讳甚至带有指责意味。桑杰对此泰然处之。当他觉得杰夫进展太快时,他会把手从键盘上抬起,张开手指,仿佛在说:“停。”(总的来说,杰夫是加速器,桑杰是刹车。)这是他们最接近争吵的时候:在一起二十年里,他们不记得曾提高过嗓门。

桑杰滚动屏幕,将一段新的代码显示出来。“比如,所有这些都可以做成一个例程(routine),不是吗?”杰夫说。

“嗯,”桑杰表示同意。

杰夫掰了掰指关节。“看起来可行。我们应该这样做吗?”

桑杰有些犹豫。“不,我——”

“所以我们要忽略一个问题?”杰夫愤愤不平地说。

“不,我的意思是,我们只是想了解一下正在发生的事情类型。所以我们可以做些笔记,对吧?”

“好的,”杰夫高兴地说,他的情绪瞬间转变。他们一起口述了一条笔记。

午餐时间临近了。他们工作了两个小时,中间休息了十分钟,大部分时间都在交谈。(一个水平稍逊的程序员看着他们,最印象深刻的恐怕是他们从未停顿或卡壳。)让另一位程序员审查你的代码是标准的工程实践,但杰夫和桑杰跳过了这一步,在他们的日志中草草写下“lgtm”(looks good to me,我看挺好)。从某种意义上说,他们一直专注于细节。然而,他们的代码是在谷歌的规模上执行的。他们关注的千比特和微秒,在世界各地的数据中心被放大高达十亿倍——那些嘈杂、炎热、仓库大小的建筑,里面无尽的处理器机架由大桶水冷却。在这样的日子里,据说杰夫回家会告诉他的女儿们:“今天桑杰和我把谷歌搜索加快了百分之十。”

杰夫和桑杰在2003年的四个月里,通过一个名为MapReduce的软件,为谷歌带来了可以说是其最大的一次单一升级。这个想法是在他们第三次重写谷歌的爬虫和索引器时产生的。他们意识到,每一次重写,他们都解决了一个重要的问题:在大量地理上分散且各自不可靠的计算机中协调工作。将他们的解决方案通用化意味着他们可以避免一次又一次地重新面对这个问题。但这也将创造一个工具,让谷歌的任何程序员都可以使用它来操作其数据中心的机器,就好像它们是一台行星大小的单一计算机一样。

MapReduce,由杰夫和桑杰在一个俯瞰鸭子池塘的角落办公室里编写,为一个可能极其复杂的过程带来了秩序。在MapReduce之前,每个程序员都必须自己弄清楚如何划分和分发数据、分配工作以及处理硬件故障。MapReduce为程序员提供了一种结构化的方式来思考这些问题。就像厨师保持“mise en place”(法餐术语,指备料就绪)一样——在组合之前准备好所有配料——MapReduce要求程序员将他们的任务分为两个阶段。首先,程序员告诉每台机器如何执行任务的“map”(映射)阶段(例如,计算一个词在网页上出现的次数);接下来,她编写指令来“reduce”(规约)所有机器的结果(例如,将它们加起来)。MapReduce处理了分发的细节——并通过这样做,隐藏了这些细节。

第二年,杰夫和桑杰用MapReduce任务重写了谷歌的爬虫和索引系统。很快,当其他工程师意识到它的强大之处时,他们开始使用MapReduce来处理视频和渲染谷歌地图上的瓦片图块。MapReduce非常简单,以至于新的任务不断涌现。谷歌有所谓的“日使用曲线”——白天的流量比晚上多——而MapReduce任务开始利用这些闲置容量。做梦的大脑处理白天的经历。现在谷歌则处理它的数据。

早期就有迹象表明,谷歌是一家伪装成搜索公司的人工智能公司。2001年,与杰夫和桑杰共用一个办公室的诺姆·沙泽尔(Noam Shazeer)对谷歌从另一家公司授权使用的拼写检查器感到沮丧:它不断犯下令人尴尬的错误,比如告诉输入“TurboTax”的用户他们可能想输入的是“turbot ax”(大比目鱼斧头)。(turbot是一种生活在北大西洋的比目鱼。)拼写检查器的效果取决于其词典的好坏,沙泽尔意识到,通过网络,谷歌可以接触到有史以来最大的词典。他编写了一个程序,利用网络文本的统计特性来确定哪些词可能是拼写错误。该软件学会了“pritany spears”和“brinsley spears”都意指“Britney Spears”(布兰妮·斯皮尔斯)。当沙泽尔在谷歌每周的T.G.I.F.(Thank God It's Friday)聚会上演示该程序时,员工们试图愚弄它,但大多失败了。沙泽尔与杰夫以及一位名叫乔治·哈里克(Georges Harik)的工程师合作,将类似的技术应用于将广告与网页关联起来。广告定位变成了一条金钱之河,公司将其重新投入到计算基础设施中。这是一个反馈循环的开始——庞大的规模将成为谷歌智能的来源;智能成为其财富的来源;财富又成为其增长的来源——这将使公司变得异常强大且令人不安地占据主导地位。

随着有进取心的程序员使用MapReduce从谷歌的数据中获取洞见,转录用户的语音邮件、回答他们的问题、自动完成他们的查询以及在一百多种语言之间进行翻译成为可能。这些系统是使用相对简单的机器学习算法开发的。尽管如此,“非常简单的技术,当你有大量数据时,效果非常好,”杰夫说。随着“数据,数据,数据”——通过BigTable、MapReduce及其后继者存储和处理——成为公司的首要指令,谷歌遍布全球的基础设施变得更加无缝和灵活。分布式计算的概念由来已久;像“云计算”和“大数据”这样的概念在谷歌崛起之前就已存在。但是,通过让普通程序员在智力上能够轻松地编写分布式程序,杰夫和桑杰让谷歌对此类技术的掌握达到了一个新的水平。用户可能已经感觉到有些事情发生了变化:谷歌的云正在变得更智能。

2004年,因为杰夫和桑杰认为这对天文学家、遗传学家和其他拥有大量数据需要处理的科学家会有用,他们撰写并公开发表了一篇论文,《MapReduce:大型集群上的简化数据处理》(MapReduce: Simplified Data Processing on Large Clusters)。MapReduce论文的到来如同天降神兵(deus ex machina)。廉价的硬件以及网络服务和连接设备的增长导致了数据洪流,但很少有公司拥有处理这些信息的软件。两位一直努力扩展一个名为Nutch的小型搜索引擎的工程师——迈克·卡法雷拉(Mike Cafarella)和道格·卡廷(Doug Cutting)——对MapReduce的重要性深信不疑,以至于他们决定从头开始构建该系统的一个免费克隆版本。他们最终将他们的项目命名为Hadoop,以卡廷儿子喜爱的一个毛绒大象玩具命名。随着Hadoop的成熟,它被《财富》50强中一半的公司采用。它成为了“大数据”的代名词。Facebook使用通常被称为“Hadoop MapReduce”的技术来存储和处理用户元数据——关于点击了什么、点赞了什么以及观看了哪些广告的信息。一度,它拥有世界上最大的Hadoop集群。Hadoop MapReduce帮助驱动了LinkedIn和Netflix。美国国家安全局(NSA)前技术总监兰迪·加勒特(Randy Garrett)记得向该机构局长基思·亚历山大将军(General Keith Alexander)演示这项技术。Hadoop执行一项分析任务的速度比之前的系统快了一万八千倍。它成为了一种新的情报收集方法的基础,一些观察家称之为“全部收集”(collect it all)。

杰夫天性不安:一旦他能看到问题的解决方案轮廓,问题对他来说就变得不那么有趣了。2011年,当世界拥抱云计算时,他开始与斯坦福大学的计算机科学教授吴恩达(Andrew Ng)合作,吴恩达当时在谷歌领导一个秘密项目,进行神经网络——由虚拟“神经元”组成的软件程序——的研究。杰夫在本科时代就接触过神经网络;那时,它们还无法解决现实世界的问题。吴恩达告诉杰夫,情况正在改变。在斯坦福大学,当神经网络获得大量数据时,研究人员取得了一些令人兴奋的结果。吴恩达认为,凭借谷歌的规模,神经网络不仅可以变得有用,而且可以变得强大。

神经网络与传统的计算机程序有着深刻的不同。它们的行为不是由程序员以通常的方式指定的;相反,它是通过输入和反馈来“学习”的。杰夫对神经网络的知识自本科以来没有太大进展,海蒂看着他们的浴室堆满了教科书。杰夫开始每周大约花一天时间在这个名为“谷歌大脑”(Google Brain)的项目上。谷歌内部许多人对这项技术表示怀疑。“真是浪费人才,”他当时的经理艾伦·尤斯塔斯回忆起当时的想法。桑杰也无法理解杰夫的举动。“你是做基础设施的,”他想。“你去那边做什么?”

在接下来的七年里,谷歌大脑团队开发的神经网络在机器翻译、语音和图像识别方面击败了当时最先进的技术。最终,它们取代了谷歌用于搜索结果排序和广告定位的最重要算法,谷歌大脑成为公司增长最快的团队之一。2001年加入的工程师崔绮雯(Claire Cui)表示,杰夫的参与标志着谷歌人工智能的一个转折点:“有人相信它,也有人不相信它。杰夫证明了它可以行得通。”

事实证明,人工智能依赖于规模,而系统工程师杰夫恰好提供了这一点。作为这项努力的一部分,他领导开发了一个名为TensorFlow的程序——试图创造出类似人工智能领域的MapReduce的东西。TensorFlow简化了将神经网络分布在一组计算机上的任务,将它们变成一个巨大的大脑。2015年,当TensorFlow向公众发布时,它成为了人工智能领域的通用语言(lingua franca)。最近,谷歌首席执行官桑达尔·皮查伊(Sundar Pichai)宣布谷歌是一家“人工智能优先”(A.I. first)的公司,并任命杰夫为其人工智能计划的负责人。

杰夫现在每周花四天时间管理谷歌大脑。他指导着三千人的工作。他出差发表演讲,每周召开一次会议研究一种新的计算机芯片(Tensor Processing Unit,张量处理单元,专为神经网络设计),并正在帮助开发AutoML,一个使用神经网络来设计其他神经网络的系统。他每周只有一天时间和桑杰一起编程。

工程上的壮举往往会抹去自身的痕迹。我们记得十八世纪伟大的探险家——詹姆斯·库克(James Cook)、乔治·温哥华(George Vancouver)——却不记得约翰·哈里森(John Harrison),那位来自约克郡的木匠,经过数十年的努力,制造出足够可靠的时钟来在海上测定经度。最近,杰夫和桑杰在他们常去的帕洛阿尔托墨西哥餐厅Palo Alto Sol享用玛格丽塔和辣酱玉米馅饼(enchiladas)时,杰夫掏出了手机。“Gmail最早是什么时候推出的?”他问道。手机回答说:“2004年4月1日。”在社交场合很敏感的桑杰似乎不太喜欢这种餐桌上的分心,但杰夫却欣喜若狂。谷歌现在可以说话、倾听并回答问题,使用一系列无缝集成且很大程度上不可见的程序堆栈,从他的手机一直延伸到世界各地的数据中心。

如今,他们的角色已经分化。在谷歌,桑杰被称为“个人贡献者”(individual contributor)——一个独自工作且不管理任何人的程序员。对此,他心存感激。“我可不想做杰夫的工作,”他说。他目前正在开发一个软件,让工程师更容易组合和控制那些一旦用户在谷歌搜索框中输入文本就开始运行的几十个程序——用于获取新闻、照片、价格等。每周一次,他与一群“领域技术负责人”(Area Tech Leads)——谷歌的工程绝地委员会——会面,做出影响整个公司的技术决策。如果谷歌是一座房子,杰夫正在建造一个附加部分。桑杰则在加固结构,加固横梁,拧紧螺栓。

与此同时,在他们周一的编程时段,他们开始了一项新工作。这是一个人工智能项目:杰夫说,试图训练一个“巨大”的机器学习模型来完成数千甚至数百万个不同的任务。杰夫思考这个想法已经很多年了;最近,他认定这是可能的。他和桑杰计划构建一个原型,以便团队可以围绕它发展壮大。在软件世界,最好的领导方式就是用代码来领导。

“我想他们想念彼此,”杰夫的妻子海蒂说。正是在他们的合作放缓时,他们开始有了周五的晚餐聚会。

三月的一个周日,杰夫和桑杰在库比蒂诺(Cupertino)外相约远足。天气晴朗清爽,但在阳光下很热。杰夫开着一辆蓝色的特斯拉Roadster到达了步道起点,车上贴着一张伯尼·桑德斯2016年的保险杠贴纸。桑杰紧随其后,开着他自己的红色特斯拉Model S。桑杰整个上午都在阅读。杰夫则踢了足球。(他小腿上的一个设备告诉他,他跑了7.1英里。)在构建三月索引二十年后,杰夫看起来像一个退役的耐力运动员,皮肤被太阳晒得有些粗糙。桑杰则似乎几乎没有变老。

小径是一个六英里的环路,穿过茂密的森林向上攀登。杰夫带路。在树林里,他们回忆起谷歌发展得多么迅速。桑杰回忆起公司第一次快速增长期间,一个水管工在男厕所的一个隔间里安装了两个马桶。“我记得杰夫的评论,”他说。“‘三个臭皮匠顶个诸葛亮!’”(原文是“Two heads are better than one!”,直译为“两个头比一个好”)他笑了。

他们走下树林,进入干燥、开阔的地带。一只土耳其秃鹫在头顶飞过。

“这里的山比我想象的要陡峭,”杰夫说。

“我以为有人说这是一条相当平坦的徒步路线,”桑杰说。

“我想这就解释了为什么那边没有自行车道,”杰夫说。

他们重新爬回树林。在一个之字形弯道上,杰夫瞥见了树木之外的景象。“我们会在某个时候看到一个很好的观景点,”他说。

小径通向一个山顶,高而宽阔,没有树木,视野开阔。地平线上有些薄雾。尽管如此,他们还是能看到南边的圣克鲁斯山脉和东边的米申峰(Mission Peak)。“桑杰,那是你的办公室!”杰夫说。他们站在一起,眺望着整个山谷。♦

发表于2018年12月10日印刷版,标题为“Binary Stars”(双子星)。 James Somers,作家兼程序员,于2018年首次为《纽约客》撰稿。