技术体系的选择之Java篇
经常有朋友对几种开发语言进行争论,有的说Java好,有的说.Net好,还有的说Php好,最后往往是变成了互相攻击,不欢而散。关于开发语言之争本质上是技术体系之争,开发语言也不过是某种技术体系里构建应用的工具。实际上,对于一个问题往往有多种多样的解决方案,可能每一种技术体系都能最终实现,但“能不能”跟“好不好”是两回事,这里面有个性价比的问题。就象我们打蚊子一样,我们可以用苍蝇拍去拍,也可以用大炮去轰,最后都能把蚊子给打死。大炮威力无比,无所不能,杀伤力极大,但对于打蚊子而言,还真不如苍蝇拍好用。采用重量级的的Java技术去做Web2.0的网站,就跟大炮轰蚊子的效果差不多。当然,反过来,也有的时候会出现“小马拉大车,瘦驴拉硬屎”的情况,比如用Php去开发一个银行结算系统,肯定也能做出来,速度倒是刷刷的,但一种弱类型的语言可能在运行时充满了变数,又有哪家银行敢冒这样的风险,他们宁可选用比较成熟的Java技术解决方案,速度虽慢,但用着心里踏实。每一种技术体系都有自己擅长的应用领域,一种技术体系想要通吃全盘的结果往往是“样样通,样样松”。
那么我们到底应该选择什么样的技术体系呢?技术体系的选择,对于一个IT公司而言,主要取决于它的商业目标,反过来说,商业目标需要一个合适的技术体系去推动。比如,公司是做电信项目系统集成的,那就基本确定以J2EE平台技术为主了;如果公司准备运营Web2.0网站,那么LAMP就是最好的选择,以后开发的语言就是3P(Php/Perl/Python)了。一个IT公司只有选择了合适的技术体系,才能更好更快地实现公司的商业目标。对于个人而言,技术体系的选择,可能会在很长时间内,决定了你的职业发展目标,比如以后你是做网站还是企业应用,你是做产品还是做项目。
技术体系的选择和确定一般是由CTO或者首架依照公司的商业目标确定,也有时候取决于客户或者行业的要求。当然,如果只以系统实现作为目的的话,架构师就可以参与实现技术的确定了,一旦选定了某种技术体系的话,所有的开发活动都被限定这种技术范围之内。作为架构师而言,必须具备较为宽广的知识体系,技术体系的基本知识便是其中之一。
以下,我将对Java技术体系、.Net技术体系和LAMP技术体系逐一剖析,重点分析这几种技术体系的技术特点和适应领域,技术特点是决定适应领域的重要因素。
1. Sun ONE体系架构
Sun ONE(Sun Open Net Environment)是Sun公司为了对抗微软的.NET体系架构而推出的,以Java语言为核心,并基于一系列开放和流行的标准、技术及协议的体系架构,Sun ONE包含了J2SE、J2EE和J2ME 3个平台,基本覆盖了应用开发的全部领域。
J2SE(Java 2 Platform, Standard Edition)
Java 2平台标准版,适用于桌面系统应用程序的开发。
J2EE(Java 2 Platform, Enterprise Edition)
Java 2平台企业版。利用J2EE平台可以简化企业解决方案的开发、部署和管理。J2EE主要用于构建企业级的服务器应用和分布式的网络程序的开发。
J2ME(Java 2 Platform, Micro Edition)
Java 2平台微型版。Sun公司将J2ME定义为“一种以广泛的消费性产品为目标、高度优化的Java运行环境”。J2ME平台广泛用于嵌入式的消费型产品中,如手机,掌上电脑,智能卡,机顶盒,汽车导航系统或其他无线设备。
我们中的多数人从事的是基于J2EE平台上企业应用的开发,以下重点讲述的就是J2EE开发平台和开发技术。
2. Java技术特点
2.1 安全性
Java平台从诞生时就充分考虑了安全性的问题。Java平台提供了基于原始安全模式的沙箱模型。沙箱模型的实质在于信任本地代码,使其可以完全访问重要的系统资源,而对于下载的远程代码则不被信任,因此只能访问沙箱内提供的有限资源。对于从开放网络中得到的不被信任的代码,该模型提供了一个非常严格的使用环境。Java引入了认证器组件,它在.class文件运行前完成该文件的安全检查,确保Java字节码符合Java虚拟机规范。Java平台通过使用认证器查看类文件的句法和词法的正确性,检查版本及API符合性等,以保证不突破Java语言的任何限制,可以被安全执行。这一特点.Net技术体系也都具备,LAMP虽然不具备这么完善的安全机制,但目前也未发现重大的安全漏洞。
2.2 健壮性
Java语言是一种强类型的静态语言,运行前必须进行编译。它要求变量和对象的类型在使用前必须声明,保证语法没有二义性,所以生产出来的代码的在可读性、可靠性和可预测性方面比较好,尽量地在运行前摒除系统中潜在的不稳定因素,极大地防止了运行期间出现错误。另外,在运行期间的容错机制,也保证了系统运行期间,不会因为局部问题引发整体的坍塌。象LAMP技术体系中的Php这种弱类型的动态语言,比较缺乏企业级应用的所看重的要素,导致最终不能走上企业级大型系统开发的原因之一。这一特点.Net技术体系的开发语言也都具备。
2.3 跨平台性
Java应用具有平台可移植的特性,既可以运行在Unix/Linux平台上,又可以运行在Windows平台上。操作系统是任何应用的最基础的支撑环境,Java应用能够运行在Unix/Linux平台上这一点非常重要,几乎决定了它的应用领域。可以这么说,大多数的系统安全问题都基本上取决于操作系统的安全性。Unix一直被认为是最安全的操作系统,主要是因为它坚持开放的策略,可以接受更多技术人员的审查和测试,而且具有非常悠久的历史。同时,Unix被认为是稳定高效的操作系统,在安全性、稳定性、高效性等几个方面要明显高于Windows Server的。Java应用可以运行在Unix平台上,直接继承了这些优势。这一点对于只能运行在Windows平台上的.Net要逊色不少,至于像开源的Mono能够实现.Net在Unix/Linux上的跨平台运行,只能具有象征意义,并没有经过大规模的实践。
2.4 面向对象
JAVA语言是彻底的面向对象的语言,软件工程的一些最新的思想和理论,大多数都是在Java平台和开发过程中最先实践的,这对于解决大型系统的分析、设计和编程提供了很好的语言级别的支撑。
2.5 其它特性
Java语言具有平台无关性,它对每种计算机都一样。比如,简单的类型都是不变的:整数总是32位,长整数总是64位。令人奇怪的是,诸如C及C++等时髦的编程语言却不是这样。由于这些语言定义如此自由,每种编译器及开发环境便各有不同了,这使程序的移植成为讨厌的问题。Java程序的移植却很容易,而且不需要进行重新编译。Java语言相对于传统语言作了一些简化,去除了诸如预处理、指针运算、结构、联合以及运算符过载等语法,还去掉了容易面向对象中的造成混淆的多重继承等等。当然,这些特性与.Net开发语言C#以及LAMP中的PHP相比没有特别明显的优势。
3. Java技术适合的领域
基于J2EE平台的开发,是比较适合于工业级别的应用开发,象金融、保险、电信、ERP以及电子商务等领域,而且大多属于基本上属于大中型级别的业务系统。
为什么Java技术适合于这样的领域,而不是.Net或者LAMP呢?我总结了以下几个方面的因素:
1)厂商支持
Java技术适应领域的业务系统的特点:业务逻辑比较复杂,要求系统具有高可靠性、安全性和容错性来保证交易事务的成功。对于这类行业来讲,选择技术路线的时候一般采用较为保守的策略,更倾向于选择成熟的方案、产品和技术提供商,而不仅仅是选择某种语言、某种技术、或者是某种应用服务器的这样很局部的问题,他们往往需要的是一整套的解决方案。大型软件服务提供商,象IBM、SAP、ORACLE等等,他们售卖的正是这样整套的解决方案,从行业咨询到流程优化,从数据库到应用服务器,从开发环境到系统部署,从售前咨询到售后服务等各个环节都非常成熟,而且有很多成功的本行业的实施案例。这些软件服务提供商的主流产品和对外提供的平台多数是基于J2EE平台的,几乎没有基于.Net技术体系的产品,LAMP就更不用提了。
2)操作系统
从操作系统的角度来讲,Unix的诞生要远早于Windows操作系统,Windows Server更晚,上述业务领域的多数应用,此前就一直运行在Unix操作系统上。因此,他们基于运营连续性考虑,选择Unix/Linux操作系统肯定是一种比较稳妥的方案。又有哪个这类企业把以前的系统推翻,全部采用Windows平台,其中包含的成本和风险,恐怕没有哪个企业敢去承担,而且也确实没有理由去进行更换。Java应用不仅可以在Unix/Linux上运行,而且在Unix/Linux的表现的确不错。另外,我们上面也提到了Unix/Linux操作系统的安全性、稳定性和高效性明显高于Windows,使得能够运行在Unix/Linux上的Java应用成为了最好的选择。
3)技术特点
Java平台的安全性、健壮性、稳定性以及容错性是企业级应用开发必不可少的前提。Java语言的的面向对象特性有助于实现系统的可维护性和可复用性设计,它的简单性又能保证开发的效率和系统的健壮性,这些是C,C++等语言无法比拟的。
4)开源产品支持
软件工程的一些最新的思想和理论,大多数都是在Java平台和开发过程中最先实践的。基于JAVA的成熟的开源框架也极好地支持了大型系统的开发,比如常用的MVC框架Struts、ORM框架Hibernate、IOC框架Spring。从系统分析、设计、编码、测试各个环节都有非常成熟的开源框架和工具,而且已经被成功地应用于系统开发实践中。类似这些产品和工具在.Net技术体系和LAMP技术体系中尚未形成大规模的实践。
4. 基于Java技术的Web开发