Skip to main content

2 位谷歌顶级程序员的激荡人生,曾共用 1 台电脑写代码

有很多人认为,Jeff Dean 的存在是谷歌如此强大的原因,谷歌员工都把谷歌搜索惊人的速度归功于他,他也是神经网络框架 TensorFlow 的主导设计者之一。在被谷歌面试时,这位大神被问及如果 P=NP 意味着什么。Jeff 答道:「P=0 或 N=1」。然后,在所有面试官还没笑完之前,Jeff 瞄了一眼谷歌的公共证书,然后在白板上写上了对应的私钥(以上为玩笑)。

最近《纽约客》终于发布了他们描写 Jeff Dean、以及 Jeff 的「好基友」Sanjay Ghemawat 的特稿。记者不仅和这两位程序员聊天,也在一旁观察了他们是如何工作,甚至吃晚餐的。纽约客指出,Jeff 和 Sanjay 共用同一台电脑写代码。

文章发出之后,Jeff Dean 表示:「我认为这篇文章精准地捕捉了我们的工作风格。」


让我们看看这篇历时一年半才写成的「黑历史」都说了些什么。

0 和 1 之下

2000 年 3 月的一天,谷歌六名最优秀的工程师聚集在一个临时「作战室」里。当时的谷歌正处于前所未有的紧急状况中:1999 年 10 月,谷歌的核心系统(抓取网页然后构建「索引」)停止运转。尽管用户当时仍可以在 google.com 中输入查询,但搜索结果已经是五个月前的了。工程师意识到的困难更多。当时,谷歌联合创始人 Larry Page 和 Sergey Brin 商议与雅虎进行合作,为雅虎提供搜索服务,他们承诺提供十倍于目前索引结果的索引,以跟上万维网的增长(2000 年万维网的规模是前一年的 2 倍)。如果失败,google.com 仍然是时间胶囊,凝固在过去的时间中,与雅虎的合作可能失败,谷歌有可能烧完现有资金,然后死亡。

在楼梯旁的一间会议室里,工程师将门板横在木板凳上,在上面放置计算机。27 岁的 Craig Silverstein 坐在墙边。他是谷歌第一名员工:在谷歌办公室还在 Brin 起居室时他就加入了这家公司,并且凭一己之力重写了很多代码。四天四夜之后,他和一名罗马尼亚系统工程师 Bogdan Cocosel 仍然一筹莫展。「我们所做的所有分析都没有用,一切都崩溃了,而我们却找不到原因。」Silverstein 说道。

Silverstein 几乎没有注意到 Sanjay Ghemawat,这位安静的 33 岁 MIT 毕业生眉毛浓密,一头黑发,但鬓角处已经斑白。Sanjay 几个月前加入这家公司(12 月)。他追随 Jeff Dean 加入谷歌,他们之前同在 Digital Equipment Corporation。Jeff Dean 比 Sanjay 早十个月离开 D.E.C.。他们关系很好,喜欢一起写代码。在作战室里,Jeff 把椅子挪到 Sanjay 的桌子处,Sanjay 使用键盘工作,Jeff 就在一旁纠正错误,就像制片人通过耳机对新闻主播耳语一样。

Jeff 和 Sanjay 开始专心检查停顿的 index。他们发现一些关键词丢失了,搜索「mailbox」时无搜索结果,有搜索结果时也是乱序的。这些天来,他们一直在查找代码中的错误,检查代码的逻辑。然而,每一部分都检查过之后,依然没有发现 bug。

程序员有时候将软件概念化为多层结构,包括顶层的用户界面和比较基础的层。探索该结构的底部(即软硬件的交接处)意味着不再按照代码的逻辑顺序,而是观察代码依赖的电子和硅的宇宙。在作战室的第五天,Jeff 和 Sanjay 开始怀疑问题可能不在于逻辑,而存在于物理层面。他们将混乱的索引文件转换成原始表示格式:二进制代码。他们想了解机器看到了什么。

多个 1 和 0 的列出现在 Sanjay 的显示器中,每一行表示一个索引词。Sanjay 指出:一个本应该是 0 的数字却显示为 1。Jeff 和 Sanjay 将所有错误分类的词放在一起,然后观察到一种模式:每个词都出现了同样的故障。机器的存储芯片被破坏了。

Sanjay 看着 Jeff。几个月以来,谷歌正在经历越来越多的硬件故障。当时的问题是,谷歌正在成长,所以它的计算基础设施也在扩张。计算机硬件很少出错,直到问题积累爆发——然后就会一直无法运转。线路磨损、硬盘坏道、主板过热。很多机器从一开始就没有工作过,有些则速度慢的让人无法接受。各种奇特的环境因素也必须考虑在内——当超新星爆发时,爆炸会产生向所有方向散发的高能粒子。科学家认为有很小的几率,一种被称为宇宙射线的粒子可以击中计算机芯片,让 0 和 1 翻转。所以,世界上最鲁棒的计算机系统,比如 NASA、金融公司的系统,会使用可以接受单比特翻转的特殊硬件。但此时的谷歌仍然更像一家初创公司,使用的是缺乏这种功能的廉价计算机。这家公司已经到了发展的拐点,它的计算集群变得无比巨大,大到无法忽视这种硬件故障。

Jeff 和 Sanjay 一起写代码来补偿硬件的问题。很快新 index 就完成了,作战室宣告解散。Silverstein 曾陷入困境。他是一个很好的调试员,但解决的关键是找到问题的根源,Jeff 和 Sanjay 走得更深。

在 3 月份 index 崩溃之前,谷歌的系统根植于其创始人在斯坦福大学攻读博士期间所写的代码。Larry Page 和 Sergey Brin 并不是专业的软件工程师,他们是在学界进行搜索技术实验的人。当他们的网络爬虫崩溃时,并不会出现诊断信息——只会出现诸如「Whoa、horsey!」之类的字眼。谷歌的早期员工常称之为 BigFiles,其名称来源于 Page 和 Brin 的一个软件 BugFiles。他们最重要的索引代码需要数天时间才能运行完成,如果遇到问题则必须从头开始重新启动。按照硅谷的说法:谷歌不具有「可扩展性」。

我们会说「搜索整个网络」,但实际上搜索引擎并不会这么做:我们的搜索引擎会遍历 Web 的索引——一张地图。当谷歌在 1996 年仍被称为 BackRub 时,它的地图还很小,足以被装进 Page 在宿舍安装的电脑里。但到了 2000 年 3 月,已经没有足够大的超级计算机可以处理它了。谷歌要跟上万维网增长速度的唯一办法就是购买消费级电脑并将它们组成集群。因为电脑的一半成本都花在了对谷歌无用的软盘驱动器、金属机箱上,因此谷歌购买电脑主板、硬盘,然后自己组装电脑。谷歌有五百个这样的计算机,堆起来有六英尺高,它们被放置在加州圣塔克拉拉的谷歌数据中心。由于硬件故障,仅有二百台计算机能够正常运转。这些看似随机发生的故障继续摧残着整个系统。为了生存,谷歌不得不将计算机连接成为一个无缝、坚韧的整体。

Jeff 和 Sanjay 共同主导这一举措。2000 年 11 月,曾在苹果公司研究苹果电脑的 Wayne Rosing 加入谷歌,运营百人工程团队。「他们是领导。」他说。工程师每周工作九十个小时,如果不把代码输入整体系统,则单个硬盘肯定会出现故障。于是工程师为网页抓取过程添加了检查点。通过开发新的编码和压缩机制,他们有效地使系统容量翻倍。他们是不懈的优化者。汽车拐弯时,外轮覆盖的地面面积更大;类似地,运转着的硬盘的外边缘(outer edge)比内边缘更快,但内部处于半空状态。Jeff 和 Sanjay 使用该空间存储常见搜索查询的预处理数据。2001 年 1 月 4 日,他们证明谷歌的 index 可以使用快速随机存取存储器(RAM)来存储,而不用相对缓慢的硬盘,这一发现重塑了谷歌的经济状况。Page 和 Brin 知道用户会乐于使用一项能够提供即时答案的服务,问题在于速度(即时性)需要算力,而算力需要钱。Jeff 和 Sanjay 完成了这一艰巨任务。

2005 年 Rosing 离开谷歌后,Alan Eustace 成为工程团队的新领导。Eustace 称,「荒谬的是,要想解决大规模问题,你必须先了解最微末的细节。」Jeff 和 Sanjay 对计算机有非常深入的了解。Jeff 曾经写过一份清单《Latency Numbers Every Programmer Should Know》。实际上,这是一份数字清单,几乎没有程序员了解。而这些数字已经嵌在 Jeff 和 Sanjay 的大脑中。他们带头对谷歌的核心软件践行了几次重写,该系统的容量扩展了几个数量级。同时,谷歌的数据中心专家按照软件生成的指令来设置硬盘、电源供给和记忆条。这样即使某个部件坏了,整个系统仍然能够运转。

今天,谷歌的工程师处于一个「存在锁链」中,从 Level 1 开始。最底层一级即 Level 1 是 IT 支持人员,Level 2 是应届大学毕业生,Level 3 通常有硕士文凭。到达 Level 4 需要几年工作经验,或者有博士文凭。大部分工程师停留在 Level 5。Level 6 工程师(top 10%)能力非常强悍,他们可以是一个项目成功的关键。Level 6 工作经验逐渐增长到一定程度会升成 Level 7,而 Level 8 和主要产品或基础架构相关。Level 9 是 Distinguished Engineer。Level 10 是 Google Fellow,该荣耀一旦得到将伴随一生,Google Fellow 通常是其领域内的世界级顶级专家。而 Jeff 和 Sanjay 是 Google Senior Fellow——谷歌唯二的 Level 11。

大脑的两个部分

这两位顶级程序员就像一个大脑的两个半球

谷歌园区坐落在距离山景城中心几分钟车程的高速公路旁,园区里的建筑矮矮的,没有什么吸引力。去年夏天的一个周一,在一起编程整个上午之后,Jeff 和 Sanjay 去了一家名为 Big Table 的餐厅吃午饭,这家餐厅是以他们俩 2005 年帮助开发的一个系统命名的,该系统将无数计算机视为一个数据库。Sanjay 又高又瘦,穿着一件 maroon Henley 的旧 T 恤、灰色裤子,戴着一副小小的线框眼镜。他发现餐厅外面有张空桌子,快步走过去占了,打开伞,在阴凉处坐下,还替 Jeff 把另一把椅子搬到了太阳下。几分钟后,Jeff 到了,肩膀宽宽,穿着短袖衬衫和时髦的运动鞋。

两人就像一对夫妻,各自讲述一点过去的事情,就这么拼凑出了过往的回忆。他们开始回忆早期的项目。

「我们当时还是手打代码,」Sanjay 说道。他的眼镜在阳光下萌生出一丝阴影。「我们会重写代码,然后感觉——『噢,这和上个月写的好像差不多』。」

「或者索引数据的传递略有不同。」Jeff 补充道。

「略有不同……我们就是这样发现问题。」Sanjay 说。

「这是重点。」Jeff 说。

「这是常见模式。」Sanjay 补充完。

Jeff 咬了一口他买的披萨。他长着像水手一样的手指,指节粗大还有点粗糙;相比之下,Sanjay 看起来似乎有点脆弱,他也不知道当初是怎么和 Jeff 成为搭档的。「我也不知道当初是怎么决定在一起合作的。」他说。

「我们加入谷歌之前就是搭档了。」Jeff 说。

「但我记不清为什么要在一台电脑上编程,而不是在两台电脑上干活。」Sanjay 说。

「在 D.E.C. 工作的时候,我经常从我的实验室走两个街区去他的实验室,」Jeff 说道,「路上有家冰淇淋店。」

「是有家冰淇淋店!」Sanjay 高兴地说道。

Sanjay 一直未婚,但他会和 Jeff 一家人去度假,Jeff 的两个女儿喊他 Uncle Sanjay。他们五个人经常在周五一起吃饭。Sanjay 还会和 Jeff 的大女儿 Victoria 一起做烘焙。他自豪地说:「我算是看着她们长大的。」2004 年谷歌首次公开募股以后,他们搬到了仅隔四英里的房子里。Sanjay 住在山景城一个普通的三居室里;而 Jeff 则在帕罗奥多市中心附近设计了自己的房子。他在地下室里装了一张蹦床。在设计房子时,他发现虽然自己喜欢设计空间,但并没有耐心去完成「适合 Sanjay 的部分」:横梁的细节、螺栓以及保证整个设计不至于分崩离析。

「我不知道为什么别人不这么干——合作编程。」Sanjay 说道。

「你要找一个与自己思考方式兼容的人一起合作编程,这样你们两个就可以互补了。」Jeff 说。

在分享工作生活多年以后,两个人会形成一种私密的语言,就像双胞胎一样。他们会模仿彼此的穿着和习惯,幽默感会在潜移默化中传递。他们的贡献也很难分出高下。但这种强度的伙伴关系在软件开发中非比寻常。虽然有些开发者嘴上会说「合作编程」——两个程序员共用一台电脑,一人「驾驶」一人「导航」,但他们通常认为这种合作是累赘。相比之下,Jeff 和 Sanjay 有时候看起来像是一个大脑的两个部分。他们很多著名论文是二人合著的。他们的经理之一 Bill Coughran 回忆:「他们俩搭档时效率很高也很多产,所以我们经常得围绕他们俩组队。」

1966 年,System Development Corporation 的研究人员发现,最出色的程序员效率是最差的程序员效率的十倍以上。自此,所谓的「十倍效率程序员」开始引发争议。这个概念推崇个体,但软件项目通常是庞大的集体项目,在编程中很少有人能独立取得成就。即便如此——甚至有些讽刺的是,很多程序员都相信「十倍效率程序员」的存在,因为他们看到了 Jeff 和 Sanjay 的合作成果。

Jeff 和他的父母经常搬家。13 岁的时候,他在八年级的最后三个月里翘课去西索马里的难民营帮助父母。高中的时候,他开始为流行病学家编写叫做 Epi Info 的数据收集程序;之后,这个程序成了流行病学家野外作业的标配工具,最终,该程序以十几种语言发行了数十万份。

Jeff 读博期间专注于编译器(一种将人写的代码转化成为计算机优化的机器语言指令的软件。)「要说性感,编译器真是无聊透了,」Alan Eustace 说道;但另一方面,编译器却可以帮你「拉近与机器之间的距离。」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)时,他没有告诉他的父母,他们还是从邻居那儿听说的。

在 MIT 研究生期间,Sanjay 结交了一群关系密切的朋友。那时候 Sanjay 几乎不曾约过会,现在也很少。他说过不是不想组建家庭,只是还没到时候。他的朋友和父母已经学会接受这样的他。也许是因为他安静的性格,他在谷歌是充满了神秘色彩的存在。他以安静而深刻著称:一个深思熟虑且不同寻常的人。在他的桌子上有一堆 Mead composition notebook,这些笔记本有近二十年历史,里面装满了整洁的清单和图表。他用钢笔写作,字迹潦草。他很少引用旧笔记本,写作是为了思考。在 MIT,他的研究生导师是 Barbara Liskov,这是一位有影响力的计算机科学家,研究复杂代码库的管理。在她看来,最好的代码就像是一篇好文章。它需要一个精心实现的结构,每个词都应该起作用。以这种方式编程需要与读者共情。它还意味着不仅要将代码视为达到目的的手段,也要把它作为工艺品。「我认为 Sanjay 最擅长的是设计系统,」Craig Silverstein 说。「如果你只是看着他写的代码文件,会发现那就像一个比例匀称的雕塑般美丽。」

在谷歌,Jeff 更为人所知。谷歌有所谓的 Jeff Dean 模因。但是,对于了解他们二者的人来说,Sanjay 是个与 Jeff 同等的人才。「Jeff 非常善于提出疯狂的新想法和原型设计,」他们的长期同事 Wilson Hsieh 说,「Sanjay 是那个能够持续开发到最后的人。」在生活中,Jeff 更外向,Sanjay 更内向。在代码中,情况正好相反。Jeff 的编程令人眼花缭乱(他可以迅速勾勒出令人吃惊的想法),但是,因为它完成得很快,并以发现的形式出现,所以它可能会把读者甩在身后。而 Sanjay 的代码具备社交性。

「某些人的代码非常松散,满屏幕的代码只携带了很少的信息,你需要来来回回的反复阅读才能读懂。」Silverstein 说。另一些人写的代码则太密集了。「Sanjay 的代码风格恰好处于两者之间,读他的代码能很容易理解,同时也能获取足够的信息。」Silverstein 继续说,「无论我想在 Sanjay 的代码中添加什么函数,都似乎是水到渠成的事情。我认为这很棒,但又不知道他是怎么做到的。」

今年春天的一个周一清晨,Jeff 和 Sanjay 站在 40 号大楼(谷歌 AI 部门多数人的家)的简易厨房里。在他们背后,一块白板上写满了矩阵代数的式子,一篇关于无监督对抗网络的论文躺在桌子上。Jeff 穿着一件褪色 T 恤和牛仔裤;Sanjay 穿着毛衣和灰色裤子。透过明亮的窗户可以看到一片高大的松树,还有一片田野。无论 Jeff 在谷歌何处工作,咖啡机都会随之转起来。在小厨房的柜台上,一个三英尺宽的 La Marzocco 咖啡机嗡嗡作响。「我们迟到了。」Sanjay 在咖啡机旁说道。现在是八点三十二分。

在喝完卡布奇诺之后,他们走到电脑前。Jeff 将一把椅子从自己凌乱的桌子前转到 Sanjay 的桌子上,Sanjay 的桌子一尘不染。他把一只脚放在文件柜上,向后靠,Sanjay 在他面前查看屏幕。他打开了四个窗口:左侧是 Web 浏览器和终端,用于运行分析工具;右边是文本编辑器 Emacs 中的两个文档,一个是组合待办事项列表和 notebook,另一个是色彩斑斓的代码。Sanjay 的 Mead 笔记本放在电脑旁边。

「好了,我们在干什么?」Sanjay 问道。

「我想我们正在思考 TensorFlow Lite 的代码 size。」Jeff 说道。

TensorFlow Lite 是一个与机器学习相关的重要软件项目,Jeff 和 Sanjay 担心它会臃肿,他们像图书编辑一样寻找精简代码的方法。为此,他们构建了一个本身需要优化的新工具。

「所以我正在尝试弄清楚它到底有多慢。」Sanjay 说道。

「非常慢。」Jeff 说。他向前倾身,仍然很放松。

「所以这一块代码有 120 KB,需要 8 秒的运行时间。」

「那是 120,000 个堆栈调用,不是 KB。」

「额,我是说有多少 KB 的文本。」

「哦,这样,抱歉。」

「我不清楚我们应该采用多大的单元 size 阈值,0.5MB?」

「听起来不错,」Jeff 说道。Sanjay 开始写代码,Jeff 盯着屏幕。「所以你是说,如果比这大,那我们就……」他只说了一半,Sanjay 用代码来回答他。

Sanjay 开车时把手放在十点钟和两点钟方向,专注地看着前方。他在键盘上也是这样。他的双脚分开与肩同宽,看起来好像在练习坐姿。他的细长手指轻轻地滑过键盘。一些年轻的程序员开始加入进来。

不久,他们达到了一个小的里程碑,Sanjay 键入了一个命令来测试他们的进展。他在运行时检查了一下 e-mail。看起来很疲惫。测试结束了,他没有注意到。

「嘿,」Jeff 打了个响指,指着屏幕。虽然在谈话中他经常讲些冷笑话和双关语,但当他和 Sanjay 一起坐在电脑前时,他会变得自以为是、唐突并提出反对意见。当 Sanjay 认为 Jeff 说的太快时,他会将手从键盘上抬起并伸出手指,好像在说「停」。(一般来说,Jeff 是油门,Sanjay 是刹车。)当他们争论时也是如此。

Sanjay 滚动屏幕,展示了一段新的代码,「这些代码都可以写成一个程序,不是吗?」Jeff 说道。

「嗯。」Sanjay 表示同意。

Jeff 扳了一下他的指关节。「看起来可行,要写吗?」

Sanjay 谨慎地说道,「不,我……」

「所以我们要忽略眼前的问题?」Jeff 生气地说道。

「不,我是说,我们正在思考眼前看到的是什么类型的问题。我们可以记个笔记,不是吗?」

「OK。」Jeff 开心地说,他的心情变化之快就像六月的天气。他们一起记了笔记。

接近午餐时间。他们工作了两个小时,休息了十分钟,大部分时间都在说话。(如果有较年轻的程序员看着他们会留下深刻的印象,因为他们从未停止或被卡住。)让你的代码由另一个程序员 review 是标准的工程实践,但 Jeff 和 Sanjay 跳过了这一步,只在他们的日志中写下,一个敷衍的「lgtm」以及「我觉得还不错。」从某种意义上来说,他们的工作充满细枝末节。但是,他们的代码是以 Google 的规模执行的。他们担心的千比特数和微秒数在世界各地的数据中心会急剧增加。这些喧闹、闷热、仓库大小的建筑物中的无数处理器由大量水冷却。在这样的日子里,Jeff 回家告诉他的女儿们,「Sanjay 和我今天把谷歌的搜索速度提高了百分之十。」

框架、规模和大数据

在 2003 年的四个月里,Jeff 和 Sanjay 给谷歌进行了最大的一次升级。他们用一款名为 MapReduce 的软件做到了这一点。在第三次重写谷歌的抓取工具和索引器时,他们有了这个想法。他们解决了重要的问题:让分布在各地、彼此独立的大量计算机协同工作。推广他们的解决方案意味着可以避免一次又一次地重新解决这个问题。但它也会创建一个工具,谷歌的任何程序员都可以使用它来运行其数据中心的机器,就好像它们是一台行星大小的计算机一样。

Jeff 和 Sanjay 在一个高级办公室里写下了 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: Simplified Data Processing on Large Clusters》,并将其公开。这篇 MapReduce 论文真乃一场及时雨。廉价硬件以及网络服务和互连设备的增长带来了巨量数据,但只有很少的公司拥有处理这些信息的软件。Mike Cafarella 和 Doug Cutting 这两位工程师坚信 MapReduce 的重要性,以至于他们决定从头开始创建一个该系统的免费克隆版本——在此之前,他们一直在艰难地扩展一个小型搜索引擎 Nutch。他们最终将自己的项目命名为 Hadoop,得名于 Cutting 的儿子喜欢的一个毛绒小象玩具。Hadoop 日趋成熟,已经得到了半数「财富 50 强(Fortune 50)」公司的采用。Hadoop 几乎已成为「大数据」的同义词。众所周知,Facebook 使用了 Hadoop MapReduce 来存储和处理用户元数据——关于用户点击、喜欢、广告查看等行为的信息。Facebook 曾有一段时间拥有世界上最大的 Hadoop 集群。Hadoop MapReduce 还帮助驱动了 LinkedIn 和 Netflix。前美国国家安全局(NSA)技术主管 Randy Garrett 记得曾向 NSA 局长 Keith Alexander 上将演示过这项技术。Hadoop 执行分析任务的速度是之前系统的 18000 倍。它成了一种新的情报收集方法的基础,某些观察家称之为「collect it all」。

AI 和程序员

Jeff 的本性是不安现状的:一旦他看到了问题解决方案的轮廓,这个问题就不再那么有趣了。2011 年,在全世界都拥抱云的时候,他开始与来自斯坦福大学的计算机科学教授吴恩达合作;吴恩达教授当时在谷歌领导着一个研究神经网络(由虚拟「神经元」构成的计算机程序)的秘密项目。Jeff 曾在本科阶段接触过神经网络;那时候,它们还不能解决真实世界的问题。吴恩达告诉 Jeff 情况正在发生改变。在斯坦福,当研究者为神经网络提供大量数据时,他们取得了一些激动人心的结果。吴恩达认为,有谷歌这样的规模,神经网络不仅仅会变得有用,而且会变得非常强大。

神经网络与传统的计算机程序截然不同。和通常的做法不同,神经网络的行为不是由程序员指定的,而是使用输入和反馈「学习」到的。Jeff 对神经网络的了解自本科阶段以来一直没什么进展,于是 Heidi 看到他们家的卫生间摆满了教材。Jeff 开始每周投入一天时间到这个被称为「Google Brain(谷歌大脑)」的项目上。谷歌内部有很多人对这项技术持怀疑态度。他当时的经理 Alan Eustace 回忆道:「简直浪费人才。」Sanjay 也不能理解 Jeff 的举动。「你的工作是基础设施,」他认为,「你在那里做些什么?」

接下来的七年时间里,谷歌大脑团队开发的神经网络在机器翻译以及语音和图像识别方面超越了之前最佳的方法。最终,它们替代了谷歌最重要的用于搜索结果排序和定向广告的算法,谷歌大脑也变成该公司增长速度最快的团队之一。2001 年加入谷歌的工程师 Claire Cui 说 Jeff 的参与标志着谷歌内部 AI 发展的一个转折点:「有人相信它,也有人不相信。Jeff 证明了它是有效的。」

事实证明,AI 依赖于规模,而系统工程师 Jeff 提供了规模。他的一项努力是领导了 TensorFlow 项目的开发——目标是为 AI 创造出类似 MapReduce 的东西。TensorFlow 简化了将神经网络分配到多台计算机的任务,从而可将它们变成一个巨大的脑。2015 年,TensorFlow 公开发布,变成了 AI 的通用语言。谷歌 CEO Sundar Pichai 近期还宣布谷歌是一家「AI 优先」公司,并让 Jeff 领导该公司的 AI 计划。

Jeff 现在每周花四天时间管理谷歌大脑。他指导着三千人的工作。他到处旅行发表演讲,每周召开一次有关一款新计算机芯片(张量处理单元/TPU,专为神经网络设计)的例会,并且还会帮助开发 AutoML,这是一个使用神经网络来设计其它神经网络的系统。他每周只有一次能与 Sanjay 一起写代码。

Jeff 和 Sanjay

现在,他们两人的角色已经大不相同。在谷歌,Sanjay 被看作是「个人贡献者」——独自干活的程序员,不管理任何人。对此,他很感激。他说:「我可不想要 Jeff 的工作。」他目前正在开发能让工程师能更轻松地组合和控制数十个程序(用于获取新闻、照片、价格)的软件,会在用户开始在谷歌搜索框输入文本时开始运行。他每周会与一群「区域技术主管(Area Tech Leads)」开一次会,这算得上是谷歌工程开发方面的最高委员会;他们会一起制定会影响整个公司的技术决策。如果把谷歌比作一座房子,Jeff 正在建新房间,而 Sanjay 则在支撑结构、加固横梁、铆紧螺栓。

同时,在 Jeff 和 Sanjay 周一的共同编程时间,他们启动了一个新东西。这是一个 AI 项目。Jeff 说这是一个尝试,要训练一个「巨型」机器学习模型来做数千或数百万个不同的任务。Jeff 多年来一直在思考这一思路,最近他认为这是可能的。他和 Sanjay 计划构建一个原型,然后让一个团队围绕其开发。在软件的世界里,最好的领导方法就是用代码。

Jeff 的妻子 Heidi 说:「我认为他们想念彼此。」在他们合作放缓的时候,他们开始一起在周五吃晚餐。


三月的一个周日,Jeff 和 Sanjay 一起去库比蒂诺城外远足。天气清爽、干冷,但在太阳底下还是有些热。Jeff 开着一辆蓝色的特斯拉 Roadster 抵达山口,车的保险杠上贴着 Bernie 2016 贴纸。Sanjay 开着自己的红色特斯拉 Model S 紧随其后。Sanjay 整个早上都在读书。Jeff 则选择踢足球(绑在小腿上的设备提醒他已经跑了 7.1 英里)。在创造「March index」20 年后,Jeff 像一名退休的耐力运动员,他的皮肤受到太阳灼晒。但 Sanjay 看起来却年轻得多。

旅程全长 6 英里,途中穿过了茂密的树林。Jeff 在前面领路。他们在树林里追忆谷歌的发展之快。Sanjay 想起在谷歌的第一个快速发展时期,一名管道工一次性为男厕所安装了两个厕位。「我记得当时 Jeff 评论道,」他说,「三个臭皮匠赛过诸葛亮!(Two heads are better than one!)」说完他笑了起来。

他们走出丛林,走进一片干燥裸露的区域。一只土耳其秃鹰从头顶飞过。

「这山比我想象中的要陡。」Jeff 说道。

「我记得有人说这是一次非常平坦的远足。」Sanjay 说。

「我猜这就是那一侧没有自行车道的原因。」Jeff 说道。

他们又走进了一片丛林。在一个之字形的爬坡路段,Jeff 瞥了一眼树后。「我们可以在某个点好好眺望一下。」他说道。

他们脚下的小径通往山顶,那里高耸、宽阔,没有树木,可以领略全景。视野中有淡淡的薄雾。

他们依然可以看见南边的圣克鲁斯山和东边的使命峰(Mission Peak)。「Sanjay,那是你的办公室!」Jeff 说道。他们并肩而立,视线穿越山谷。

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...