Java混合化现状和RIA趋势分析
作者: Bruce Eckel
Java抵触情结已经初步显现,我们已经开始看到由此引起的一些根本性转变。
Bruce Tate的一些著作集中讨论了Java的缺陷,并指出需要放弃一些还未实现的想法。诸如Jens Alfke's Thought Palace和Stephen Colebourne's Weblog中的博客也频繁提到这个问题。当然还有Steve Jobs的著名引用(引用自iPhone):“Java不具有构建价值。人们不会再使用Java了。它只是个巨大的累赘”。产生这种抵触的惟一原因就 是,Sun始终以为Java是无所不在、无所不能。它曾经是令人叹服的,但是只有语言的设计者和提倡者能认识到其中的问题,这种语言才能继续发展。如果这 种语言已经不再成功,仍然坚持称赞它,这种行为本身就是一种否认。EJB已经对此作出了反应。EJB3小组最终承认EJB成本太高,并且也从 Hibernate和Spring学习了经验,但是还不足以解决问题。大多数人似乎都认为Hibernate和Spring比EJB3更加简单和直观,因此,对于这种过去成本过高的技术,很难再回到以前的看法了。
Java 5默认了这样一个事实:Microsoft使用C#实现了很多有趣的功能,而且Java 7中引入的特性支持这样一种思想——Java现在正与C# 3.0玩追赶游戏。竞争是不错的,Java并没有死。它在继续发展,构建在JVM之上的新语言(如Ruby、Scala和Groovy)的出现是Java 技术恢复活力的象征。我们想问这样一个问题:为何Java applet未被当作RIA(富Internet应用程序)的客户端标准在Internet上普及?这是一个非常尖锐的问题,因为Gosling及其团队 打算放弃Java(从而摒弃许多考虑不周的决策),这将会引起Internet的变革。这就是AWT和Applets在最后时刻被抛弃的原因,据说从计划 到完成花了一个月时间。Bill Venners引用了Patrick Naughton的话:“这是一个时间问题,只需3个月时间就会波及整个Java领域。这是由我们发起的。”我之前就听说过这句话1,而且在构建编程语言 时,这种态度似乎总是错误的。您正在创建一个基本的体系结构,希望人们将会采纳和使用多年。这就是需要谨慎思索的地方,而不是冲动。
我能够明白为何Green Team持有这种态度:这是Microsoft的方式。抛出一个产品以吸引大众的目光。这个产品不必是完美的;它只需要占领市场空间就行了。随着时间的推 移,可以修复仓促推出的产品上的任何缺陷。这是一种敏捷的营销方式。这种方法适用于动态语言。曾经最流行的语言之一Visual Basic,已经发展了许多年了。Python已经修复了一些对原有代码有害的缺陷,以优化该语言。据说,Ruby也计划这么做。但是对于包含大量代码 (特别冗长的语言)的静态语言来说,修复漏洞似乎不那么奏效。所有代码都必须重新编译,而且可能被更改,但是我认为,Java本来也可以采用Python 的方法:如果不希望更改就不要更新。许多公司始终都没有更新其Java版本。
1. 1 特别是当我编写Thinking in Java 时,许多人都说“已经有太多的Java图书了,您的书不会有市场的,不值得这样做。”
Web陷入混乱
能够发现可能性固然不错,然而缺点是很难确定何时出现故障。Web的概念非常有远见,但大部分web是失败的。是的,我们已经能够使web工作,但是很难 说它“运行良好”。具体来讲,使用HTML、CSS和JavaScript的任何应用程序都难于开发并且成本昂贵,而且似乎不可能在不同浏览器上获得相同 的外观。甚至简单的页面也会因字体问题而看起来不同。
如果您使用Firefox,有多少您访问的站点由于只针对Internet Explorer (IE)创建而至少有部分内容难以读取?在我看来情况越来越糟了;我看到更多(不是更少)站点不能很好地兼容Firefox,以至于我将认真地考虑转向IE。
CSS并没有实现它许下的美好承诺。许多年过去了,它在各种浏览器上的实现仍然不一致。只要使用HTML和CSS,您就总是想知道自己创建的应用程序是否会在其他浏览器上产生不符合期望的效果。除IE或Firefox之外,其他浏览器的情形还会更糟。
JavaScript也在web初期出现了,但是浏览器的混战导致了JavaScript的不一致性和难于使用。Ajax的关键元素之一在于,已经有人开 始解决跨平台JavaScript问题,因此您不用考虑不同浏览器之间经常出现的不一致。这种方法存在两个问题。第一个问题是JavaScript的功能 有限。尽管Ajax可以充分利用JavaScript的功能,但它的功能也非常有限。第二个问题是,我们依靠Ajax库来处理跨浏览器问题。如果想要编写 自己的代码,必须精通这些问题,而且到那时Ajax的许多功能都没有用了。Ajax极大地改善了用户体验,但它也存在局限性,我猜想我们已经了解了 Ajax将提供的绝大部分功能了。
更令人印象深刻的是Google Web Toolkit (GWT),为了加速开发过程,它将类型检查Java转换为跨平台JavaScript。首先用Java编写代码,然后用GWT将其编译为跨浏览器 JavaScript。然后,JavaScript变成了能够在所有平台上运行的中间代码。但是这让Google的智囊团不得不解决本来不应该出现的问 题。而且,如果没有所需的库,您仍然必须解决跨平台JavaScript问题,才能编写新代码。纵使GWT如此高明,我觉得它也会被JavaScript 和浏览器的内在限制搞得筋疲力尽。
我们确实看到了一些令人惊奇的基于Ajax的工具,比如GMail和其他Google工具,它们正在不断地诱惑我。这种现象非常好,但这是您希望在web 上看到的最好结果吗?您已经看到,如果没有这个限制,这些应用程序就非常接近理想结果了,即使它们不能持续工作(是的,我知道Google工具还“处于测 试阶段”)。例如,在GMail中,您按下‘r’键后应该能回复消息。有时候这是可行的,但常常行不通,这非常使人恼火。而且更常见的情况是,当我使用像 GMail这样的web应用程序时,Ctrl-C复制操作也不起作用了。Windows、Firefox、JavaScript或其他软件中都会出现这种 问题,但它似乎与web应用程序有关,而且这种情况至少持续了一年。坦白来讲,我并不关心为什么会出现问题,相信任何其他用户也不会关心。如果这么简单的 事情都出现问题,其前途不容乐观。
对于造就了如今的web的一连串错误决策,我们必须付出多少努力才能补救?
安装问题
Java已经存在10年了,而且applet并不是与web交互的主要方式。我认为主要原因在于安装问题,这是另一个未被重视的Java问题。老实说,为什么我们喜欢Ajax?
这显然不是因为JavaScript易于使用——JavaScript的跨平台问题是过去人们不愿使用它的原因。Ajax的流行是因为,我们知道客户端已 经安装了必需的软件。人们必须首先解决JavaScript的跨平台问题,但是如果Java Runtime Environment (JRE)很容易安装,所有人都只需创建Java applet就行了。但事实不是这样的,applet没有这么流行,因而每个人都转向使用Ajax。所以,Ajax变成了大家喜爱的RIA技术。
尽管借助ECMAScript标准化会使情况得到好转,但是与JavaScript相比,我仍然更愿意使用Java编程,主要原因在于 JavaScript的不一致性。也许八年内当前版本的ECMAScript将会成为几乎所有浏览器的标准。但是当前版本的JavaScript已经可以 使用了(尽管其实现比较随意),并且不存在安装问题。我认为这很好地印证了一点:Java未能接手RIA语言的原因在于其安装问题。
尽管多年来已经对Java进行了各种各样的修补,但我认为根本问题在于,所有尝试解决安装问题的人都只是站在技术的角度,而没有从真正需要的角度考虑:外 部用户的体验。例如,我曾经被Linux发行版困扰,因为它的安装很麻烦。我几乎每隔一年安装一次Linux,而且一旦安装,安装程序就开始询问问题。只 有精通Linux的人才知道这些问题的答案。我甚至无从下手,因此只有放弃并在来年再尝试。然后Red Hat诞生了(至少,我认为它是第一个关注安装体验的产品),而且安装Linux时不会询问问题,或者至少给出一些合理的默认设置。Linux正是从那时 开始流行的。(最近,Ubuntu在解决Linux的友好性问题上似乎处于领先地位。)
安装JRE需要用户回答问题。对于精通JRE的人来说,这些问题的答案很简单或者是显而易见的,但是对于其他web用户来说,这些问题会让他们不知所措。 在文章Sun Never Sets on Java Security Updates中,InfoWorld的Ed Foster评论并举例说明了Java的安装问题。尽管这篇文章主要是对更新的抱怨,但也对旧版本的Java很不满。Ryan Tomayko也写了一篇博客,讨论了Java的安装问题。
Java Network Launch Protocol (JNLP)是Java WebStart的基础,它本来应该解决这些问题,创建易于安装的桌面应用程序。我认为JNLP未被广泛使用的原因可以在 https://aerith.dev.java.net/上找到,这是“Cool JavaOne Demos”的一个页面。如果单击页面上的JNLP版本链接,它将开始启动、下载一些东西并询问您问题。然后就没有下文了。没有错误消息或任何信息告诉你 发生了什么。重复尝试还是会产生相同的结果,只是速度快些,因为需要的文件已经下载下来了。至少,我的体验是这样的。如果您能够正常使用,那么就更糟了 ——它只能随机地在一些平台上运行,而在另一些上就不行。这样的产品如何调试呢?
使用Java构建GUI应用程序并不是不可能,但是10年过去了,applet、Java WebStart和常用应用程序仍然存在安装问题。10年之后,人们不再信任它了。如果10年之后不会出现这种情况,我敢说某些人会认为这个问题不值得修 复。即使他们修复了,由于用户已经有了如此多的糟糕体验,需要经过多年才能重新建立起之前的信任。
Java applet和应用程序体验
AWT最初的用户体验沉重打击了Sun对Java的狂热吹嘘,而且我认为applet到现在还未恢复元气。结果,Java永远不会成为RIA的主流。即使 在现在,仍然不能在web站点上方便地运行Java applet。他们失败了,而且还不知道错在哪里。更糟糕的是,他们甚至会阻止Firefox打开新窗口,直到我重新启动计算机。
对 “applet已经死了”的常见回应是“它们没有死。我一直都在使用它们。”applet并不是一无是处;人们仍然在用它创建出色的产品。Java Posse每周都会发布一个或多个applet。上面的论断应该理解为“对于web RIA来说,applet已经死了”。JRE和任何特定applet的安装过程并不足以说服任何人将它们用于通用的web站点。
Java的缺陷同样也影响到了桌面应用程序,applet也是一样。我曾经使用过一个叫做Memorex exPressit的Java产品,它的UI非常难看而且缺陷很多。我还使用过Logitech IO钢笔支持软件(用.NET编写的),它运行流畅而且外观漂亮,与Memorex exPressit形成鲜明对比。您也许会说Memorex编程人员缺乏经验,但是Logitech软件只是一个运行良好的小型应用程序,无