从谷歌最好的程序员Jeff Dean:我用过18种编程语言
当地时间2月21日,谷歌大神Jeff Dean在参与网友“学习编程语言顺序”的话题中,又不小心秀了下自己的“肌肉”:自己至今已经学习和使用了17种编程语言。但他分明忘记了自己还用过Sawzall,还是在网友的提醒下才想起来。这样算来,Dean已经用过至少18种编程语言了!
Dean的评论区一时间也成为网友的“答疑区”。“你还记得这些吗?我学Python的时候忘了Java,学Java的时候又忘了C……我想我的大脑内存严重不够。”网友Ravi Ahuja不禁问道。
“我认为这有点像骑自行车?为了记住我不经常用到的、感觉模糊的地方,我会做一些查究。但通常来说,看到那些代码都很舒服。如果在一段时间不用后开始使用,那么一两天之后情况就会变得更好。”Dean回答道。
还有网友Avik Dutta问道,“如何为特定的问题或项目选择编程语言?”Dean回答称,这是多种因素造成的,其中包括性能有多重要、需要与之交互的现有代码、是一个少数人参与的小项目还是一个大项目等等。
不过,Dean在博客介绍中也提到,尽管多年来使用其它编程语言写了大量代码,但他大部分代码都是用C++编写的。
“成神之路”
有很多“关于Dean的事实”的段子流传至今。比如,2007年的愚人节,一些对Dean抱有崇敬之情的谷歌工程师决定以诺里斯式幽默的方式向他致敬,热情宣扬他在编程领域的成就。例如:
• 不是由编译器向Dean报警,而是Dean向编译器报警。
• Dean直接用二进制码编程,再把源代码转换成其他开发者能看懂的文档。
• 对Dean来说,人体工程学要保护的不是他,而是键盘。
• 有一回,Dean想优化一个函数来让返回先于调用,于是异步API就此诞生。
抛开段子不谈,Dean的编程能力到底多让人信服?Hacker News上曾有人问:你见过的最优雅的代码是什么?放在首位的回答就是Jeff Dean的MapReduce最初实现。
IIRC只有3个C++类和几百行代码。它将大部分分发、任务运行和磁盘访问任务外包给其他谷歌基础设施,只专注在运行计算、为每个键收集结果并分发给reducer。
当前(截至2012年,不再是当前版本)的MapReduce版本更快、更可靠,但用几百行代码启动一个价值数万亿美元的行业,确实也是一种的优雅。
在当前(也是自2012年起)的MapReduce代码中,还有另一个同样由Jeff Dean设计的令人毛骨悚然的东西。这是一种外部排序算法,与大多数外部排序一样,它通过编写一堆整机RAM大小的临时文件然后执行N路合并来工作。但它是如何对机器的RAM进行排序的呢?当然是使用STL qsort()函数!但是,如何使用标准库函数有效地对64GB的数据进行排序呢?他编写了一个自定义比较器,一次比较整个记录,使用IIRC编译器的内在机制编译成SIMD指令,并执行某种Duff's device(类似展开)来考虑不同的密钥长度。它是标准库函数与高度优化的专用代码的巧妙结合。
Dean曾为MapReduce、Bigtable和Spanner等重要项目做过贡献,正是这些技术,让谷歌乃至众多现代Web产品得以存在。他所从事的项目,也随时可能再次颠覆整个信息技术世界。
Dean是1999年加入谷歌的,当时的他已经是享誉全球的顶尖年轻计算机科学家之一。Dean回忆道,当时家用计算机正在蓬勃发展,他一直希望能在给定的设备上做更多的事情。
还在读高中的Dean编写了一个用于分析大量流行病学数据的软件,而且速度比当时专家们常用的产品“快26倍”。这套系统定名为Epi Info,后来被翻译成13种语言版本供世界各地的疾控中心使用。读博期间,他又开始探索编译器课题,希望将源代码转换为计算机能够轻松执行的语言。“我一直喜欢能快速运行的代码。”
但Dean不满于此,他不愿把一辈子都耗费在编译器身上。于是他离开学术界,在两年多之后加入了当时只有20名员工的谷歌。
在为Google News和Adsense做出重要早期贡献之后,Dean意识到谷歌的广告业务将必定互联网经济的基本规则,于是他开始将注意力转向即将到来的核心问题:规模。
谷歌的两位创始人Larry Page和Sergey Brin本身就是一流的开发人员。1990年代末,他们开发出一种能将最相关结果返回至给定搜索查询的算法Pagerank。这种对相关性的关注,让谷歌一举超越了上个世代的霸主雅虎、Altavista和曾经代表先进生产力的其他对手。但随着业务占比的提升,谷歌也面临着巨大的计算挑战。Dean曾感叹道,“我们部署机器的速度”总是跟不上需求。
为此,Dean与其他几位优秀同事联手合作,并意识到高中时做的Epi Info已经蕴藏着正确的方向:把看似硬件的问题,转化成软件形式来解决。
Dean和同事Sanjay Ghemawat开发了一款名叫MapReduce的编程工具,能帮助开发人员在机器上并行处理庞大的数据集。就像编译器能帮助程序员完成代码转换一样,MapReduce能帮助谷歌开发者调整搜索算法或添加新计算,又不必分神于并行化操作或者处理设备故障。
Dean和Sanjay的成就震古烁今,因此在2004年发布开创性研究论文后,其很快成为行业标准和后来Hadoop的实现基础。尽管如今的谷歌已经逐渐超越MapReduce,但每当有新的时期实习生参与新项目时,仍然经常会从MapReduce起步。
谷歌的联合创始人们经常讨论“10倍”效能,而MapReduce正是个绝佳案例。所谓10倍效能,就是不满足于将效能提升10%,而是直接扩大10倍。MapReduce也是如此,它不是让每项操作都快上一点,而是让谷歌的开发者们得以做出以往无法想象的尝试。
Dean参与的其他一些项目也带来了类似的指数级效应。在Google File System的基础之上,他和Sanjay一同创建了名为Bigtable的分布式数据存储系统,亮点是能够处理PB级别的数据(1 PB约等于100万GB)。
之后他们又更进一步,开发出了号称是“全球最大单体数据库”的Spanner。凭借一种创新的计时方法,Spanner“在全球覆盖的同时又保持着类似于单地部署运行感受”。换句话说,即使更新在抵达各地节点的时间上并不相同,Spanner也能让全球数据中心网络保持一致。在Spanner出现之前,很多人认为这根本不可能实现。
大家应该能理解开头那些“关于Dean的事实”完全是在搞笑。Dean本人觉得“有点尴尬,但也挺好玩的。”而且他总是强调,自己的一切成就都离不开合作。
通过采用新的数据库方法和大规模数据分析帮助谷歌成为一个计算强国,Dean也赢得了业界最有才华的编码员之一的荣誉。
每天早上,Dean都会到加州山景城的Googleplex总部上班,跟其他核心员工坐下喝杯咖啡。虽然大家的工作方向并不一样,有些同事也随谷歌业务的拓展而搬到了别处,但这种轻松愉快的每日讨论仍然不断激发着彼此的思路。咖啡对话帮助Dean把自己的优化、并行化和软件基础设施方面的专业知识,推广到了更多谷歌项目当中。作为他的长期搭档,Sanjay说“他对我们的工作总是非常热情和乐观,似乎没什么能够阻挡他的脚步。”
“Dean证明了它确实有效”
Dean天生不愿安于现状:一旦看到问题解决方案的轮廓,这个问题对他而言也就失去了吸引力。
2011年,在全世界都向云计算张开怀抱时,他开始与来自斯坦福大学的计算机科学教授吴恩达合作。吴恩达教授当时在谷歌公司负责领导一个关于神经网络研究(即利用虚拟「神经元」构建计算机程序)的秘密项目。
Dean曾在本科求学阶段接触过神经网络,但那个时候还无法解决真实世界中的问题。吴恩达告诉Dean,情况正在快速发生改变。在斯坦福大学,研究人员们发现向神经网络提供大量数据之后,即可取得一系列激动人心的结果。吴恩达认为,在谷歌庞大的业务规模支撑之下,神经网络不仅将在实用性层面有所提升,更会变得无比强大。
神经网络与传统计算机程序截然不同。神经网络的行为并非由程序直接指定,而是通过输入与反馈自行“学习”到的。自从本科毕业之后,Dean的神经网络知识就一直停滞不前,于是Dean的妻子Heidi很快发现家里的卫生间中摆满了相关教材。Dean决定每周拿出一天了解这个被称为“谷歌大脑(Google Brain)”的项目。
当时,谷歌公司内部有很多人对这项技术持怀疑态度,谷歌员工Alan Eustace回忆道:“这简直是在浪费人才。”就连Sanjay也对Dean的举动无法理解,他说道,“你的工作在于管理基础设施,整那些没用的干啥?”
在接下来的七年时间里,谷歌大脑团队开发出了远超以往最佳方案的机器翻译以及语音与图像识别神经网络。最终,这些神经网络模型取代了谷歌最重要的搜索结果排序与定向广告算法,这也使得谷歌大脑团队成为公司内增长速度最快的部门之一。
2001年加入谷歌公司的工程师Claire Cui提到,Dean的参与标志着谷歌内部人工智能开发工作的历史性转折点:“当时有人相信这项技术,也有人不信,但Dean证明了它确实有效。”
事实证明,人工智能以规模化为前提,而Dean这位系统工程师正是规模化实现的好手。他的一项重要努力在于领导了TensorFlow项目的开发——目标是为人工智能创造出与MapReduce相似的简化方案。
TensorFlow极大降低了将神经网络分配至多台计算机的门槛,从而将大量计算设备视为统一的庞大主脑。2015年,TensorFlow正式亮相,并成为人工智能领域的客观标准。谷歌CEO Sundar Pichai此后骄傲地宣布谷歌是一家“AI优先”的企业,并任命Dean领导公司内的所有AI开发项目。
Dean每周拿出四天时间管理谷歌大脑团队,包括团队中的三千名成员。他到处发表演讲,每周召开一次关于新型计算机芯片(即专为神经网络设计的张量处理单元,简称TPU)的例会。此外,他还参与到AutoML的开发协助当中——这是一套尝试利用神经网络设计其它神经网络的系统。在如此繁重的工作压力之下,如今他每周与Sanjay一同编写代码的机会只剩下一次。
结束语
其他行业不太一样,IT领域的开发者具有很强的不可替代性。
一位出色的会计师也许能帮企业省下5%的税费,一名出色的棒球运动员可能比普通选手的抢垒率更高。但出色的软件开发者可不一样,一位大神七天能做完的工作,普通的小型开发团队可能需要几个月的时间。这是一种指数级的差距,所以各大科技巨头才愿意竭尽全力吸引最顶尖的编程人才。显而易见,Dean就是这样的顶尖人才,以至于在很多人眼中,Jeff Dean就是谷歌技术的代名词。
还有一个“关于Dean的事实”的段子说道,Dean能光靠小键盘上的0和1就完成发明。但真正的Dean承认,他自己并不是机器学习专家,只是渴望帮助他人构建起可扩展的高性能系统。
跟人们想象中的技术天才不同,Dean认为硬堆时间来寻求最佳答案的可能性很低。相反,他的解决过程往往从后续计算起步,尝试在给定过程的质量和速度之间取得最佳平衡点。在他看来,“在许多领域,从机器翻译到搜索质量,我们总是在对每条查询的计算方法做权衡。也许无法实现理论上的最佳方法,但如果我们能用某种方式来求取近似,那没准能用1%的算力获得98%的收益。”
Dean也确实是这么做的,他甚至整理了一份“每位计算机工程师都该知道的数字”清单——比如数据包从加利福尼亚到阿姆斯特丹的往返大约需要150毫秒。他认为牢记这些数字很重要,因为工程师们经常需要“在20分钟内只靠一块白板,计算出三种设计里哪种最好。”这事并不容易,但Dean表示“只要能把所有细节转换成能够直接比较的粗略结论,后面就比较容易推进了。”
如果非要说Dean拥有什么超人的力量,那这种力量跟所谓“神迹”肯定没半点关系。他的力量是优先级、优化和数量级意义上的力量。更直白地讲,这是一种能在更少时间内完成更多工作的力量。在硅谷,这种力量可比舞刀弄棒酷多了。
参考链接