Java 8即将正式发布,从早期版本中,我们已经可以领略到一些令人兴奋的特性。但是开发者Andrew C. Oliver表示,尽管如此,Java语言在某些特性上还是落后于.Net。比如,Java 8中最令人期待的Lambda表达式,在2007年发布的.Net 3.5中已经存在了。他认为,.Net已有的和即将到来的特性要比Java 8优秀得多,如果Java 9再不做一些大的改进,那么Java落后于.Net就不止一点点了。
关于更新速率
微软有能力做出更快的改进。我记得在很早期的时候,微软能做到每周都更新数据库API:从ODBC、RDO、ADO到OLEDB等。自从出现了.Net之后,微软便达到了一种前所未有的更新速度。
但是Java为什么落后这么远?在早期的时候,Java的发展也是非常快速的,从Java 1.0.2 到 Java 1.1,仅仅一年时间,我们就看到了Java彻底地改变。从Java 1.1到Java 1.2只用了一年半时间,而Java 1.2.2只用了7个月的时间(这是一个重要的版本,只是使用了一个小版本号)。而在10个月之后,具有关键意义的Java 1.3问世,这也正是Java发行的第一个带有垃圾回收的版本。
Java 1.4为我们带来了NIO和正则表达式,但在之后不到两年的时间里就被取消了。Java 1.4.2版本带来了用于多核环境的垃圾回收器。Java 1.5带来了可用于生产环境的并行和并发GC(垃圾回收)特性,它还添加了更重要的并发和NIO功能,不过这一过程花了一年多的时间。
总的来说,Java还是有不错的表现的,Java 6使锁变得更廉价,但其在本质上和Java 1.5是一样的,还是让用户多等了2年时间。Java 7是第一个对底层VM技术做出重大改变的版本,同时还给用户带来了invokedynamic特性——用于在JVM上更好地连接其它语言,但是在两个大版本的更新之间用了大概5年时间,这个进度着实有些太慢了。
为什么Java进展缓慢?
对于这个问题有一个简单的解释:Sun并不是一个实力超群的公司。Java创造于互联网繁荣时期,而那个时候Sun正在出售Sparc业务。
之后,互联网经济不景气,Sun决定持续加大其在硬件业务中的投入。Sun比较擅长创建生态系统,但它就是无法创造出用户需要的产品。Oracle是Sun的后继者,擅于彻底毁坏生态系统,最终吞并/摧毁圈内的同行,还会开发出高利润的产品来取代同行。
Oracle曾在一份简洁的公开声明中称:“我们都知道,由于各种商业和政治原因,该版本(Java 7)花费了不少时间。”
当然,在分析Java的问题上,我们还必须考虑Sun公司的财政困难以及Java系统周边的东西。Sun公司违背了其提交Java进行标准化的初衷,它创造了自己的“标准”委员会,即JCP(Java社区进程)。随着时间的推移,JCP尽管在一定程度上已经开放,但是无论是Sun还是现在的Oracle,都拥有绝对的否决权,它们可以忽略规则,做任何想要的事情。
什么阻碍了JCP?不是开放性,而是利益冲突。我记得当时参与EJB3规范制定的某个供应商,它习惯延迟规范的进度。这是为什么呢?这些供应商需要购买或开发一个产品来集成到它们的应用服务器中,如果下一代JavaEE规范已经发布,那么它们也必须尽快推出产品,它们不希望比市场晚。
协调产品的发布,对于一个公司来说都有些难,更不用说几个公司了。因此,我认为Java最大的问题并不是由于JCP造成的。
抛弃或分离一些东西
Sun已经成为了过去时,现在Oracle是“老板”,那么为什么Java版本的发布周期仍然需要这么长?最简单的解释是——Java太大。大项目往往意味着进展比较缓慢,且充满风险。下面我们就来看看如何将Java变得小一些。
首先,Oracle必须摆脱其“心爱”的客户端技术。当然,目前还没有更好的Swing和JavaFX的替代品,但是使用这些技术意味着需要把你捆绑在Oracle的平台上——至少目前是这样。
我尚不清楚,目前JavaFX或客户端Java为Oracle带来的战略上的意义是什么,它们似乎被设计用来和VB6、Flash或一些4GL(第四代语言)进行竞争的。在现代的、多平台的环境中,大部分人会认为触摸和滑动操作会更酷一些,而JavaFX与这种趋势是不相匹配的。为什么我们需要使用客户端Java来阻碍服务器端的发展,并且还有可能伴随着各种风险,比如持续数月的Java零日漏洞安全问题以及关于如何禁用Java的讨论。
如今Java语言已经不再和Java平台一样重要。从Java平台中砍掉Java语言,并根据自己的时间表进行发布,这对于Oracle来说可能更容易——Oracle推出的开发工具不是Java业务的重要组成部分,并没有为大部分的Java开发者所使用。
Java平台上有多种语言,比如JRuby、Scala等等。以高性能和可扩展的方式来支持这些语言和技术,对于云计算来说非常重要。如果云计算是未来,那么Oracle应该首先考虑Java平台。而目前所支持Ruby、Scala、甚至Node.js的Java平台似乎是一个“锚”,而不是产生创新的“引擎”。
比起Mark Reinhold(Java SE规范领导者,目前在Oracle公司),我更希望由Charles Nutter(JRuby创始人,目前在Red Hat公司)和Martin Odersky(Scala创始人,目前在Typesafe公司)来决定在Java平台中添加哪些特性。我并没有不尊重Mark Reinhold的意思,但是一些证据表明,在很多与Java语言合作的项目中,Java语言拖慢了项目的进度。
对于Oracle领导的Java来说,事情发展不会那么顺利,很多Sun之前的决议现在仍然在困扰着我们。我的建议是,抛弃客户端Java,独立出JVM和Java语言的发布周期,致力于将Java作为一个平台,而不是想一次性地解决所有问题。