谷歌基情实录:和Jeff Dean在同一台电脑上写代码

百家 作者:大数据文摘 2018-12-08 07:14:53

大数据文摘出品

编译:DonFJ、周家乐、李雷、小七、胡笳、jin、钱天培


单丝不成线,孤木不成林,浑身是铁也打不成几根钉子。

谷歌的伟大有一多半要归功于公司中亲密无间、协同工作的程序猿们!向伟大的猿类童鞋致敬!

今天,就让我们翻开谷歌程序员们的基情实录,扒一扒《纽约客》笔下谷歌两大元老——Jeff Dean和Sanjay Ghemawat“手拉手”走过的那些年。


故事从这里开始!


2000年三月某日,六位谷歌的顶尖程序员齐聚一堂,眉头紧锁,当时谷歌正处于前所未有的紧急状态。


公司的核心系统罢工了,也就是那个爬取各种网页然后建立索引的爬虫系统。它要是罢工了,新产生的网页和新闻都没法被检索到了!所以,就算这时候用户还能凑合的在google.com上输入检索信息,但是得到的结果都是五个月前的内容了。


这个事儿其实挺严重,因为当时的谷歌还不是现在这个庞然大物,他们需要资金需要钱,那就要向外界展示他们技术没问题!


当时谷歌还刚好正在和雅虎谈项目,为雅虎提供搜索引擎。谷歌承诺提供一个比当时谷歌搜索引擎还大十倍的索引,为什么要这么大的量呢,因为按照当时的情况,互联网上的数据一年翻一倍(现在岂止一倍……),那这个索引刚好能小跑儿地跟上时代的步伐。


如果谷歌失败了,建立不了这么大的索引,那他们就会沦为一个时间胶囊,检索的结果还都是老内容,而且跟雅虎谈好的生意肯定崩了,谷歌就很有可能面临着资金链断裂然后GG的结果。


为了解决这个问题,工程师们扎营在一间靠近楼梯的会议室里,郑重的打开他们的电脑。


Craig Silverstein是谷歌的第一个员工,在两位创始人们还在自己家创业的时候就已经跟着他们混了。Silverstein当时还是个27岁意气风发的小伙子,工程能力极强,重写了很多谷歌的代码。他和Bogdan Cocosel,一位罗马尼亚的系统工程师搞了四!天!四!夜!但是一无所获……(是的,都是套路,先夸上天,然后pia!踹倒~)


Silverstein在回忆这段经历的时候说,“额了个神,闹鬼了,我们分析了半天找了半天试了半天捣鼓了半天呀!都没用……我们真的弄不明白这是为什么!”


在Silverstein抓耳挠腮的这几天里,坐他左手边,一个默默无闻的程序员却有了点思路。


Sanjay Ghemawat是一位33岁的MIT毕业生,生得是豹头环眼,但两鬓黑发已经花白。Sanjay几个月前才进入公司,跟他一起来的还有一位叫做Jeff Dean的童鞋。Dean原来在一家数字设备公司工作,后来跳槽到谷歌。


Dean和Sanjay原来也经常在一起玩耍,后来Dean离开了华盛顿DC,Sanjay也跟着过来了。他们两个关系特别好(unusually close),老喜欢一起写代码。


在办公室里,Jeff把椅子推到了Sanjay桌子旁边,自己的桌子空着。Sanjay敲代码的时候,Jeff就一边儿斜靠着他,一边儿在Sanjay耳边指正他的错误,不时的还调戏一下Sanjay。


上面的画面太美……我们继续说索引失败的问题!


Jeff和Sanjay也加入奋战大军,开始尝试找到问题的根源。他们发现代码里面有些单词漏掉了,还有些单词拼错了。好几天以来,他们都在寻找代码中的漏洞,一点点剥丝抽茧的查代码逻辑错误。慢慢的,所有的代码都查完了,但还是找不到问题。


程序员查bug也是有逻辑的,通常会分成很多层。先是最上面的用户交互逻辑层,然后是代码实现层,数据层等等等等,一直到最底的硬件层。


当查到最底下的硬件层的时候其实是最困难的,因为那里都是0、1组成的世界,是芯片中硅元素的碰撞,和高低电平之间的交互。


某个在交互层一眼就能看明白的东西,在底层世界你要花半个小时才懂得是什么。终于,在第五天的时候,Jeff和Sanjay开始意识到问题可能不是出在代码上,而是出在硬件的物理层上!他们将索引的文件以二进制的形式打开(是的,就是一堆0xblablablabla或者0101010001010的东西),然后尝试从这堆看着跟乱码一样的内容中找到问题。



在Sanjay的屏幕上,密密麻麻的出现了一堆1和0,每一行代表一个索引词。Sanjay一点一点的查看文件,说,这里应该是0,居然变成了1.当Jeff和Sanjay耐心至极的将所有排列错误的单词汇总到一起的时候,他们发现了共性!每个单词中都有同样的故障!


矛头紧指一个目标,他们服务器的内存!不出意外的话,是内存条出问题了。


Sanjay看着Jeff,这个结果其实并不意外。最近几个月,公司内部硬件损坏事故频发!


随着公司规模的迅速扩大,谷歌对计算设备的需求与日俱增,需要购入更多的设备。对于单独的计算机硬件来说,它坏掉的概率很低,但是如果你有大量的计算机的话,那么故障就总是会发生(概率问题嘛~100台故障率0.01的设备中出现故障的概率可是高达63.4%的哦)。


什么电线断了、硬盘坏了、主板过热等等的问题接踵而来。甚至有的机器一开始就没有工作,有的莫名其妙用着用着就慢了等等,各种问题五花八门。


据说当超新星爆炸的时候,爆炸波会产生高能粒子,这些粒子会向各个方向散射。科学家认为其中一种叫做cosmic射线的粒子极有可能击中地球上的计算机芯片,然后让0变成1……(听着怎么那么像那些卖硬盘公司的软文)。


为了防止这种问题,NASA和大批有钱有势的公司都购入一些特殊的硬件来避免这个问题的发生。


谷歌那时候还是个没钱的创业公司,苦哈哈的活着,买不起这么高端的东西。但是当时的谷歌在业务上已经进入了转折点,它慢慢的长大了,拥有的集群数量开始特别庞大,大到硬件的损坏频发!


所以在了解问题的根本之后,Jeff和Sanjay写了很多代码来避免让机器再出现类似的问题。那之后很快,新的索引就能够建立辣~那个在楼梯旁边的作战指挥室自然而然解散鸟。


Silverstein很苦恼,他本来是一个很好的程序员,很擅长处理bug的。但是解决bug的真谛是弄清楚事情的根源。Silverstein挖得不够深,相反,Jeff和Sanjay才真正的刨到了问题的根儿。


在这场三月风波之前,谷歌的系统都是植根于两位创始人的核心代码上,而写代码的时候他们还都是斯坦福的学生。两位创始人Page和Brin都不是专业的软件工程师,他们更像是个实验室的研究人员,用自己在搜索领域的学术知识搭建一个原型系统。


当他们的网络爬虫GG的时候,系统没能提供错误信息,最多的就是输出一句不痛不痒的:“我勒个去!(Whoa,horsey!)”。


谷歌的早期员工将Page和Brin写的BigFiles系统戏称为BugFiles。系统中最重要的索引部分代码需要好几天才能写完,如果它遇到问题的话,必须要从头开始一点点排查才能解决。所以当时硅谷说谷歌搜索引擎无法扩展(Google wasn’t “scalable”)。


要搞懂这个问题还要先了解“搜索”在网络世界到底是如何进行的。


我们常说,我们是在互联网上搜索,但其实并非如此。我们能看到的结果依赖于搜索引擎,搜索引擎会用网络爬虫到网络的各种地方来将信息下载下来,然后建立索引。咱们能看到的结果只是索引库中有的内容而已。


当谷歌还叫BackRub的时候,大概是1996年,当时的索引库特别小,就安装在Page宿舍的电脑上。但是在2000年的时候,索引就已经特别庞大,按照当时的技术,根本没有任何超级计算机能够将全部的内容放在上面处理。


在当时来说,唯一的解决方案就是买很多计算机,然后想办法让他们一起工作(就是我们知道的集群)。可是以当时谷歌的资金情况来看,是买不了特别多全新的设备的,所以他们的设备中一半都是用到的别人淘汰的垃圾设备,包括软盘驱动、金属托盘之类的。然后为了保证设备的可用性,谷歌会向生产商购买“芯儿”,就是主板和硬盘之类的东西,再把他们拼到一起使用。在加利福尼亚谷歌的一栋大厦里,有1500台这样的混用设备堆在六英尺高的机架上。但是由于故障等等原因,其中只有1200台能使用。再微小、再偶然的故障,也会让系统崩溃。


为了能让系统工作下去,谷歌不得不将它的系统整合成一个天衣无缝的整体!


于是乎,Jeff和Sanjay一起并肩为这项工作而努力。


2000年11月,一个名叫Wayne Rosing的程序员加入了谷歌,并开始管理百人工程团队。之前,他曾在Apple公司负责Macintosh项目的前期工作。


Wayne Rosing如此评价Jeff和Sanjay,“他们都是领导者”。


他们每周奋战90个小时来编写代码(平均每天超过12小时!),以确保一个微小的硬盘故障不会导致整个系统的瘫痪。他们在爬虫进程中添加各种检查点,以确保程序能够在进程中途自动重启。通过开发新的编程和压缩方案,他们迅速高效实现了系统容量的翻倍。


简直是两只行走的、机械般无情的优化器啊!


当汽车在转弯时,它的外轮必须覆盖更多的地面;同理,旋转硬盘的外边缘必须比内边缘移动的更快。Google已经将运行最流畅的进程数据移动到了硬盘外缘,因为这样后台智能传送服务能够在头部读取式的进程中运转更快,并同时把内部空间留空。Jeff和Sanjay利用这些空间来存储普通式搜索查询所需的预处理数据。


在2001年的四天中,他们证明了Goolgle的索引可以使用快速的随机存取式存储器,而不是相对存储较慢的硬盘,这一发现使得公司的财务状况实现了逆转。


Page和Brin 很清楚,用户将会涌向能够迅速提供答案检索服务的产品。关键问题是检索速度需要匹配相应的计算能力,而计算能力需要成本投入。Jeff和Sanjay对软件进行了见缝插针般的精细打磨


2005年,在Rosing离开团队后,Alan Eustace继任了工程师团队的负责人。


“想要解决一定规模的问题,相应的,你必须了解最微小的细节”,Eustace说。


Jeff 和 Sanjay对计算机的了解已经达到了字节级别。Jeff曾经发布过一个名为“每个程序员都应该知道的延迟数列”的列表。事实上,几乎没有程序员知道这个数字列表:引用L1缓存通常需要半纳秒,或者在内存中顺序读取一兆字节通常需要250微秒。这些数字都深深印刻在了Jeff和Sanjay的脑海中。当他们多次帮助Google进行核心软件的改写后,其系统容量提升了几个数量级。同时,在Google公司庞大的数据中心内,技术人员们正遵循软件生成的指示,沿着曲曲折折的路,分部的替换硬盘、电源和内存条等设备。就算存在部分脱轨或死机的情况,整个系统进程仍可健康运行。


今天,谷歌的工程师们从巨大生存链条中的1级水平开始成长。处在链条最底层的是IT支持人员。处在2级水平的是大学毕业生,3级水平的通常是硕士毕业生。想要达到4级,通常需要数年的积累,或者获得博士学位。大多数工程师的成长进程都停留在第5级。


达到第6级的工程师们,是群体中的前10%,可以说他们所具有的能力是项目获得成功的重要原因。7级工程师是具有老资历的工程师们。首席工程师们,属于8级别,通常都与某个主要产品或某项基础设施相关联。杰出的工程师们,属于9级别,通常都已获得极大的尊敬。成为Google的合伙人,即达到10级,能够获得伴随自己一生的荣誉。Google的研究员们通常都是世界范围内各领域的领军人物。


Jeff和Sanjay都是Google的高级合伙人,是公司内第一批也是唯一的两位11级工程师(神一样的工程师!!!)。


Google的园区坐落在离市中心几分钟的高速公路旁,其山顶视角可纵览风光。园区内是成片的低层建筑,窗户虽是彩色的却毫不张扬。


去年夏天的某个星期一,经过一上午的集体编程,Jeff和Sanjay去了一家名为Big Table的园区自助餐厅吃午饭。这个餐厅是以2005年他们协助开发的一个系统命名的,该系统能够把无数的计算机都识别为独立的数据库。Sanjay又高又瘦,他穿着一条古老的栗色Henley上衣,搭配灰色的裤子,并佩戴了一副小巧的金属框眼镜。他发现外面有一张桌子,便快步走过去,打开伞,在阴凉处坐下。他又额外拉了一把椅子留给Jeff。一分钟后,穿着短袖衬衫和时尚运动鞋的Jeff来了。


Jeff和Sanjay就像一对夫妇,你一言我一语的,从早期的那些项目开始共同回忆起他们的故事。


“我们可都是手写代码,”Sanjay说到。他的眼镜在阳光下显得更暗了。“我们不停修改、重写,可始终感觉跟上个月写的比没什么长进。'”


“或者说只是索引数据中的传递方式略有不同,”Jeff补充道。


“而这些细小的差别,”Sanjay说。“就是我们得突破口”
“这才是本质,”Jeff说。


“…这是常见的模式,”Sanjay做了个总结。


Jeff吃了一口手里的披萨。他的手指看起来就像低等水手那样指节粗大、皮肤粗糙;相比之下Sanjay看起来精致得多,连他自己都好奇他们是怎么凑成一对的。“我也不太清楚那时候我们究竟怎么了竟然会觉得凑一对会更好,”他说。


“我们来谷歌之前就开始这么合作了,”Jeff说。


“不知道为什么,我们就是觉着两人共用一台电脑会更利于合作”,Sanjay说。


“我愿意从我的D.E.C.研究实验室走两个街区去他的D.E.C.实验室,“Jeff说。“中间还有一家冰淇淋店。”


“这么说是因为冰淇淋店咯”,Sanjay带着微笑说道。


Sanjay至今还是单身,所以他经常和Jeff一家一起度假,包括Jeff的两个女儿和妻子Heidi。Jeff的女儿们亲切的称呼他为Sanjay叔叔,他们五人还经常在周五一起聚餐。Sanjay和Jeff的长女维多利亚有时会一起烘焙。


“我可是看着他的女儿们长大的,”Sanjay自豪地说道。2004年Google I.P.O.之后,他们各自搬进了相隔四英里的房子。Sanjay住在Old Mountain View的一间很普通的三居室里;Jeff则在Palo Alto市中心附近自己设计了一套别墅,还在地下室安装了一个蹦床。


在房子里工作的时候,Jeff发现虽然他喜欢设计自己的空间,但他实在无法忍受他所谓的带有“Sanjay风格“的部分:屋梁,螺栓和载重这些细小的部分让他那些伟大的设计避免了分崩离析。


“我不懂为什么其他人不像我们这样,”Sanjay说,“可以凑成一对一起编程。”


Jeff说:“你需要找到一个与你思维方式一致的人和你结对编程,这样你们两个人可以互相弥补。


他们推开桌子站起来,穿过Big Table和那些忙碌的谷歌人,出发去寻找好吃的甜筒了。他们两人之中,Jeff更热衷于表达,即使走在路上他还在阐述他的甜筒策略。“我觉得一边挤冰激凌,一边把甜筒往上推的策略更有稳定性。”他说到。Sanjay则带着微笑专注地往他的甜筒里绕上更多的巧克力香草冰淇凌。


在社会学家迈克尔•法瑞尔(Michael P. Farrell)2001年出版的《协作圈:友谊动机与创造性工作》(Collaborative Circles: Friendship Dynamics and Creative Work)一书中,他对相近的创作型群体进行了研究,包括法国印象派画家、西格蒙德•弗洛伊德(Sigmund Freud)及其同时代的人。


他在书中写道:“大多数新愿景,并非起源于整个团队的协商,也不是单个成员的独立构想,而是他们在合作时相互激发出来的”。莫奈(Monet)和雷诺阿(Renoir)曾在1869年的夏天并肩工作,才开创了印象派画风;毕加索(Pablo Picasso)和乔治·布拉克(Georges Braque)在六年的合作期内,都经常在画布背面签名,以混淆他们的作品,是以产生了立体主义。毕加索后来回忆道,“一幅画只有我们俩都认同它完成了,它才能算真正的成品”。


在《两个人的力量:发现创造性组合中的革新本质》一书中,作者Joshua Wolf Shenk引用了1971年John Lennon接受采访时说的话,在采访中Lennon是这样形容他和Paul McCartney的,“我们都能写出好的内容,就像‘我今天看了新闻’或者其他东西,这时创作就很容易”。他还说,“我们都可能会遇到创作瓶颈,但是我们可以相互激发,例如,我会唱一半,他会受到启发,写下一段,反之亦然。”每个人都会遇到创作瓶颈,但很少两个人一起遇到。


在新科学或艺术的“理论建设”阶段,重要的是广泛探索,而不要陷入死胡同。Francois Jacob与Jacques Monod一起开创了基因调控研究的先河,他指出,到了二十世纪中叶,分子生物学领域的大多数研究都是两个人合作的结果。Jacob写道:“相比一个人,两个人更容易提出理论并构建模型。因为两个人在处理同一个问题,所以想法就会来得更快、更多,它们会在合作伙伴之间相互反射。当它们彼此嫁接在一起时,就会像树上的树枝一样,密不可分。在这个过程中,假象很快就会被扼杀在萌芽中。”在过去的三十五年里,大约一半的诺贝尔生理学或医学奖都是授予了科学合作伙伴。


经过多年工作和生活的分享,两个人就可能会形成自己私密的语言,就像双胞胎一样。他们模仿彼此的衣着和习惯,幽默感也在不知不觉中相互渗透,在他们之间分配信任是不可能的。但是这种强度的合作在软件开发中是不寻常的。虽然开发人员有时会谈论“结对编程”,即两个程序员共享一台计算机,一个“驾驶”而另一个“导航”,但他们通常认为这种合作关系是冗余的,这就好像一架飞机上安排了两个飞行员。相比之下,Jeff和Sanjay有时更像是一个大脑的两部分。他们共同参与了很多项目,所以很多著名的论文都有多达十几位的合作者。他们的经理之一Bill Coughran回忆说:“他们非常多产,工作效率极高,因此我们常常会让他们带不同的项目。”


1966年,系统开发公司的研究人员发现,最好的程序员的效率是最差的十倍以上。从那以后,所谓的“10倍程序员”一直存在争议。


这种说法推崇的是个人至上,但是软件项目通常非常庞大,需要多人共同完成,尤其在编程中,很少有人是独立完成项目的。然而,具有讽刺意味的是,即便如此,许多程序员也将Jeff和Sanjay共同完成的工作视为10倍程序员存在的证据。


Jeff于1968年7月出生在夏威夷,他的父亲Andy是一名热带病研究员,而他的母亲Virginia Lee是一位会讲六国语言的医学人类学家。一时兴起,父子俩设计了一套IMSAI 8080工具包计算机。他们将升级程序焊接到机器上,学习它的每一部分。


Jeff和他的父母经常搬家。十三岁时,他正上八年级,为了到索马里西部的一个难民营帮助父母,在最后的三个月里他都没有去上课。后来,在高中时,他开始为流行病学家编写一个名为Epi Info的数据收集程序,之后它就成为了野外工作的标配工具,最终它以十几种语言发行了数十万份。由疾病控制和预防中心维护的一个网站(Epi Info Story)上面还有Jeff在高中毕业典礼上的照片。


Jeff在明尼苏达大学遇到的他后来的妻子,Heidi。Heidi说:“Jeff从不张扬,想要了解他你可得一点点慢慢挖。”


他们的第一次约会是在一场女子篮球比赛中,当时Jeff穿着地鼠服在当啦啦队。


Jeff在博士期间专注于编译器,这是一种将人们编写的代码转换为针对计算机优化的机器语言指令的软件。Alan Eustace说:“就有趣程度而言,编译器非常无聊。”但是从另一方面说,它们可以让你非常接近机器。


在描述Jeff时,Sanjay用食指在脑袋上画了个圈,说道:“当你编写代码时,他脑子里就会跑出来一个模型,来衡量这段代码的性。他几乎可以不会吹灰之力地考虑到所有极端情况。”


Sanjay在17岁时去康奈尔大学之前没有碰过电脑。他于1966年出生于印第安纳州西拉斐特,但在印度北部的工业城市长大。他的父亲Mahipal是一名植物学教授,他的母亲Shanta则在家照顾Sanjay和他的两个哥哥姐姐。他们一家人都热爱看书,还记得他的叔叔Ashok Mehta买了一本Frederick Forsyth写的《豺狼的日子》副本,但它的装订已经严重损毁,他叔叔会看着Ghemawat的孩子们一起读这本破旧的书,等所有人读完了才舍得翻页。


Sanjay的哥哥Pankaj是哈佛商学院有史以来最年轻的教师。(他现在是纽约大学斯特恩商学院的教授。)Pankaj和Sanjay去了同一所学校,当年Pankaj有着“文艺复兴时期男子”的美誉。Sanjay说:“我有点生活在我哥哥的阴影下。”成年后,他保留了自我贬低的品质。2016年,当他被引入美国艺术与科学学院时,他的父母事前居然不知道,还是他们的邻居告知的。


在麻省理工就读研究生期间,Sanjay结识了一群关系紧密的朋友。尽管如此,他从来没约过会,而且现在也“非常非常少见”。他说,他并不是不想结婚,只是顺其自然就这样了而已。他的亲密朋友已经学会了不去打扰他,而他的父母也在很久以前就接受了他们的儿子将成为单身汉的事实。也许正是因为他如此低调,他在谷歌才充满了神秘色彩。他喜安静,比较沉默寡言,但是他是一个思想深刻且出众的人。近二十年来,在他的桌子上,他一直保留着一堆Mead组合笔记本,这里面记载的满是整洁的清单和图表。他喜欢用钢笔写草体字,但他很少翻阅之前的笔记本,书写只是为了思考。在麻省理工时,他的研究生导师是一位很有影响力的计算机科学家Barbara Liskov,研究过复杂代码库的管理。


在Barbara看来,最好的代码就像一篇好的文章。它需要精心设计的结构,每个单词都应该发挥作用。这种程序需要与读者产生共鸣。这也意味着代码不仅被看做是实现功能的手段,而其本身也是一种艺术。


Craig Silverstein说:“我认为他最擅长的就是系统设计”,“如果你阅读Sanjay写的代码,就知道他的代码就比例协调的雕塑那么美。”


在谷歌,Jeff更为人所知,但是对于那些了解他们俩的人来说,他们会说Sanjay同样是个天才。


“Jeff非常善于提出疯狂的新想法和原型设计”,他们长期以来的同事Wilson Hsieh说道:“Sanjay是那种能够打造出能够持久运行的作品的人。”在生活中,Jeff更外向,Sanjay更内向。而在代码中,情况正好相反。Jeff的代码令人眼花缭乱——他可以迅速构架出惊奇的想法——但是因为实现的过快,出于探索精神的读者可能会被拉在后面。Sanjay的代码更加具有交流观赏性。


“有些人”Silverstein说,“他们的代码太过松散。一页屏幕中的代码展示的信息非常少。你总是来回滚动屏幕来弄清楚代码做的是什么。另一些人代码写的太过密集,你看着这样的代码,会想,‘额,我一点也不想读下去。’Sanjay以某种方式介于这两种方式中间。你阅读他们的代码,就好像‘哦,我懂了’而且,你仍然可以从一页屏幕上得到很多信息。”Silverstein继续说道:“每当我想为Sanjay的代码添加新功能时,我会发现他已经给我准备好了切入口。我懂这种伟大,但我不明的他是如何做到的。”


今年春天的一个早上,Jeff和Sanjay站在40号楼的小厨房里,那里是谷歌人工智能部门总部。在他们身后的白板上,写满了矩阵代数;一篇关于无人监督的对抗性网络的论文摆在桌上。Jeff穿着一件褪色的T恤和牛仔裤,看起来像是一个进阶版流浪汉;Sanjay穿着一件毛衣和灰色的苦衷。明亮的窗外是一片高大的松树,还有一片田野。无论Jeff在谷歌哪里工作,都会伴随咖啡机。在小厨房的柜台上,一个三英尺款的La Marzocco正在嗡嗡作响。“我们迟到了”,Jeff站在咖啡研磨机旁说道。这时正是八点三十二分。


在喝过卡布基诺后,他们走到各自的电脑前。Jeff从他自己的脏兮兮的桌子旁,滚了一把椅子到Sanjay的桌旁,那张桌子很干净。他把一只脚放在文件柜上,向后靠着,而Sanjay盯着他们面前的电脑屏幕。


屏幕上有四个窗口:左侧分别是Web浏览器和终端,用于运行分析工具;右侧是文本编辑器Emacs的两个编辑文件,一个是待办事项列表和笔记本,另一个是颜色丰富的代码。Sanjay的一个笔记本电脑放在电脑旁边。


“好吧,我们做点什么?”Sanjay问道。


“研究TensorFlow Lite的代码大小”,Jeff说。


这是一个与机器学习相关的主要新软件项目,Jeff和Sanjay担心它会像书编辑一样不断膨胀,他们正在寻找削减方法。为此他们构建了一个需要优化自身的新工具。


“所以我试图找出它有多慢,”Sanjay说。


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


“所以那个是120KB,”Sanjay说,“要八秒钟。”


“是十二万个堆栈调用,”Jeff说,“不是KB。”


“好吧,我是说120KB个字符”,Sanjay说,


“哦,是的,抱歉”,Jeff说


“我不知道我们应该为单元大小设定什么门槛”,Sanjay说“半个兆?”


“听起来不错”,Jeff说,Sanjay开始编码,Jeff被屏幕所吸引。“所以你刚才说,如果它比我们样本那个大...”还没有说完,Sanjay就用代码回答了他。


当Sanjay开车时,他把手放在十点钟和两点钟的位置,然后专注地向前看。他在敲键盘时也是这样。他的双脚分开与肩同宽,看起来好像在按照自己的姿势行事。他的细长手指轻轻地移过钥匙。一些年轻的程序员开始鱼贯而入。


不久以后,他们达成了一个小里程碑,Sanjay敲下了一个命令来测试他们的进展。他看起来很疲惫,在程序运行的时候检查了一下自己的邮箱。测试结束了,他没有注意到。


“嘿”,Jeff 说道,啪的一声指着屏幕。虽然他平时很喜欢讲笑话,但当他坐在Sanjay的电脑前时,他会变得很自以为是、顽固、粗鲁和不满。Sanjay对此已然可以从容应对。当他认为Jeff的移动速度太快的时候,他会将手从键盘上抬起,并伸出手指,好像在说“停止”(一般来说,Jeff是加速器,Sanjay就是制动器。)这很接近争论,在二十年的时间里,他们已经不记得他们相互吼了多少回了。


Sanjay滚动屏幕,将新的代码块放入视图中。“所有这些都可以成为惯例,不是吗?”Jeff说。


“嗯”,Sanjay表示同意。


Jeff敲了个指响,“似乎可行。我们应该这么做吗”?


Sanjay 很谨慎“不,我——”


“所以我们将忽略这个问题?”Jeff愤怒的说。


“不,我的意思是,我们只是试图了解正在发生的事情的类型。所以我们可以做出一些关于它的消息,对吧?”


“哦”,Jeff愉快地说,他的心情变好了。他们一起讨论了这条消息。


午餐时间接近了。他们工作了两个小时,中间休息了十分钟,大部分时间都在交谈。(一个年轻程序员看着他们工作会留下很深的印象,因为他们从未停止或被卡住。)这种将你的代码由另一个人审查的方式,是标准的工程实践。


但Jeff和Sanjay跳过了这一步,直接在日志中输入了一个敷衍的“lgtm”表示“我觉着不错(looks good to me)”,从某种意义上说,他们沉浸在各种细枝末节中。


但是他们的代码是按照谷歌的规模来执行的。他们担心的kb和微妙数将在世界各地的数据中心成倍增加,达到十亿倍。在这样的日子里,Jeff回家会告诉他的女儿们,“Sanjay和我今天加快了谷歌搜索的百分之十。”


2003年的四个月中,Jeff和Sanjay给谷歌带来了可以说是其最大的单一升级,是用一个名为MapReduce的软件做的。在第三次重写Google的爬虫和索引器(indexer)时,他们就有了这个想法。每次当他们解决一个重要的问题时,都会面对一个现实:如何让大量散步各地、不可靠的计算机协同工作。做一个通用化的解决方案意味着他们可以避免一次又一次地重新面对这一问题。


MapReduce就是Jeff和Sanjay在一个办公室的角落里这样编写出来的,它对一个令人费解的复杂过程添加了排序。


在MapReduce出现之前,每个程序员都必须弄清楚如何分割和分发数据,分配工作以及自己负责解决硬件故障。MapReduce为编码人员提供了一种思考这些问题的结构化方法。就像一位厨师的准备工作,在炒菜之前准备食材,所以MapReduce要求程序员将他们的任务分成两个阶段。首先,编程人员要告诉每台机器如何进行任务的“map”阶段(比如,计算一个单词出现在网页上的次数);接下来,她要编写如何“合并”(reduce)所有机器结果的指令(例如,把它们加起来)。MapReduce处理分发的细节 – 并且对编程人员是透明的。


第二年,Jeff和Sanjay重写了Google爬虫和索引系统的MapReduce任务。很快,当其他工程师意识到它有多强大时,他们开始使用MapReduce处理视频和在Google地图上渲染图块。MapReduce非常简单,新任务可以自发的进行。


谷歌拥有所谓的“昼夜使用曲线” - 白天的工作量比夜间更多 - 而MapReduce任务开始利用这些闲置能力。就像做梦中的大脑可以处理其日间体验一样,现在谷歌也可以在“梦中”处理它的数据了。


在谷歌早期阶段,你就可以看出它是一家打着搜索公司幌子的人工智能公司。2001年,与Jeff和Sanjay共享办公室的Noam Shazeer已经对Google从另一家公司购买的拼写检查程序越来越失望:它不断犯下令人尴尬的错误,例如告诉那些想输入“TurboTax”的用户他们可能想输入“turbot ax”(turbot是一种生活在北大西洋的比目鱼)。


如果一个拼写检查程序参照的字典不好,那这个程序一定也好不到哪里去。Shazeer意识到在网络世界,谷歌可以访问有史以来最大的字典。他编写了一个程序,该程序利用Web上文本的统计属性来确定哪些单词可能是拼写错误。这个软件学会了“pritany spears”和“brinsley spears”都是“Britney Spears”的意思。


当Shazeer在谷歌每周一次的TGIF聚会上演示这个程序时,其他的程序员们试图骗过它,但大多数都失败了。Shazeer与Jeff和一位名叫Georges Harik的工程师合作,采用类似技术将广告与网页相关联。广告定位成为支持公司重新投入其计算基础架构的财路。这是良性循环的开始 - 巨大数据量将成为谷歌智能的源泉;谷歌智能带来财富;而财富是公司增长的基础 - 这将使谷歌成为人工智能的霸主。


有想法的程序员使用MapReduce从Google的数据中获取先机,因此使用户的语音邮件识别,问题回答,查询自动完成以及超过一百种语言的互译成为可能。这种系统是使用相对简单的机器学习算法开发的。


“很简单的技术,当你拥有大量数据时,也会工作得很好,”Jeff说。随着“数据,数据,数据”使用BigTable,MapReduce及其后续产品进行存储和处理成为公司的最高指导原则,Google的全球基础架构变得更加无缝和灵活。


分布式计算的想法早已有之;像“云计算”和“大数据”这样的概念也早于谷歌的崛起就已经出现。但是,通过使普通编程人员编写分布式程序这件事变得智能可控,Jeff和Sanjay已经让谷歌对这些技术的掌控更上一层楼。用户可能已经感觉到了某些变化:谷歌云变得越来越聪明。


2004年,Jeff和Sanjay觉得MapReduce这项成果对对天文学家、遗传学家和其他有大量数据需要处理的科学家也非常具有价值,于是他们写了一篇论文把MapReduce公之于众了。


这是一把神器!


硬件设备的降价以及Web服务和连接设备的增长导致了大量数据泛滥,但很少有公司拥有可以处理这些信息的软件。工程师Mike Cafarella和Doug Cutting一直在努力扩展一个名为Nutch的小型搜索引擎,他们坚信MapReduce的重要性,因此决定从零开始构建一个免费的克隆版本。


他们最终以Cutting的儿子所喜爱的一头毛绒玩具象给他们的项目取名Hadoop。


随着Hadoop的逐步成熟,它已被全球财富50强中的一半所采用。它成为“大数据”的代名词。据了解,Facebook使用“Hadoop MapReduce”来存储和处理用户元数据(例如用户点击内容、喜欢内容以及查看了哪些广告的信息)。它曾一度拥有世界上最大的Hadoop集群。


Hadoop MapReduce也帮助推动了LinkedIn和Netflix的发展。国家安全局前技术总监Randy Garrett记得曾向该机构的主管Keith Alexander将军展示这项技术。Hadoop执行分析任务的速度比之前的系统快了18000倍。它成为了一种新的情报收集方法的基础,一些观察家称之为“全面收集”。


Jeff有一种不安分的本性:一旦他能看到解决方案的轮廓,问题就变得不那么有趣了。2011年,当云计算开始为世界所接受时,他开始与斯坦福大学的计算机科学教授Andrew Ng合作。Andrew Ng当时正在谷歌主持一个秘密项目,研究神经网络-由虚拟“神经元”组成的软件程序。


Jeff在他的大学期间曾经接触过神经网络;那时的神经网络还无法解决现实世界的问题。Ng告诉Jeff这种情况正在发生改变。在斯坦福大学的研究中,当给神经网络输入大量数据时,研究人员取得了一些令人兴奋的结果。Ng认为,凭借谷歌的规模,神经网络将不仅有用武之地而且会非常强大。


神经网络系统与传统的电脑程序大不相同,该系统的操作不是由程序员进行常规的编码建成,而是通过输入与反馈学习到。在大学期间,Jeff沉迷于学习神经网络,这一点可以从浴室里成堆的教科书就可以看出来。Jeff开始致力于“谷歌大脑”项目,然而,那时谷歌内部大多数员工都认为这个项目毫无价值。不仅经理Alan Eustace说“它是在浪费人才!”,Sanjay甚至质疑他“你究竟是在做些什么?”。


此后7年内,谷歌大脑团队成功训练出了神经网络,完胜机器翻译、机器语音以及图像识别。最后,他们替换掉谷歌的搜索结果排序和定位广告这些最重要的算法,谷歌大脑成为公司内成长速度最快的团队。Claire Cui将Jeff的创举视为谷歌在A.I领域发展的转折点:“公司里,有人支持这个项目,也有人认为它是在浪费时间,但Jeff坚信它将会成功。”


AI似乎是一项繁冗复杂的大工程,所以Jeff研发出了一项程序“TensorFlow”,用于创建AI的分布式计算系统(MapReduce)。TensorFlow简化了在计算机之间散步神经网络的过程,将他们集中于一个大脑。2015年,TensorFlow一经发布,就成为A.I领域的通用语。近期,谷歌首席执行官Sundar Pichai宣布公司将A.I放于第一位,并且将任命Jeff为领头人。


现在Jeff带领着3000人的团队,平均每星期有四天都在运营谷歌大脑。另外他还会去到全球演讲、为新的电脑芯片(用于神经网络的张量处理单员)开周例会议、协助AutoML的研发——使用神经网络来建设其他网络的系统。


反观Sanjay,他依旧是个“个体工作者”,独自编写程序,也不需要管理其他人。对此,他表示很庆幸:“我并不想像Jeff那样工作。”他现在致力于研究一款软件,让工程师们可以更容易地整合和控制大量程序(例如寻找新闻、图片和搜寻价格),并在用户输入搜索词时就开始运行。每周,他都需要和“Area Tech Leads”集团(谷歌工程绝地委员会engineering Jedi council)会面一次,保证技术更新能够即时传递到整个公司。


如果将Google比喻为一座房子,Jeff在为房子增华添彩,而Sanjay则支撑着房子的基地,加固房梁,拧紧螺栓。


同时,在他们的“周一编码日”,Jeff和Sanjay仍会聚在一起研究新事物。


Jeff说:“我想开发一个巨型机器学习模型,一个可以完成成千上万不同任务的模型。”Jeff多年来一直在考虑这个问题,直到最近,他才肯定了它的可行性。他和Sanjay打算建造一个原型,团队其他成员就可以按此继续研发——在软件世界,最好的领导方式是使用代码。


Jeff的妻子Heidi说:“他们很想念对方。”自从他们开始各自工作后,合作就越来越少了。


三月的某个周日,Jeff和Sanjay相约去Cupertino徒步旅行。天气明亮清新,但是有些热。Jeff开着一辆蓝色特斯拉电动跑车,Sanjay的红色特斯拉Model S紧随其后。Sanjay喜好阅读,Jeff经常打球。建造March index的20年后,Jeff越来越像退役的运动员,他的皮肤也被烈日晒成黝黑,而Sanjay看起来依旧年轻焕发,不曾老去。


穿过茂密森林,有一条道路环绕6公里。Jeff带路,走在丛林中,他们追忆起以前Google如何快速发展。Sanjay回忆起,公司业绩获得第一次剧增后,给一个厕所隔间装了两个便池,“我还记得Jeff说,两个比一个好。“


他们走出森林,进入乡村,这时一只土耳其秃鹰从头顶飞过。


“这里的山比我想象中还要陡峭”,Jeff说。


“我记得有人说过这是一个非常平坦的山坡”,Sanjay回应道。


“我想,这就可以解释为什么没有人骑车了。”


当他们走回森林,Jeff向树的远方瞥了一眼,说到:“那边我们可以看到更好的风景。”


这条小路通向一个小山顶,高而宽广,没有树,可以俯瞰全景。虽然有薄雾笼罩,他们依旧看见了南边的圣克鲁兹山脉,以及东边的使命峰。


Jeff调侃到:“Sanjay,看!那就是你的办公室!”。


他们并立一起,眺望山谷。


相关报道:

https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge/amp?__twitter_impression=true


【今日机器学习概念】

Have a Great Definition

志愿者介绍

后台回复志愿者”加入我们

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接