以文本方式查看主题

-  曙海教育集团论坛  (http://peixun0.cn/bbs/index.asp)
--  JAVA语言开发  (http://peixun0.cn/bbs/list.asp?boardid=64)
----  从Java到Ruby——我的最近一次技术转型  (http://peixun0.cn/bbs/dispbbs.asp?boardid=64&id=2479)

--  作者:wangxinxin
--  发布时间:2010-12-11 10:03:08
--  从Java到Ruby——我的最近一次技术转型
这里所涉及到的都是与软件开发有关的技术,感觉很有必要总结一下我从业以来所使用过的开发技术以及所经历过的几次技术转型。

1996年7月-1999年10月3年时间一直使用C语言编写电信协议软件,算作我的C语言时代。其中还使用过一段时间SDL语言和基于SDL的代码自动生成工具(瑞典Telelogic公司的SDT)。
2000年3月-2000年10月7个多月时间使用Perl语言做网站开发,算作我的Perl语言时代。后来转向了使用Java和JSP,用了两个月。
2001年2月-2001年8月6个月时间使用JavaScript做DHTML开发,还使用ColdFusion做网站开发。
2001年12月-2001年6月7个月时间使用C语言做企业级邮件服务器开发。
2002年8月之后做开发一直使用Java语言至今,算作我的Java语言时代,算算已经快5年了。

在我使用过的这些语言中,有3种语言对我的影响最大,那就是C、Perl和Java。当然JavaScript对我的影响也很大,不过对于整体的应用软件开发来说,JavaScript并不是一个主角。

现在我正在经历一次新的技术转型,从Java语言转向Ruby语言和Rails框架。

如果说以前的几次技术转型都是因为工作的变动而导致的,那么这一次技术转型则是我自己主动发起的,因为我感觉Ruby代表着应用软件开发技术(注意限定词 “应用软件”)的未来。Ruby是一种比Java更加先进的应用软件开发语言,最重要的是它能够带来极高的开发效率,而且不会影响代码的可读性和可维护性。

一年多以前我对Java还抱有一些幻想,认为Java社区如果有更好的框架,开发效率一定会追上Rails。今年5月我读了 Bruce A. Tate的《超越Java》这本书,希望从专家那里了解一下Java语言和Java社区到底出了什么问题。这本书打消了我的幻想,让我理解了Java最大的问题在于静态类型对开发效率造成的严重影响。联想到我去年下半年做的那个广告发布平台,我对此深有感触。我当时所采用的框架是Spring MVC+Spring IoC+Hibernate+FreeMarker+SiteMesh,按理说在Java开发领域,这套组合的开发效率应该算是比较高的了。然而实际的开发进度远远低于我的预期,我作出第一个版本的时间差不多是预计时间的两倍。当然因为资金的缺乏,大部分时间都只有我一个人在做开发,什么都要亲自动手,困难确实很多。不过我认为主要的问题还是在于Java语言做Web开发的笨拙。

因为资金的缺乏,我今后要做一些自己感兴趣的东西,注定仍然只会有很少的人参与(2、3个人),Java这样笨拙的语言可能会使我付出双倍的代价。

当然,Java语言仍然在发展和变化,但是它变的越来越复杂,越来越缺乏一致性,最终很可能会发展成为像C++那么复杂的一种语言。Java越来越不适合Web应用的开发了(我说的比较谨慎是因为这个领域是我最熟悉的),是到需要寻找一种新的开发语言的时候了。

Rod Johnson确实很伟大,在参与翻译了《J2EE without EJB》之后,我至今仍然对Rod Johnson对于JavaEE的伟大贡献深感敬意。但是Spring是从企业应用环境成长起来的,它对于面向Internet的Web应用来说,仍然是太重了。而Web 应用的很多重要的需求(例如对Ajax的支持、对REST的支持等等),Spring并没有解决。做企业应用,Spring仍然是很好的选择,然而做Web应用,Spring,甚至是Java语言本身,都不是很好的选择。为何在Web应用开发技术方面,PHP最终占据了第一的份额,这是很值得思考的。

我们以前做网站开发从Perl语言转向了Java语言,主要的原因有以下这些:
1. Perl开发的应用代码量大了之后很难维护。我自己写过一个4、500行的复杂Perl程序,过了两个月后再读居然都读不懂了。
2. Perl这个工具最初是设计用来取代bash、awk、sed等工具的,因为Larry Wall觉得这些工具还不够强大灵活。Perl最初并不是设计用来作为一种全功能的应用软件编程语言的。
3. Perl对面向对象编程支持的并不好。
4. 对于Web开发来说,Perl的资源(开发框架、开发库)没有Java丰富,很多功能需要自己来开发。
5. CGI开发与支持session的Servlet/JSP开发相比太原始,开发难度太大。

所以我们有非常充足的理由转向Java语言。还有一个不大好开口的理由就是,做Java开发当时似乎是成为一个专业程序员的标志,纯粹的面子问题,当然Java程序员的就业前景也要好的多。

但是转向Java之初最强烈的感觉就是Java做一些与文本处理相关的工作非常麻烦,没有Perl快捷,而这些工作对于开发Web应用来说是很常见的。当时 Java核心类库甚至还不支持正则表达式,需要下载学习其他的开发包,直到JDK1.4之后Java核心类库才开始支持正则表达式。不过JSP这样与 ASP、PHP类似的服务器页面技术是比CGI要先进一代的技术,所以开发效率还是比写Perl CGI有所提高。

我做了一段时间JSP 开发,发现全部代码都混在页面中问题很多,于是开始学习Java Web开发的Model1和Model2,并且接触到了当时刚刚兴起的Struts。不过因为工作转换,并没有深入使用Struts。后来我用了半年 ColdFusion之后,就不爱使用JSP了。JSP的开发效率虽然比Perl CGI高一些,但是比起ColdFusion来说还是要低很多。JSP开发后来逐渐转向基于custom tag的开发方式,并且最终出现了JSTL,在我看来是一种对ColdFusion的模仿。Java社区后来出现了n多的MVC框架、n多的IoC框架、 n多的ORM框架。《J2EE核心模式》所提倡的标准的三层架构至今仍然被当作铁律来遵循,过多的层次带来了巨大的灵活性,同时也带来了巨大的复杂性。除了JavaEE之外,我还没有看到其他的服务器端开发技术如此强调三层架构或者多层架构。一般来说,分出MVC就足够了。而JavaEE开发不仅要在 Web表现层中分出MVC,还要在M中再分出业务层和持久层。这个分层的设计,是做JavaEE开发很难实现Martin Fowler在《企业应用架构模式》中提倡的充血的domain model的一个主要原因。另外Java语言本身的静态类型所造成的笨拙和无法避免的重复代码也是一个主要的原因,如果不强调分层,并且真的实现充血的 domain model,那么一个类中包含的代码量会显得太多太复杂了。

Java社区中的一些厂商目前在大力追捧JSF和EJB3,但是我并不认为JSF和EJB3或者将两者集成在一起的JBoss Seam能够拯救JavaEE。复杂性才是JavaEE最大的问题,JBoss Seam成功的关键在于它能否成功地掩盖JSF和EJB3的复杂性,使得学习成本降低到与Rails相当的级别。不过即使它能够做到,将来开发者还是要面对Java语言本身的静态类型所造成的开发效率低下。我并不认为JBoss Seam有机会在开发效率上超越Rails。另外一个值得关注的框架是Grails,它是基于动态语言Groovy的,严格来说不能算是Java社区的框架。不过由于它基于Spring、Hibernate、SiteMesh,所以也可以看作是Java框架的进一步发展。在开发效率方面Grails也不大可能超越Rails。除了开发框架本身,还需要考虑众多外围工具的支持和社区的规模,在这些方面Grails不可能达到Rails的水平。还有一个RIFE呢,虽然我完全不了解它,不过看来它受到的关注很少。一个几乎完全被忽视的框架,成功的前景估计很渺茫。Wicket我认为是不值得考虑的,现在我们应该把目光仅仅投向那些full stack框架上,建造一个更加精巧的Web MVC框架解决不了根本的问题,对开发效率的提升是有限的。Cetia4和Restlet也是两个很有趣的框架,特别是它们能够支持REST开发,代表了 Java Web开发框架的未来。Google的Guice是一个很有可能取代Spring的轻量级IoC框架,前景似乎不错。不过Cetia4、Restlet、Guice这些框架和Wicket一样,并不是full stack框架,对开发效率的提升是有限的。

根据上述分析,我现在对Java社区内部的创新能力已经感到很失望了(很明显我后知后觉了,感到失望的大有人在),这种持续了10年之久的创新能力似乎已经逐渐枯竭。由于动态类型的脚本语言(Python、Ruby、JavaScript等等)这些年来取得了长足的进步,而且在Web开发方面出现了一些killer级的框架,现在是将目光投向其他开发语言的时候了。我的决定就是在今年下半年完全转到Ruby和Rails这个平台上面。从Java转到 Ruby有几个强有力的理由:
1. Rails可以让单个开发者在开发效率方面接近自己能力的极限。我并不是一个完美架构的fans,热衷于不写一行代码,巨细无靡地分析各种架构优劣直到脑神经瘫痪。我热衷的是解决用户真正关心的问题,用技术改善他们的生活,与用户建立起良好的人际关系。
2. Rails框架对Ajax有更好的支持,通过使用RJS模板可以极大减轻一般情况下做Ajax开发的复杂性,提高开发的效率。
3. Rails框架对REST开发提供了最好的支持。REST在Web开发方面会越来越重要,全面支持REST就是未来所有语言Web开发框架发展的方向。
4. JRuby 1.0对Rails的支持已经很好,而且支持直接使用Java开发的资源,所以现在是从Java转到Ruby的一个适当的时机。

我已经读完了《Ruby for Rails中文版》,并且出了一个个人的勘误。《应用Rails进行敏捷Web开发》第2版我已经读了1/3,在一周之内可以全部读完。这两本书读完之后,基本上已经入门了。在入门阶段我只准备读这两本书,然后我会通过开发来熟悉更多的技术。因为我对Perl、JavaScript和Java语言的熟悉,所以学习Ruby和Rails并没有感觉有什么难度。事实上阅读《应用Rails进行敏捷Web开发》第2版要比我阅读《Struts实战》之类的书容易理解的多(同时也更加有趣味,我第一次没有感觉犯困),到目前为止,一切都感觉很自然。Ruby在我看来就是Perl+JavaScript+Java,毫无疑问是一门伟大的语言。很可惜晚学习了整整一年多,否则去年见到Martin Fowler的时候本应该问他更多关于Ruby的问题的。