Rock Star 2008 -- Joshua Bloch
这是一篇在今年的JavaOne会议期间对Joshua Block的访谈。作为闻名的Java guru,大家已经从Joshua的Effective Java,Java Collection Framework,...中获益了。相信,Joshua Block在访谈中的一些真知灼见,仍然会使大家受益良多。(2008.06.02最后更新)
简历:Joshua Block,Google公司的首席Java构架师,曾为Sun Microsystems公司的杰出工程师,由于Effective Java Programming Language Guide一书,他获得了Software Development Magazine极富盛名的Jolt大奖。在Sun公司时,他领导设计并实现了众多的Java平台特性,包括JDK 5.0的语言升级以及获奖的Java集合框架。他拥有卡纳基-梅隆大学计算机科学博士学位,目前还是Effective Java, Second Edition的作者。
Q:你和Brian Goetz将会有一个名为"撰写下一本伟大的Java技术书籍"(BOF-6588)的议题。写一本伟大的Java书籍需要做些什么?
A:这要看实际情况。你可以以书籍的形式介绍那些之前还没有被介绍过的重要知识,就如Brian Goetz和Tim Peierls 在Java Concurrency in Practice一书中所做的那样。或者,你也可以写一部对现有资料的原创讲解,使它能被所有未接触过Java的人所接受,就如Kathy Sierra和Bert Bates在Head First Java一书中所做的那样。你也可以先弄一大堆资料,然后提炼出其中的精华,就像Peter Sestoft在Java Precisely一书中做的那么出色。这还可以接着说下去。
Q:对于你写的Effective Java,开发者经常告诉我,那是他们最喜欢的Java技术书籍。你将二次贡献名为"More 'Effective Java'"(TS-6623)的议题,在那儿,你将谈论Java平台新近的最佳实践。让我们先了解一点儿它的情况。
A:我正在收集新出现在该书第二版中的素材。去年,我花了大量时间在谈论泛型,所以今年我仍将重点关注它,我确实有一个新的期望能够分享的泛型小窍门。
我也将介绍一些关于enum类型的有趣素材,并有一个针对延迟初始化的最佳实践的简明指导。是的,我还计划展示我们州长年轻时的一张祼照[1]。
一天的生活
Q:描述一下你在Google的一天中的生活。
A:那是个工作的好地方。我与许多来自世界各地的聪明人一起工作,那儿不缺乏挑战性的工作去做。 Google理解开源以及回馈社区的重要性,所以他们一直支持我在Java平台方面的持续工作。额外的好处就是他们因此而获得的好名声。
Q:你在Google吃的最好的一餐是什么?
A:嗯...可能是两年前在Cafe 7吃的烤鹌鹑?或者可能是在Pinxto吃的Shiro Maguro Sashimi?有些饮品也是很棒的。
Q:这些食物真的很好吃吗?
A:是的。我不是说在那儿我就没吃过差的食物,但总的来看,确实很好。
将"Bloch"作为动词
Q:如果你能将"Bloch"变成动词,就如已对"Google"做的那样,那么动词"Bloch"会是什么意思?
A:天啊,这是个很难的问题。可能是"写出好的API"?当然,这将不会发生,而我也乐于接受。在每一代中,只会有很少的人够得上用一个词去称呼,并且经常是一个形容词。如你所知的:牛顿的,笛卡尔的,莎士比亚的,就像这样的。
由于某种原因,这使我想起多年前看到的一则头条。当Miles Davis[2]逝世时,纽约时报上他的讣告说:"Miles Davis,小号手,去逝了;爵士天才,65岁,绝对的酷"。我也想到了自己,"是的,这就是一个总结。而且还没人能上这样的头条"。
最美的代码
Q:你所喜爱的代码是怎样的?或者说,你所见过的最漂亮的代码是什么样的?如诗般的代码?
A:我看过许多代码都能激起这种反响。就像真的诗歌一样,在某人看来很美的一段代码可能在其它人看来很丑陋。这儿有一段神秘的代码诗:
static int inverse(int val) {
t *= 2 - val * t;
t *= 2 - val * t;
t *= 2 - val * t;
t *= 2 - val * t;
return t;
}
正如它的名字所暗示的,该方法计算奇参数的乘法逆值,mod 2^32。换言之,对于所有的奇整数i,有i * inverse(i) == 1。它根据牛顿迭代原理。
有严格的证据表明这四个迭代--方法中非回转的循环--对于任何输入值都足够了。那么这是我见过的最漂亮的代码吗?不,但它确实十分的聪明。
如果你喜欢这样的东西,你应该去看看Henry S. Warren的书Hacker's Delight(Addison-Wesley,2003)。当你能看这本书时,要翻到"The Quest for an Accelerated Population Count"一章。在Osram和Wilson的Beautiful Code(O'Reilly,2007)一书中,当你手里也有这本书的话,也要读一下Jon Bentley 写的"The Most Beautiful Code I Never Wrote"一章。Jon写了许多诗歌般的代码。
最有趣的代码
Q:你能想到的最有趣的代码是什么?
A:The Daily WTF中满是有趣的代码。Bill Pugh也经常发给我一些由FindBugs发现的有趣代码。这儿有一个令人欣喜的例子--我发誓,它从未被透露过:
public Object getObject(java.util.Map<String,Class<?>> map)
throws SerialException
{
map = new Hashtable(map);
if (!object.equals(null)) {
return map.get(object);
} else {
throw new SerialException("The object is not set");
}
}
Q:代码是世界语吗?如果是,那为什么?
A:我认为音乐才称得上,其次就是数学了。因为音乐将自然语言与数学符号联系了起来。代码很像数学:创建具有良好可读性程序的很大一部分工作就是选择好的标识符名称,而这就要基于自然语言。
Q:哪位Java达人深深地影响了你?是在什么方面?
A:应该是Doug Lea[3]。他知道很多事情中的很多东西,多年来,他激发了我数不清的想法。他总有让人感兴趣的事情可说。并且他有一种不可思异的能力,能发挥出VM的最佳性能。幸运的是,他已教给我一些他的窍门。例如,Branch Free代码会运行的很快,缓存的作用将会终结,内联探索法(Inlining Heuristics)在性能方面有着巨大的效用。
Q:能给我们一个你创造的最让你感到自豪的代码例子吗?并解释一下为什么?
A:集合框架。虽远非完美,但多年来,已经证明了它的可维护性与优雅。而前面提到的Doug Lea构建的java.util.concurrent包中的许多部分就构建集合框架之上。并且在程序员的来信中,他们总是告诉我,集合框架是如何使他们的工作更加赏心悦目。它能使你写像下面这个程序那样的代码,这个程序通过标准输入流计算文件中所有的片语:
public class Anagram {
public static void main(String[] args) {
int minGroupSize = Integer.parseInt(args[0]);
// Read words from input and put into simulated multimap
Map<String, List<String>> anagrams =
new HashMap<String, List<String>>();
for (Scanner s = new Scanner(System.in); s.hasNext(); ) {
String word = s.next();
String alphagram = alphagram(word);
List<String> group = anagrams.get(alphagram);
if (group == null)
anagrams.put(alphagram, group = new ArrayList<String>());
group.add(word);
}
// Print all permutation groups above size threshold
for (List<String> group : anagrams.values())
if (group.size() >= minGroupSize)
System.out.println(group.size() + ": " + group);
}
private static String alphagram(String s) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
return String.valueOf(chars);
}
}
Q:当你感到困惑时,你会做些什么?
A:我会喝一杯美味的热咖啡。Google有很好的咖啡机,这些机器来自于Barefoot Coffee Roasters。如果不管用,我就会去走一走。如果还不管用,我就会去叫Doug Lea。
Q:你使用哪些网络资源,以紧跟Java技术。
A:规范,还有Google。无论走到哪里,这都能帮上我。
Q:是否有一种益智的训练或有趣的行为让你觉得能使你成为一名更好的开发者?
A:我认为数学和写作能使你成为更好的开发者。数学与编程一样,要求严谨的思维。而写作会强迫你去组织你的想法。数学和写作都训练了相同的审美机能,而这对于写出好的程序也是必需的。
Q:你希望在工科学校中你还应该学到哪些东西?
A:我希望我能更好地学会弹吉他,现在我弹的可不好。我希望能学一门外语,还有艺术史。当然,还想学一些商业和金融方面的知识。这样说起来,哥伦比亚大学会对我有更好的帮助。我会鼓励本科生们,当他们还有时间时,就要创造机会去获取更宽泛的知识。以后,他们会有足够的时间深入到其中。
译注
[1]这张"祼照"就是加利福尼亚州现任州长阿诺.施瓦辛格的健美祼肤照。
[2]Miles Davis,爵士乐大师。点击此处可以看到纽约时报上关于他的讣告全文。
[3]Doug Lea,java.util.concurrent的创始人,目前也是OpenJDK临时管理委员会的成员。
请关注下一篇译文:Rock Start 2008 -- Chet Haase