Jeff 的本性是不安现状的:一旦他看到了问题解决方案的轮廓,这个问题就不再那么有趣了。2011 年,在全世界都拥抱云的时候,他开始与来自斯坦福大学的计算机科学教授吴恩达合作;吴恩达教授当时在谷歌领导着一个研究神经网络(由虚拟「神经元」构成的计算机程序)的秘密项目。Jeff 曾在本科阶段接触过神经网络;那时候,它们还不能解决真实世界的问题。吴恩达告诉 Jeff 情况正在发生改变。在斯坦福,当研究者为神经网络提供大量数据时,他们取得了一些激动人心的结果。吴恩达认为,有谷歌这样的规模,神经网络不仅仅会变得有用,而且会变得非常强大。
Sanjay 滚动屏幕,展示了一段新的代码,「这些代码都可以写成一个程序,不是吗?」Jeff 说道。
接近午餐时间。他们工作了两个小时,休息了十分钟,大部分时间都在说话。(如果有较年轻的程序员看着他们会留下深刻的印象,因为他们从未停止或被卡住。)让你的代码由另一个程序员 review 是标准的工程实践,但 Jeff 和 Sanjay 跳过了这一步,只在他们的日志中写下,一个敷衍的「lgtm」以及「我觉得还不错。」从某种意义上来说,他们的工作充满细枝末节。但是,他们的代码是以 Google 的规模执行的。他们担心的千比特数和微秒数在世界各地的数据中心会急剧增加。这些喧闹、闷热、仓库大小的建筑物中的无数处理器由大量水冷却。在这样的日子里,Jeff 回家告诉他的女儿们,「Sanjay 和我今天把谷歌的搜索速度提高了百分之十。」
2000 年 3 月的一天,谷歌六名最优秀的工程师聚集在一个临时「作战室」里。当时的谷歌正处于前所未有的紧急状况中:1999 年 10 月,谷歌的核心系统(抓取网页然后构建「索引」)停止运转。尽管用户当时仍可以在 google.com 中输入查询,但搜索结果已经是五个月前的了。工程师意识到的困难更多。当时,谷歌联合创始人 Larry Page 和 Sergey Brin 商议与雅虎进行合作,为雅虎提供搜索服务,他们承诺提供十倍于目前索引结果的索引,以跟上万维网的增长(2000 年万维网的规模是前一年的 2 倍)。如果失败,google.com 仍然是时间胶囊,凝固在过去的时间中,与雅虎的合作可能失败,谷歌有可能烧完现有资金,然后死亡。
旅程全长 6 英里,途中穿过了茂密的树林。Jeff 在前面领路。他们在树林里追忆谷歌的发展之快。Sanjay 想起在谷歌的第一个快速发展时期,一名管道工一次性为男厕所安装了两个厕位。「我记得当时 Jeff 评论道,」他说,「三个臭皮匠赛过诸葛亮!(Two heads are better than one!)」说完他笑了起来。
在楼梯旁的一间会议室里,工程师将门板横在木板凳上,在上面放置计算机。27 岁的 Craig Silverstein 坐在墙边。他是谷歌第一名员工:在谷歌办公室还在 Brin 起居室时他就加入了这家公司,并且凭一己之力重写了很多代码。四天四夜之后,他和一名罗马尼亚系统工程师 Bogdan Cocosel 仍然一筹莫展。「我们所做的所有分析都没有用,一切都崩溃了,而我们却找不到原因。」Silverstein 说道。
随着富有进取精神的程序员使用 MapReduce 来发掘谷歌的数据中的洞察,转录用户的语音邮件、回答他们的问题、自动完成他们的查询以及翻译上百种语言也随之变得可能。这样的系统都是用相对不那么复杂的机器学习算法开发的。不过 Jeff 说:「都是非常简单的技术,当你有大量数据时,效果就会非常好。」随着「数据、数据、数据」变成谷歌的最高指导原则(可使用 BigTable、MapReduce 及其后继技术存储和处理这些数据),该公司那全球扩张的基础设施也变得更加无缝和灵活。分布式计算是一个古老的思想,「云计算」和「大数据」等概念在谷歌崛起前就已出现。但是,Jeff 和 Sanjay 使这些技术可被智能地管理,让普通程序员也能编写分布式程序,进而让谷歌在这些技术方面又占据了进一步的主导地位。用户可能已经注意到某些东西已然改变:谷歌的云正越来越聪明。
谷歌园区坐落在距离山景城中心几分钟车程的高速公路旁,园区里的建筑矮矮的,没有什么吸引力。去年夏天的一个周一,在一起编程整个上午之后,Jeff 和 Sanjay 去了一家名为 Big Table 的餐厅吃午饭,这家餐厅是以他们俩 2005 年帮助开发的一个系统命名的,该系统将无数计算机视为一个数据库。Sanjay 又高又瘦,穿着一件 maroon Henley 的旧 T 恤、灰色裤子,戴着一副小小的线框眼镜。他发现餐厅外面有张空桌子,快步走过去占了,打开伞,在阴凉处坐下,还替 Jeff 把另一把椅子搬到了太阳下。几分钟后,Jeff 到了,肩膀宽宽,穿着短袖衬衫和时髦的运动鞋。
接下来的七年时间里,谷歌大脑团队开发的神经网络在机器翻译以及语音和图像识别方面超越了之前最佳的方法。最终,它们替代了谷歌最重要的用于搜索结果排序和定向广告的算法,谷歌大脑也变成该公司增长速度最快的团队之一。2001 年加入谷歌的工程师 Claire Cui 说 Jeff 的参与标志着谷歌内部 AI 发展的一个转折点:「有人相信它,也有人不相信。Jeff 证明了它是有效的。」
大脑的两个部分
「所以这一块代码有 120 KB,需要 8 秒的运行时间。」
在 MIT 研究生期间,Sanjay 结交了一群关系密切的朋友。那时候 Sanjay 几乎不曾约过会,现在也很少。他说过不是不想组建家庭,只是还没到时候。他的朋友和父母已经学会接受这样的他。也许是因为他安静的性格,他在谷歌是充满了神秘色彩的存在。他以安静而深刻著称:一个深思熟虑且不同寻常的人。在他的桌子上有一堆 Mead composition notebook,这些笔记本有近二十年历史,里面装满了整洁的清单和图表。他用钢笔写作,字迹潦草。他很少引用旧笔记本,写作是为了思考。在 MIT,他的研究生导师是 Barbara Liskov,这是一位有影响力的计算机科学家,研究复杂代码库的管理。在她看来,最好的代码就像是一篇好文章。它需要一个精心实现的结构,每个词都应该起作用。以这种方式编程需要与读者共情。它还意味着不仅要将代码视为达到目的的手段,也要把它作为工艺品。「我认为 Sanjay 最擅长的是设计系统,」Craig Silverstein 说。「如果你只是看着他写的代码文件,会发现那就像一个比例匀称的雕塑般美丽。」
「OK。」Jeff 开心地说,他的心情变化之快就像六月的天气。他们一起记了笔记。
让我们看看这篇历时一年半才写成的「黑历史」都说了些什么。
第二年,Jeff 和 Sanjay 依照 MapReduce 任务重写了谷歌的爬虫和索引系统。很快,当其他工程师意识到了这种方法的强大时,他们开始使用 MapReduce 来处理视频以及在谷歌地图上渲染图块。MapReduce 是如此的简单,新任务也在不断昭示着这一点。谷歌有所谓的「昼夜使用曲线」(即白天的流量比夜晚更大),MapReduce 任务开始占用谷歌服务器的闲置时间。生物大脑会在梦中处理白天的经历。现在谷歌用同样的方式处理自己的数据。
文章发出之后,Jeff Dean 表示:「我认为这篇文章精准地捕捉了我们的工作风格。」
1966 年,System Development Corporation 的研究人员发现,最出色的程序员效率是最差的程序员效率的十倍以上。自此,所谓的「十倍效率程序员」开始引发争议。这个概念推崇个体,但软件项目通常是庞大的集体项目,在编程中很少有人能独立取得成就。即便如此——甚至有些讽刺的是,很多程序员都相信「十倍效率程序员」的存在,因为他们看到了 Jeff 和 Sanjay 的合作成果。
Jeff 和 Sanjay 在一个高级办公室里写下了 MapReduce,这个办公室俯瞰着一个鸭子池塘,这一架构使得令人费解的进程变得井井有条。在 MapReduce 之前,每个程序员都必须弄清楚如何分割和分配数据、分配工作以及自己解决硬件故障。而 MapReduce 为编程人员提供了一种思考这些问题的结构化方法。就像一位厨师在掌勺之前做餐前准备,MapReduce 要求程序员将他们的任务分成两个阶段。首先,他们需要告诉每台机器如何进行任务的「map」阶段(比如,计算一个单词出现在网页上的次数); 接下来,他们需要编写「reduce」所有机器计算结果的指令(例如,把它们累加)。MapReduce 处理分配细节。
「嗯。」Sanjay 表示同意。
我们会说「搜索整个网络」,但实际上搜索引擎并不会这么做:我们的搜索引擎会遍历 Web 的索引——一张地图。当谷歌在 1996 年仍被称为 BackRub 时,它的地图还很小,足以被装进 Page 在宿舍安装的电脑里。但到了 2000 年 3 月,已经没有足够大的超级计算机可以处理它了。谷歌要跟上万维网增长速度的唯一办法就是购买消费级电脑并将它们组成集群。因为电脑的一半成本都花在了对谷歌无用的软盘驱动器、金属机箱上,因此谷歌购买电脑主板、硬盘,然后自己组装电脑。谷歌有五百个这样的计算机,堆起来有六英尺高,它们被放置在加州圣塔克拉拉的谷歌数据中心。由于硬件故障,仅有二百台计算机能够正常运转。这些看似随机发生的故障继续摧残着整个系统。为了生存,谷歌不得不将计算机连接成为一个无缝、坚韧的整体。

「不,我是说,我们正在思考眼前看到的是什么类型的问题。我们可以记个笔记,不是吗?」
在分享工作生活多年以后,两个人会形成一种私密的语言,就像双胞胎一样。他们会模仿彼此的穿着和习惯,幽默感会在潜移默化中传递。他们的贡献也很难分出高下。但这种强度的伙伴关系在软件开发中非比寻常。虽然有些开发者嘴上会说「合作编程」——两个程序员共用一台电脑,一人「驾驶」一人「导航」,但他们通常认为这种合作是累赘。相比之下,Jeff 和 Sanjay 有时候看起来像是一个大脑的两个部分。他们很多著名论文是二人合著的。他们的经理之一 Bill Coughran 回忆:「他们俩搭档时效率很高也很多产,所以我们经常得围绕他们俩组队。」
在 2003 年的四个月里,Jeff 和 Sanjay 给谷歌进行了最大的一次升级。他们用一款名为 MapReduce 的软件做到了这一点。在第三次重写谷歌的抓取工具和索引器时,他们有了这个想法。他们解决了重要的问题:让分布在各地、彼此独立的大量计算机协同工作。推广他们的解决方案意味着可以避免一次又一次地重新解决这个问题。但它也会创建一个工具,谷歌的任何程序员都可以使用它来运行其数据中心的机器,就好像它们是一台行星大小的计算机一样。
AI 和程序员
在早些时候就已经出现了一些迹象,暗示谷歌是一家假装成搜索公司的 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 将类似的技术应用到了网络页面的关联广告上。定向广告成了一条淌着钱的河,谷歌将这条河导向了其计算基础设施。这是反馈循环的开端——规模造就了谷歌的智能,智能带来了谷歌的财富,财富推动谷歌壮大规模;这将使得该公司占据极其强势且令人不安的主导地位。
「是有家冰淇淋店!」Sanjay 高兴地说道。
「我们加入谷歌之前就是搭档了。」Jeff 说。
Jeff 的妻子 Heidi 说:「我认为他们想念彼此。」在他们合作放缓的时候,他们开始一起在周五吃晚餐。
同时,在 Jeff 和 Sanjay 周一的共同编程时间,他们启动了一个新东西。这是一个 AI 项目。Jeff 说这是一个尝试,要训练一个「巨型」机器学习模型来做数千或数百万个不同的任务。Jeff 多年来一直在思考这一思路,最近他认为这是可能的。他和 Sanjay 计划构建一个原型,然后让一个团队围绕其开发。在软件的世界里,最好的领导方法就是用代码。
Sanjay 17 岁之前没有碰过电脑,直到他去了康奈尔大学。1966 年,他出生在印第安纳州的西拉法叶,但在印度北部工业城市科塔长大。他的父亲 Mahipal 是一名植物学教授。Sanjay 的家人都很爱读书:他的叔叔 Ashok Mehta 买过一本 Frederick Forsyth 写的 The Day of the Jackal,这本书装帧非常破旧,他看着 Ghemawat 家的孩子们一起阅读这本书,并在读完一页时为他们翻到下一页。Sanjay 的哥哥 Pankaj 成为了哈佛商学院获得终身教职的最年轻教师(他现在是纽约大学斯特恩商学院的教授)。Pankaj 和 Sanjay 上同一所学校,被誉为「全才」(Renaissance man)。「我有点活在我哥哥的阴影下。」Sanjay 说道。因此,他一直都很谦逊。2016 年,当他入选美国人文与科学院(American Academy of Arts and Sciences)时,他没有告诉他的父母,他们还是从邻居那儿听说的。
「我不清楚我们应该采用多大的单元 size 阈值,0.5MB?」
「听起来不错,」Jeff 说道。Sanjay 开始写代码,Jeff 盯着屏幕。「所以你是说,如果比这大,那我们就……」他只说了一半,Sanjay 用代码来回答他。
Jeff 和 Sanjay
「某些人的代码非常松散,满屏幕的代码只携带了很少的信息,你需要来来回回的反复阅读才能读懂。」Silverstein 说。另一些人写的代码则太密集了。「Sanjay 的代码风格恰好处于两者之间,读他的代码能很容易理解,同时也能获取足够的信息。」Silverstein 继续说,「无论我想在 Sanjay 的代码中添加什么函数,都似乎是水到渠成的事情。我认为这很棒,但又不知道他是怎么做到的。」

