- 浏览: 88719 次
- 性别:
- 来自: 南京
-
文章分类
最新评论
-
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 4487The purpose of the 100 (Continu ... -
ubuntu 8.04 rails安装问题
2008-07-18 11:21 1531在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 2003我照Agile Web Development with Ra ... -
render与redirect_to的区别
2008-03-25 17:07 4937今天在做R.R.log的时候发 ... -
避免nil object错误
2008-03-24 19:57 1025一般都会使用 <%= @topic.category.n ... -
毕业设计遇到的问题
2008-03-17 12:54 12851.如何统计一个分类中的文章数?是通过在Category表中设 ... -
MySQL安装与配置 for Rails
2008-03-10 15:56 25761.Linux下MySQL的安装 引用sudo apt-get ... -
人性化接口
2008-02-15 21:09 1255by 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版本进行了更新和完善,涵盖了最新特性以及最佳实践。 #### 书籍简介 这...
毕业设计选题 -未来生鲜运输车设计.pptx
内容概要:本文详细探讨了基于樽海鞘算法(SSA)优化的极限学习机(ELM)在回归预测任务中的应用,并与传统的BP神经网络、广义回归神经网络(GRNN)以及未优化的ELM进行了性能对比。首先介绍了ELM的基本原理,即通过随机生成输入层与隐藏层之间的连接权重及阈值,仅需计算输出权重即可快速完成训练。接着阐述了SSA的工作机制,利用樽海鞘群体觅食行为优化ELM的输入权重和隐藏层阈值,从而提高模型性能。随后分别给出了BP、GRNN、ELM和SSA-ELM的具体实现代码,并通过波士顿房价数据集和其他工业数据集验证了各模型的表现。结果显示,SSA-ELM在预测精度方面显著优于其他三种方法,尽管其训练时间较长,但在实际应用中仍具有明显优势。 适合人群:对机器学习尤其是回归预测感兴趣的科研人员和技术开发者,特别是那些希望深入了解ELM及其优化方法的人。 使用场景及目标:适用于需要高效、高精度回归预测的应用场景,如金融建模、工业数据分析等。主要目标是提供一种更为有效的回归预测解决方案,尤其是在处理大规模数据集时能够保持较高的预测精度。 其他说明:文中提供了详细的代码示例和性能对比图表,帮助读者更好地理解和复现实验结果。同时提醒使用者注意SSA参数的选择对模型性能的影响,建议进行参数敏感性分析以获得最佳效果。
2025年中国生成式AI大会PPT(4-1)
内容概要:本文详细介绍了基于Simulink平台构建无刷直流电机(BLDC)双闭环调速系统的全过程。首先阐述了双闭环控制系统的基本架构,即外层速度环和内层电流环的工作原理及其相互关系。接着深入探讨了PWM生成模块的设计,特别是占空比计算方法的选择以及三角波频率的设定。文中还提供了详细的电机参数设置指导,如转动惯量、电感、电阻等,并强调了参数选择对系统性能的影响。此外,针对PI控制器的参数整定给出了具体的公式和经验值,同时分享了一些实用的调试技巧,如避免转速超调、处理启动抖动等问题的方法。最后,通过仿真实验展示了系统的稳定性和鲁棒性,验证了所提出方法的有效性。 适用人群:从事电机控制研究的技术人员、自动化工程领域的研究生及科研工作者。 使用场景及目标:适用于需要深入了解和掌握无刷直流电机双闭环调速系统设计与优化的人群。主要目标是帮助读者学会利用Simulink进行BLDC电机控制系统的建模、仿真和参数优化,从而提高系统的稳定性和响应速度。 其他说明:文章不仅提供了理论知识,还包括了许多实践经验和技术细节,有助于读者更好地理解和应用相关技术。
内容概要:本文详细介绍了西门子S7-1200 PLC与施耐德ATV310/312变频器通过Modbus RTU进行通讯的具体实现步骤和调试技巧。主要内容涵盖硬件接线、通讯参数配置、控制启停、设定频率、读取运行参数的方法以及常见的调试问题及其解决方案。文中提供了具体的代码示例,帮助读者理解和实施通讯程序。此外,还强调了注意事项,如地址偏移量、数据格式转换和超时匹配等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要将西门子PLC与施耐德变频器进行集成的工作人员。 使用场景及目标:适用于需要通过Modbus RTU协议实现PLC与变频器通讯的工程项目。目标是确保通讯稳定可靠,掌握解决常见问题的方法,提高调试效率。 其他说明:文中提到的实际案例和调试经验有助于读者避免常见错误,快速定位并解决问题。建议读者在实践中结合提供的代码示例和调试工具进行操作。
内容概要:本文详细介绍了如何使用Verilog在FPGA上实现IIC(Inter-Integrated Circuit)主从机驱动。主要内容包括从机和主机的设计,特别是状态机的实现、寄存器读取、时钟分频策略、SDA线的三态控制等关键技术。文中还提供了详细的代码片段,展示了从机地址匹配逻辑、主机时钟生成逻辑、顶层模块的连接方法以及仿真实验的具体步骤。此外,文章讨论了一些常见的调试问题,如总线竞争、时序不匹配等,并给出了相应的解决方案。 适合人群:具备一定FPGA开发基础的技术人员,尤其是对IIC协议感兴趣的嵌入式系统开发者。 使用场景及目标:适用于需要在FPGA平台上实现高效、可靠的IIC通信的应用场景。主要目标是帮助读者掌握IIC协议的工作原理,能够独立完成IIC主从机系统的开发和调试。 其他说明:文章不仅提供了理论讲解,还包括了大量的实战经验和代码实例,有助于读者更好地理解和应用所学知识。同时,文章还提供了一个思考题,引导读者进一步探索多主设备仲裁机制的设计思路。
内容概要:本文介绍了一款基于C#开发的拖拽式Halcon可视化抓边、抓圆控件,旨在简化机器视觉项目中的测量任务。该控件通过拖拽操作即可快速生成测量区域,自动完成边缘坐标提取,并提供实时反馈。文中详细描述了控件的工作原理和技术细节,如坐标系转换、卡尺生成、边缘检测算法封装以及动态参数调试等功能。此外,还讨论了一些常见问题及其解决方案,如坐标系差异、内存管理等。 适合人群:从事机器视觉开发的技术人员,尤其是熟悉C#和Halcon的开发者。 使用场景及目标:适用于需要频繁进行边缘和圆形特征测量的工业自动化项目,能够显著提高测量效率并减少编码工作量。主要目标是将复杂的测量任务转化为简单的拖拽操作,使非专业人员也能轻松完成测量配置。 其他说明:该控件已开源发布在GitHub上,提供了完整的源代码和详细的使用指南。未来计划扩展更多高级功能,如自动路径规划和亚像素级齿轮齿距检测等。
内容概要:本文详细介绍了西门子200Smart PLC与维纶触摸屏在某疫苗车间控制系统的具体应用,涵盖配液、发酵、纯化及CIP清洗四个主要工艺环节。文中不仅展示了具体的编程代码和技术细节,还分享了许多实战经验和调试技巧。例如,在配液罐中,通过模拟量处理确保温度和液位的精确控制;发酵罐部分,着重讨论了PID参数整定和USS通讯控制变频器的方法;纯化过程中,强调了双PID串级控制的应用;CIP清洗环节,则涉及复杂的定时器逻辑和阀门联锁机制。此外,文章还提到了一些常见的陷阱及其解决方案,如通讯干扰、状态机切换等问题。 适合人群:具有一定PLC编程基础的技术人员,尤其是从事工业自动化领域的工程师。 使用场景及目标:适用于需要深入了解PLC与触摸屏集成控制系统的工程师,帮助他们在实际项目中更好地理解和应用相关技术和方法,提高系统的稳定性和可靠性。 其他说明:文章提供了大量实战经验和代码片段,有助于读者快速掌握关键技术点,并避免常见错误。同时,文中提到的一些优化措施和调试技巧对提升系统性能非常有帮助。
计算机网络课程的结课设计是使用思科模拟器搭建一个中小型校园网,当时花了几天时间查阅相关博客总算是做出来了,现在免费上传CSDN,希望小伙伴们能给博客一套三连支持
《芋道开发指南文档-2023-10-27更新》是针对软件开发者和IT专业人士的一份详尽的资源集合,旨在提供最新的开发实践、范例代码和最佳策略。这份2023年10月27日更新的文档集,包含了丰富的模板和素材,帮助开发者在日常工作中提高效率,保证项目的顺利进行。 让我们深入探讨这份文档的可能内容。"芋道"可能是一个开源项目或一个专业的技术社区,其开发指南涵盖了多个方面,例如: 1. **编程语言指南**:可能包括Java、Python、JavaScript、C++等主流语言的编码规范、最佳实践以及常见问题的解决方案。 2. **框架与库的应用**:可能会讲解React、Vue、Angular等前端框架,以及Django、Spring Boot等后端框架的使用技巧和常见应用场景。 3. **数据库管理**:涵盖了SQL语言的基本操作,数据库设计原则,以及如何高效使用MySQL、PostgreSQL、MongoDB等数据库系统。 4. **版本控制**:详细介绍了Git的工作流程,分支管理策略,以及与其他开发工具(如Visual Studio Code、IntelliJ IDEA)的集成。 5. **持续集成与持续部署(CI/CD)**:包括Jenkins、Travis CI、GitHub Actions等工具的配置和使用,以实现自动化测试和部署。 6. **云服务与容器化**:可能涉及AWS、Azure、Google Cloud Platform等云计算平台的使用,以及Docker和Kubernetes的容器化部署实践。 7. **API设计与测试**:讲解RESTful API的设计原则,Swagger的使用,以及Postman等工具进行API测试的方法。 8. **安全性与隐私保护**:涵盖OAuth、JWT认证机制,HTTPS安全通信,以及防止SQL注入、
内容概要:本文介绍了一种先进的综合能源系统优化调度模型,该模型将风电、光伏、光热发电等新能源与燃气轮机、燃气锅炉等传统能源设备相结合,利用信息间隙决策(IGDT)处理不确定性。模型中引入了P2G(电转气)装置和碳捕集技术,实现了碳经济闭环。通过多能转换和储能系统的协同调度,提高了系统的灵活性和鲁棒性。文中详细介绍了模型的关键组件和技术实现,包括IGDT的鲁棒性参数设置、P2G与碳捕集的协同控制、储能系统的三维协同调度等。此外,模型展示了在极端天气和负荷波动下的优异表现,显著降低了碳排放成本并提高了能源利用效率。 适合人群:从事能源系统优化、电力调度、碳交易等相关领域的研究人员和工程师。 使用场景及目标:适用于需要处理多种能源形式和不确定性的综合能源系统调度场景。主要目标是提高系统的灵活性、鲁棒性和经济效益,减少碳排放。 其他说明:模型具有良好的扩展性,可以通过修改配置文件轻松集成新的能源设备。代码中包含了详细的注释和公式推导,便于理解和进一步改进。
毕业设计的论文撰写、终期答辩相关的资源
该是一个在 Kaggle 上发布的数据集,专注于 2024 年出现的漏洞(CVE)信息。以下是关于该数据集的详细介绍:该数据集收集了 2024 年记录在案的各类漏洞信息,涵盖了漏洞的利用方式(Exploits)、通用漏洞评分系统(CVSS)评分以及受影响的操作系统(OS)。通过整合这些信息,研究人员和安全专家可以全面了解每个漏洞的潜在威胁、影响范围以及可能的攻击途径。数据主要来源于权威的漏洞信息平台,如美国国家漏洞数据库(NVD)等。这些数据经过整理和筛选后被纳入数据集,确保了信息的准确性和可靠性。数据集特点:全面性:涵盖了多种操作系统(如 Windows、Linux、Android 等)的漏洞信息,反映了不同平台的安全状况。实用性:CVSS 评分提供了漏洞严重程度的量化指标,帮助用户快速评估漏洞的优先级。同时,漏洞利用信息(Exploits)为安全研究人员提供了攻击者可能的攻击手段,有助于提前制定防御策略。时效性:专注于 2024 年的漏洞数据,反映了当前网络安全领域面临的新挑战和新趋势。该数据集可用于多种研究和实践场景: 安全研究:研究人员可以利用该数据集分析漏洞的分布规律、攻击趋势以及不同操作系统之间的安全差异,为网络安全防护提供理论支持。 机器学习与数据分析:数据集中的结构化信息适合用于机器学习模型的训练,例如预测漏洞的 CVSS 评分、识别潜在的高危漏洞等。 企业安全评估:企业安全团队可以参考该数据集中的漏洞信息,结合自身系统的实际情况,进行安全评估和漏洞修复计划的制定。
内容概要:本文档作为建模大赛的入门指南,详细介绍了建模大赛的概念、类型、竞赛流程、核心步骤与技巧,并提供实战案例解析。文档首先概述了建模大赛,指出其以数学、计算机技术为核心,主要分为数学建模、3D建模和AI大模型竞赛三类。接着深入解析了数学建模竞赛,涵盖组队策略(如三人分别负责建模、编程、论文写作)、时间安排(72小时内完成全流程)以及问题分析、模型建立、编程实现和论文撰写的要点。文中还提供了物流路径优化的实战案例,展示了如何将实际问题转化为图论问题并采用Dijkstra或蚁群算法求解。最后,文档推荐了不同类型建模的学习资源与工具,并给出了新手避坑建议,如避免过度复杂化模型、重视可视化呈现等。; 适合人群:对建模大赛感兴趣的初学者,特别是高校学生及希望参与数学建模竞赛的新手。; 使用场景及目标:①了解建模大赛的基本概念和分类;②掌握数学建模竞赛的具体流程与分工;③学习如何将实际问题转化为数学模型并求解;④获取实战经验和常见错误规避方法。; 其他说明:文档不仅提供了理论知识,还结合具体实例和代码片段帮助读者更好地理解和实践建模过程。建议新手从中小型赛事开始积累经验,逐步提升技能水平。
该资源为protobuf-6.30.1-cp310-abi3-win32.whl,欢迎下载使用哦!
内容概要:本文档详细介绍了基于Linux系统的大数据环境搭建流程,涵盖从虚拟机创建到集群建立的全过程。首先,通过一系列步骤创建并配置虚拟机,包括设置IP地址、安装MySQL数据库等操作。接着,重点讲解了Ambari的安装与配置,涉及关闭防火墙、设置免密登录、安装时间同步服务(ntp)、HTTP服务以及配置YUM源等关键环节。最后,完成了Ambari数据库的创建、JDK的安装、Ambari server和agent的部署,并指导用户创建集群。整个过程中还提供了针对可能出现的问题及其解决方案,确保各组件顺利安装与配置。 适合人群:具有Linux基础操作技能的数据工程师或运维人员,尤其是那些需要构建和管理大数据平台的专业人士。 使用场景及目标:适用于希望快速搭建稳定可靠的大数据平台的企业或个人开发者。通过本指南可以掌握如何利用Ambari工具自动化部署Hadoop生态系统中的各个组件,从而提高工作效率,降低维护成本。 其他说明:文档中包含了大量具体的命令行指令和配置细节,建议读者按照顺序逐步操作,并注意记录下重要的参数值以便后续参考。此外,在遇到问题时可参照提供的解决方案进行排查,必要时查阅官方文档获取更多信息。