Pervasive Java
引言
进入正文之前,先来点废话。
这要从那部追随我近20个月之久的Nokia 3350说起。在去年5月的某一天,就在我上公汽的那一刹那,它被迫离开了我。后来买了一部N3100,就是经常可以在公汽和校园里见到的很多人在用的那种。它是彩屏的,可以支持java游戏,准确的说它采用了Nokia S40平台,可以支持MIDP 1.0。后来买了根COM口的数据线,从PC下载些图片和铃声,然后是游戏和应用软件。期间,我一直有一个想法,就是给它写一个小的游戏或者应用软件。因为自己的研究方向就是嵌入式系统,这种想法变得越来越强烈。在毕设的PCB设计脱手之后,我实现了这种想法。虽然只是编了个很简单很简单的东西,但是经历了全部的流程,对这件事情也有了个初步的认识。就这点粗浅的认识本不足撰文以记之的,但是有两个原因使我决定写这篇小文。我猜你一定在说,这些个读书人真是麻烦,写个文章还要扯这么多理由。名正则言顺嘛,约女生出来还得找个借书还书之类的幌子。
其一是因为好友yuanqs很喜欢钻研软件,而且对逆向工程比较有兴趣,经常和我交流心得,我每每劝他整理个文档,这样比较有条理,也便于日后拿起来。前一段准备和他一起研究一个Python写的应用软件,后来因为毕设和写手机程序就耽搁了。而且说起来容易,其实我也很少就自己学习的东西整理出个书面的东西,所以想想也不能光说不做。
其二是因为接下来的一段时间要调试硬件,写板子的程序(主要是C),并且要花很多时间写毕业论文,所以估计不会有很多时间去学习Java的东西。所以这篇文章也算是对之前学习的一个小节。
也许有点厌烦那些道听途说,众口一词的套话。我现在的想法是不说没有用的正确的废话,宁愿说一些有自己见解的不一定全面的看法。
学习Java于我是一个断断续续的过程,而且也没有长时间的在实际项目中使用它,所以对Java的理解一直是比较粗浅和有限的,我想即便现在也是。但是因为工作和学习内容的变化使得我有机会能接触到Java针对不同平台的版本,所以可以从不同的侧面来看Java,因而可能会有些不同的体会。这里我不想讨论具体的技术细节,那是汗牛充栋的东西。我想做的是叙述一个开发者对Java的理解和认识,以期与其他人的交流,并希望别人可以指出我的看法中不对和偏颇的地方,或者在一段时间之后再读到此文,觉得太粗鄙,那就说明是一种进步。
Java on Desktop
最早接触的是Java的桌面版本,当初学习它是因为热门,我想我说是因为看到Java的光明前途你也不会信的。花了两天的时间匆匆看完了两本Java核心技术,因为觉得很多语法和C++类似,当时还心存疑惑,有了C++,为什么还要搞这个,而且又很慢。语言毕竟是一个工具,所以我觉得看它怎么样还要看它能做出或者已经做出了什么样的东西。那时用Java做的桌面应用软件还比较少,看到相关的文章,当时对于纯Java能否做出一些比较大的实用的软件,很多人还是心存疑虑的。我所了解的用Java写的应用软件主要有几类。
第一类是软件的安装程序,以Oracle数据库的安装程序为典型,我想主要是因为数据库有不同平台的版本,核心的组件无法跨平台,但是安装模块却可以只做一个,这可以省掉很多的工作,确实很好的利用了Java的跨平台的优点。
第二类是一些IDE,以JBuilder为代表。到后来的几个版本,几乎是纯Java的代码了。当然JBuilder也继承了Java启动比较慢的特点,也是经常被诟病的地方。
第三类就是Java的应用服务器,例如WebLogic,WebSphere,SunOne。这些应用服务器对平台无关性的要求使得Java几乎成了一个必然的选择,否则为每个平台开发一个版本确实有点难以承受。
第四类是一个服务端软件的控制台,例如数据库和应用服务器。
第五类是通用的商业应用软件,例如永中Office等。
第六类是开源的软件,现在这方面发展很快,好的作品也越来越多,比如大家熟悉的JBoss, Eclipse等等。
上面的分类不一定全面和准确,但是从中我们可以看出Java的能力已经无需证明,也就确立了它主流开发语言的地位。分析上面的一些软件,我们会发现Java的跨平台的优越性,得到了很好的体现,比较坚定的使用它的也是一些需要支持多平台的系统。我想这其中还必提到的一点就是Linux的发展。正是因为如此,使得Windows不再是桌面OS的唯一选择,需要开发很多Linux下可用的软件。或者也可以理解成Java和Linux是互相协助的一个发展,Linux的普及带动了Java的发展,Java的成熟也促进了Linux平台应用软件的丰富。它们还有一个共同的地方,那就是开放,所以很多的厂商和个人都可以参与进来,当然,他们必须找到自己的定位。
JDK1.5已经稳定,JDK1.6也即将发布。Java很好的体现了发展才是硬道理。它在不断的改进,它的优点得到体现,一些缺点也不再那么明显和难以接受,或者提出了别的解决方法。想起李维书中提到的C++ Builder和Visual C++的战争,VC在前几版中均不如CB,但是它一直在发展,到6.0就已经在很多方面超越了CB。软件总是在不断的改进,只要它没有失去发展的动力,就一定会变得更好。以前同事开玩笑说,还是等某个软件版本高一点吧,因为你看哪个服务器软件不是8.0,9.0,十几点几的。所以对Java在桌面系统的前景十分的乐观。
Enterprise Java
下面我们谈论一下企业级平台的Java。我想这也是Java最成功的领域。首先我想是因为这个领域的重要性和它在软件中所占的份额。企业级的系统一般承担着比较重要的任务,很多还是企业的命脉系统,比如电信,银行,证券等等。对于很多这类的企业,不是要不要信息化的问题,而且怎么做好的问题。他们要求系统的处理能力强,容量大,稳定性好,有良好的伸缩性,可扩展性,以及等等要求。天下没有免费的午餐,达到这些要求的系统自然价格不菲。硬件自不必说,数据库、中间件、报表、应用系统等等都比较昂贵。按理说,Java这个初出茅庐的家伙在这个平台应该不会有很多的机会。但是恰恰就在这个领域,Java获得了最快的发展。在国内,已经有很多的系统开始转向了Java的平台,以前可能说用C/S的两层结构,或者是基于传统的交易中间件,例如Tuxedo和CICS。据说在国外,Java在企业级的系统中应用得更广。
我分析了一下,可能有几个方面的原因。
首先Java一开始就对网络提供了很好的支持,很多架构也是专为网络设计。随着互联网的普及,基于Web的系统(各大门户网站之类)越来越多,另一方面,对传统的企业信息系统也提出了联网的要求,这使得原来比较封闭的信息系统不能满足现在的要求。而J2EE的相关技术很好的满足了这些需求,并随之快速的发展。除了SUN,这其中不能不提Oracle,IBM,BEA对Java企业级应用的推进。
其次,这个世界变得太快。变化快就对信息系统提出了很多更高的要求,他们必须快速的满足新的需求,这样才能在竞争中占得先机,否则可能成为被快鱼吃掉的慢鱼。J2EE的应用正好提供了快速的开发和部署的能力。这得益于它开放的标准,以及有很多可选的组件。现在的Java应用服务器的功能越来越强大,而且相关的开发工具也越来越多,使得信息系统的开发变得更加高效。当然,这对系统的架构和设计提出了更高的要求,因而这方面的问题也开始变得突出。
第三,平台的可选择性。在以前的企业系统中,一般是选定了某家厂商的产品之后就很少变动,硬件平台是这样,大型的软件平台也是这样。现在可能不再是这样,特别是针对一些规模小的企业,他们需要更多的选择,然后挑出对他们来说性价比比较高的。Java的这种跨平台的特性正好满足了这种要求。首先它可以跨硬件平台,使得开发的一套应用可以跑在不同的硬件上,购买硬件的时候也有了不同的选择。我以前所在的项目组,就曾经因为硬件性能的原因,将整个web应用从PC搬到一个小型机,过渡非常的平滑。另外一个被忽视的就是软件平台的可选,这里主要是应用服务器,因为数据库的选择可能涉及到很多移植的问题,处理不好会引起很大的混乱。听同学提起他们项目从SunOne到WebLogic只用了一个晚上。这样一来的好处是显而易见的。我想这样的需求可能也是因为竞争的压力。以前在电信这样的企业,对于信息系统的投资是不太计较成本的,现在的情况就完全不同了,想必其他的单位也是一样。
提起Java的企业级应用,就不能不提微软的.NET。因为它现在也得到了十分广泛的应用。微软的产品向来以后来居上著称,Visual Studio、IE、Office,即便是Windows也一样,我想首先是因为MS有很强的学习能力和很强的开发能力。而在Windows按照Bill的理想推广到世界各地的Desk上之后,这种能力可以从另一个角度来理解,那就是“我可以撑得比你久,直到我开始赚钱,并超过你”。大家都知道MS有天文数字般的现金储备,而且我们还知道它的很多软件产品线刚开始出来是赔钱的,上面提到的无不是如此。如果Borland的开发工具在亏损,如果Oracle的数据库在赔钱,他们一定都会乱,可是MS却可以多撑几个版本,然后占主导地位。以上是和同学聊天时大家的一点看法,比较旁门左道。现在我们回到.NET。MS投入了巨大的人力和物力来研发.NET,但是并没有达到它预期的效果。但是现在已经得到比较广泛的应用了。我相信.NET一定会越做越好。
但是尽管如此,我还是更倾销于Java,主要是因为自己的一些观念。首先做一些推论。如果选择了.NET,那么OS必须是Windows,请原谅我这方面的无知,我不知道MS是否已经或者有计划在其他OS上实现.NET。另一种理解就是 .NET本身就是和OS集成的平台,那么Windows就是其中的一部分。两种理解得出的结论就是如果选择.NET就没有其它OS什么事了。这一点很多人都不能接受,特别是那些涉及到自身利益的厂商。接下来,因为Windows主要是在X86平台(有没有在其他平台上实现?比如Sparc,PowerPC),所以如果选择.NET,那就必须选择X86平台,更具体的说,主要的选择就是Intel和AMD。这样的结论对于IBM, SUN, HP来说确实难以接受。要知道在企业级的市场,特别是大型的系统,一直都是IBM, SUN, HP的天下。如果.NET成为了主流,那么这些企业做什么呢,给.NET做些开发工具或者库?正因为如此,这几家大厂商都很坚定的支持Java,因为Java使得每个人都有机会去分一杯羹。厂商之间的竞争是为各自的利益,开放和公平有时候只是他们的一个幌子。但是,作为一个软件的开发者,我还是希望硬件和OS平台不是唯一的,就好比我在Windows、Linux、HP-UX、Solaris上写C++代码,他们没有太大不同。对于用户,在构建一个系统的时候,他们可以选择BEA,IBM,SUN或者Oracle等的应用服务器,数据库也是可选的,硬件可以选IBM, SUN, HP的专有架构,或者PC,进而OS可以选AIX,Solaris,HP-UX, Windows以及各种Linux。这样的选择空间显然比上面的唯一要来得自由。这很容易让人想到购买兼容机的时候对于硬件的选择,由于有了开放的标准和接口,大家可以选择不同厂家的显示器,主板,硬盘等等。可选也意味着激烈的竞争,竞争对于用户而言就是更多选择,更好的质量和更低的价格,当然也会因为选择多了难以抉择。
J2ME, Java for embedded system
要是说起Java的历史,应该是起源于嵌入式系统。当时SUN有一个称为OAK的项目,是为电视机、烤箱这类电器而设计的一种语言。没想到进入桌面系统和企业级市场之后,获得巨大的成功。但是在嵌入式系统上的成功相比在其它平台也毫不逊色。
相比以上的两个平台,嵌入式平台可以用一个词来形容,杂乱。这体现在几个方面,首先因为是嵌入式系统,它不是通用的计算机,而是为了某些专用的功能而设计的,只是因为需要计算能力或者一些智能化的操作而引入了计算机系统。例如TV,洗衣机,空调,电子玩具,还有就是各种移动的通讯设备等等。因为他们的功能和作用差别很大,所以里面的计算机在处理能力,存储容量,供电等方面的差别就非常大,这就使得其中的计算机的外在环境的差别也很大,进而使得很难有一个通用的东西。其次这样的系统可以看成是传统的行业与计算机结合的产物,也是一个逐步深入的过程,在这个过程中采用的硬件平台和当时的环境有关,而且区域性的特点比较明显,比照一下通用计算机的硬件就可以很容易的看出。TV或者空调的制造者可以为他们的设备选择不同的处理器,只要他们觉得合适,他们的系统不用和别人的交互,所以也没有兼容性的问题。其他一些更小型的嵌入式设备就更是这样了。为嵌入式应用而设计的CPU种类太多,相关的文章指出,常用的有100多种,而且指令集都是不同的。接下来就是软件的问题,在早期简单的控制系统中还没有引入嵌入式操作系统,现在随着系统硬件的增强和对系统功能更高的要求,系统的软件变得越来越复杂,这是操作系统的引入就变得十分必要,嵌入式操作系统已经成为并且很长的一段时间都是嵌入式系统开发和应用中的热点。但是嵌入式操作系统的种类一点都不比处理器少,他们之间的差别使得兼容也只能是梦想。
也正是由于以上的特点,在嵌入式市场上还没有形成PC市场的那种垄断。这也给Java这种希望跨平台运作的语言提出了更大的挑战。没有完美的解决方案。SUN自然也考虑到了这一点,因此在设计J2ME规范时的原则是:对于各种不同的设备而创造出一个单一的平台是一件没有意义的事,但至少都应该使用Java程序语言。由于都采用Java语言,实际上就达到了一种低程度的兼容性,因为语言的很多的基本的东西是一样,比如一些原始的数据类型(在某些Java平台可能只是J2SE的一个子集)和一些语法。
由于嵌入式设备的差异实在太大,不便于制定规范,SUN将其粗略的分为两大类,分为CD(Connected Device)和CLD(Connected Limited Device)。第一类是针对那些计算能力比较强,电源供应比较持久的设备,例如电视,冰箱等,它们的体积可以做得比较大。对于这类设备,制定了CDC(Connected Device Configuration)规范。第二类是针对运算能力有限、电力有限的设备,例如手机,PDA等,这些设备很多使用电池供电的,CPU主频不高,存储也比较有限。针对这类设备制定的规范称为CLDC(Connected Limited Device Configuration)。
即便进行了这样的划分,我们在每类设备上也不可能实现一个统一的平台,因为很多都是和底层的硬件相关的,以手机为例,背光、震动是很多手机的软件系统需要支持的,但是J2ME不会把这个作为标准里面的要求,因为很多CLD没有这样的需要。这些都是需要厂商提供相应的支持。所以开发J2ME应用的时候会使用到这两方面的库,下载他们的SDK。
目前在手机和PDA,对Java的支持越来越普遍,java的游戏或者应用软件也是越来越多,这个方面现在也是开发的热点。Java在这方面将扮演越来越重要的角色。
Java Card, Java for Smart Card
关于Java Card,由于研究方向的原因,查阅过相关的论文。智能卡一般是指卡中含有微处理器、存储器的卡,这是对早期的只有存储功能的存储卡的加强,卡中一般都有COS(Card Operating System),虽然都是OS,不过你可不要拿我们常用的这些OS来比较,因为这些COS相比太过简陋,一般都很小,几KB是很常见的,文件系统也很简单,没有复杂的任务调度,因为没有智能卡一边写数据一边唱歌的,要唱那也是读卡器或者终端的事。这样的智能卡每张卡都只有一个专有的用途,就好比各大银行的卡是分开的,现在一个银行都可能给你n张卡,目前也还很少一张智能卡做很多不同类型的用途。这样我们自然想到的一个问题就是用户的卡会越来越多,很多用钱包的人都有类似的经历吧。这就引入了便携性的问题,还有一个问题就是现在的智能卡操作系统一般都是专有的,比如某个银行卡的操作系统,那可是高度的机密。那么一般的很多应用要实现一些不复杂的功能都需要和底层的硬件打交道,这显然也不利于智能卡的普及,开发周期也会很长。正是基于以上的原因,人们提出了“一卡多用”的概念,这个很好理解,就好比你可以用这个卡在食堂吃饭,然后去坐公汽,还可以去体育馆打球,这些不是简单的系统联网就可以解决的,需要卡支持多个应用。针对这种情况,Java Card应运而生,它就是要提供一个平台,可以在实现不同的应用,然后一张卡就可以当作多张卡用。SUN总是喜欢提出各种各样的规范,难怪说一流的厂商定标准呢。对于Java Card的具体技术,我没有进一步的研究,不太了解,这里借用不同时间的两个业界的消息来说明一下它的发展概况。
2001-05-31
Java Card技术应用日益多元化
Sun表示Java Card技术已被普遍应用,并强化全球数千万张智慧卡功能。Java Card技术提供一个安全且可相互操作的多重应用智慧卡平台,能够支援诸如金融服务、政府机关和电信市场等重要产业的特殊需求。Sun和一些产业龙头厂商,包括ActivCard、Banksys、Gemplus、Giesecke & Devrient, Ingenico、日本电信(NTT)、Obethur、普罗威登金融公司(Providian)、Schlumberger、Trusted Logic和威士卡(Visa),于美国拉斯维加斯举行的CardTechSecureTech 2001中展示运用Java Card技术的各种解决方案,包括数位识别解决方案、生命周期管理系统、医疗保健应用、以及平台安全性工具。
Sun的Java软体部副总裁暨总经理Richard Green表示:「在目前已售出的大约1亿个智慧卡中,Java Card技术显然已成为多重应用(multi-application)智慧卡的开放标准之指标。Java Card技术的设计,可以让智慧卡的厂商、开发者和发行者迅速建立可靠的应用与服务,以降低成本和缩短上市的时间。」
Java Card技术在全球市场的应用
在欧洲、亚洲和美国等地区的金融机构,例如美国运通、花旗银行和威士卡,均已建置了数百万采用Java Card技术的智慧卡,这些卡可支援加值服务,包括库存价值、EMV借/贷、信用调查、及Internet PK认证。 许多政府机关目前正准备发行具备Java Card技术的智慧卡,来作为他们新的识别卡,以取代现有的“纸张”型识别卡。举例来说,美国国防部就建置以Java Card技术为主的智慧卡,作为430万名现役美军及合格约雇/聘人员的新ID卡。此外,台湾政府也将发行采用Java Card技术的智慧卡,来作为2400万人民的新健保卡。 中国移动通信(China Mobile)、France Telecom、香港电讯(Hong Kong Telecom)、Orange、Swisscom、Telecom Italia Mobile和Telefonica等知名的电信大厂,已在全球各地建置了数百万采用Java Card技术的SIM卡。 Sun最近推出了Java Card 2.1.2开发套件,以简化在Java Card平台的开发应用服务的过程。这个开发套件为应用程式及平台的开发人员提供了新工具,在能保有现行运用的功能外,还可让开发的过程更为可靠。
2004-11-3
THG报道,Sun Microsystems宣布,公司的Java Card技术平台已经被整合到包括移动电话卡等超过7亿5000万个产品中了。根据Sun公司的报告,这个数量在一年内递增了50%。移动电话是目前对此技术要求最高的产品,其要求多个应用服务能够同时存储在一张卡中。设计员通过标准化的Java技术来提供移动数据服务,并且能够进行3G USIM卡和GSM SIM卡鉴别,同时还可以进行基于SIM卡的应用服务。目前,SIM卡的容量已经可以达到1MB了。除此之外,主要的银行和信用卡公司,如Visa,American Express和MasterCard也已经发布了基于EMV Java Card技术的新一代信用卡。其中EMV是于1996年由Europay,MasterCard和Visa制定的一项smart card标准,其能够使用户在全球范围内使用信用卡进行消费。根据Sun的报告,政府也正在进行护照存储数据的测试评估工作,其准备将持有人姓名,出生地和诸如照片,指纹等一系列复杂信息存储到基于Java的非接触式芯片中。
注:本文不会在有酬的杂志或网站发表,无商业目的。以上引用未经授权,如有异议,请与作者联系,立即删除。
感言或者胡言乱语
上面,我们把Java在各个领域的应用做了一些简要的分析。在结束前,我们先来看看两个看似无关的概念。
第一个是网格计算。网格计算(Grid Computing)在学术界和产业界都是热门的研究方向。这个名词起源于电力系统的Power Grid。大家已经习惯了把插头插到墙上的插座里就可以用电了,而根本不关心这个电是哪里发出来的,是水电、火电还是核电,它是经过怎样的路线输送过来的。当不想用的时候,我们就断开,而且我们只按我们实际使用的电能来付费。什么时候我们可以像用电来使用计算能力呢?这是一个很大胆而有趣的想法,那些先知们总是能提出各种类似的想法,谁敢说有一天它不会变成现实呢?中国已经组建了高校的教育网格系统和高性能计算网格系统,有很多的人在研究,包括几个我的朋友。在业界,Oracle的新版数据库就称为10g,这个g就是grid,Oracle在应用这些新技术的时候总是比较迅速的,当初也是它最早将internet的特点集成到数据库中,那是Oracle 8i。IBM提出了“On Demand”的概念,他们称为随需应变。BEA提出了Liquid Computing。如果计算变成了自来水一样的液体,那个power grid也就差不多了。不管是power还是water,它都是生活中不可或缺的部分,以后的计算能力也是这样。以后提到计算或者计算机,将不再只是摆在电脑桌上的那个东西,也不只是notebook。当一个东西在生活中变得必须的时候,它就有了重要的意义,一个东西重要,它就有意义,有价值,值得你去付费。OK,既然你愿意付费了,那么接下来会有人和你谈各种奇奇怪怪的付费方法,按使用时间,按CPU数,按公司的人数等等,只要你能想到的,你都有可能听说。
第二个是普适计算(Pervasive Computing),或者叫无处不在的计算。这个在前面的网格计算上可谓更进一步了。IBM提出这个概念的时候给出了一个简单的解释,那就是在任何地方,用任何设备访问或者操作任何你想要或者能够处理的资源。这三个“任何”就涉及到了三个方面。第一个任何就对数据的传输提出了要求,包括各种有线的无线的网络,是他们把各种各样的设备连接在一起,他们是物质的肢体里纤细敏感的神经。这一块可能涉及通讯网络、计算机网络、电视网络等等。而这些网络的设备本身也是有计算机的系统,他们上要运行各种复杂的程序。一个IP网络的路由器上面可能就有数百万行的代码。
第二个是嵌入式设备,就是各种各样的设备,家电、手机、汽车、你的旅行箱、手表、智能卡等等,它们都会有自己的处理器,有自己的网络地址,有自己的存储,它们就是很多的计算机。
第三个是资源的管理,他们可能是集中式的服务器,各种各样的,web站点、企业门户、电子商务、多媒体服务等等,也可能是一些分布式的资源管理系统,或者是P2P的另一端。
这个Pervasive Computing是如此的保罗万象,它清晰而又模糊的勾勒出了未来信息社会的景象。
将这两个概念和前面提到的Java的各个平台进行比照,Java的野心是显而易见的。因为你很容易发现它几乎涵盖了各个方面,只要是有计算能力的地方,都可以用到Java技术。所以Java早已经超出了编程语言的范畴。
进而我们会想,把整个信息社会的基础放在一个语言之上是好的方法吗?我想这是不可能的,很多语言在很长的时间里仍然会有它们存在的空间,也不一定会被取代。这就好比铁(或者钢或者某种合金)可以用来做锅炉、饭锅、装饭的桶、还有饭碗、勺子,以及烧饭要用的水的水管等等,但是我一样可以拿个塑料饭盒并配上一个木勺子去食堂打饭,如果我正常刷了卡,应该不会被打饭的师傅拒绝。
很多技术的东西发展到一定程度就会有很多超越技术本身的问题或者思考,这些可能涉及到哲学、经济、政治、社会等等方面。我想这也就是为什么你在看很多优秀的专业书籍的时候可以体会到一些普遍适用的道理。所以有人说一个顶尖的工程师可能也是一个哲学家,或者艺术家。你一旦去做一些具体的事情,你就进入了某个领域,这个领域有它的技术和知识,而当你做的事情的影响力已经超出了你的领域,它就不再只是技术的问题。计算机技术就是这样,它从纯粹的计算工具演变成关系到人们生活的各种方面,关于它的很多问题也超出了它本身的领域。这里可能扯得比较远了,算是有感而发。
既然计算机技术关系到整个信息社会的基础,那么它必然设计经济、社会、政治的问题。这些显而易见,看看各种各样的相关政策法规就知道了。掌握着这些东西的人可能就进而掌握了更多的东西,比如商业利益、信息的安全等等。那么这些技术也需要被合理的掌握。我的粗浅的理解就是它应该是一个比较开放的标准,不同的人可以参与进来,可以为这些做出自己的贡献,获得应有的回报,而且在很多的部分上,不应该有某个厂家的产品是唯一的选择。历史书上说绝对的权力导致绝对的腐败,我想在商业上也是一样。Java现在就是这样的一种开放的标准,当然它还有很多地方不完美,但是它是建设性的。
Ricky Qiu 2005-3-9 于HUST