Java的劣势在何处?与前些年相比
现在看的已经很清楚了
Java的劣势就在于做Web表现层的开发
Web表现层开发需求变化频繁
Java这类静态类型的语言不够敏捷
严重影响了开发的效率
而JavaEE的一个最大的缺点就是企图在服务器端搞定一切我将这种开发方式称作传统集中式的开发方式标准的JEE三层架构——Web表现层业务层持久层也许对于传统的基于HTML表单的Web应用来说是恰当的但是现在已经显得落伍了JavaEE企图在服务器端完全搞定Web表现层的开发给自己制造了一个大麻烦无论是从这门语言本身还是从支持这门语言主要的公司SunIBMBEAOracle来说他们并不擅长此道擅长此道的是哪些公司呢?Adobe/MacromediaM$Borland/CodeGear
如果Web表现层必须要在服务器端开发Ruby on Rails的优势与JavaEE相比要明显的多RoR要比任何主流的JavaEE Web表现层框架和技术(StrutsWebWorkSpring MVCJSFTapestryetc)更加灵活学习成本更低开发效率更高
换个思路来思考如果我们不再假设客户端就是几乎毫无智能的Thin Client将会如何?假设我们能够充分利用客户端的Ajax组件库和各种RIA技术将Web表现层完全或者绝大部分前推到客户端来开发并且通过REST风格的API来与服务器通信那么服务器的角色就变成了类似于Web服务提供者(注意这里和Web服务还是有很大的差别因为REST在这里是用于同一个应用内部的通信即连接一个应用的客户端和服务器端)的角色这样就能够极大地简化服务器端Java的开发工作让它从自己所不擅长的领域退出来集中精力做自己最擅长的一些工作
这个趋势其实在年多前我在JavaEye论坛中宣传基于XMLHttpRequest的开发方式的时候就已经看到了现在这个趋势已经越来越明显了新一代Web开发方式的面貌已经逐渐浮出水面Adobe AIR/FlexM$ WPF/Silverlight都是这样一类的开发方式当然Ajax也可以以这种方式来做开发我给这样一类开发方式取名叫做RIA+REST
在服务器端搞定一切当然也有好处因为这样可以获得最佳的控制安全问题解决起来也比较容易但是其代价就是无法得到最佳的交互设计强迫用户不得不承受降级的使用体验如果这样的用户体验是能够接受的那么采用这种方式做设计和开发问题不大但是如果这样的用户体验是无法接受的那么就需要严肃地考虑RIA+REST的开发方式了与传统集中式的开发方式相比这是一类新型的分布式的开发方式在一些方面(交互设计服务器端架构)得到了简化的同时也会使得一些方面(服务器端的控制能力安全性)复杂化所以要求架构师作出慎重的权衡分布式应用必然会带来很大的复杂性但是REST无疑是基于Web的分布式应用的最理想的架构风格在Web领域REST的优势要比RPC和分布式对象等架构风格大的多同时REST是简练实用的可以很大程度上降低分布式应用的巨大复杂性
根据我的经验在绝大多数中小型项目中Web表现层开发的工作量要比后面两层的开发工作量的总和还要大也就是占到项目开发工作量的一半以上当用户需要较为苛刻的使用体验时传统集中式的开发方式完全无法满足要求而必须由Ajax来补充然而对于有复杂交互需求的应用来说RoR应用的开发效率同样也会受到基于DHTML的开发效率的拖累而无法充分体现出其敏捷的优势
如果Java将做Web表现层开发的负担卸掉让客户端的RIA技术来承担那么Java在服务器端开发中与Ruby相比的劣势就不是那么明显了甚至在很多方面还有优势从整体架构的开发效率来考虑
RIA + REST + Java
RIA + REST + Ruby
两种架构组合也许可以达到大致相同的级别即使Java在开发效率上仍有劣势但是也不会像在传统集中式的开发方式中那样悬殊有很多传言说基于RoR开发的项目与基于Java开发的项目相比开发效率能够高出倍我虽然对于Java并不乐观但是对于RIA+REST这种新的开发方式我估计开发效率的差距应该可以降低到倍左右不过开发效率只是一个方面如果服务器端的代码经过良好重构重用性非常好不会在半年之后就成为必须要抛弃的遗留代码那么Ruby在开发效率方面的巨大优势也许只会停留在最初的阶段随着代码的积累这种开发效率的优势会逐渐降低下来
Ruby会不会拥抱RIA呢?RoR 将会是完全基于REST设计的开发框架他们现在拥抱REST就是为将来拥抱RIA做准备对于传统集中式的开发方式来说应用REST当然也会带来很大的好处但是我认为这并不是RoR的主要的目的RoR拥抱REST是希望使自己在将来的技术变迁过程中处于一个非常有利的位置对于未来Web开发技术的发展REST处在一个核心的位置它是连接客户端和服务器端的纽带REST也会极大影响客户端架构和服务器端架构的设计和建模面向资源的Web应用将会是未来几年的一个技术热点
Java在对于REST的支持这个方面行动要迟缓的多官方正在制订的JSR 规范主要还是面向不同的应用之间的集成也就是主要覆盖SOAP所覆盖的领域而不是面向RIA+REST这样一类新型的Web应用开发方式不过一些支持REST的Java框架已经存在也可以基于Adobe的Flex框架(今年之内就会开源)来做设计这些框架使得基于Java做REST设计和开发成为了一件比较容易的事情我们不指望Sun已经有很多年了日子不是一样过来了吗?Sun其实可以坦承我不做老大已经很多年了
综上所述我认为支持REST对于JavaEE而言意义甚至要比RoR更大是否能够拥抱未来Web开发技术的发展趋势对于Java语言未来的命运来说是至关重要的