大家谈 18 岁的 Java——周志明:多语言协作至今仍是一个被严重忽视的优势

阅读数:4245 2013 年 6 月 8 日

话题:JavaScala语言 & 开发

2013 年,已经进入第 18 个年头的 Java 仍然是 InfoQ 上最受欢迎的话题,最近的《详细分析 Java 中断机制》、《关于 Java 性能的 9 个谬论》、《深入理解 Java 内存模型》等系列文章,一直占据 InfoQ 阅读热榜的首位。同时,今年 7 月的JavaOne购票入口)再次选择了中国,7 月 22-25 日将在上海世博中心举行连续 4 天的会议,话题涵盖核心 Java 平台、JavaFX 与用户体验、Java EE 和 Web 服务 / 云,以及 Java ME/Java Embedded/Java Card 等技术领域。

2013 年,在云计算、大数据、移动互联网等话题占据了人们所有的注意力的时候,Java 的状态到底如何?近期,InfoQ 中文站将对业内几位资深 Java 项目作者与书籍作者进行采访,了解他们眼中 Java 的现状,以及他们对 Java 未来的看法。

今天受邀参与采访的嘉宾是远光软件开发部总经理,《深入理解 Java 虚拟机》、《深入理解 OSGi》的作者周志明(@Iam 周志明)。

InfoQ:Java 语言给您留下的最初印象是什么?您最初的 Java 项目是什么样的?

周志明:我在大学以及刚开始工作时,并不使用 Java 语言。第一次接触 Java,是参与一个 MIS 项目,采用 JDK 1.4,EJB 2、JSF 1 作为技术平台,IBM WSAD 作为开发平台。

那时候对 Java 的感受很矛盾,一方面感觉 Java,准确的说是 Java EE 确实很规范、完善,框架和容器了提供很多功能,使用者大部分的技术性需求确实都考虑到了。另一方面,感受是 Java EE 很烦很繁,经常怀疑是不是必须把事情搞得那么复杂,最简单一个 SessionBean 至少要写 3 个类还要做一番配置,WSAD 虽然能帮忙做很多工作,但是又慢得一塌糊涂。"理想很丰满,现实很骨感",相信这就是那时候很多人的感受。

InfoQ:您现在接触的 Java 项目跟那时相比,有怎样的变化?

周志明:现在的 Java 项目普遍从“迷信”趋于“理性”,以前的 Java 项目从迷信 EJB 为代表重容器服务时代,到后来迷信 without EJB 为代表的 SSH 时代,再到现在各种技术、框架都趋于成熟后,理性选择的时代。现在我接触的很多项目,除了 Spring 还被普遍采用之外,已经没有什么必然的技术存在了。

另外一个变化是现在的项目已经把非交付代码的需求提升到很重要的位置,单元测试、CI、Maven 等几乎成为项目必不可少的一部分。

InfoQ:您是否会推荐您在 Java 项目中的年轻程序员去掌握其他编程语言?您的首选推荐语言是什么?

周志明:我认为“掌握其他语言”不是推荐不推荐的问题,Java 程序员应该、必须学习掌握至少一门 Java 以外的语言。从互联网到企业应用,从手机、移动设备到分布式服务、从界面到后端,目前 Java 都有涉猎。使用一门语言包办绝大部分需求,对这门语言本身来说是一件好事;但对于人来说,这何尝不是一个单调的世界。熟练掌握一门语言的语法、框架、工具之后,要更进一步,或者说要精通这门语言,那会遇到很多问题,不得不站在语言之外去看去思考,才能避免“只缘身在此山中”的困境。

举一些例子,譬如去年发布的 Java 7 中,其中一个新增的特性是加入了 invokedynamic 指令和 java.lang.invoke 包(JSR-292)。仅在 Java 语言范围内,很难理解为什么需要添加 invokedynamic 指令?java.lang.invoke 和 java.lang.reflect 有什么区别?再譬如为什么有许多 JIT 的代码优化,尤其是激进优化,JIT 编译器能做,而 GCC 这些静态编译器不能做?没有其他语言的对比,这些问题都不容易想清楚理透彻。

InfoQ:对于一些从新锐编程语言开始入行的年轻程序员,比如 Ruby 程序员,您是否会推荐他们了解 Java?为什么?

周志明:如果主要使用的是 JRuby,那学习 Java 还是很有必要和价值的。否则,是否要学习 Java,我认为首先要取决于个人兴趣。若没有足够动力,仅仅从语法层面了解 Java,简单写几个 DEMO,那 Java 并没有什么可取之处,甚至可以说 Java 的语法已经落后于许多新生代的语言,也落后于它的竞争对手 C#(随着 Project Coin 和 Lambda 的加入,Java 的语言能力会改善一些),以至于让人产生 Java 语言非常啰嗦的误解。我认为 Java 最值得学习的是它极为完善成熟的生态系统,几乎所有你感兴趣的领域,都能找到对应的开源项目,而且在不少的技术领域中,存在着经过长期验证,蕴含精妙思想,值得学习阅读的项目。

InfoQ:不少传统的 Java 应用开发者最近都开始尝试 Scala、Node.js 等新的编程语言,编写出来的应用在编写效率、资源消耗等方面相比 Java 有很多优势。毫无疑问,新技术大量出现,老技术的适用范围会被部分替代。您认为 Java 的应用场景有哪些适合被替代,哪些不适合被替代?

周志明:说 Scala、Node.js 对比起 Java 有编写效率的优势,这点在开发处于中小型规模时,我是认同的。但是在资源消耗上,以相同的算法思路为前提,Scala 和 Java 都是 JVM 语言,将很难找到论据证明前者比后者性能有显著提高。而当开发规模膨胀到一定程度,我相信 Java 在规范、协作和性能调优上还是占有很大优势。许多著名应用都证实了这一点,如 Yammer 从 Scala 转 Java、Twitter 从 ROR 转 Java 等。

因此我认为关注快速成型的、中小型的互联网应用,新生代语言将会一定程度代替 Java,但是在大型应用,尤其是企业应用上,Java 的地位仍然难以撼动。

InfoQ:JVM 下多语言协作开发是否能够最大化地发挥 Java 自身的优势?

周志明:毫无疑问,多语言协作至今仍是一个被严重忽视的优势。许多人认为 Java 之所以基于虚拟机运行,目的仅是来满足 Java 语言跨平台的需要。这其实只对了一半,看那些没有跨平台需求的 C#、VB.net 语言,同样运行于 CLR 虚拟机之上,这样做的目的就是为了支持多语言。

Java 平台上的多语言混合编程正成为主流,每种语言都可以针对自己擅长的方面更好地解决问题。试想一下在一个项目之中,并行处理用 Clojure 语言编写,展示层使用 JRuby/Rails,中间层则是 Java,每个应用层都将使用不同的编程语言来完成,而且,接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生 API 一样方便 ,因为他们最终都运行在一个虚拟机之上。

InfoQ:您觉得 Java 语言自身存在的挑战是什么?

周志明:Java 语言最大的挑战来源于自身。Java 一直引以为豪的社区管理(基于 JCP 管理)模式,利于集合多家厂商的力量,对 Java 语言的发展起了至关重要的促进作用。但是今天这种模式对 Java 的发展反而产生了制约。JCP 执委会中每个成员,基于自己的商业利益,都希望在 Java 发展方向上有更大的话语权,过于庞大的决策群体和决策流程导致 Java 患上了“大公司病”,前面提到的 Java 语法是一个例子,C# 刚刚发布的时候是参考模仿过 Java 的,但到今天微软一家掌控的 C#,语法先进程度早已远远超过了 Java。另一个例子是 Java 的模块化规范,JSR-232、JSR-277、JSR-291、JSR-294 等技术提案几乎成了 Oracle 与 IBM 为首的厂商的商业斗争,导致 Java 的模块化进程一拖再拖。其他的例子还有 Oracle 与 Apache 关于 Harmony 的 TCK 授权之争、Oracle 与 Google 关于 Android 的 Java 授权之争等等。由于掺杂着越来越多的商业利益,导致 JCP 和 Java 的活力在逐渐减弱。

InfoQ:一旦 Java 8 走向成熟,是否可以支持现有系统向 Java 8 的成熟迁移?

周志明:尽管 Java 8 已经发布在望,但距离成为商用主流版本还有一段相当遥远的路。据我所知,目前还有许多企业信息系统甚至还在使用 JDK 1.4。Java 的每一个版本都是与之前版本保持兼容的,即使有少量不兼容的地方,修改成本一般也不大。迁移到新 Java 版本的最大的牵绊在于对新版本特性和虚拟机稳定性的考量,以及以前在生产环境中投入的成本两方面,例如用户已经够买了 Weblogic 10,没有特殊需要的话,那就一直用 Java 5 好了。

但是如果以“一旦 Java 8 走向成熟”为前提来讨论的话,Java 8 还是相当吸引人的,且不说 JVM 层面上的性能改善措施,光从功能上讲,即使 Jigsaw 被裁,剩下以 Lambda 为首的一系列改进仍然让人对 Java 8 保有足够的期待。

感谢张龙张逸提供采访问题。