- 浏览: 88925 次
- 性别:
- 来自: 南京
-
文章分类
最新评论
-
angjunwen:
redirect_to 是重新提交一个请求到控制器方法,所以原 ...
render与redirect_to的区别 -
lin_style:
redirect_to 应该是重新提交了一个请求,不理会当前的 ...
render与redirect_to的区别 -
bugx:
这样不是变得密码可以为空了吗
如何在update一条记录的部分字段时跳过某些校验 -
evil850209:
不错,最近正为这个发愁呢!
render与redirect_to的区别 -
wiisola:
theone 写道wiisola 写道theone 写道upd ...
如何在update一条记录的部分字段时跳过某些校验
转自:http://vipnews.csdn.net/newscontent.aspx?pointid=2008_03_03_170600555
文/杨祥吉
本文作者以使用Ruby和Rails进行创业为经验背景,结合具体的项目,尝试以客观公正的方式来评价Ruby、Rails和Agile。下面的文字,我们将以名词解释和实践的方式看看这些词汇带来的价值:
Agile
敏捷开发是一个高频度的热词。 实施敏捷开发的好处很多, 技术公司都在研究。NibiruTech从诞生便是一只遵循敏捷方法论的团队。 目前我们采用的敏捷技术,请看后面的名词解释。
测试先行
所有的项目,都是以TDD的方式开发,要求先编写测试代码,然后再编写功能代码,使得这个测试被通过。新程序员入职最先接触到的就是TDD的 知识和各种培训。我们大量采用了Autotest这种工具,使得测试代码在开发过程中持续运行。甚至为了更方便查看,每个成员都配备了第二个显示器,其主 要用途就是为了显示测试运行结果。
结对开发
结对开发已经成为我们的主要培养新人的方法。结对编程是指两人共用一台电脑,一路讨论编码。结对编程是一种乐趣,使得双人任何一人会感受到巨 大的乐趣。结对编程是共同分享技术挑战和难题,共同享受编码的乐趣。这会显著降低程序员的工作枯燥程度,提高技术水平。结对已经成为我们主要的培训方式。
短周期迭代
敏捷开发中讲究短周期的迭代,尽量缩短项目Release的时间。NibiruTech做到每天自动部署到测试服务器上,方便远程的客户直接在互联网上查看当天的产品进度,并及时提交反馈。
每日晨会
每日晨会上,大家回答“昨天做了什么工作?”、“今天计划做什么工作”。早上项目组的人到齐后,第一件事就是站成一个圆圈,依次讨论昨天的工 作和今天的计划。期间也有很多关于项目的整体需求,技术难点的讨论。由于大家都是站立开会,会议鼓励简短,高效的发言,显著提高了项目组的内部沟通和信 任,每日晨会的帮助很大。
从我们的实践经验来看,执行力无疑是实施过程中很重要的因素。任何流程的形成都需要很大的决心和长期的努力。我们的经验是,一项一项地进行实 施。实施过程中不断进行调整和反省,当TDD成为一种习惯后,便开始晨会,几个星期后,晨会也成为团队习惯了,就能进行下一步。需要团队中有人强力地坚持 推行敏捷思路,而且要慢慢推进,一项一项地推进。
Ruby
Ruby是一种有趣的语言。Ruby语言的创始人Matt从小就对计算机语言有天生的兴趣,强烈到无法自己。他前后编写了10种语言,没有任何一种release过,全部失败,直到第11种语言,被称为Ruby。
Ruby是一种解释型的方便快捷的面向对象脚本语言,它是日本的Yukihiro Matsumoto(人们都叫他Matz)于1993年2月24日首次发布的。
Ruby精心地设计了它的面向对象特性,使之完整并且开放允许改进。比如:Ruby有在运行时可以向类里,甚至能够向实例里添加方法的能力。所以,如果有需要,某个类的一个实例可以表现得和同一个类的其他实例不一样。
Ruby是一种完整的纯面向对象语言(OOL)。这就是说所有的数据在Ruby里面都是对象,不是像Python或Perl那样,而是像Smalltalk那样的纯面向对象(没有什么例外)。比如:在Ruby里面,数字1是类Fixnum的一个实例。
Ruby精心地设计了它的面向对象特性,使之完整并且开放允许改进。比如:Ruby有在运行时可以向类里,甚至能够向实例里添加方法的能力。所以,如果有需要,某个类的一个实例可以表现得和同一个类的其他实例不一样。
假如你希望Procduct类的find方法在参数为1 的时候,直接返回某个事先设定的对象。借助Mocha这个Ruby gem,你可以用近乎人类自然语言的方式说:
这就是Ruby 强大而又灵活的地方。
Ruby一个思想是,语言应该尽量给编程者最大的自由度,当然需要程序员明白自己在做什么的情况下。
声明了为Private的方法,在其他语言中是不能被其他类中调用。而在Ruby中,假如你确信你需要这样做,你可以:
因为Ruby认为一旦程序员知道自己想做什么,就应该让他去做,即使违反了常规。
从来没有见到过任何一门语言可以如此轻松的对已有的核心API进行修改和增强。
例如Rails的作者在写Rails的时候,就对Ruby的Hash需要进行增强。
而后只需要:
便成功地为Hash这个类添加了revers_merge这个方法。
上述例子,只是Ruby语言强大灵活的一些简单例子。可以说,正是因为Ruby语言,才使得Rails成为现实。很难想象其他任何一门语言能够让一个独立的程序员完成一个如此出色的Web框架。Rails使用的越多,越是感受到Ruby和Rails同样出色。
Rails
作为computer world评选出的2007年最值得研究技术,Ruby On Rails从一出生就是媒体的宠儿。这一切源自其独特的思维,抛弃原有技术落后遗产,轻装上阵的便捷。
许多人都看过下面这幅图片,图片的左边是使用Java Web框架,所需要用到的技术书籍。右边是使用Ruby on Rails,需要用到的技术书籍,只有两本,简洁清新,优雅愉快。作为一个使用Ruby On Rails的先行者,我想指出上面的图只是从技术复杂程度上进行了对比。事实上,Java作为重型武器,有许多轻型武器暂时无法取代的地位。只是从技术的 复杂度讲,Ror确实简单优雅许多。
DRY 原则
这些设计规则中的一个就是来自于Dave Thomas的Pragmatic Programmer一书中的“DRY重用原则(Don"t Repeat Yourself)”DRY原则意味着创建到应用程序中的信息和逻辑应该被局部化或隔离。它应该尽可能少的存储在更少地方,副本应该保持在绝对最低限度。 这种原则有助于组织开发者的思路和保持好的开发速度,而且使得的代码可以被更轻松修改。这种更轻松的修改所带来的好处不仅仅体现着维护模式中,在最初的开 发中同样也会体现出来。Ruby通过使编程更轻松,而鼓励这种行为。
convention over configuration
Rails强调convention over configura-tion。这意味着这个框架的用户不用去做太多的设置工作,或者不用花费太多的时间来处理一些个别的组件。举个例子来说,Rails 假定在代码中的类名称和数据库中的表名称之间存在关联。如果你坚持这个标准约定,你代码将显得更具有逻辑性和更平稳;否则,你将不得不做一些额外的工作。 当默认约定与你的实际情况发生冲突时,感谢Ruby难以置信的灵活性和宽容,你可以轻易改变任何Rails的行为,使得其完全按照你的思维运行。
Ruby on Rails这样的技术的出现,使得实现一个独特的互联网创意的代价急剧降低,从而加剧了创业的门槛,使得任何领域内充满了大量的创业者。竞争的加剧使得创新不断涌现,互联网急剧的改变着整个人类社会的发展。
最近数年中,Facebook、Myspace、youtube等网站的创新,及其大量的追随者,极大的方便了人们的生活,工作和学习。可以说,任何受过良好教育的人,已经无法离开互联网了。网络游戏、网络媒体、电子商务、软件外包,因为互联网才得以出现。
互联网时代,使得个人成为英雄的机会大大增加。DHH,作为一名26岁的丹麦年轻程序员,不满意大公司傲慢的web框架,从自己的工作项目中,抽取了一个实用小巧的framework,这个小小的开源项目,成就了2005年技术领域的创新,DHH一个人改变了世界。
Ruby on Rails在2004年发布了它的第一个公众版。现在它已经不是一个蹒跚学步的孩子。在2005年,David Heinemeier Hansson因为这个软件程序获得了“年度最佳黑客”奖项。在2006年,Rails赢得了2006年度Jolt大奖的最佳Web开发工具,2007年 Rails被评选为年度最值得研究技术。
当前人们对Ruby这门编程语言吵得不可开交了,尤其是对Rails这个Web应用开发框架更是吵得一塌糊涂。有人说它是编程的未来,前途光明;有人说它是旁门左道,危险暗淡。
我是在1年前开始用Ruby来创作http://www.englishquad.com,边学边用的过程充满了艰辛。当技术转型完成后,一切变得如此美好,以至于一直想更好地使用RoR为更多的企业服务。
通过和更多的使用RoR企业交流,已经可以根据好几个项目的经验做分析了,到目前为之,分析结果力挺Ruby。每次我问使用过RoR的人: “你觉得用Ruby比用Java或C#生产力有显著提高吗?”我听到的无一例外都是一句有力的肯定:“是的!”这已足够让我开始断言:如果你的项目合适, 就应该给Ruby个机会。
也有观点认为,尽管Ruby和Rails是出众的平台,但可能无法成为主流。完全理解这个观点,优秀高产的平台可能成不了当前主流企业应用的首选。如果对你而言,重要的是只采用主流平台,那么你还得静观其变。不过,不囿于主流而获成功的案例也非常多。
还有许多项目,开发的生产率并不是首要的,取而代之的是政治及其他沟通上的因素。那样的话,RoR的优势就被大大削减了。
总的来说,通过数年的RoR创业和对其他伙伴的关注,我对在注重速度、响应性以及生产力的严肃工作中使用RoR持越来越肯定的态度,并愿意将我们的经验分享出来。
源自真实应用
Rails来源于真实世界中的应用程序。Rails并不是最初的目标产物,当时是为了开发一个叫做Basecamp的Web应用程序。在 DHH和其他人开发这个应用程序的时候,他们多次发现,Web开发是一件令人痛苦的事情,而且耗时、具有反复性和注重细节。这给了Ruby on Rails一个诞生的机会。
在编写这个高度浓缩的Ruby编码的过程中,DHH开始从界面的本质进行提炼,于是就诞生了Ruby on Rails。因此说它源于真实世界的需求,源于使用中的代码,源于开发者的每日体验。这与其他技术框架的学术和研究气质非常不同。
这正是RoR社区中的一个特点。在RoR社区中,很难看到“学术”性质的东西,也很难看到所谓的“流派”,只有非常真实代码和思想。 Rails技术领域的最高技术会议RailsConf,也鼓励展示领域内的项目创新。没有大公司的搅局,纯粹程序员的文化氛围,一切都显得简单到极致。
Ruby 和Rails的关系
在世界范围内,Rails以不可抵挡之势席卷Web开发领域,带来了全新的开发理念和难以置信的开发效率。 对于一些初学者而言,也许不能理解Ruby On Rails其实是指一个Web框架,这个Web框架是用Ruby这种语言来开发的。
Ruby是目前各种主流语言中最优美,最简练的一种语言。正是因为DHH选择了Ruby作为Rails的语言,使得Rails这套框架轻便而 又强大无比。Ruby语言的动态特性,通过Rails这个成功的项目,得到了主流开发社区的认同。在笔者自己的开发项目中,越来越多的项目证明,正是因为 Ruby使得Rails成为可能。Ruby社区中的许多理念,走在了软件开发的前沿。
所以,Ruby成就了Rails,Rails让Ruby成为明星。它们都是非常出色的技术,我们热爱这两种技术。
Ruby 和Rails的一些应用
笔者创办NibiruTech前,曾是www.englishquad.com 创始团队之一。参与将一个在线语言学习平台的想法,通过学习和使用Rails,变为实在的产品,并进入运营阶段。国内的新锐Web 2.0网站财帮子,http://www.caibangzi.com,从今年4月开始上线,短短几个月时间,就能在高峰时期达到每小时数十万的PV。在与财帮子创始人交流之中,大家都同意如果不是选择Ruby On Rails这项技术,开发成本将成倍增加,而开发周期还将显著增长。其他典型的RoR站点包括:
JavaEye http://www.iteye.com
iease我易 http://search.iease.com.cn
51dir http://www.51dir.com
发生网 http://www.8sheng.com
友播网 http://www.yobo.com
乐道 http://www.likenote.com
著名的国外Twitter就是用Ruby On Rails开发的:http://www.twitter.com。
最近势头很盛,与Youbute一争高下的hulu.com,也盛传是Ruby on Rails的杰作:http://www.hulu.com。
Ruby和Rails的企业级应用真实案例
目前Rails在Web 2.0中的应用获得足够的眼球,最新的创业,不少都基于Rails技术框架,然而事实上,在Web 2.0之外,Rails仍然大有希望在企业级应用,甚至金融领域大有作为。在Rails以前,很多技术的特点是“用复杂的技术来解决复杂的问题”,以复杂 性对抗复杂性,人的感受成为一种痛苦。Rails提倡简化开发流程,引入多种思想,成功地将开发变成一种乐趣,并为企业带来实实在在的价值。
E公司是北美一家小型金融服务公司。过去,大量使用的技术为微软技术。当E公司在.NET架构上越陷越深的时候,发现很多东西过度依赖微软的 技术框架,成本代价非常大,而且由于测试技术的不全面,使得维护成本很高。企业存在时间超过10年,多数核心业务组件是用微软的技术。但随着业务的发展, 微软技术平台上的诸多问题逐渐暴露。首先是高昂的许可费用,缓慢的技术服务,以及商业技术平台特有的不开放特性,使得业务系统革新面临巨大挑战客户决定使 用最便于测试的语言,Ruby来进行核心业务的重写。
Ruby天生对TDD理念的支持,使得任何Ruby项目都能非常好的进行TDD测试和开发。结合Ruby令人称奇的高级语言特性,使得技术转 型进展非常顺利,成为全世界少有的使用Ruby和Rails来取代旧技术,并在金融领域成功运作的案例。这充分证明了Ruby和Rails在企业级应用市 场上的潜力。
从2006年Rails崛起之时,公司决定尝试使用Ruby和Rails来改进已有系统。经过两年的努力,公司已经将外围项目升级到了 Ruby和Rails技术平台,技术人员也成功实现了技术转型。在新的Ruby 和Rails平台上,得益于新技术,开发人员的工作效率,代码的质量同以前相比,有巨大提升。更不用提任何使用Ruby 和Rails的程序员,生活质量都明显提高了。
在尝到甜头后,E公司坚定了技术转型的决心。然而,在北美,懂得Ruby On Rails的技术人才稀缺。通过与NibiruTech合作,E公司成功地解决了开发人员稀缺的问题,在双方共同努力下,开始对核心业务进行升级。E公司 信用卡业务,去年的交易额是40亿美元,交易系统是由多种技术混合而成的技术平台。其中一个用Delphi完成的基础组建,使用了10年,代码已经十分陈 旧,几乎没有任何测试代码覆盖,任何改动都充满风险。通过与NibiruTech合作,我们成功地将这个组件用Ruby重写,代码量减小到原有的10%, 并且包含重度的测试覆盖,为核心业务的升级做好了准备。这个案例充分说明了Ruby这种语言强大之处,为企业带来的不仅仅是成本的节约,更是技术架构换代 升级后的各种好处,使得企业在技术方面充满竞争力。
RoR开发,不仅是快速高效,更重要的是优雅简洁,与任何其他的技术相比,这个方面的优势可谓巨大。IT巨头们也没有忽视RoR的崛起。 Sun是现在RoR的主要支持者之一,Netbeans默认支持RoR的开发。整个J2EE社区渴望将Ruby和Rails嫁接在一起,让RoR可以继承 Java的巨大遗产,而Java则可方便使用Ruby和Rails的各种创新,为整个企业界的开发带来了一股新鲜的风气。
文化对Ruby 和Rails的影响
任何一个出色的群体,都会在某些方面有个性的特征,被称作文化。Ruby On Rails这个群体,目前尽管得到了广泛的关注,炙手可热,但仍然属于小众。这个群体的创造力是非常强的。这个群体的开源氛围也很好。
Mac文化,笔者从来没有见过任何一个计算机群体拥有如此高的创造力和文化魅力。可以说,Mac世界的人对Apple文化就是一种宗教般的狂 热。笔者使用PC时间长达10年,今年转变为Mac用户后,终于体会到了Mac的华丽和易用性。笔者问身边许多使用Mac的朋友,下一台电脑,你会选择 PC,还是Mac?100%的回答是会继续选择Mac。简短几个月,笔者在Mac下面进行工作、学习的经验,已经让我很难在回到Windows了(必要的 时候会使用Windows虚拟机)。
看看主流的Rails社区,清一色的Mac用户。Mac的很多文化,在Rails诞生之日,变顺利集成下来。Mac和Rails都优雅,简 单,与众不同,在各自的领域中,都是最具有艺术气息的产品和技术。使用这些产品和技术,使得工作也变得简单和优雅起来,让程序员觉得自己不仅仅是工程师, 也是艺术家。
Ruby On Rails的常用武器
测试工具
我们实际工作中, 严重依赖以下测试工具:
● Autotest:开始编码了? 第一件事是打开Autotest,结束编码了,最后一件事是关闭Autotest。编码的过程中, 应该一直让autotest开着,它会一直检测你的代码改动,自动持续运行测试,是最好的TDD工具。
● Rspec : 抛弃Rails原有的测试框架吧,这个更优秀。
● Mocha: 可以让你轻易实现Mock功能,非常好用,语法如英文般自然。
● Selenium: 项目稳定后,可以用来做交付测试,自动启动浏览器,完全模拟人的鼠标键盘点击,进行测试。
● Cruise Control:持续集成,在源代码服务器端验证运行测试代码,确保不会出现“it works for me”,文件漏提交,以及开发环境不同带来的bug等问题。
学习和使用RoR,却不用TDD方式,实在是非常大的损失。以我自己的经验来看,国内遵循TDD方式开发的团队,是非常稀少的,原因是TDD 的学习需要对已有的软件开发思维进行巨大的调整。过去是写好了代码后,为了应付检查,匆忙补上测试代码。如果项目紧张的话,领导也会体谅没有时间写测试代 码。而遵循TDD之后,是任何时候都在编写重构测试代码,并且是先写好测试代码,然后在去实现这个测试,其中的乐趣巨大,当项目进入中期后,面对几千行代 码,几百个测试用例是最有信心的保障。
许多非TDD信徒怀疑,采用TDD后,工作量成倍增加,从而导致开发速度降低。事实上, 在我们的实际工作中,由于采用了RoR,以及其他的非常棒的测试框架和技术,使得我们的测试成为工作最有力的保障,使得我们开发的速度急剧提高,大部分情 况下,我们从事Web开发,却不开启浏览器,当所有的测试用例都通过的时候,我们是非常有信心保证,所有的页面都是正确可用的。DHH在演讲中声称,在 ROR框架中,不写测试的人应该受到惩罚。以笔者自己学习和工作经验来看,走向TDD是技术生涯中最大,也是最有乐趣的一次转变。整个 NibiruTech的人都有这样的体会,没有测试代码,我们不知道如何写程序。
操作系统
操作系统的问题上,Rails社区有强烈的Mac感情倾向。无疑Rails、Ruby和Mac是天生的搭档,使用这三者会使得工作充满乐趣。 作为一名专业的计算机工程师,使用Unix系统总是一种回家的感觉。Mac同属Unix分支,系统安全性非常出色,加上苹果公司公认的艺术般的UI设计, 使得Mac成为专业工程师最有力的操作系统之一。
笔者从Windows过渡到Mac的过程也并非一帆风顺。最初的两个星期,对于Mac完全是陌生,过去使用Windows严重依赖快捷键, Mac的键盘布局与Windows不同(后来认为更合理),导致工作效率很低。由于各种Windows常见的软件不容易找到,于是就安装了虚拟机的 Windows版本。逐渐熟悉了Mac的各种系统界面后,现在对Mac非常习惯,已经融入到了Mac世界中。对我而言,Mac有3点好处:
1、血统纯正的Unix系统
2、非常安全,非常稳定,完全不用担心备份操作系统,不担心木马病毒
3、华丽的界面,使用艺术品一样的享受
以上三点,是Windows无法提供。当然,Windows作为统治者,有很多软件方面的广泛支持,难免需要用到的时候。这种情况下,请出虚拟机,启动Windows,完成必要的工作,然后离开。
从事Ruby On Rails开发,Mac无疑是最佳选择。如果无法使用Mac,那么Ubuntu也比Windows要好一些。作为专业计算机工程师,一直使用Linux, 软件都手动编译,将会成为提高对计算机理解的一条捷径。Google公司最新的Andriod系统,证实了对Linux的投资,迟早会让使用者站着一个更 好的新技术位置。
禁止使用Windows已经成为NibiruTech的公司核心文化。每一个成员,都需要在Unix/Linux系统下,完成工作任务。再也 不用担心烦人的病毒和间谍软件,Window上太多分散人注意力的地方,使用Linux后,公司员工的生产效率一点也不比Windows低,而且避免了各 种法律问题。
按照优先级向技术团队推荐OS :
● Mac OS X
● Linux/Ubuntu
● Windows
IDE
在NibiruTech内部,我们鼓励使用不同的IDE来开发程序。
IDE这个问题上,纯粹的优劣之争已经没有太大价值。任何一个主流的IDE都经过大量用户的检验,功能设计上都已经比较成熟,效率也都很高。 由于NibiruTech是一个重度TDD团队,出现需要调试的机会非常少。Ruby又是一种动态语言,IDE能做的事情不是太多。所以选择IDE重要的 是看你是否已经熟悉其中的某种,快捷键直接影响了编码的效率。
● TextMate
● Eclipse(RadRails)
● Netbeans
● Emacs
任何让你得心应手的IDE就是你最好的IDE。
Ruby和Rails学习建议
Ruby On Rails同主流的技术相比,文档方面稍微欠缺一些,官方的支持少一点。Agile Web这本书是这个领域的Bibile,每个开发人员都应该仔细看看。Ruby语言与其他主流语言还是有比较大的不同,建议多看看screencast和开源项目。
给初学者的建议是最简单的平台:
● 使用windows + instantrails + radrails;
● 先把Agile书•¬一遍;
● 动手将Depot做一遍;
● 把Railscast和peepcode看一遍,能懂多少算多少;
● 可以动手完成一个实际的项目;
● 放弃Windows,做一个真正的Hacker,迁移到Mac或ubuntu;
● 重新配置Ruby和Rails环境,如果没有unix的经验,会非常受挫折,做好准备。
学习Ruby On Rails,可以在中小项目里直接应用Rails从而获得高速的开发速度,也能借鉴RoR社区中的许多前沿设计理念,帮助改善Java项目的架构。
Rails的入门有个特点,通过观看官方视频,花上15分钟写一行代码,就能实现第一个完整的CRUD系统。而别的技术派别,学习代价非常巨 大。当然RoR入门的第一个难点是配置环境。如果在Windows下,下载一个InstantRails、看看说明,就可以零配置完成第一个 HelloWorld。
给企业的建议:
● 听说过使用Ruby 和Rails而后悔的企业吗;
● Ruby和Rails在技术上拥有明显的快速开发的优势;
● 能带来的好处不仅仅是成本下降,更重要的是产品质量的显著提升;
● 开发难度显著降低,企业反馈速度明显加快,业务得到更大的支持;
● 避免招聘一个Rails高手来带领企业技术转型。要从已有的技术队伍中培养人,摸索锻炼出学习型的人才。Rails以简单优雅征服世界,学习成本明显低于其他技术;
● 寻找专业的Ruby 服务公司,将本企业18个月的学期缩短为6个月。
结束语
本文是写给程序员杂志,为SD 2.0大会写的文章之一。我们所创办的NibiruTech公司,遵循简洁的技术路线,将程序当作艺术,将程序员当作艺术家,为了这样的理念,我们愉快地工作在一起。
“上帝赐予我一份Rails程序员的工作吧!”
“用Rails来工作,就像是在玩RPG游戏一样有趣,欲罢不能”
Ruby 和Rails是我见过最为优雅,最为高贵的语言和框架。当然,没有任何东西可以满足所有人的热爱。 只是在Ruby 和Rails领域,我所见到过真正研究过Ruby和Rails的程序员,都不能自已地爱上了这种技术,在NibiruTech中有一半的人是爱好的程度让 其不得不放弃已有工作职位,寻求一份Ruby On Rails的技术职位。应用Ruby和Rails、遵循Agile和TDD,使得程序开发的职位,犹如世界上最幸福的工作一般,在NibiruTech工 作的人,都有强烈的“征服技术”的感觉。
对于真正的程序员,如果你想与众不同,不妨尝试一下Ruby On Rails,每天工作之余,花时间想想,如果用RoR来做,会不会不同?
对于企业决策者,如果犹豫不决是否该尝试RoR,那么建议你给自己一次犯错的机会。彷徨犹豫不会让答案更加清晰,只会延误时机,增加选择中的焦虑。采取行动,让自己犯错,才是得到最佳答案的途径。
文/杨祥吉
本文作者以使用Ruby和Rails进行创业为经验背景,结合具体的项目,尝试以客观公正的方式来评价Ruby、Rails和Agile。下面的文字,我们将以名词解释和实践的方式看看这些词汇带来的价值:
Agile
敏捷开发是一个高频度的热词。 实施敏捷开发的好处很多, 技术公司都在研究。NibiruTech从诞生便是一只遵循敏捷方法论的团队。 目前我们采用的敏捷技术,请看后面的名词解释。
测试先行
所有的项目,都是以TDD的方式开发,要求先编写测试代码,然后再编写功能代码,使得这个测试被通过。新程序员入职最先接触到的就是TDD的 知识和各种培训。我们大量采用了Autotest这种工具,使得测试代码在开发过程中持续运行。甚至为了更方便查看,每个成员都配备了第二个显示器,其主 要用途就是为了显示测试运行结果。
结对开发
结对开发已经成为我们的主要培养新人的方法。结对编程是指两人共用一台电脑,一路讨论编码。结对编程是一种乐趣,使得双人任何一人会感受到巨 大的乐趣。结对编程是共同分享技术挑战和难题,共同享受编码的乐趣。这会显著降低程序员的工作枯燥程度,提高技术水平。结对已经成为我们主要的培训方式。
短周期迭代
敏捷开发中讲究短周期的迭代,尽量缩短项目Release的时间。NibiruTech做到每天自动部署到测试服务器上,方便远程的客户直接在互联网上查看当天的产品进度,并及时提交反馈。
每日晨会
每日晨会上,大家回答“昨天做了什么工作?”、“今天计划做什么工作”。早上项目组的人到齐后,第一件事就是站成一个圆圈,依次讨论昨天的工 作和今天的计划。期间也有很多关于项目的整体需求,技术难点的讨论。由于大家都是站立开会,会议鼓励简短,高效的发言,显著提高了项目组的内部沟通和信 任,每日晨会的帮助很大。
从我们的实践经验来看,执行力无疑是实施过程中很重要的因素。任何流程的形成都需要很大的决心和长期的努力。我们的经验是,一项一项地进行实 施。实施过程中不断进行调整和反省,当TDD成为一种习惯后,便开始晨会,几个星期后,晨会也成为团队习惯了,就能进行下一步。需要团队中有人强力地坚持 推行敏捷思路,而且要慢慢推进,一项一项地推进。
Ruby
Ruby是一种有趣的语言。Ruby语言的创始人Matt从小就对计算机语言有天生的兴趣,强烈到无法自己。他前后编写了10种语言,没有任何一种release过,全部失败,直到第11种语言,被称为Ruby。
Ruby是一种解释型的方便快捷的面向对象脚本语言,它是日本的Yukihiro Matsumoto(人们都叫他Matz)于1993年2月24日首次发布的。
Ruby精心地设计了它的面向对象特性,使之完整并且开放允许改进。比如:Ruby有在运行时可以向类里,甚至能够向实例里添加方法的能力。所以,如果有需要,某个类的一个实例可以表现得和同一个类的其他实例不一样。
Ruby是一种完整的纯面向对象语言(OOL)。这就是说所有的数据在Ruby里面都是对象,不是像Python或Perl那样,而是像Smalltalk那样的纯面向对象(没有什么例外)。比如:在Ruby里面,数字1是类Fixnum的一个实例。
Ruby精心地设计了它的面向对象特性,使之完整并且开放允许改进。比如:Ruby有在运行时可以向类里,甚至能够向实例里添加方法的能力。所以,如果有需要,某个类的一个实例可以表现得和同一个类的其他实例不一样。
假如你希望Procduct类的find方法在参数为1 的时候,直接返回某个事先设定的对象。借助Mocha这个Ruby gem,你可以用近乎人类自然语言的方式说:
product = Product.new Product.expects(:find).with(1).returns(product)
这就是Ruby 强大而又灵活的地方。
Ruby一个思想是,语言应该尽量给编程者最大的自由度,当然需要程序员明白自己在做什么的情况下。
Class A Private Def private_method #…. end end
声明了为Private的方法,在其他语言中是不能被其他类中调用。而在Ruby中,假如你确信你需要这样做,你可以:
a = A.new a.send(“private_method”)
因为Ruby认为一旦程序员知道自己想做什么,就应该让他去做,即使违反了常规。
从来没有见到过任何一门语言可以如此轻松的对已有的核心API进行修改和增强。
例如Rails的作者在写Rails的时候,就对Ruby的Hash需要进行增强。
module ActiveSupport module CoreExtensions module Hash module ReverseMerge def reverse_merge(other_hash) other_hash.merge(self) end end end end end
而后只需要:
class Hash #:nodoc: include ActiveSupport::CoreExtensions::Hash::ReverseMerge end
便成功地为Hash这个类添加了revers_merge这个方法。
上述例子,只是Ruby语言强大灵活的一些简单例子。可以说,正是因为Ruby语言,才使得Rails成为现实。很难想象其他任何一门语言能够让一个独立的程序员完成一个如此出色的Web框架。Rails使用的越多,越是感受到Ruby和Rails同样出色。
Rails
作为computer world评选出的2007年最值得研究技术,Ruby On Rails从一出生就是媒体的宠儿。这一切源自其独特的思维,抛弃原有技术落后遗产,轻装上阵的便捷。
许多人都看过下面这幅图片,图片的左边是使用Java Web框架,所需要用到的技术书籍。右边是使用Ruby on Rails,需要用到的技术书籍,只有两本,简洁清新,优雅愉快。作为一个使用Ruby On Rails的先行者,我想指出上面的图只是从技术复杂程度上进行了对比。事实上,Java作为重型武器,有许多轻型武器暂时无法取代的地位。只是从技术的 复杂度讲,Ror确实简单优雅许多。
DRY 原则
这些设计规则中的一个就是来自于Dave Thomas的Pragmatic Programmer一书中的“DRY重用原则(Don"t Repeat Yourself)”DRY原则意味着创建到应用程序中的信息和逻辑应该被局部化或隔离。它应该尽可能少的存储在更少地方,副本应该保持在绝对最低限度。 这种原则有助于组织开发者的思路和保持好的开发速度,而且使得的代码可以被更轻松修改。这种更轻松的修改所带来的好处不仅仅体现着维护模式中,在最初的开 发中同样也会体现出来。Ruby通过使编程更轻松,而鼓励这种行为。
convention over configuration
Rails强调convention over configura-tion。这意味着这个框架的用户不用去做太多的设置工作,或者不用花费太多的时间来处理一些个别的组件。举个例子来说,Rails 假定在代码中的类名称和数据库中的表名称之间存在关联。如果你坚持这个标准约定,你代码将显得更具有逻辑性和更平稳;否则,你将不得不做一些额外的工作。 当默认约定与你的实际情况发生冲突时,感谢Ruby难以置信的灵活性和宽容,你可以轻易改变任何Rails的行为,使得其完全按照你的思维运行。
Ruby on Rails这样的技术的出现,使得实现一个独特的互联网创意的代价急剧降低,从而加剧了创业的门槛,使得任何领域内充满了大量的创业者。竞争的加剧使得创新不断涌现,互联网急剧的改变着整个人类社会的发展。
最近数年中,Facebook、Myspace、youtube等网站的创新,及其大量的追随者,极大的方便了人们的生活,工作和学习。可以说,任何受过良好教育的人,已经无法离开互联网了。网络游戏、网络媒体、电子商务、软件外包,因为互联网才得以出现。
互联网时代,使得个人成为英雄的机会大大增加。DHH,作为一名26岁的丹麦年轻程序员,不满意大公司傲慢的web框架,从自己的工作项目中,抽取了一个实用小巧的framework,这个小小的开源项目,成就了2005年技术领域的创新,DHH一个人改变了世界。
Ruby on Rails在2004年发布了它的第一个公众版。现在它已经不是一个蹒跚学步的孩子。在2005年,David Heinemeier Hansson因为这个软件程序获得了“年度最佳黑客”奖项。在2006年,Rails赢得了2006年度Jolt大奖的最佳Web开发工具,2007年 Rails被评选为年度最值得研究技术。
当前人们对Ruby这门编程语言吵得不可开交了,尤其是对Rails这个Web应用开发框架更是吵得一塌糊涂。有人说它是编程的未来,前途光明;有人说它是旁门左道,危险暗淡。
我是在1年前开始用Ruby来创作http://www.englishquad.com,边学边用的过程充满了艰辛。当技术转型完成后,一切变得如此美好,以至于一直想更好地使用RoR为更多的企业服务。
通过和更多的使用RoR企业交流,已经可以根据好几个项目的经验做分析了,到目前为之,分析结果力挺Ruby。每次我问使用过RoR的人: “你觉得用Ruby比用Java或C#生产力有显著提高吗?”我听到的无一例外都是一句有力的肯定:“是的!”这已足够让我开始断言:如果你的项目合适, 就应该给Ruby个机会。
也有观点认为,尽管Ruby和Rails是出众的平台,但可能无法成为主流。完全理解这个观点,优秀高产的平台可能成不了当前主流企业应用的首选。如果对你而言,重要的是只采用主流平台,那么你还得静观其变。不过,不囿于主流而获成功的案例也非常多。
还有许多项目,开发的生产率并不是首要的,取而代之的是政治及其他沟通上的因素。那样的话,RoR的优势就被大大削减了。
总的来说,通过数年的RoR创业和对其他伙伴的关注,我对在注重速度、响应性以及生产力的严肃工作中使用RoR持越来越肯定的态度,并愿意将我们的经验分享出来。
源自真实应用
Rails来源于真实世界中的应用程序。Rails并不是最初的目标产物,当时是为了开发一个叫做Basecamp的Web应用程序。在 DHH和其他人开发这个应用程序的时候,他们多次发现,Web开发是一件令人痛苦的事情,而且耗时、具有反复性和注重细节。这给了Ruby on Rails一个诞生的机会。
在编写这个高度浓缩的Ruby编码的过程中,DHH开始从界面的本质进行提炼,于是就诞生了Ruby on Rails。因此说它源于真实世界的需求,源于使用中的代码,源于开发者的每日体验。这与其他技术框架的学术和研究气质非常不同。
这正是RoR社区中的一个特点。在RoR社区中,很难看到“学术”性质的东西,也很难看到所谓的“流派”,只有非常真实代码和思想。 Rails技术领域的最高技术会议RailsConf,也鼓励展示领域内的项目创新。没有大公司的搅局,纯粹程序员的文化氛围,一切都显得简单到极致。
Ruby 和Rails的关系
在世界范围内,Rails以不可抵挡之势席卷Web开发领域,带来了全新的开发理念和难以置信的开发效率。 对于一些初学者而言,也许不能理解Ruby On Rails其实是指一个Web框架,这个Web框架是用Ruby这种语言来开发的。
Ruby是目前各种主流语言中最优美,最简练的一种语言。正是因为DHH选择了Ruby作为Rails的语言,使得Rails这套框架轻便而 又强大无比。Ruby语言的动态特性,通过Rails这个成功的项目,得到了主流开发社区的认同。在笔者自己的开发项目中,越来越多的项目证明,正是因为 Ruby使得Rails成为可能。Ruby社区中的许多理念,走在了软件开发的前沿。
所以,Ruby成就了Rails,Rails让Ruby成为明星。它们都是非常出色的技术,我们热爱这两种技术。
Ruby 和Rails的一些应用
笔者创办NibiruTech前,曾是www.englishquad.com 创始团队之一。参与将一个在线语言学习平台的想法,通过学习和使用Rails,变为实在的产品,并进入运营阶段。国内的新锐Web 2.0网站财帮子,http://www.caibangzi.com,从今年4月开始上线,短短几个月时间,就能在高峰时期达到每小时数十万的PV。在与财帮子创始人交流之中,大家都同意如果不是选择Ruby On Rails这项技术,开发成本将成倍增加,而开发周期还将显著增长。其他典型的RoR站点包括:
JavaEye http://www.iteye.com
iease我易 http://search.iease.com.cn
51dir http://www.51dir.com
发生网 http://www.8sheng.com
友播网 http://www.yobo.com
乐道 http://www.likenote.com
著名的国外Twitter就是用Ruby On Rails开发的:http://www.twitter.com。
最近势头很盛,与Youbute一争高下的hulu.com,也盛传是Ruby on Rails的杰作:http://www.hulu.com。
Ruby和Rails的企业级应用真实案例
目前Rails在Web 2.0中的应用获得足够的眼球,最新的创业,不少都基于Rails技术框架,然而事实上,在Web 2.0之外,Rails仍然大有希望在企业级应用,甚至金融领域大有作为。在Rails以前,很多技术的特点是“用复杂的技术来解决复杂的问题”,以复杂 性对抗复杂性,人的感受成为一种痛苦。Rails提倡简化开发流程,引入多种思想,成功地将开发变成一种乐趣,并为企业带来实实在在的价值。
E公司是北美一家小型金融服务公司。过去,大量使用的技术为微软技术。当E公司在.NET架构上越陷越深的时候,发现很多东西过度依赖微软的 技术框架,成本代价非常大,而且由于测试技术的不全面,使得维护成本很高。企业存在时间超过10年,多数核心业务组件是用微软的技术。但随着业务的发展, 微软技术平台上的诸多问题逐渐暴露。首先是高昂的许可费用,缓慢的技术服务,以及商业技术平台特有的不开放特性,使得业务系统革新面临巨大挑战客户决定使 用最便于测试的语言,Ruby来进行核心业务的重写。
Ruby天生对TDD理念的支持,使得任何Ruby项目都能非常好的进行TDD测试和开发。结合Ruby令人称奇的高级语言特性,使得技术转 型进展非常顺利,成为全世界少有的使用Ruby和Rails来取代旧技术,并在金融领域成功运作的案例。这充分证明了Ruby和Rails在企业级应用市 场上的潜力。
从2006年Rails崛起之时,公司决定尝试使用Ruby和Rails来改进已有系统。经过两年的努力,公司已经将外围项目升级到了 Ruby和Rails技术平台,技术人员也成功实现了技术转型。在新的Ruby 和Rails平台上,得益于新技术,开发人员的工作效率,代码的质量同以前相比,有巨大提升。更不用提任何使用Ruby 和Rails的程序员,生活质量都明显提高了。
在尝到甜头后,E公司坚定了技术转型的决心。然而,在北美,懂得Ruby On Rails的技术人才稀缺。通过与NibiruTech合作,E公司成功地解决了开发人员稀缺的问题,在双方共同努力下,开始对核心业务进行升级。E公司 信用卡业务,去年的交易额是40亿美元,交易系统是由多种技术混合而成的技术平台。其中一个用Delphi完成的基础组建,使用了10年,代码已经十分陈 旧,几乎没有任何测试代码覆盖,任何改动都充满风险。通过与NibiruTech合作,我们成功地将这个组件用Ruby重写,代码量减小到原有的10%, 并且包含重度的测试覆盖,为核心业务的升级做好了准备。这个案例充分说明了Ruby这种语言强大之处,为企业带来的不仅仅是成本的节约,更是技术架构换代 升级后的各种好处,使得企业在技术方面充满竞争力。
RoR开发,不仅是快速高效,更重要的是优雅简洁,与任何其他的技术相比,这个方面的优势可谓巨大。IT巨头们也没有忽视RoR的崛起。 Sun是现在RoR的主要支持者之一,Netbeans默认支持RoR的开发。整个J2EE社区渴望将Ruby和Rails嫁接在一起,让RoR可以继承 Java的巨大遗产,而Java则可方便使用Ruby和Rails的各种创新,为整个企业界的开发带来了一股新鲜的风气。
文化对Ruby 和Rails的影响
任何一个出色的群体,都会在某些方面有个性的特征,被称作文化。Ruby On Rails这个群体,目前尽管得到了广泛的关注,炙手可热,但仍然属于小众。这个群体的创造力是非常强的。这个群体的开源氛围也很好。
Mac文化,笔者从来没有见过任何一个计算机群体拥有如此高的创造力和文化魅力。可以说,Mac世界的人对Apple文化就是一种宗教般的狂 热。笔者使用PC时间长达10年,今年转变为Mac用户后,终于体会到了Mac的华丽和易用性。笔者问身边许多使用Mac的朋友,下一台电脑,你会选择 PC,还是Mac?100%的回答是会继续选择Mac。简短几个月,笔者在Mac下面进行工作、学习的经验,已经让我很难在回到Windows了(必要的 时候会使用Windows虚拟机)。
看看主流的Rails社区,清一色的Mac用户。Mac的很多文化,在Rails诞生之日,变顺利集成下来。Mac和Rails都优雅,简 单,与众不同,在各自的领域中,都是最具有艺术气息的产品和技术。使用这些产品和技术,使得工作也变得简单和优雅起来,让程序员觉得自己不仅仅是工程师, 也是艺术家。
Ruby On Rails的常用武器
测试工具
我们实际工作中, 严重依赖以下测试工具:
● Autotest:开始编码了? 第一件事是打开Autotest,结束编码了,最后一件事是关闭Autotest。编码的过程中, 应该一直让autotest开着,它会一直检测你的代码改动,自动持续运行测试,是最好的TDD工具。
● Rspec : 抛弃Rails原有的测试框架吧,这个更优秀。
● Mocha: 可以让你轻易实现Mock功能,非常好用,语法如英文般自然。
● Selenium: 项目稳定后,可以用来做交付测试,自动启动浏览器,完全模拟人的鼠标键盘点击,进行测试。
● Cruise Control:持续集成,在源代码服务器端验证运行测试代码,确保不会出现“it works for me”,文件漏提交,以及开发环境不同带来的bug等问题。
学习和使用RoR,却不用TDD方式,实在是非常大的损失。以我自己的经验来看,国内遵循TDD方式开发的团队,是非常稀少的,原因是TDD 的学习需要对已有的软件开发思维进行巨大的调整。过去是写好了代码后,为了应付检查,匆忙补上测试代码。如果项目紧张的话,领导也会体谅没有时间写测试代 码。而遵循TDD之后,是任何时候都在编写重构测试代码,并且是先写好测试代码,然后在去实现这个测试,其中的乐趣巨大,当项目进入中期后,面对几千行代 码,几百个测试用例是最有信心的保障。
许多非TDD信徒怀疑,采用TDD后,工作量成倍增加,从而导致开发速度降低。事实上, 在我们的实际工作中,由于采用了RoR,以及其他的非常棒的测试框架和技术,使得我们的测试成为工作最有力的保障,使得我们开发的速度急剧提高,大部分情 况下,我们从事Web开发,却不开启浏览器,当所有的测试用例都通过的时候,我们是非常有信心保证,所有的页面都是正确可用的。DHH在演讲中声称,在 ROR框架中,不写测试的人应该受到惩罚。以笔者自己学习和工作经验来看,走向TDD是技术生涯中最大,也是最有乐趣的一次转变。整个 NibiruTech的人都有这样的体会,没有测试代码,我们不知道如何写程序。
操作系统
操作系统的问题上,Rails社区有强烈的Mac感情倾向。无疑Rails、Ruby和Mac是天生的搭档,使用这三者会使得工作充满乐趣。 作为一名专业的计算机工程师,使用Unix系统总是一种回家的感觉。Mac同属Unix分支,系统安全性非常出色,加上苹果公司公认的艺术般的UI设计, 使得Mac成为专业工程师最有力的操作系统之一。
笔者从Windows过渡到Mac的过程也并非一帆风顺。最初的两个星期,对于Mac完全是陌生,过去使用Windows严重依赖快捷键, Mac的键盘布局与Windows不同(后来认为更合理),导致工作效率很低。由于各种Windows常见的软件不容易找到,于是就安装了虚拟机的 Windows版本。逐渐熟悉了Mac的各种系统界面后,现在对Mac非常习惯,已经融入到了Mac世界中。对我而言,Mac有3点好处:
1、血统纯正的Unix系统
2、非常安全,非常稳定,完全不用担心备份操作系统,不担心木马病毒
3、华丽的界面,使用艺术品一样的享受
以上三点,是Windows无法提供。当然,Windows作为统治者,有很多软件方面的广泛支持,难免需要用到的时候。这种情况下,请出虚拟机,启动Windows,完成必要的工作,然后离开。
从事Ruby On Rails开发,Mac无疑是最佳选择。如果无法使用Mac,那么Ubuntu也比Windows要好一些。作为专业计算机工程师,一直使用Linux, 软件都手动编译,将会成为提高对计算机理解的一条捷径。Google公司最新的Andriod系统,证实了对Linux的投资,迟早会让使用者站着一个更 好的新技术位置。
禁止使用Windows已经成为NibiruTech的公司核心文化。每一个成员,都需要在Unix/Linux系统下,完成工作任务。再也 不用担心烦人的病毒和间谍软件,Window上太多分散人注意力的地方,使用Linux后,公司员工的生产效率一点也不比Windows低,而且避免了各 种法律问题。
按照优先级向技术团队推荐OS :
● Mac OS X
● Linux/Ubuntu
● Windows
IDE
在NibiruTech内部,我们鼓励使用不同的IDE来开发程序。
IDE这个问题上,纯粹的优劣之争已经没有太大价值。任何一个主流的IDE都经过大量用户的检验,功能设计上都已经比较成熟,效率也都很高。 由于NibiruTech是一个重度TDD团队,出现需要调试的机会非常少。Ruby又是一种动态语言,IDE能做的事情不是太多。所以选择IDE重要的 是看你是否已经熟悉其中的某种,快捷键直接影响了编码的效率。
● TextMate
● Eclipse(RadRails)
● Netbeans
● Emacs
任何让你得心应手的IDE就是你最好的IDE。
Ruby和Rails学习建议
Ruby On Rails同主流的技术相比,文档方面稍微欠缺一些,官方的支持少一点。Agile Web这本书是这个领域的Bibile,每个开发人员都应该仔细看看。Ruby语言与其他主流语言还是有比较大的不同,建议多看看screencast和开源项目。
给初学者的建议是最简单的平台:
● 使用windows + instantrails + radrails;
● 先把Agile书•¬一遍;
● 动手将Depot做一遍;
● 把Railscast和peepcode看一遍,能懂多少算多少;
● 可以动手完成一个实际的项目;
● 放弃Windows,做一个真正的Hacker,迁移到Mac或ubuntu;
● 重新配置Ruby和Rails环境,如果没有unix的经验,会非常受挫折,做好准备。
学习Ruby On Rails,可以在中小项目里直接应用Rails从而获得高速的开发速度,也能借鉴RoR社区中的许多前沿设计理念,帮助改善Java项目的架构。
Rails的入门有个特点,通过观看官方视频,花上15分钟写一行代码,就能实现第一个完整的CRUD系统。而别的技术派别,学习代价非常巨 大。当然RoR入门的第一个难点是配置环境。如果在Windows下,下载一个InstantRails、看看说明,就可以零配置完成第一个 HelloWorld。
给企业的建议:
● 听说过使用Ruby 和Rails而后悔的企业吗;
● Ruby和Rails在技术上拥有明显的快速开发的优势;
● 能带来的好处不仅仅是成本下降,更重要的是产品质量的显著提升;
● 开发难度显著降低,企业反馈速度明显加快,业务得到更大的支持;
● 避免招聘一个Rails高手来带领企业技术转型。要从已有的技术队伍中培养人,摸索锻炼出学习型的人才。Rails以简单优雅征服世界,学习成本明显低于其他技术;
● 寻找专业的Ruby 服务公司,将本企业18个月的学期缩短为6个月。
结束语
本文是写给程序员杂志,为SD 2.0大会写的文章之一。我们所创办的NibiruTech公司,遵循简洁的技术路线,将程序当作艺术,将程序员当作艺术家,为了这样的理念,我们愉快地工作在一起。
“上帝赐予我一份Rails程序员的工作吧!”
“用Rails来工作,就像是在玩RPG游戏一样有趣,欲罢不能”
Ruby 和Rails是我见过最为优雅,最为高贵的语言和框架。当然,没有任何东西可以满足所有人的热爱。 只是在Ruby 和Rails领域,我所见到过真正研究过Ruby和Rails的程序员,都不能自已地爱上了这种技术,在NibiruTech中有一半的人是爱好的程度让 其不得不放弃已有工作职位,寻求一份Ruby On Rails的技术职位。应用Ruby和Rails、遵循Agile和TDD,使得程序开发的职位,犹如世界上最幸福的工作一般,在NibiruTech工 作的人,都有强烈的“征服技术”的感觉。
对于真正的程序员,如果你想与众不同,不妨尝试一下Ruby On Rails,每天工作之余,花时间想想,如果用RoR来做,会不会不同?
对于企业决策者,如果犹豫不决是否该尝试RoR,那么建议你给自己一次犯错的机会。彷徨犹豫不会让答案更加清晰,只会延误时机,增加选择中的焦虑。采取行动,让自己犯错,才是得到最佳答案的途径。
发表评论
-
HTTP状态码100的用法
2009-04-17 15:57 4495The purpose of the 100 (Continu ... -
ubuntu 8.04 rails安装问题
2008-07-18 11:21 1533在8.04下用gem装好rails,rails -v无效,说我 ... -
Testing: One assertion per test
2008-04-09 15:10 2Limiting your tests to using on ... -
如何在update一条记录的部分字段时跳过某些校验
2008-03-27 18:00 2011我照Agile Web Development with Ra ... -
render与redirect_to的区别
2008-03-25 17:07 4942今天在做R.R.log的时候发 ... -
避免nil object错误
2008-03-24 19:57 1029一般都会使用 <%= @topic.category.n ... -
毕业设计遇到的问题
2008-03-17 12:54 12891.如何统计一个分类中的文章数?是通过在Category表中设 ... -
MySQL安装与配置 for Rails
2008-03-10 15:56 25821.Linux下MySQL的安装 引用sudo apt-get ... -
人性化接口
2008-02-15 21:09 1264by Martin Fowler 在Ruby群体 ...
相关推荐
总之,《敏捷Web开发与Rails》是Ruby on Rails开发者必备的参考书,无论你是初学者还是经验丰富的开发者,都能从中获得宝贵的指导和启示,提升你的Web开发技能和效率。通过阅读这本书,你可以学会如何运用Rails的...
《敏捷Web开发与Rails第四版》(Agile Web Development with Rails Fourth Edition)是一本专门介绍如何利用Rails框架进行高效、高质量Web应用开发的经典书籍。本书出版于2010年,是Rails框架发展过程中一个重要的...
Rails是基于Ruby语言的一个开源Web应用框架,它采用MVC(模型-视图-控制器)架构模式,并且强调代码的简洁性和易用性。本书针对Rails 3.03版本进行了更新和完善,涵盖了最新特性以及最佳实践。 #### 书籍简介 这...
Dify智能体:JSON 修复.yml
陕西省2025年初中学业水平考试实验操作考试试题及评分细则.zip
内容概要:本文详细介绍了西门子S7-1200 PLC在污水处理项目中的应用,涵盖模拟量处理、设备轮换、Modbus通讯以及事件记录等多个方面。文中展示了如何利用博途V17进行程序设计,包括具体的SCL代码实例,如液位检测的滑动窗口滤波法、提升泵的轮换逻辑、Modbus TCP对变频器的控制以及报警信息管理等。此外,还分享了一些实用技巧,如防止信号跳变、避免设备过度磨损、确保通讯稳定性和提高报警记录效率的方法。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉西门子PLC和博途软件的从业者。 使用场景及目标:适用于污水处理项目的PLC编程和系统集成,旨在提高系统的稳定性和可靠性,减少维护成本并优化设备性能。 其他说明:文中不仅提供了详细的代码示例,还分享了许多来自实际项目的经验教训,帮助读者更好地理解和应用相关技术。
内容概要:本文详细介绍了基于PLC(西门子S7-1200)的自动药片装瓶机控制系统的设计与仿真过程。涵盖了硬件选型(伺服电机、光电传感器)、软件编程(梯形图、结构化文本)、关键算法(传送带定位、振动盘控制、药片计数)、异常处理以及仿真测试等方面的内容。重点讨论了如何通过精确的硬件配置和优化的控制逻辑来确保系统的稳定性和高效性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和机电一体化感兴趣的读者。 使用场景及目标:适用于制药行业及其他需要自动化包装设备的企业。主要目标是提高生产效率、减少人工干预、提升产品质量和稳定性。 其他说明:文中提供了大量实际案例和调试经验,帮助读者更好地理解和应用相关技术和方法。同时强调了仿真测试的重要性,为后续的实际部署提供了宝贵的经验和改进建议。
内容概要:本文介绍了一种利用元启发式算法(如粒子群优化,PSO)优化线性二次调节器(LQR)控制器加权矩阵的方法,专门针对复杂的四级倒立摆系统。传统的LQR控制器设计中,加权矩阵Q的选择往往依赖于经验和试错,而这种方法难以应对高维度非线性系统的复杂性。文中详细描述了如何将控制器参数优化问题转化为多维空间搜索问题,并通过MATLAB代码展示了具体实施步骤。关键点包括:构建非线性系统的动力学模型、设计适应度函数、采用对数缩放技术避免局部最优、以及通过实验验证优化效果。结果显示,相比传统方法,PSO优化后的LQR控制器不仅提高了稳定性,还显著减少了最大控制力,同时缩短了稳定时间。 适合人群:控制系统研究人员、自动化工程专业学生、从事机器人控制或高级控制算法开发的技术人员。 使用场景及目标:适用于需要精确控制高度动态和不确定性的机械系统,特别是在处理多自由度、强耦合特性的情况下。目标是通过引入智能化的参数寻优手段,改善现有控制策略的效果,降低人为干预的需求,提高系统的鲁棒性和性能。 其他说明:文章强调了在实际应用中应注意的问题,如避免过拟合、考虑硬件限制等,并提出了未来研究方向,例如探索非对角Q矩阵的可能性。此外,还分享了一些实践经验,如如何处理高频抖动现象,以及如何结合不同类型的元启发式算法以获得更好的优化结果。
内容概要:本文详细介绍了LLC谐振变换器的设计方法及其仿真模型的应用。首先,通过参数设计程序,如Excel表格和Matlab脚本,进行关键参数的计算,确保设计符合预期性能。其次,利用Matlab/Simulink构建闭环控制仿真模型,优化PID控制器和PWM生成模块,提高系统的稳定性和响应速度。最后,提供了详细的模态分析和波形解读,帮助理解和规避常见设计陷阱。文中强调了参数选择的重要性,如电感比k值、死区时间和谐振元件的实际测量值,并分享了多个实战经验和调试技巧。 适合人群:从事电力电子设计的技术人员,尤其是对LLC谐振变换器感兴趣的工程师。 使用场景及目标:适用于需要高效、稳定的电源转换解决方案的研发项目。主要目标是掌握LLC谐振变换器的设计原理和技术要点,能够独立完成从参数计算到闭环调试的全过程。 其他说明:文中提供的工具和方法不仅有助于初学者快速入门,也能为有经验的工程师提供宝贵的参考资料。特别提到了一些容易忽视的细节和常见的错误,帮助读者避免不必要的损失。
内容概要:本文探讨了利用深度强化学习(DRL)解决现代电网复杂控制问题的方法,特别是针对自主电压控制(AVC)的应用。文中介绍了多智能体系统(MAS)与深度确定性策略梯度(MADDPG)相结合的MA-AVC算法,展示了如何将电网划分为多个子区域,每个子区域由一个智能体负责,通过集中训练和分散执行的方式进行电压控制。文章详细解释了智能体网络的设计、训练过程、奖励机制以及在伊利诺伊200总线系统上的实验验证。结果显示,相比传统方法,该算法在处理负荷突变、N-1故障和通信延迟等方面表现出显著优势。 适合人群:对深度强化学习、电力系统自动化感兴趣的科研人员和技术开发者,尤其是希望了解如何将AI应用于实际工业场景的研究者。 使用场景及目标:适用于需要提高电网稳定性和响应速度的实际应用场景,特别是在可再生能源接入和快速需求响应的要求下。目标是通过智能化手段提升电网的自适应能力和鲁棒性。 其他说明:文章提供了详细的代码示例和实验结果,帮助读者理解和复现相关算法。特别强调了奖励函数设计和电网仿真的重要性,指出了一些常见的实现陷阱及其解决方案。
内容概要:本文详细介绍了MIMO通信系统的三个重要方面:空间编码、系统容量计算以及信道特性仿真。首先探讨了Alamouti空时编码的具体实现方法及其在接收端的解码过程,展示了如何通过共轭转置排列实现分集增益。其次,深入讲解了MIMO系统容量公式的推导及其在Matlab中的高效实现,特别强调了使用奇异值分解提高数值稳定性的技巧。最后,讨论了信道矩阵的条件数对系统性能的影响,并提出了应对病态信道的方法如MMSE检测。 适合人群:具备一定通信理论基础和技术背景的研究人员、工程师及高校学生。 使用场景及目标:适用于希望深入了解MIMO通信系统内部机制的人群,帮助他们掌握空间编码、系统容量计算和信道建模的实际应用技能,为后续研究提供理论支持和技术储备。 其他说明:文中提供了大量实用的Matlab代码片段,便于读者快速理解和实践。同时提醒读者注意实际工程中可能遇到的问题,如数值稳定性、信道相关性和噪声增强等。
内容概要:本文档详细介绍了西门子PLC与意普测量光栅通过Modbus RTU协议进行通信的方法。硬件方面,使用了1214DC/DC/DC PLC、CB1214通讯板、ESM4810NQ-2测量光栅以及USB转485串口线缆等设备。软件部分采用博图V18进行编程,并利用调试助手modbuSCAN和sscom来辅助配置与测试。文中具体描述了创建MASTER_COMM_LOAD指令、添加MB_MASTER主站指令及轮询程序编写的步骤,包括详细的报文格式解析如站号、功能码、寄存器地址、内容及CRC校验码等信息。此外,还提供了针对光栅的初始化、波特率、奇偶校验和停止位等参数配置示例及其对应的报文解释。; 适合人群:熟悉PLC编程并希望深入了解Modbus通讯协议的应用工程师和技术人员。; 使用场景及目标:①实现PLC作为主站与测量光栅之间的稳定通信;②掌握Modbus RTU协议的具体应用细节,包括报文结构的理解与配置;③解决实际项目中可能遇到的通信问题,如线路连接、参数设置等。; 阅读建议:建议读者在阅读时结合实际硬件设备进行操作练习,同时注意文中提到的一些常见问题及其解决方案,如线序连接错误导致的乱码现象等。
内容概要:本文详细介绍了基于Qt的Modbus协议开发,涵盖协议原理、Qt框架支持、开发流程、代码示例及常见问题解决方案。Modbus协议支持串行通信(RTU/ASCII)和以太网(TCP/IP)两种传输方式,具有功能码定义、数据模型和通信模式等核心功能。Qt通过Qt Serial Bus模块提供对Modbus的支持,主要类有QModbusDevice、QModbusClient(含QModbusTcpClient和QModbusRtuSerialMaster)、QModbusDataUnit和QModbusReply。开发环境配置需在Qt项目的.pro文件中添加相应模块,并准备硬件设备。文中给出了Modbus客户端(TCP)的连接、读取和写入寄存器的代码示例,以及Modbus服务器的实现步骤。还列举了常见的问题与调试技巧,包括通讯不稳定、数据异常和性能优化的方法。最后介绍了该技术在工业自动化、能源管理和智能家居的应用场景。; 适合人群:具备一定Qt编程基础,对工业通信协议感兴趣的开发者。; 使用场景及目标:①学习Modbus协议的基本原理及其在Qt中的实现方法;②掌握Qt Modbus框架的核心类及其用法;③能够独立开发Modbus客户端和服务器程序,解决常见问题。; 阅读建议:本文内容详实,涉及多个知识点和技术细节,在阅读过程中应结合实际开发环境进行实践操作,以便更好地理解和掌握相关技术。
本书《SEO for Beginners 2021》旨在向读者介绍如何使用搜索引擎优化(SEO)技术,在谷歌上提升网站排名,吸引新客户,从而实现业务增长。作者加里·戈丁和阿伦·肯尼迪通过实例和策略指导,帮助读者了解SEO的基础知识,包括关键词研究、网站设置、链接构建、社交媒体SEO优化以及如何使用谷歌分析工具来监控SEO效果。书中还特别强调了SEO在商业世界中的重要性,并提供了在谷歌广告平台上进行有效广告投放的技巧和策略。此外,作者还分享了如何通过解决SEO常见问题、设置广告账户、撰写广告文案、创建着陆页以及监控转化率等方法,进一步优化搜索引擎营销效果。
内容概要:本文详细介绍了利用混沌系统进行图像加密的方法,重点探讨了Logistic映射生成混沌序列用于图像加密的具体实现。首先,通过Python代码生成混沌序列,确保其随机性和不可预测性。然后,采用循环移位扰乱技术对图像像素进行重新排列,使图像的像素位置发生改变。接着,通过水平和垂直扩散技术进一步打乱像素之间的关联性,增加加密强度。文中还展示了加密效果评估方法,如直方图分析、信息熵计算以及相关系数测量,验证了加密算法的有效性。 适合人群:对图像加密技术和混沌系统感兴趣的科研人员、信息安全专家及有一定编程基础的研究者。 使用场景及目标:适用于需要高强度图像加密保护的场合,如军事、医疗等领域的重要图像资料保护。目标是提供一种高效、安全的图像加密解决方案。 其他说明:文中提供了详细的Python代码示例,便于读者理解和实践。同时强调了实际应用中需要注意的问题,如参数选择和性能优化等。
内容概要:本文详细介绍了利用FLAC3D软件进行双线隧道开挖和临近既有隧道的基坑开挖的数值模拟方法和技术要点。首先,针对隧道开挖部分,采用反力支撑法控制应力释放,并使用shell壳单元模拟喷射混凝土支护结构。其次,在基坑开挖过程中,采用了地连墙加对撑的方式,分层开挖并及时安装水平对撑。文中还提供了多个关键代码片段,展示了具体的实现步骤。此外,文章强调了监测点数据采集和处理的重要性,以及如何通过调整接触面参数解决潜在问题。最后,作者分享了一些实用技巧,如固定云图色标范围、正确设置接触面摩擦系数等。 适合人群:从事地下工程、岩土工程及相关领域的研究人员和工程师。 使用场景及目标:适用于需要进行复杂地质条件下隧道和基坑开挖数值模拟的研究人员和工程师,旨在帮助他们更好地理解和掌握FLAC3D软件的应用,提高模拟精度和效率。 其他说明:文章不仅提供了详细的代码示例,还结合实际案例进行了深入分析,有助于读者将理论知识应用于实际工程项目中。
实现多数据类型的传输
内容概要:《2024年中国物联网产业创新白皮书》由深圳市物联网产业协会与AIoT星图研究院联合编制,汇集了全国30多个省市物联网组织的智慧。白皮书系统梳理了中国物联网产业的发展历程、现状及未来趋势,涵盖了物联网的概念、产业结构、市场规模、投融资情况、面临的问题与机遇。书中详细分析了感知层、传输层、平台层及应用层的关键技术,探讨了智慧城市、智能工业、车联网、智慧医疗等九大产业物联网应用领域,以及消费物联网的发展特征与热门单品。此外,白皮书还关注了物联网数据安全、法规遵从、人才短缺等挑战,并提出了相应的解决方案。 适用人群:物联网从业者、企业决策者、政策制定者及相关研究机构。 使用场景及目标:①帮助从业者深入了解物联网产业的现状和发展趋势;②为企业决策者提供战略规划依据;③为政策制定者提供政策支持和法规制定参考;④为研究机构提供详尽的数据和案例支持。 其他说明:白皮书不仅限于技术科普,更从宏观角度结合市场情况,多维度讨论了物联网产业生态,旨在为物联网企业、从业者找到最适合的技术应用场景,促进产业健康发展。报告还特别鸣谢了参与市场调研的企业,感谢他们提供的宝贵行业信息。由于时间和资源的限制,报告可能存在信息不充分之处,欢迎各界人士提出宝贵意见。
内容概要:本文介绍了如何利用Simulink实现‘质心侧偏角-横摆角速度’相平面法,用于分析车辆的动力学行为。作者详细描述了模型的构建过程,包括输入模块、车辆动力学模型以及相平面生成模块的设计。通过调整车辆速度、路面附着系数和前轮转角等参数,可以直观地观察到车辆稳定性的变化。此外,文中还提供了详细的代码示例和结果分析,帮助读者更好地理解和应用这一方法。 适合人群:对车辆动力学感兴趣的工程师和技术人员,特别是那些希望通过Simulink进行车辆稳定性分析的人。 使用场景及目标:适用于需要评估车辆在不同行驶条件下稳定性的场合,如汽车制造商的研发部门、交通安全研究机构等。目标是通过相平面法直观展示车辆动态响应,辅助优化车辆设计和改进驾驶安全性能。 其他说明:附带完整代码和Simulink模型文件,便于读者动手实践。同时,文中提到的一些调试技巧和常见问题解决方法也非常有价值。