InfoQ

InfoQ

文章

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

Ruby和Rails:朴实而深远的朋友

作者 David A. Black 译者 Jason Lai 发布于 2007年10月18日

领域
架构 & 设计,
过程 & 实践,
语言 & 开发
主题
交付价值 ,
Ruby ,
Web框架
标签
语言 ,
评论

许多人都说,Ruby和Rails的入门门槛很低——而且大家都是不约而同地表达了同样的观点。“Ruby语言帮你解决了很多事情,”这些年我听到的都是这样的话语,“因此你可以专注于实现你的目标。”而你也常常会听见人们用相似的好评褒扬Rails。

对于这两种情况的说法,我恰好都表示赞同。

当然,这并不是说,写出能正常工作的代码或者让一个Rails应用程序启动并正常运转这样的事情,是你从街边随便揪出来的一个人就可以做的。门槛低只是相对的说法;你得先对习惯于程序开发的过程,才能体会到透明编程技术所带来的好处。你得先入道,才能借助Ruby或者Rails在原有的“道”上取得突破。

对于用户来说,易用性同样也是相对的。数十年来,从Usenet和其它在线评论中,我们可以发现,人们对于编程工具一直没有一致认可的选择。所有这些希望说服对方改变自己所用的工具集合的高谈阔论都是在浪费时间——没错,浪费时间,这些话里面的每一个字都在浪费时间——想想都让人觉得对不起自己的胃。(我从1990年就开始关注Usenet和其它在线论坛了,但从没看见有谁成功说服另外一个人转投某个语言或者工具。) 因此,费尽心机宣称某个语言或者框架比起另一个更透明或者组织得更为良好,或者更容易使用,根本没有意义。

不过,要是你听见哪些技术被人们以同样的语气不停赞扬着的话,那么你至少得好好留意并且讨论一下这些技术了。

至少,在理论上像Ruby和Rails这样的编程语言和系统都是为了帮助你解决某方面具体问题的,也就是说,像乐器一样,它们是让你达到结果和完成目标的工具,而它们本身并不是目的。不过,音乐家把自己乐器的历史、文化和技术特性视为一个整体,而程序员们正如他们一样,对于自己所用的语言和系统也存在同样的认同感。没错,你用算法就可以描述出一个编程任务,然后可以任选几百种编程语言中的一种来把任务实现出来——这和你可以使用数百种乐器中的任意一种演奏出一个特定的曲调是一个道理。不过使用了哪种乐器并不是最终的结局。

将音乐家和程序员做类比的例子简直是不胜枚举,而其中有一些类比,与手头的问题还有易于入门的问题是有关系的。

小提琴大师Itzhak Perlman(伊扎克·帕尔曼)就恰如其分地点评了小提琴和钢琴的区别——从长远角度看,两者没有哪个更难也没有哪个更简单,但具体说起来,和小提琴还是不一样,钢琴上手还是更容易一些。Perlman如是说:

和钢琴演奏者相比,小提琴演奏者要度过一段更为艰苦的历程才能演奏出真正的音乐,因为钢琴演奏者[……]一上手就得照着乐谱练曲子,依葫芦画瓢。他们[钢琴演奏者]不用处理颤音(vibrato),不用操心换把(shifting),不用对付滑音(sliding),也无须顾虑弓速(bow-speed)[……]你只要[在钢琴上]摁下一个键就能听到声音[……]你一开始就得把音乐弹出来。

正因如此,钢琴就成了乐器王国中的Ruby或者Rails一样脱颖而出。

Perlman把低入门门槛描述成一种责任:钢琴演奏者没办法拖延自己演奏动人音乐的责任,因为他们无法以钢琴在器械操作上有难度为借口。(我们当然不是说你轻而易举就可以把钢琴弹得行云流水,而只是说在你面前扔一本乐谱你就能弹出一点什么,而初用小提琴你是做不到这样的。)

于是,自我夸耀——当然不是说Perlman在自夸,不过他开玩笑地把这个未决的问题抛给了更多的人——就成了演奏高难度乐器的音乐家专属的权利了,这些人能用“奇技淫巧”演奏出悠扬的乐章。但是,在计算机世界中,显摆的权利则属于使用能让自己效率更高的工具的人们,而Ruby和Rails则成为人们“吹牛显摆”所用的扩音大喇叭。

但是,我们应该分开讨论Ruby和Rails,它们入手的难易度可不能直接就划上等号——这也是和我们文章主基调像对应的说法。这个说法也代表人们常会表达的疑虑:到底Rails开发人员该不该花时间掌握Ruby呢?

从某个角度讲,这个问题是可以理解的。Rails和Ruby“门槛低”的美名并不意味着它们对于同一群人来说都很容易,或者说不意味着它们容易的方式是相同的。S系统并不因为使用L语言写的,就一定和L语言具备相同的难度。比如说,Ruby是使用C语言写的,不管人们对C语言如何褒扬贬抑,要说得上C语言入门通常是没那么简单的。

对熟练掌握Ruby语言的反驳,我见过两种情况,分别基于不同的立场:

  • Rails很简单,但Ruby就高深得多了(从难度的意义上说,级别太高)。
  • Rails是一个系统;而Ruby则是原材料(不从简单的意义上讲,级别过低)。

对于这两种立场,就未来的Ruby框架或者还没有问世的类库来说,任意一种都可以说是正确的——而且也可能确实是正确的,但不管哪一个都没能正确描述Ruby和Rails之间的关系。

这里的关键点在于Rails设计的方式。Rails让开发人员用到Ruby语言中的许多资源。是的,在许多方面,Rails都是自成一套系统的。然而在许许多多其它的方面,Rails暴露、探索并且发掘了它和Ruby的联系,而不是将这些联系隐藏或者掩盖起来。

举一个例子:helper文件。在你每生成一个控制器(controller)的时候,helper文件也会相应为你创建出来。Helper文件里面什么也没有:你可以在里面放入自己写的Ruby方法,并可以从视图模板中调用这些方法。

这里并没有什么和Ruby无关的抽象,也没有将Ruby封装成一个单独的领域特定语言,更没有“只能通过向导生成(Wizard Only)”的标志。有的只是空位,由Rails提供的空位,可以让你放入定制的Ruby代码,也就是提供给你让你可以为应用程序加入Ruby代码的空位。

Rails鼓励你使用Ruby,鼓励你去了解Ruby。Ruby既不会过于难以使用,也不会过于底层,而使得你无法给Rails项目带来直接迅速的帮助。

Ruby和Rails是不是两个平级的搭档,二者之间只是一个平行的关系?答案是否定的,要更加复杂一些。Ruby是一项先行的基础技术;而在某些层面上,Rails则为你提供一个经过量体裁衣的、以目的驱动的Ruby环境。

尽管如此,在你编写Rails应用的时候,Ruby看起来确实像一个辅助技术。试想一下XML和XHTML(或者任何其它的XML应用)之间的关系吧。一个是系统,另外一个则是使用第一个系统写出来的系统。尽管二者都被称为“标记语言(markup languages)”,但是它们的命名方案将其中的一个间接层(indirection)给隐藏起来了。

对于Ruby和Rails来说,事情有点儿倒过来了。名字是不一样,但是技术上的关系倒是比较平级(egalitarian)。

可能“平级”这个词用得并不是很准确,可能根本不存在描述Ruby和Rails之间比值的正确用词。可能这就是duck typing的一个例子,duck typing所代表的原则是,无论对象属于什么类或者模块,关系都不大,关键在于它做些什么。当你开发一个Rails程序,并且你决定要写一个Ruby方法来帮你解决问题的时候,你是否能给语言和框架的关系下个定义其实并不重要。你要的只是能给出结果的东西:Rails的配备、Ruby的核心类、插件、Ruby类库、你自己写的方法,等等。

这也正和“百川汇于海”是一个道理。

关于作者

David A. Black(dblack@wobblini.net)是Manning出版社《Ruby for Rails》一书的作者,同时是Ruby Central, Inc.的共同主管。Ruby Central, Inc.是RubyConf和RailsConf这两个国际Ruby及Rails年度大会的主办公司。David通过Ruby Power and Light, LLC提供Ruby和Rails的咨询和培训(http://www.rubypowerandlight.com)。

相关电影

Itzhak Perlman访谈,来自《The Art of Violin》,导演Bruno Monsaingeon,2000年出版。

查看英文原文:Ruby and Rails: In your face... but out of your way

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。