聊聊Java(二)

厄尔尼诺分割了大气流,从大洋彼岸掠过,温暖、潮湿的空气弥漫在整个得克萨斯。他与冷锋气流发生遭遇,在南面的压力下形成了漩涡,并当场锁定了冷空气。暖湿气流冲入冷气团中,相互交汇,产生一个完美的风暴。

这是对Bruce A.Tate在他的《Beyond Java》书中一段描述的翻译。任何风暴都不是偶然,它需要很多因素聚结在一起,而Java就如同这股完美风暴,席卷了世界。

wave

自1995年Java正式向世界发布,到如今已经影响了世界近20年,从技术创新到企业的发展合作模式,也不断地改变着人们的生活。Java成为了第一大开发平台,有着约9百万的开发者,平均每年有10亿下载量,有30亿的设备在运行着Java,占领者97%的企业桌面份额。可以说Java是很成功的,这点从Java语言在TIOBE榜上的情况也可以看得出来。Java的成功是由多方面因素共同造就的,我们就来看看。

一   我们回顾下Java体系结构特点。

通常,在介绍Java的时候都要提到的几个基本特点就是,平台无关性、安全性、网络移动性。其中前面的两者是支持后者的基础和前提。Java的JVM是平台无关性的最根本技术支持,屏蔽了底层环境的不相同。安全性则体现在Java体系结构的各个层面上,class文件格式的规范性和校验机制,JVM类加载器动态加载类时的信任代理机制,Java API中安全管理器的概念和栈中权限检测的机制,还有就是Java语言中对指针的抽象、数组越界异常机制等安全的控制。网络移动性,则与互联网的发展,计算方式的改变等有着密切的关系,可以说是顺应形势。下面的两节会更详细地结合情况说明这些。

二   下面,我们详细看下Java在技术上诞生和发展方面的因素。

(1)计算方式的改变和互联网的兴起。在PC流行以前,多终端的大型机系统还是主要的计算模式,计算相关的很多资源都是共享的,当需求发展到一定程度,计算资源就到达了一个瓶颈。在PC刚刚开始流行的时候,互联还并不方便,因此各个计算机就如孤岛一般,但不久这个限制最终被互联网打破。自此,Client/Server的计算形式便开始广泛得到了运用。但这还有另外一个问题,就是和如今做C/S所需要注意的问题一样,就是客户端程序不易于管理,可能会存在多版本,服务端必需兼容处理个版本的客户端程序才能保证全局是稳定的。

不知道读者中有多少了解移动互联网或者说无线应用开发的,对于大中型公司的应用,很多有一种需求,叫做插件化——就是说,客户端初始安装只是一个框架,在这个框架体系下,客户端可以通过用户定制来进行可插拔的软件安装和更新,软件本身也成为一个网络传输的内容,而不仅仅是单纯的数据。但据本人了解,目前iOS平台还无法真正意义上地实现这些,我推测原因可能有安全性方面的考虑等。其实除了安全,在各种硬件和操作系统环境中能够实现同样的效果等也不容易,但这些正是Java崭露头角的机会(前文重复过几次,平台无关性、安全性以及网络移动性的特征)。Java在出世的时候,就是以Applet,HotJava等打破了这个僵局,后续的Serialization、RMI、Reflection等对此提供更强有力的支持。

(2)C++和Java。相信大家都看到我的文章“聊聊Java(零)”中TIOBE中,第一阵营中除了Java,还有一个C。C语言是一门很古老的语言,是汇编语言基础层面之上最重要的一门语言,和汇编比起来具有很好的可读性,和VB比起来又很有执行效率,是开发操作系统层面最重要的一门语言,直到如今亦如此。但任何事物都有不完善的方面,比如在当时很受人欢迎的面向对象概念,C就不怎么具备。面向对象可以对应用做更好的设计,并重用代码,这种对事物已有资源的积累,是任何事物向更高更广发展的前提。C++诞生了,在C的基础上融进了OO的理念。C++也算是一门很重要的语言,但很遗憾,她也有着非常脆弱的特点。先不说C先天的缺陷,C++就算是面向对象,也不纯粹,没有做到everything is object,她不指定唯一根(不像Java的java.lang.Object),而且多重继承。这些一方面使得语法更为复杂,出现了虚基类等概念,学习成本更高,而且在类结构上层次容易带来很多困惑,不利于更清晰的设计。回头再看C和C++的一些通病,就是对底层环境依赖强,基本谈不上什么可移植性,对内存操作直接(也有好的一面),野指针可以满天飞,而且没有Java中的垃圾内存回收机制,内存泄露也许是经常发生的事儿。据说在Win下还有一个“DLL问题”,本人用C++在Win下做应用开发的少不太了解,这个就不细说了。

如此种种,使C++的开发者很困惑不爽,早就期待着有Java这样声称有各类有点的语言和平台,而Java确实做到了这些,使众人眼前一亮。

(3)面向对象。前文说C++也提到了一些OO,这里少说点,说点其它的。面向对象的三个基本特征是封装、继承、多态。用OO直接的好处就是可重用性设计,其实OO不仅仅是这些,她使得应用程序的设计更接近自然更为人的思维所接受,也就更利于设计出更好的应用,推动软件开发的发展。早期的OO语言有Simula、SmallTalk等(貌似《设计模式》一书中很多例子都基于SmallTalk)。其中SmallTalk是非常成功的面向对象语言启蒙者,也是单继承,但由于其他因素局限于特定的领域内。可以说,如今的Java、ObjectiveC都从SmallTalk中学到了很多。

(4)再说JVM和API。其实对于Java平台,这两者也提到了很多次。不得不说JVM对于Java的成功非常关键,平台无关性和安全性在这里都做了很多。JVM其实不是一个特定的实现,她有一套完整的规范,允许个厂商合作推出适合特定系统和场景的实现,这是一个很好的合作机制。虽然Sun给出了HotJava和HotSpot,但JRockit等也都是不错的实现。JVM规范给出了class的结构、并粗略地规划了类加载和内存管理以及执行相关的条款,但具体到堆了栈了这种实施,是没有任何硬性要求的,甚至可以使非软件实现而用硬件。JVM相当于给了下面实现者很大的空间,又对用Java语言的开发者一个统一的开发平台。规范设计的相当好,据我所知,Java对于JVM规范的制定改动一直很少,只有几个版本:第一版、第二版和Oracle时代的7 。规范相关详细的内容可见http://docs.oracle.com/javase/specs/jvms/se7/html/。对于JVM成功的另一个佐证就是,Groovy、Scala这些后来语言对JVM的应用了。对于API,在第二版之后对各个方向的分工是非常有利于Java的发展的,任何领域发展到一定程度,都会细化分工,明确各自的方向。

三   还有一些是技术本身之外的东西。

作为码农/开发者/程序员/工程师,技术很重要。但技术不意味着整个世界,不是所有事情都仅靠技术就能解决。这个观点很重要。

(1)微软和Java同盟。微软大家都了解,在PC的发展过程中,有一个称谓叫Wintel,就是Intel加Win的OS。微软在软件界可以说是霸主地位,说他是霸主不仅仅因为他干得很大,更重要的是,谁是他的竞争对手,几乎都会很惨……比如网景、Lotus等,当时Win还在图形界面上抄袭了乔帮主的Macintosh,让苹果在PC一度被动。1997年,Sun和MS终于迎来的第一仗,Sun起诉MS在Win下歧视Java(貌似是微软对Win下Java平台相关的东西有改动致使Win下Java程序能用而其他环境的不行)垄断并胜诉。后续的斗争更为激烈,比方说MS抄袭Java搞出了自己的.NET和C#(虽然目前的市场占有应该远不及Java)等。

另一方面,Java的跨平台优势吸引了众多底层的操作系统提供方和企业。早在1996年,10家主要的操作系统提供商就声明引入Java技术,其中微软的各个竞争对手(IBM、Apple等),每年一度的JavaOne大会也开始进行。之前微软以OS垄断使其Windows大举扩张,而目前Java这个跨操作系统的平台似乎弱化了这一点,在MS竞争对手的支持下,Java正不断向前发展。此外,Java声称的安全性对微软Win中被抱怨的种种缺陷也是一大明显优势。

(2)企业支持业界标准。随着Java企业用户的发展和技术上的不断革新,Java从客户端的applet不断走向服务端,1997年有了servlet这个东西(可以理解为server applet),98年又搞出了个EJB1.0 。这促使了IBM这种大企业将Java和企业内部的数据库、消息系统等整合起来,而且在这个过程中Java再一次展现了她在服务器程序开发和整合上的优势,也积累了很多不错的产品。

Java吸引了大批优秀企业用户。像IBM,拥有非常大量的工程师应用Java做各种开发,这些大企业促使了一些基于Java的业界标准,就像秦始皇统一货币度量衡一样,这对Java的进一步统一发展是有着很大的促进作用的。

(3)开源和社区。Java的成功,开源功不可没。正因为开源,更多企业和个人才能更容易的接受和使用Java程序。其实Sun最初是对开源有抵制情绪的,因为微软已经通过垄断赚取了大量利润。开源,这是发展的必然,开源给大家带来的非常丰富的选择,开源也提高了收费的门槛,促使软件提高质量和价值,开源也促进了Java的推广。这里举个可能不很恰当的例子,开源就好比电商领域的淘宝。在淘宝出现以前,传统的百货公司把持着市场,只有有一定资本的人才能在百货大楼中有一席之地,而像北京西单中友百货这种,一件普通的衣服要卖到好几千,这中间的利润到底耗费在了什么环节,进了谁的腰包我们并不清楚。但我们应该清楚的是,这个价格应该在一定程度上讲是虚高的,超出了一件衣服应有的价值。马云貌似说过这样一句话“不是淘宝太便宜,是传统商场太贵”。从经济学的角度上讲,商品的价格应该与价值相关联,一件商品到底有多贵,不是谁来要多少就是多少,而应该探其本身的价值,价值是什么,无差别的社会劳动。

放到开源意义上讲也是一样,微软垄断了操作系统,不开源,而这样的软件或者企业必定会受到开源社区的影响,甚至威胁。就像越来越多的人会使用淘宝而不是去百货大楼买贵的衣服一样。在开源社区,开源的应用会显现其应有的价值,并随着需求不断发展进步,最终得到广大用户的认可,这是开源软件的价值所在。

就算大家可能没有看过Tomcat、Spring等优秀产品的源码,但一定用过并且知道他们的源码是可读的。开源社区创造了这样一个环境,她不但催生出从Jetty这类服务器,netty这类网络通信框架,而且也会产出像Lucene这种搜索引擎和Hadoop分布式计算框架等。另外,这一切的一切,回过头来又进一步促进了Java的发展。

其实,Java的发展成功因素也许不仅这些,但历经近二十年,Java依然是开发平台中的中流砥柱。

聊聊Java(零)
聊聊Java(一)
聊聊Java(二)
聊聊Java(三)

相关文章:

此条目发表在 Java, 开发, 计算机技术 分类目录,贴了 , , , , , , , 标签。将固定链接加入收藏夹。

聊聊Java(二)》有 1 条评论

  1. Pingback 引用通告: 聊聊Java——Java诞生的诞生背景 | 三石·道

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>