近日 InfoQ 荣幸邀约 Cay Horstmann,就 Java 最新形势和 Cay 的新书 Java 核心技术:卷一 & 卷二(第九版)进行探讨。
自 1995 年首版发布以来,Java 历经多次变更:从语言规约的扩充到 Oracle 并购 Sun 后所有权的变动。本次访谈的第一个话题是 Oracle 的 Java 管理。
InfoQ:您如何看待这些年来 Oracle 对 Java 的管理?可以谈语言特性,也可以谈商业运作,诸如在 JRE Installer 中绑定第三方浏览器工具栏。
Horstmann:我并不喜欢工具栏绑定。这一点 Oracle 表现得很矛盾。一方面,他们投入大量资源改进 Java,另一方面,他们又在做些不利于 Java 的事。过去很长一段时间 Java 的安全处理都很差劲,不过如今正迎头赶上。Oracle 的管理是把双刃剑。 社区在 Oracle 做出这种值得商榷的决定时不会有任何争议。与内部人员交谈时,他们会宣称,“我就这点权力,对该问题没有任何话语权。”而 Sun 决不会出现类似的问题。Sun 一度开放,情况不乐观时 Sun 会欣然承认需要改进。我琢磨着这点可能和 Oracle 内部文化相关。
InfoQ:所以 Oracle 会否认问题直到发现可行解?
Horstmann:我想那会是一种很好的处理方式,虽然不受待见。此外,Oracle 和 Google 的诸多诉讼会让很多人不喜欢 Oracle。
InfoQ:确实。整体看来,Android 有点像 Java 平台的大使。Google 选择了 Java,Java 的开发需求量会因此增加,Java 的整个市场渗透率也会随之提升。
Horstmann:诚然。Sun 不曾为 Oracle 留有任何有利市场。多年来,Sun 一直对 Java ME(Java 平台的微型版)手机寄予厚望,但人所共见,ME 日渐没落直至灭亡。此外,Sun 未发布智能手机提案。
InfoQ:你是一名作者,也是计算机系教授。你教 Java 是由于学生有学用 Android 开发的意愿,还是个人或校方的要求?
Horstmann:任何课程引进新语言都要付出巨大代价。任何语言的熟练掌握和高效运用都要学生付出一学期以上的时间。所以,课程设计时要有选择性。一方面,Java 有很强的适用性:从最简单的作业,到数据库课程,网络课程和 Android 移动开发课程。另一方面,与教学生十种语言相比,以 Java,C 和函数式语言等典型语言为例传授基本概念才是教师的职责。
InfoQ:你在移动开发课程中使用的是哪种语言?
Horstmann:过半的学生用 iPhone,因此,我想让他们有一些 iOS 开发经验,诸如他们所关心的如何让应用程序上机、上架。总体上看,课程会有 50% 的 Android,30% 的 iOS 和 20% 的 HTML5(移动 JQuery,PhoneGap 平台)。
InfoQ:这种分授方案在学生中反响如何?
Horstmann:这种多重视角大有裨益,学生们很感激。但最终,绝大多数学生更愿意在 Android 平台上工作。
InfoQ:你认为 Java 未来的落点在哪?基于 Android 的开发?
Horstmann:服务器端,特别是大型购物网站,还会用到很多 Java。我观察过周边的初创企业,有很多没有选择 Java。我不知道他们是否有特定原因。与这部分人交谈,问到“是哪些考虑使你在技术决策中放弃了 Java?”答案多是“我不知道,我不了解 Java。”这些公司中的整整一代年轻人都不了解服务器端 Java。像我会觉得境况堪忧。Oracle 并没有做出足够的努力来向人们证明最新发布的 Java 实际上很好用。Java 已不是一门艰深的学问。现阶段的 Java EE 很简单,支持工具极多。
InfoQ:就初创企业而言,Java 并不是因此不受待见。
Horstmann:Oracle 更倾向于为有能力购置昂贵设备的大型机构做调研。但很多创新,特别是硅谷中的创新,更多发生在小团队中。这部分人用 Rails,用 Node.js,而不会用服务器端 Java。有时这并非技术原因。有时连他们自己都不知道有何损失。
InfoQ:关于最新版本的 Java 7 或者即将到来的 Java 8,你认为 Oracle 是该致力于解决 “时尚因素”问题,还是该解决营销问题,比如如何营销服务器端的优势?
Horstmann:我认为 Java 服务器端的营销确实有问题。就服务器端开发而言,经营良好的语言应有广阔的市场,包括用这种语言处理问题得心应手,包括语言背后良好的工具支持。可极少会有人建议“可以试试 Java。相比若干年后时兴技术 X 可能遭遇的各类瓶颈,初用 Java 应该会更高效。”
InfoQ:是这样。小型购物网站的问题也许在于应用呈指数型增长时是否有必要从 Node 或 Rails 切换到一个“更正式”的环境。
Horstmann:是的。在我看,对 JavaEE 敬而远之并非幸事。即便开发小型项目,Java 也常常能相当快速且轻松完成任务。如今我所接手项目的用户数量多几千或上万,不会有百亿之众。我发现无论项目大小,很多人一概无脑选用像 Rails 之类的技术。这样做,你必须去找会 Ruby 的人。Rails 的那套技术是全新的,而找到 Java 开发者则相当简单。
InfoQ:你说的情况更多针对当前开发者还是大学新人?
Horstmann:大学新人。Java 在教育中相当普遍,而学过 Ruby 的人会很难找,无论这些人学 Ruby 是自娱自乐,还是工作所需。
InfoQ:你如何看 Java 随时代变迁而发生的变化?
Horstmann:任何一种想经久不衰的语言都应该具备用户现阶段需要的特性。比方现在,并发情境下,函数式库更为时代所需。没有这些特性不是不行,但这些特性会为 Java 8 锦上添花。就目前所支持的特性而言,Scala 可能更胜一筹,但 Scala 有其他问题,比方说复杂性。
InfoQ:也就是说,Scala 用户更多看重 JVM 平台,而并不想使用 Java。
Horstmann:如果你了解所做的事情,Scala 可能会更高效。一半或更少的代码就足够表达你的想法。有些在 Java 中你会因为繁杂而不愿尝试的方法,在 Scala 中就很简单。我很喜欢 Scala,但我偶尔也会为之担心。(用 Scala 编程时,)如果走错了一步,你可能要抓耳挠腮一会了。 多数情况下 Java 简单一致。我甚至记不得最后一次自问“Java 语句暗中做了什么”是什么时候。这条特性很有价值。
InfoQ:特别是在公司或团队环境中,从事人员会超过两三个。要求相关人员记得所有资料会十分困难。可预测性却是必须的。
Horstmann:确实。你不会记得 C++ 11 的所有特性。那种语言太繁杂。
InfoQ:Ruby 之类的语言呢?我是说你可以立刻着手,之后呢?
Horstmann:Ruby 本身并不提供更多选择。Rails 才使之真正规范化。也许你会花好几天冥思苦想某些 Ruby 谜团,可专家会告诉你,“这是它两年前的运行方式,现在的运行方式有很大不同。”
InfoQ:就 Ruby on Rails 所能提供的优点而言,你认为那些自称最小化 Ruby on Rails 的 Java 框架是否有效?
Horstmann:现在看来 Rails 解决过很多并无解决必要的问题。如果客户端通过移动设备、tablet 或 HTML 5 提供用户界面,用 Javascript 做渲染,Rails 的 HTML 模版会无用武之地。所以将来 Rails 是否会再度高速增长,我不知道。
InfoQ:书中是如何处理 Java 选材问题的?现在分上下两卷,如果知道当前语言的规模,你会作哪些调整?挑选主题的标准是什么?
Horstmann:因为要求涵盖所有内容,最初书的主题很多。若干年前初次设计时,Swing 和 RMI 是热点。这会是讨论这些内容的最后一版。下一版,即 Java 8 版中,我会更关注人们想达成的目标。Swing 或 RMI 在下一版中仍出现是不可想象的。最后一次用到这些技术是多久之前了?
InfoQ:书中涵盖了整个语言,显然不是简化版。开发新手或 Java 用户会对此表示感激,还是只关注卷一?
Horstmann: 一半以上的读者没买实体书。查阅销售记录时,我发现 Safari Books Online 是主要销售途径。程序员在那儿每次读几页。
InfoQ: 保持书中内容系统有序很重要,而书的厚度并不重要,读者可以从书中主动获取想要的知识而不必通读全本。
Horstmann: 确实如此。新版中也许不包含 Swing,但 Safari 仍会留有旧版。所以绝非 Swing 到了世界末日。实际上我更惊讶于电子版发行后快速增长的销量。计算机市场中这一现象已持续了一段时间。 我并未试着加入一些孤立环境中很难理解的长例子。有些书会这样做。他们渐渐扩充实例,这会让跳读变得很难。
我试着让每个人能直接从感兴趣的那一章节读起,而不必一定要先读过之前的六章。
InfoQ: 你已展望过 Java 8。在你看,最需要或者最应该被关注的特性是什么?
Horstmann: Lambda 表达式毫无疑问是一个。容器方面的改进是一个。这些会让日常开发变得十分简单。为充分利用多核而不加大程序员开发难度,并发方面的变化也很重要。Java 8 和 Scala 会让这一工作变得优雅。程序员呼吁,“噢,我想所有事情都并行。”你恰好有一种并发的解决方案,通过操纵一个类似 Linq 的队列轻松实现并发。这点将会十分重要。
InfoQ: 基本数据类型有必要消亡么?研究时我发现基本数据类型和包装类型间兴许存在共性。
Horstmann: 那就太好了。若干年前,我问过那段时间正研究这个问题的 Neal Gafter:即便基本数据类型相比范型添加了一整层复杂性,基本数据类型为何仍未消亡?他说存在这样一种无法等同 int 和 Integer 的情况。有人创建了类似 Integer(42) 的新对象并把它当锁来使用。这种情况下,如果你无法区分两个不同的 Integer(42),代码将会失效。 绝对的向下兼容看来并不理性。可交换情形下,int 和 integer 的差别应当是 VM 所能识别并优化的。
同样,对 VM 而言,int 数组和 integer 数组间的交换同样困难。
现在看来,整型和浮点型数值在最初就该当对象看,但 20 年前,基本数据类型听上去是个好主意。
InfoQ: 初次向学生介绍 Java 时,你会选用 Integer 么?
Horstmann: 不会,我用 int,因为很多库都用 int。我不会用太多时间区分两者。用容器时,自然会考虑包装类型。实际上这并不打紧。难道你会经常用 ArrayList 存储整型? Java 主要关注两方面。一方面,Java 门槛低,理解它无需博士学位。另一方面,Java 库非常庞大:总会存在一个完成任何你想完成功能的 Java 库。
很多语言不具备这样庞大的扩展库。比如 Python,和 Java 比,Python 的库相当局限。
和 Python 比,Java 还有一个好处在于向后兼容性。我赞成 Python3 的规范和优雅,但我不知 Python2 会坚持多久,而兼顾两者并不好受。
InfoQ: 庞大的遗留代码会产生问题。
Horstmann: Scala 会让你体会残酷性。似乎每隔半年所做的一切就会被全然颠覆,你将从头开始。
InfoQ: 确实。这种情况很多?
Horstmann: 是的。有些时候必须结束。但目前你必须全部重新编译,因为 Scala 并非二进制兼容。Scala 的语言特性存在足够的变化空间,而这也正是修正良机。
InfoQ: 这对语言发展极好但不利于继承。
Horstmann: 是的。那也是为什么有时他们会说“好吧,我们之前已经做得足够有趣,现今我们将使之平稳。”
InfoQ: 全面审视后,若由你来负责 Java,你认为 Java 所要克服的最大障碍是什么?(舍弃或改良)
Horstmann: 也许是基本数据类型。基本数据类型带来的复杂性非常烦人。还有什么我真正讨厌并想摆脱的?我从未想过。你也知道,Java 语言特性不算多。但我讨厌漫长的启动时间,那妨碍了 Java 被作为脚本使用。这点是我从未关注的。也许是 Java 9,也许是我的孙子活着时,我希望 Oracle 能通过模块化关注这点。这限制了 Java 的适用范围。 另一件与 Java 本身无关而与环境相关的问题是安全。用户正在流失,因为 Oracle 无法像承诺所述的那样更新 JVM 客户端。从来没有人会抱怨 Flash 不安全,因为 Adobe 每三周都会推送给你一个新版本。而就我 Windows 机器上运行的 Java 而言,一打开它我就会看到一个 Java 需要更新的小图标;但每次点击图标,都会报出无法执行的错误。这么多年过去了,一切如旧。
InfoQ: 我从未想过能这样比较 Java 和 Flash,但这观点不错。Adobe 相比运行时 Java 似乎有更好的解决方案。
Horstmann: 是的。只要单击按钮 Flash 就会更新。而 Java,则是报错。就我的观察,几乎每个学生的机器中都有一些旧版 Java 等待移除。
InfoQ: 活跃开发者也许更容易找到所安装的程序并保证程序正确安装,但可以肯定的是,远程诊断会带来困惑。
Horstmann: 确切而言,是的。分析之后,你会为常规用户提供什么样的补救方案?“是时候格式化硬盘了?”
InfoQ: 你还想改变其他的一些么?
Horstmann: 如果你是在问哪些不好的语言特性需要消除的话,用不到且不希望存在的特性有很多,比如带标号的 break。为了消除偶发复杂型,这些特性是我想舍弃的,但这些特性极少使用,所以并不妨碍。另一方面,并非任何特性我都想舍弃,有些特性确实代表了 Java 的设计。至于添加特性,噢,另一件我想舍弃的特征是属性。我不喜欢 getter 和 setter 方法。 这并不像解决世界饥饿,但没有模版也不错。我喜欢 Scala 的一个原因是,你能在几行内定义一个简单类。
InfoQ: Java 的模版类型常被指责。
Horstmann: 是的,但让我们认真回顾下。人们赞誉 Java 是新一代 Cobol。Java 横空出世时 Cobol 正濒临灭亡。还记得有段时间,世界上一多半的程序员都用 Cobol 编程,几年之后,没有人再用 Cobol。那种变化非常非常快。至于 Java,我认为还有很多事情 Java 可以做而 Cobol 中不存在的,比如,具备一个可移植性强的世界一流虚拟机。由于这些原因,我认为 Java 会存在更久。 另一件事情是,Cobol 消亡时,有一些更好的替代品。可目前,什么值得人们趋之若鹜?我的意思是,并不存在其他值得你高呼哈利路亚的替代品。
InfoQ: 是的。我指其他一些语言。比如 C++ 圈内,C++ 的自我复兴最为引人注目。
Horstmann: 你想用 C++ 编程么?
InfoQ: 如果你是 C++ 程序员,也许会更认同,但我不知道对新程序员而言,那是否足够吸引。再看 C#,很多用户觉得 C#优于 Java,而这部分用户中很多是程序员,这部分人认定微软将放弃 C#转向支持更新的技术。
Horstmann: 综合看来,C#就是 Java。C#具备一些 Java 不具备的特性,但如果某一特性真的重要,Java 会很快具备。
InfoQ: 但对 Java 程序员而言,使公众接受似乎并不够。如果你是 C#拥护者,会很高兴。但绝大多数阵营都已分化。程序员新手并非从已分化阵营中来。那之后,尽管我不想用悲观的腔调说,但你只会得到……
Horstmann: 市场定位。
InfoQ: 是的。不同的大小,不同的竞争语言群体。
Horstmann: 是的,从这一点看,没有语言能一统天下。若你能找到那么一种语言,告诉我,我会写下一本书。
InfoQ: 有很多新语言,其中一些至少小范围内很流行,但没有一种广泛流行。现在每种语言都有支持者和批评家,但没有真正的狂热者或是或仅仅推动任何事。
Horstmann: 广泛流行很困难。不光是语言。而今,人们期盼一种合适大小的库,一个虚拟机。直接在裸机上运行语言的时代已告结束。一些你能在 VM 上做的优化,像 Objective-C 之类的语言想都不要想。JavaScript 运行得相当好,他们让虚拟机更具生气。
InfoQ: 几乎只有两类主流库。一类静态类型推断为主,希望得到更多语言特性。另一类追求速度为主。两类库间存在重叠而不存在共性。
Horstmann: 这点也不错。我认为强类型语言能提供更多。看看 Google 为 Dart 所做的就知道了。他们试图弥合动静态间的区别。那确实是一条很有趣的路。但那些是否会是下一代主流语言的竞争者?我认为 Java 还会强势一段时间。
InfoQ: 似乎每次 Java 经历过一段沉静期后,一种新技术就会重新使之扬名。从伪革命性的 applets,到原生 web 应用,再到目前的 Android。似乎 Java 永远有一个领跑者促使语言前进。
Horstmann: 另一个 Java 会持续一段时间的原因在于 Java 是开源的,其专利会很快失效。专利有个妙处,20 年之内保值。
InfoQ: 也许正有下一个领跑者。十分感谢,祝好。
Horstmann: 客气,谢谢。
关于受访者
Cay S. Horstmann是《Java 核心技术,卷一 & 卷二》,《快学 Scala》(Addison-Wesley, 2012) 的作者, 《JavaServer Faces 核心编程》第三版 (Prentice Hall, 2010) 的共同作者,是圣荷西州立大学的计算机系教授,是一名 Java Champion,也是各类程序员会议上的活跃讲演者。
感谢张龙对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论