`
tiantian911
  • 浏览: 228889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[李琨]从Java到Ruby——我的最近一次技术转型【转载自李坤的blog】

阅读更多
这里所涉及到的都是与软件开发有关的技术,感觉很有必要总结一下我从业以来所使用过的开发技术以及所经历过的几次技术转型。

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的问题的。
分享到:
评论

相关推荐

    网络安全等级保护v2.0详解(李琨) 1

    第四章等保2.0标准发布背景第二十一条 国家实行网络安全等级保护制度。网络运营者应当按照网络安全等级保护制度的要求,履行下列安全保护义务,保障网络免受干扰、破坏

    Ajax学习网址大全 .doc

    Ajax,即Asynchronous JavaScript and XML(异步JavaScript和XML),是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。这种技术的运用极大地提升了用户体验,因为它允许网页在后台与服务器进行交互,...

    红柱石基耐火材料抗铜液侵蚀的神经网络预测.pdf

    【红柱石基耐火材料】是用于高温工业如炼铜过程中的一种重要材料,因其具有高耐火度、高体积密度、低气孔率、优良的抗渣性和耐热震性而被广泛应用。红柱石是一种铝硅酸盐矿物,其主要化学成分为氧化铝和二氧化硅,还...

    《永磁无刷直流电机控制系统与软件综合研究-集成电机计算软件、电机控制器及电磁设计软件的创新设计与实践》,永磁无刷直流电机计算与控制软件:高效电机控制器与电磁设计工具,永磁无刷直流电机计算软件,电机控

    《永磁无刷直流电机控制系统与软件综合研究——集成电机计算软件、电机控制器及电磁设计软件的创新设计与实践》,永磁无刷直流电机计算与控制软件:高效电机控制器与电磁设计工具,永磁无刷直流电机计算软件,电机控制器,无刷电机设计软件,电机电磁设计软件 ,永磁无刷直流电机计算软件; 电机控制器; 无刷电机设计软件; 电机电磁设计软件,无刷电机设计专家:永磁无刷直流电机计算与控制器设计软件

    新能源汽车VCU开发模型及策略详解:从控制策略到软件设计全面解析,新能源汽车VCU开发模型及策略详解:从控制策略到软件设计全面解析,新能源汽车VCU开发模型及控制策略,MBD电控开发 新能源汽车大势所

    新能源汽车VCU开发模型及策略详解:从控制策略到软件设计全面解析,新能源汽车VCU开发模型及策略详解:从控制策略到软件设计全面解析,新能源汽车VCU开发模型及控制策略,MBD电控开发 新能源汽车大势所向,紧缺VCU电控开发工程师,特别是涉及新能源三电系统,工资仅仅低于无人驾驶、智能驾驶岗位。 ——含控制策略模型 整车控制策略详细文档 通讯协议文档 接口定义 软件设计说明文档 等(超详细,看懂VCU电控策略开发就通了) 内容如下: 新能源汽车整车控制器VCU学习模型,适用于初学者。 1、模型包含高压上下电,行驶模式管理,能量回馈,充电模式管理,附件管理,远程控制,诊断辅助功能。 2、软件说明书(控制策略说明书) 3、模型有部分中文注释 对想着手或刚开始学习整车控制器自动代码生成或刚接触整车控制器有很大帮助。 ,新能源汽车VCU开发模型; 控制策略; MBD电控开发; 模型学习; 代码生成; 整车控制器; 能量回馈; 诊断辅助功能,新能源汽车电控开发详解:VCU控制策略模型及学习手册

    Python读取Excel文件的方法详解及应用场景

    内容概要:本文详细介绍了两种利用 Python 读取 Excel 文件的不同方法,分别是基于 pandas 和 openpyxl。对于想要利用Python 处理 Excel 数据的读者来说,文中不仅提供了简洁明了的具体代码片段以及执行效果展示,还针对每个库的应用特性进行了深度解析。此外,文档提到了一些进阶应用技巧如只读特定的工作薄、过滤某些列等,同时强调了需要注意的地方(像是路径设置、engine 参数调整之类),让读者可以在面对实际项目需求时做出更加明智的选择和技术选型。 适合人群:对 Python 有基本掌握并希望提升数据读取能力的开发人员。 使用场景及目标:适用于任何涉及到批量数据导入或是与 Excel 进行交互的业务流程。无论是做初步的数据探索还是深入挖掘隐藏于电子表格背后的故事,亦或是仅为了简化日常办公自动化任务都可以从中受益。最终目标帮助使用者熟悉两大主流 Excel 解决方案的技术特性和最佳实践。 阅读建议:本文既是一份详尽的学习指南也是一份方便随时查阅的手册。因此初学者应当认真研究所提供的示例,而有一定经验者也可以快速定位到感兴趣的部分查看关键要点。

    毕设springboot基于springboot的医护人员排班系统.zip

    # 医护人员排班系统 ## 1. 项目介绍 本系统是一个基于SpringBoot框架开发的医护人员排班管理系统,用于医院管理医护人员的排班、调班等工作。系统提供了完整的排班管理功能,包括科室管理、人员管理、排班规则配置、自动排班等功能。 ## 2. 系统功能模块 ### 2.1 基础信息管理 - 科室信息管理:维护医院各科室基本信息 - 医护人员管理:管理医生、护士等医护人员信息 - 排班类型管理:配置不同的排班类型(如:早班、中班、晚班等) ### 2.2 排班管理 - 排班规则配置:设置各科室排班规则 - 自动排班:根据规则自动生成排班计划 - 排班调整:手动调整排班计划 - 排班查询:查看各科室排班情况 ### 2.3 系统管理 - 用户管理:管理系统用户 - 角色权限:配置不同角色的操作权限 - 系统设置:管理系统基础配置 ## 3. 技术架构 ### 3.1 开发环境 - JDK 1.8 - Maven 3.6 - MySQL 5.7 - SpringBoot 2.2.2 ### 3.2 技术栈 - 后端框架:SpringBoot - 持久层:MyBatis-Plus - 数据库:MySQL - 前端框架:Vue.js - 权限管理:Spring Security ## 4. 数据库设计 主要数据表: - 科室信息表(keshixinxi) - 医护人员表(yihurengyuan) - 排班类型表(paibanleixing) - 排班信息表(paibanxinxi) - 用户表(user) ## 5. 部署说明 ### 5.1 环境要求 - JDK 1.8+ - MySQL 5.7+ - Maven 3.6+ ### 5.2 部署步骤 1. 创建数据库并导入SQL脚本 2. 修改application.yml中的数据库配置 3. 执行maven打包命令:mvn clean package 4. 运行jar包:java -jar xxx.jar ## 6. 使用说明 ### 6.1 系统登录 - 管理员账号:admin - 初始密码:admin ### 6.2 基本操作流程 1. 维护基础信息(科室、人员等) 2. 配置排班规则 3. 生成排班计划 4. 查看和调整排班 ## 7. 注意事项 1. 首次使用请及时修改管理员密码 2. 定期备份数据库 3. 建议定期检查和优化排班规则

    MATLAB仿真的夫琅禾费衍射强度图:圆孔、圆环、矩形孔定制研究,MATLAB仿真:夫琅禾费衍射强度图的可定制性-以圆孔、圆环及矩形孔为例的研究分析,MATLAB夫琅禾费衍射强度图仿真 圆孔,圆环

    MATLAB仿真的夫琅禾费衍射强度图:圆孔、圆环、矩形孔定制研究,MATLAB仿真:夫琅禾费衍射强度图的可定制性——以圆孔、圆环及矩形孔为例的研究分析,MATLAB夫琅禾费衍射强度图仿真 圆孔,圆环,矩形孔可定制。 ,MATLAB; 夫琅禾费衍射; 强度图仿真; 圆孔; 圆环; 矩形孔; 可定制。,MATLAB仿真夫琅禾费衍射强度图:定制孔型(圆孔/圆环/矩形)

    商道融绿ESG评级20241231.xlsx

    详细介绍及样例数据:https://blog.csdn.net/samLi0620/article/details/145652300

    基于Dugoff轮胎模型与B08-01基础建模的七自由度车辆动力学模型验证:利用MATLAB 2018及以上版本与CarSim 2020.0软件的仿真对比研究,基于Dugoff轮胎模型与B08-01框

    基于Dugoff轮胎模型与B08_01基础建模的七自由度车辆动力学模型验证:利用MATLAB 2018及以上版本与CarSim 2020.0软件的仿真对比研究,基于Dugoff轮胎模型与B08_01框架的七自由度车辆动力学模型验证——使用MATLAB 2018及以上版本与CarSim 2020.0软件进行仿真对比研究,七自由度车辆动力学模型验证(Dugoff轮胎模型,B08_01基础上建模) 1.软件: MATLAB 2018以上;CarSim 2020.0 2.介绍: 基于Dugoff轮胎模型和车身动力学公式,搭建7DOF车辆动力学Simulink模型,对相关变量(质心侧偏角,横摆角速度,纵、横向速度及加速度)进行CarSim对比验证。 ,核心关键词:七自由度车辆动力学模型验证; Dugoff轮胎模型; B08_01建模基础; MATLAB 2018以上; CarSim 2020.0; Simulink模型; 变量对比验证。,基于Dugoff轮胎模型的七自由度车辆动力学模型验证与CarSim对比

    【毕业设计】基于Java+servlet+jsp+css+js+mysql实现“转赚”二手交易平台_pgj.zip

    【毕业设计】基于Java+servlet+jsp+css+js+mysql实现“转赚”二手交易平台_pgj

    恋爱聊妹术V2小程序源码4.1.0多开版.zip

    微猫恋爱聊妹术小程序源码介绍: 微猫恋爱聊妹术小程序源码是一款全新升级的聊天工具,它采用全新主题和UI,完美支持分享朋友圈功能。同时,它的独立后台也进行了大规模更新,让操作更加简单。其中,课堂页面、搜索页面和子话术列表页面等,均增加了流量主展示,具有超多的功能。 安装教程: 您可以先加入微猫恋爱聊妹术小程序源码的赞助群,然后在群内找到魔方安装说明。根据源码编号找到相应的安装说明,非常详细,让您轻松完成安装。

    电气安装工程安全技术规程-蒋凯,杨华甫,马仲范,王清禄译;孙照森校;鞍钢工程技术编委会编.pdf

    电气安装工程安全技术规程_蒋凯,杨华甫,马仲范,王清禄译;孙照森校;鞍钢工程技术编委会编

    基于Copula函数的风光空间相关性联合场景生成与K-means聚类削减MATLAB研究,基于Copula函数的风光空间相关性联合场景生成与K-means聚类削减算法研究,基于copula的风光联合场

    基于Copula函数的风光空间相关性联合场景生成与K-means聚类削减MATLAB研究,基于Copula函数的风光空间相关性联合场景生成与K-means聚类削减算法研究,基于copula的风光联合场景生成?K-means聚类并削减 MATLAB 由于目前大多数研究的是不计风光出力之间的相关性影响,但是地理位置相近的风电机组和光伏机组具有极大的相关性。 因此,采用 Copula 函数作为风电、光伏联合概率分布,生成风、光考虑空间相关性联合出力场景,在此基础上,基于Kmeans算法,分别对风光场景进行聚类,从而实现大规模场景的削减,削减到5个场景,最后得出每个场景的概率与每个对应场景相乘求和得到不确定性出力 ,基于Copula的风光联合场景生成; K-means聚类削减; 空间相关性; 概率分布; 场景削减,基于Copula与K-means的风光联合场景生成与削减研究

    模块化多电平变流器MMC的VSG控制技术研究:基于MATLAB-Simulink的仿真分析与定制实现-支持三相与任意电平数,构网型模块化多电平变流器MMC的VSG控制策略与仿真模型:三相负荷变动下的

    模块化多电平变流器MMC的VSG控制技术研究:基于MATLAB-Simulink的仿真分析与定制实现——支持三相与任意电平数,构网型模块化多电平变流器MMC的VSG控制策略与仿真模型:三相负荷变动下的虚拟同步发电机控制研究,构网型 模块化多电平变流器 MMC 的VSG控制 同步发电机控制 MATLAB–Simulink仿真模型,可按需求定制 10电平.14电平,任意电平可做。 三相MMC,采用VSG控制。 设置负荷变动,调整有功无功,保持电网电压和频率 ,构网型模块化多电平变流器; MMC的VSG控制; 虚拟同步发电机控制; MATLAB–Simulink仿真模型; 任意电平可做; 三相MMC; 负荷变动; 有功无功调整; 电网电压和频率保持。,基于VSG控制的模块化多电平变流器(MMC)的构网型仿真模型

    暗通道算法DCP-Python实现

    暗通道算法DCP-Python实现

    南师大实验室安全准入知识供学习

    南师大实验室安全准入知识供学习

    纯openMV寻迹小车.zip

    纯openMV寻迹小车.zip

    【毕业设计】基于Java mvc架构开发的完整购物网站.zip

    【毕业设计】基于Java mvc架构开发的完整购物网站

    以下是针对初学者的 **51单片机入门教程**,内容涵盖基础概念、开发环境搭建、编程实践及常见应用示例,帮助你快速上手

    以下是针对初学者的 **51单片机入门教程**,内容涵盖基础概念、开发环境搭建、编程实践及常见应用示例,帮助你快速上手。

Global site tag (gtag.js) - Google Analytics