技术开发 频道

谷歌首席架构师Bloch:Java可取代C++?

  Seibel:也就是说你写好使用API的用户代码,然后评审代码:“这就是我要的代码吗?”

  Bloch:对!有时候你都不用走到评审用户代码的这个阶段。写代码的时候可能就会有感悟,“写不出来,我忘了这部分API的功能了。”或者“这代码写起来太乏味了,一定哪里出错了。”

  这跟你多么优秀无关。不用API写代码,就不可能看出API有什么问题。设计了一个东西,使用了才知道:“哦,错的这么离谱。”如果这是在你浪费大量时间基于这个API写了无数代码之前的话,那么这就是一个重大的胜利。所以,我谈得更多的是测试先行编程和对API的重构,而不是重构API的实现代码。

  说到能够运行的最简程序,我完全赞同这种提法。API设计有一条基本原则:疑则不用。它必须是完全满足你关心的所有用例的最简系统。而不是说“把乱七八糟的代码堆在一起”。有很多格言警句说明了这点。我最喜欢的一条是:“简单没那么容易做到。”坊间认为就是Thelonious Monk说的,实际不是,是误传。

  没人喜欢烂软件。人们提倡“构建可运行的最简系统,然后毫不留情地重构”,而不提倡“写垃圾代码”,更不会说“不要做前期设计”。我曾跟Martin Fowler讨论过这个问题。他坚信,只有仔细推敲要做的东西,系统才会有合理的形状和结构。他说过,“不要在写代码前先写下247页的设计规范。”我很赞同。

  我不赞同Martin的一点是:我认为测试不能用来取代文档。只要你写了别人编程时可以利用的代码,你就需要做出精确的说明,而测试确保这些代码符合你给出的说明。

  所以两大阵营确实有些不同意见,但是我认为他们之间的鸿沟没有某些人想象的那么大。

  Seibel:既然你提到了Fowler,咱们就聊聊他。他写了很多关于UML的书,你把UML当设计工具用过吗?

  Bloch:没有。我觉得用UML做些图表让其他人理解起来可能更容易。但是说实话,我根本记不住那些组件应该是方的还是圆的。

  Google是否可以多用点Java

  Seibel:作为Google公司里面的Java程序员,你有没有想过Google是否可以多用点Java?如果不考虑现实因素,假如轻挥一下魔棒就可以把Google所有的C++代码用Java代替,这样行吗?

  Bloch:某种程度上是可以的。系统的大部分都可以用Java编写,而且现状,也是逐渐往这个方向发展的。但是对系统的绝对核心,例如索引服务器的内循环来说,性能上的一丁点儿提升都有巨大的价值。当这段代码运行在很多机器上的时候,你让它稍微快一点,那么无论是在经济上,还是从环保角度看,都会获得很大的收益。所以有些代码你恨不得用汇编来写,汇编就比C语言更好吗?

  我不是对某件事物特别虔诚的那种人。能用就好。我写了20年的C语言代码。从消耗多少程序员的时间的角度来看,使用更现代的编程语言更有效率,而且更现代化的编程语言更安全、更便利,表达能力更强。在大多数情况下,程序员的时间比计算机的时间更宝贵。但是当你的程序运行在成千上万台机器上的时候,就完全不同了。所以我们写的有些程序,使用那些可能不那么安全的语言,榨出每一点值得榨出的性能。现在程序员们使用的现代语言效率都差不多,如果有人说他们的语言效率高十倍,那么多半是在骗你。

  但是从工程师写程序耗时的角度去看,差异很大。首先,更现代的语言已经排除了大量的错误实践。其次,它们包含了大量的工具,可以提高工程师的工作效率。可以说这是一种文化,是人们在学校学的语言。但是它也是工作中的基础工程问题。例如,假如一种语言有宏处理器,那么就很难给它写出好的工具。解析C++比解析Java要难多了。

  现在,Google用Java写的代码比以前多多了。我不知道具体的数量,但就算还没有达到临界点,估计也快了。不过,各种语言都有多少行代码和在各种语言下执行多少个循环是有很大区别的。试图把索引服务器的内循环用Java改写很愚蠢,不值得称道。如果你是初创一个公司要做类似的事情,可以用Java或者其他现代的安全的语言来写大部分代码,但是在不需要它们的时候,不要用它们。我们有自己的工程基础架构。代码库、监控工具等所有的东西都维系着它。就算Java最终不能获得同等的地位,也会在这些系统中有很多用处,这就不错。我刚到Google的时候,还不是这样的。

  如果很早就着手建立公司的DNA,就能够获得巨大的成功,但是这也令他们很难换掉那些早期应用良好、现在已经过时的技术。我记得1982年左右,我在约克镇高地的IBM研究中心实习的时候,那里的主流还是批处理系统。甚至当他们已经开始做分时系统的时候,他们还用虚拟读卡机(编程卡片)、虚拟打孔器这样的术语交流。什么东西都用80列的记录。而DEC一直将思维禁锢在分时系统上。我估计微软也面对这样的问题,就是他们的思维能否超越桌面PC系统。

  Seibel:20年内,人们将会谈论Google为何只能在互联网上卖广告。

  Bloch:没错。毕竟,在Google还有一部分人认为Java太慢而且不可靠。有这种看法的原因很显然,那就是1999年左右发布的用于Linux的Blackdown Java(译者注:一个非官方移植的虚拟机),它确实又慢又不可靠。既有的看法总是很顽固的,很难改变。事实上Google在很多核心功能上使用Java,甚至包括广告。

  所以某种程度上,他们知道Java既快又可靠。但是在实际的搜索流程中,对机器循环最敏感的领域,所有的东西都基于C++,这么做很明显的一个原因就是公司的“基因”。这将在很长一段时间里影响着我们。

  Seibel:你实际编程中用哪些工具?

  Bloch:我就知道你迟早要问这个问题,我是老帮菜了,提这个都觉得丢人。Emacs的键盘快捷方式在我的脑子里面已经根深蒂固了。而且我喜欢写小的程序,代码库之类的。所以,我写代码的时候几乎不用现代的工具。但是我知道,很多现代的工具可以提高效率。

  写大程序的时候我确实使用IntelliJ,因为我们整个团队都在用,但是我不是这方面的专家。这个工具给我留下了深刻印象,我喜欢这些工具对代码做的静态分析。我找用Eclipse、NetBean以及FindBug的人来帮我审阅《Java解惑》,书中的很多错误陷阱都可以被这些工具自动检测到,太了不起了。

0
相关文章