Scala 探秘:专访 Java Champion Cay Horstmann

作者:Janice J. Heiss

了解 Scala 为 Java 开发人员提供了哪些功能。

2013 年 6 月发布

Scala 是一种面向 Java 虚拟机 (JVM) 的静态类型对象-函数式编程和脚本语言,最近好评如潮。著名的 Java Champion Dick Wall 评价 Scala“几乎具备我认为语言中应该包括的一切元素。”Wall 是一位 Scala 培训师,他曾撰文写道,一旦跨越了初期的学习障碍,“开发人员通常会发现,使用 Scala 的工作效率比使用 Java 高出数倍。”

最近,Java Champion Cay Horstmann 带着他备受称赞的新书《Scala for the Impatient》加入了支持 Scala 的行列。为这本书作序的不是别人,正是 Scala 创始人 Martin Odersky,他的评价是“阅读这本书是一种享受”和“Scala 最佳入门教程”。Odersky 非常喜欢这本书的基本概念,甚至问 Horstmann 能否将第一节放到 Typesafe 网站上供大家免费下载,Horstmann 欣然接受了这个提议。

Horstmann 是圣何塞州立大学计算机科学系教授,经常在计算机行业会议上发表演讲。他撰写了许多关于 C++、Java 和面向对象开发的书籍,其中最著名的或许是他与 Gary Cornell 合著的《Core Java》系列。在职业生涯早期,他在一家互联网创业公司担任过 4 年的副总裁兼首席技术官。该公司最初只有一间小办公室和 3 名员工,现在已发展成一家上市公司。他拥有密歇根大学数学博士学位。

我们对他进行了采访,了解他对 Scala 的看法。

Cay Horstmann
Cay Horstmann

Oracle 技术网:假如您是一位经验丰富的程序员,寻求更好的表现力。Scala 能为您提供什么?

Horstmann: Scala 的优点体现在多个层面上。例如,可以用更少的样板代码编写类,文件和 XML 处理更简洁,并且可以用更完美的构造取代集群上繁琐的循环遍历。通常情况下,该级别的程序员报告说用 Scala 编写的代码行数约为 Java 的一半,这一点不容小觑。另一个切入点是,如果您想使用基于 Scala 的框架(如 Akka 或 Play),可以将它们与 Java 结合使用,但使用 Scala API 效果更佳。

“您可能对于自己问题领域中的下一个优秀框架有自己的想法。当然,您可以使用 Java 编写该框架,但 Scala 可以为您提供更多工具,让您的框架更便于开发人员使用。”

Cay Horstmann
Java Champion

您可能对于自己问题领域中的下一个优秀框架有自己的想法。当然,您可以使用 Java 编写该框架,但 Scala 可以为您提供更多工具,让您的框架更便于开发人员使用。

还有一个我非常重视的用例。我经常进行一些探索性编程、交叉分析数据集或者将 XML 从一种格式转换成另一种格式。借助 Scala REPL(读取/求值/打印循环),在混乱的真实数据世界中另辟蹊径,快速想出解决方案。

Oracle 技术网:网络评论员 K. Ferrio 说,《Scala for the Impatient》与众不同之处在于它没有一上来就介绍函数式编程;而是先寻找与 Java 和 C++ 程序员的共同话题;快速介绍 Java 和 Scala 之间可重新对应的特性的区别,然后才开始介绍新概念。是什么指导您采取了这些战略?

Horstmann:“很久以前”,我读研究生时做过相当多的函数式编程。我仍然喜欢 Lisp 和 Scheme,但是在我毕业后不得不解决实际问题时,出于许多实用性原因,我并不经常使用这两种语言。说实在的,面向对象的编程在大多数情况下都非常有效。因此,当我看到一些 Scala 书籍告诉读者他们的选择是错误的,应该为此感到后悔时,我觉得这有点儿太自以为是了。为什么不告诉读者 Scala 不仅可以帮助他们进行面向对象的编程,还可以为他们提供另一套基于函数式编程的工具呢?

Scala 与理论

Oracle 技术网: 您这本书没有详细介绍 Scala 的背景理论。关于 Scala 理论,开发人员最需要了解什么?

Horstmann: 有些人第一次接触这些理论就可以学得很好,但对于大多数人来说,包括我自己在内,示例的效果更好。当然,您上大学或者通过技术书籍学习时,通常先看到理论,然后,如果您真的很幸运的话,会看到一个应用。您刚才是不是感觉很茫然?那是因为我没有举例。

这里有一个例子。解释 map 函数时,我不会说它通过对每个元素应用一个函数将一个集合转换成另一个集合。相反,我会这样介绍:

val names = List("Peter", "Paul", "Mary")
names.map(_.toUpperCase) // List("PETER", "PAUL", "MARY")

现在,您亲眼看到 map 转换了一个列表,您大致可以猜测 _.foo 意味着“将 x 映射到 x.foo 的函数”。我刚才做了什么?我举例说明一些内容,而不是喋喋不休地讲理论。

我再举个例子。我现在在学习法语,顺便说一下,法语比 Scala 复杂得多。语法书上说,不能在复合介词后面使用‘dont’(在法语中相当于‘which’)。这条看似武断的规则令我感到非常困惑,但幸运的是,这本书马上举了一个例子,因为作者担心读者在没有例句的情况下很难掌握这条规则。

理论很好 — 但不适合学习新东西。我们这些碳基生命形式更愿意通过经验来学习,而不是通过理论。在我们习得一些知识之后,可以利用理论更轻松地学习下一个内容。我们人类就是这样。

Oracle 技术网:如果不掌握 Scala 背后更深层次的概念和理论,能成为一名优秀的 Scala 开发人员吗?

“Scala 经过精心设计,这样您能够使用非常有用的功能,而不必担心理论。”

Cay Horstmann
Java Champion

Horstmann: 当然可以。大多数 Java 开发人员只是大概掌握了重载解析或泛型通配符工作原理,但这并不影响他们对这些特性的使用。我总是觉得很滑稽,与 Rails 开发人员交谈时,尽管他们对 Rails 所基于的 Ruby 元对象协议知之甚少,但他们依然能够非常高效地工作。我认为,要求所有用户都精通深层理论的语言在设计上肯定有问题。知晓更深层次的概念和塑造语言是语言设计师的工作,这样程序员只需做正确的事,而不必成为理论家。幸运的是,Scala 经过精心设计,这样您能够使用非常有用的功能,而不必担心理论。

Oracle 技术网: 人们最喜欢您这本书的哪部分?

Horstmann: 令我非常惊讶,是练习。当我写《Core Java》(第一本关于 Java 的严肃书籍,写于 1995 年)时,编辑严肃地对我说“不要章节编号,不要练习,否则人们会认为这是(停顿了一下)一本高校教材。”但是在这本 Scala 书中,我说过,“无论如何,我都会再次尝试提供练习。”我收到了很多的正面反馈,读者真的喜欢尝试运用他们学到的新知识。

关于 Scala 的误解

Oracle 技术网: 许多开发人员刚接触 Scala 时都有点儿担心。您遇到的关于 Scala 的最大误解是什么?

Horstmann: 我认为许多开发人员之所以害怕,是因为有人告诉他们这种语言的不足之处是使用起来很复杂。你知道吗?这种语言的不足之处的确是使用起来很复杂。就我个人而言,我只是避开这些不足之处。您想知道哪种语言真的很简单,没有缺点吗?那就是 Scheme。

因此,在实际工作中,您可以选择精致、简洁的 Scheme 或 Java 1.0(无内部类或泛型),也可以选择可能异常复杂的 Java SE 8、C# 4.0、C++ 11、Apple 的 Objective-C 实现或 Scala。

Oracle 技术网: 您在书中写道,对于希望在 Java 和 C++ 之外有其他选择的开发人员来说,Scala 无疑是最具吸引力的。为什么?其他选择是什么?

Horstmann: Clojure 相当不错,但我发现它的 Lisp 语法有点讨厌,似乎非常专注于软件事务内存,这对我来说不是那么有用。而且它不是静态类型的。我想喜欢 Groovy,但实际上它令我很困惑,它的语义似乎定义的不够完善,变来变去的。而且它不是静态类型的。是,有 Groovy++,但是它更粗犷。

有几个竞争对手,例如 Kotlin 和 Ceylon,但是到目前为止它们还没有得到真正运用。

因此,如果您想在 JVM 上使用目前已存在的静态类型语言,Scala 的确是一个实用的选择。很高兴看到 Scala 是这样一个不错的选择。

推动 JVM 发展

Oracle 技术网:Java Champion Dick Wall 表示,相比于其他 JVM 语言,Scala 推动 JVM 发展更难。“Scala 试图在各方面都超越 Java,”Wall 说道。“它更面向对象、更函数化、更偏向静态类型、更灵活且更简洁,在许多其他方面,它提供了更多可能。”您做何评论?

Horstmann: Dick 说的没错。幸运的是,作为语言使用者,您不必太过担心。事实上,由实施人员做这种推动工作。您只需加以利用即可。有人可能认为二十年前设计的 JVM 可能太陈旧了,新的 VM 可能会更好。但不是每天都能设计出高性能的 VM,Scala 开发人员正在使用 JVM 做正确的事。

Oracle 技术网:Scala 是不是比 Java 更复杂?

Horstmann:它既更简单,又更复杂。使用 Scala 时,您不必过多担心 intIntegerarraysArrayList,或者单一抽象方法接口与函数。但是,Scala 有许多复杂特性。我同意 Brian Goetz 的观点,要让 Scala 参考达到 Java 语言规范的详细程度,可能需要相当长的时间。

Oracle 技术网: Dick Wall 还说道:“Scala 开发人员通常发现,一旦跨越初期的学习障碍,在大型项目中使用 Scala 的工作效率比使用 Java 高出数倍。”您也是这种感觉吗?

Horstmann: 当然,这来自两个方面。首先,摆脱枯燥的样板是种解放。性能提升了 2 倍。其次,因为可以使用 Java 中没有的工具,所以能构建自己的结构,进而减少您自己以及您为之提供服务的程序员的工作量。

Oracle 技术网: 是不是某类 Java 开发人员比其他人更适合学习 Scala?具备什么技能集的开发人员最适合学习 Scala?

“如果您想知道为什么 Java 中都是那种样板,以及怎样才能提高工作效率,为什么不试试 Scala 呢?”

Cay Horstmann
Java Champion

Horstmann: 我想有些开发人员只是上班工作,然后下班回家,他们不会从 Scala 中获益太多。但总体而言,我发现 Java 程序员好奇心很强,他们想知道下一件大事是什么,能够为他们做什么。因此,如果您想知道为什么 Java 中都是那种样板,以及怎样才能提高工作效率,为什么不试试 Scala 呢?即使您不是每天都使用它,您学会的语法也会让您成为一名更高效的 Java 开发人员。

Oracle 技术网: 作为开发人员,Scala 在您的生活中发挥什么样的作用?您如何利用它?

Horstmann: 就像我说的,我非常有策略性地使用 Scala:对数据和 XML 格式进行转码。我正在研究一个非常棒的框架,可以用来制作图表和示意图,我通常需要在我的书里用到这些东西。

Oracle 技术网: 人们常常抱怨说 Scala 在 IDE 支持上比较薄弱。最近有什么改进吗?

Horstmann: 问题是“相比什么而言?”Java 拥有非常强大的 IDE 支持,Scala 仍在努力追赶。不过,我最近在使用 Python 和 Objective-C,发现它们对 IDE 的支持还不如 Scala。(是的,我正在考虑 XCode。据说很不可思议,不知道是否的确如此。)

Scala 2.10 更新

Oracle 技术网: Scala 2.10 的最终版本于 2013 年 1 月 4 日发布。您一直在用这个版本。请给我们介绍一下您在书中未提及的一些新功能的最新消息吧。

Horstmann: 我一直被动态调用所困扰,它让您可以添加类似 Ruby 风格的功能。我有一个研究生,他用过宏功能,看起来还有待进一步开发。通过宏实现有趣的功能需要大量工作。我的确非常喜欢字符串插值 — 不再有 "label:" + value + "another label:" + anotherValue 之类的输出语句。总之,这是一个增量更新。

Scala 让我喜欢的一点是愿意尝试新功能,将新功能放在开发人员面前,有时会说“或许效果不那么好”,然后解决问题。在 Java 中,所有理念都不会消逝,无论多么糟糕,因为向后兼容性是核心价值。Scala 模型看起来更符合人们使用软件的方式,真的很有效。

另请参见

关于作者

Janice J. Heiss 是 Oracle 的 Java 策划编辑,并且还是 Java Magazine 的技术编辑。

分享交流

请在 FacebookTwitterOracle Java 博客上加入 Java 社区对话!