写点什么

谷歌最好的程序员 Jeff Dean:我用过 18 种编程语言

  • 2023-02-22
    北京
  • 本文字数:4666 字

    阅读完需:约 15 分钟

谷歌最好的程序员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 拥有什么超人的力量,那这种力量跟所谓“神迹”肯定没半点关系。他的力量是优先级、优化和数量级意义上的力量。更直白地讲,这是一种能在更少时间内完成更多工作的力量。在硅谷,这种力量可比舞刀弄棒酷多了。

 

参考链接:

https://slate.com/technology/2013/01/jeff-dean-facts-how-a-google-programmer-became-the-chuck-norris-of-the-internet.html

https://www.infoq.cn/article/rAJiubRpi9xSl_LEhI2N

2023-02-22 15:038011

评论 4 条评论

发布
用户头像
Dean确实是大拿,从事过6种语言的编译器或解释器的工作。我们就多种语言用用就好了。
2023-02-24 10:50 · 湖北
回复
用户头像
嘿~我也用过 18 种编程语言 = html、asp、php、jsp、basic、vb、c#、c++、java、as、js、go、erlang、elixir、ruby、python、rust、dart
2023-02-23 11:25 · 广东
回复
用户头像
Ubuntu
2023-02-23 10:03 · 江苏
回复
用户头像
百万美元年薪
2023-02-23 08:21 · 浙江
回复
没有更多了
发现更多内容

RecyclerView

android 程序员 移动开发

svn 使用方法(1)

android 程序员 移动开发

vue学习(三)—vue

android 程序员 移动开发

[译] 如何用 Flutter 来创建一个带有底部导航栏的应用程序

android 程序员 移动开发

umi(1)

android 程序员 移动开发

[译] Android 中的 MVP:如何使 Presenter 层系统化?

android 程序员 移动开发

[译] Android 模拟器:Project Marble 中的改进

android 程序员 移动开发

Realm数据库使用教程(五):删除数据

android 程序员 移动开发

RxHttp-完美适配Android-10-11-上传-下载-进度监听

android 程序员 移动开发

Stetho简化Android调试(一)

android 程序员 移动开发

TCP_UDP协议详解(1)

android 程序员 移动开发

ViewPager2重大更新,支持offscreenPageLimit

android 程序员 移动开发

webview最全面总结(二)全面介绍webview用法

android 程序员 移动开发

区块链之共识算法系列——PoW(一)

Regan Yue

区块链 11月日更

这一篇 K8S(Kubernetes)集群部署 我觉得还可以

牧小农

kubenetes

TCP_UDP协议详解

android 程序员 移动开发

windows环境下JSP环境搭建:Apache2

android 程序员 移动开发

[译] 使用自定义文件模板加快你的应用开发速度

android 程序员 移动开发

[译] 如何将 Stackdriver 连接到智能家居服务器以进行错误记录

android 程序员 移动开发

QMUI框架简介

android 程序员 移动开发

React Native for Android 原理分析与实践:实现原理

android 程序员 移动开发

SLF4J 的几种实际应用模式--:SLF4J+Log4J 与 SLF4J+LogBack

android 程序员 移动开发

phonegap照相插件的使用

android 程序员 移动开发

svn 使用方法

android 程序员 移动开发

WebSocket学习

android 程序员 移动开发

Router_一款单品、组件化、插件化全支持的路由框架

android 程序员 移动开发

Thinkphp5使用model模型操作数据库

android 程序员 移动开发

tinker热修复gradle接入

android 程序员 移动开发

webRTC(十四):webrtc 端到端文本聊天

android 程序员 移动开发

[译] Android 的多摄像头支持(1)

android 程序员 移动开发

[译] Android 的多摄像头支持

android 程序员 移动开发

谷歌最好的程序员Jeff Dean:我用过 18 种编程语言_语言 & 开发_褚杏娟_InfoQ精选文章