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保有足够的期待。
|