李锟

汉家烟尘在东北,汉将辞家破残贼。男儿本自重横行,天子非常赐颜色。摐金伐鼓下榆关,旌旆逶迤碣石间。校尉羽书飞瀚海,单于猎火照狼山。山川萧条极边土,胡骑凭陵杂风雨。战士军前半死生,美人帐下犹歌舞。大漠穷秋塞草腓,孤城落日斗兵稀。身当恩遇恒轻敌,力尽关山未解围。铁衣远戍辛勤久,玉箸应啼别离后。少妇城南欲断肠,征人蓟北空回首。边庭飘飖那可度,绝域苍茫更何有。杀气三时作阵云,寒声一夜传刁斗。相看白刃血纷纷,死节从来岂顾勋。君不见沙场征战苦,至今犹忆李将军。

原创 从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的问题的。

发表于 @ 2007年07月22日 23:50:00|评论(loading...)|编辑

旧一篇: 为何你应该选择Dojo?

评论

#suiyueln 发表于2007-07-23 11:22:41  IP: 124.114.116.*
但是目前或者最近3年选择java是明知的。也是唯一的!!!!!!!!!!!
#zlxym 发表于2007-07-23 13:40:02  IP: 218.6.192.*
从来没有什么唯一的选择,只有合适与否。Java在很多场合是不适合的,对于个人选择来说,也是一样。
#AlphaGroup 发表于2007-07-23 14:10:44  IP: 125.71.245.*
Java的最大优势就是在Unix或Linux下运行简化了原来C/C++的程序编写。替代了部分原来由C/C++在Unix或Linux下完成的工作。
#myan 发表于2007-07-23 15:42:21  IP: 210.77.134.*
动态语言在应用开发、特别是Web应用开发领域取得主流地位,这已经是不需要太长时间便可以实现的了。但是到底这几种主流动态语言各自如何定位,这是还需要观察的事情。

#wjzxx 发表于2007-07-23 16:55:16  IP: 211.103.225.*
本来看了这遍文章我也想学,百度了一下才发现是小日本的东西!!!不感兴趣.还是钻研的的c#了.
#willko 发表于2007-07-23 17:53:25  IP: 121.35.166.*
我也想学RUBY。。但是。。。时间不够。。
#jy00752900 发表于2007-07-23 20:57:35  IP: 60.26.59.*
虽然我不知道你所说的是不是这样,但是在我接触JAVAEE我感觉

以后也许会出现更强大更好的语言,但是目前来说我不认为哪个语言

能够比JAVA更加优秀....

我应用J2EE 也感到了复杂性,但是我只感觉到筐架的复杂性

我想会有更好的筐架~

就好象数据库一样 做到6 7 层泛式~确实是理想的

但是操作起来会多复杂,并且机器的负担加重了

我认为现在在层的概念上~确实这样是最规范的

但是做为代价来说~得失却说不清楚
#netcasper 发表于2007-07-23 21:39:40  IP: 58.34.246.*
不知道你对Perl的见解是自己归纳的,还是听别人说的?

引一句chromatic说的话:“I'd put it up against just about any J2EE application you could name.”见http://programming.reddit.com/info/1xz81/comments/c1y0c6

我无意引起语言之争,你愿意学什么就去学好了,但在说其它语言不好的时候要慎重,尤其是一种只用过7个月的语言。
#iamqixiang 发表于2007-07-23 21:54:49  IP: 222.92.42.*
非常到位的分析!谢谢作者!
#fxbird 发表于2007-07-23 22:36:07  IP: 221.201.184.*
静态语言为什么开发效率就低?
#platform 发表于2007-07-24 00:01:45  IP: 124.78.120.*
其实,俺看你的文章的目的是想知道:在你看来ruby的优势在那里。具体的优势。而且从某种角度来讲还不应该从个人用户的角度来看ruby.
#yaotyl 发表于2007-07-24 09:19:11  IP: 61.52.121.*
不知道说了些什么。。
#guigui179 发表于2007-07-24 09:22:07  IP: 61.185.224.*
其实你的目的不是 要1 -2 个人能做一个网站嘛
下一个开源改改就好了 或用php就好了

如果给你个银行的单子 估计你也做不来
#book_LoveLiness 发表于2007-07-24 11:56:44  IP: 222.221.213.*
支持dlee,虽然目前公司还是用的java,但是我个人兴趣早已转向rails了
#Fitzwilliam 发表于2007-07-24 12:32:45  IP: 59.44.116.*
不知道你你去年下半年做的那个广告发布平台有多大规模,不过,我想大部分时间一个人就可以搞定的项目不会很大。这种规模的项目你还不如直接使用PHP呢。
JavaEE不是用来做中小型网站的,建议你重新理解一下JavaEE中的第一个E代表什么。
#user2008 发表于2007-07-24 14:04:52  IP: 222.66.166.*
原来作者用专业相机照了两天还照不好的照片,用傻瓜相机一天不到就照好了,就认为傻瓜相机好啊。唉,楼主,你想想,连垃圾都能用得好的语言,还是好语言吗?还值钱吗?

大侠能用木棍把别人打扮,三脚猫拿屠龙刀也会落败,
你这个三脚猫还是好好提高自身的修养和水平吧,别怪自己没有本事用好的语言,语言是没有严格的好坏,只有用它的人有好坏之分。
#zuzong 发表于2007-07-24 15:18:56  IP: 60.216.87.*
你也太小看Web应用了,

哈哈。。。。。
#hawk_e2e 发表于2007-07-24 17:08:40  IP: 58.61.222.*
回来再详细看看楼主的分析,因为我觉得开发效率跟语言是静态还是动态没有直接联系。

楼主刚接触RUBY,用了一段时间JAVA。那您觉得Ruby能否开发出企业级应用?我觉得它在界面、效率、稳定上可能比不上JAVA,个人意见。
ruby像是一种玩具开发工具。呵呵。
#sidealice 发表于2007-07-24 18:31:23  IP: 10.100.50.*
其实大家没什么吵头啊

ruby语言比Java在灵活性上优势大很多,是否适合开发企业应用不是看语言关键是框架的成熟度,假以时日ruby的优秀特点发挥出来了,有了一个轻便又适合企业级应用框架是不成问题的。

批评ruby的人该看看“应用Rails进行敏捷Web开发”,注意楼主提醒大家的是“敏捷”,这点我想大家对java的繁杂都有同感吧。以后需求变化可能性会越来越大,越来越快,开发周期要求越来越短,就算是银行的系统用RoR也要比java搭配N框架效率高。

拥护ruby的人也的确底气不够,毕竟目前大型的企业级应用还没有大规模采用ROR,社区成熟度也无法和java抗衡的。执行效率也无法和java比,随着访问数据量上升只能通过硬件横向拓展。

但是我们是开发者不是CEO,看东西不就是要看的远吗,ruby目前的确可以当作一个玩具玩玩,但是玩的同时我们应该从上向下看,从宏观看问题。Java已经在自我反省了目前JRuby已经渐渐完善,微软的IronPython也青睐有加,大家喜欢哪个的确是萝卜青菜各有所爱,不过不容否认的是时代变了,硬件性能的提高以及开发效率越来越关键注定了动态语言的成功!
#gdss_wjn 发表于2007-07-25 02:02:14  IP: 58.41.126.*
正在入门,学习学习
#book_LoveLiness 发表于2007-07-25 12:21:59  IP: 222.172.222.*
任何一个说某某东西不过如此、不过是玩具语言的人,在我看来都是浮躁的,没有底气的……
#book_LoveLiness 发表于2007-07-28 12:16:20  IP: 222.172.222.*
李老师,我在都《agile rails》中文第二版的时候,发现一些印刷错误,一并贴在这里供您参考:

106页 代码
@product = Product.find(params[:id])
应该是
product = Product.find(params[:id])
110、117相应的代码也需要改正(这个比较严重)。
115页“为稍后的Ajax模法”我想应该是“魔法”吧?
138页第三段第一行“参加附录中的程序列表”——“参见”
153页代码第6行
flash[:notice]
应该是
flash.now[:notice]
173页最后一段文字“@products变量”应该是“@product变量”
243页第一段开始的“ActionSupport”应该是“ActiveSupport”
310页标题第二个“create”应该是“create!”,说明列表的第二项应该是“使用save!方法”
432页代码第7行“Comment”应该是“comment”
497页第三段文字“找我们”应该是“照我们”
535页倒数第二段“就是把remote_function一个”中的“remote_function”应该删除,重复了
545页倒数第二段文字“你也可以指定一个或者分隔符”,应该是“一个或者多个”

我也还在看这本书呢……
#yuyinghan 发表于2008-01-11 17:06:10  IP: 60.23.88.*
我的道行不算深,发表一下个人不成熟的意见:
ruby的对手是.net,它们的目标是相同的,将程序员的工作变成傻瓜式工作,但现在发展的侧重点有所不同,.net要将自已的UI变得更加漂漂以收买用户的眼球,而ruby则强调自已的开发效率,但就其适用范围都是中小型网站的快速低成本的建设,造就更好的客户满意度。说白了,它俩更像是照大头贴的机器,恨不得让最终客户自已来进行编程操作,最终目标“干掉WEB程序员”。
个人观点:如果你是那种很想赚钱而且干年就转行的程序员比较适合学习ruby,如果你只想做一个好的程序员,可以学习,但请不要放弃java!!!
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © dlee