写点什么

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

2007 年 10 月 18 日

许多人都说,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

2007 年 10 月 18 日 19:30702
用户头像

发布了 117 篇内容, 共 97381 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

微服务架构深度解析与最佳实践 - 第四部分

kimmking

微服务 微服务架构 最佳实践 深度解析 高可用

浅谈数据中台

数据社

大数据 数据中台 数据仓库

微服务架构深度解析与最佳实践 - 第七部分

kimmking

微服务 微服务架构 最佳实践 深度解析 高可用

微服务架构深度解析与最佳实践 - 第五部分

kimmking

微服务 微服务架构 最佳实践 深度解析 高可用

微服务架构深度解析与最佳实践 - 第六部分

kimmking

微服务 微服务架构 最佳实践 深度解析 高可用

程序员职业生涯的八点感想

池建强

程序员 职业

微服务架构深度解析与最佳实践(全篇汇总)

kimmking

微服务 微服务架构 最佳实践 深度解析 高可用

申请鲲鹏920测试机试水+编译nginx

草宝虫

鲲鹏920 centos7 nginx编译 armv8

平均响应1000ms到200ms,PHP和Go那家强?

拖地先生

php 架构 性能优化 后台开发 运维

【译】Rust 开发者的2019

Michael Yuan

程序员 rust

亚马逊云 AWS LightSail 搭建高性能 LNMP 环境并安全部署 Wordpress

小蚂蚁(Snow Hide)

Nginx PHP-FPM Wordpress 部署 SELinux 安全上下文配置 亚马逊云 AWS Lightsail 安全

聊聊:Python

谢烟客

Python 人工智能 编程

数据分析师应该了解的数据湖

数据社

大数据 数据仓库 数据湖 数据分析

最近看了两本书:The Rules of Life 和 Make Big Happen

泰稳@极客邦科技

创业 团队管理 自我管理

凡事必先骑上虎背

ikook

学习 态度 方法论

微服务架构深度解析与最佳实践 - 第三部分

kimmking

微服务 微服务架构 最佳实践 深度解析 高可用

黄金思维圈,养成透过现象看本质的能力

非著名程序员

读书笔记 程序员 程序人生 提升认知

归去来兮:递归

曲镇

算法

基于RocketMQ实现分布式事务 - 完整示例

清幽之地

Java 分布式事务 RocketMQ 微服务

微服务架构深度解析与最佳实践-第一部分

kimmking

微服务 微服务架构 最佳实践 深度解析 高可用

阿里笔记之数据模型

迹_Jason

大数据

两边夹的应用二

孙苏勇

算法 两边夹 重排序 函数式接口 Lambda

一个独立开发者,他是如何做到月入 20 万的?

非著名程序员

程序员 独立开发者 副业赚钱 开发者 程序人生

你不是迷茫,只是缺乏目标

ikook

学习 身心健康 方法 自我管理

求稳不得

孙苏勇

职业 发展 职场

2019 年

贾献华

2020 2019 总结 日历 计划

两边夹的应用

孙苏勇

算法 积水问题 两边夹

微服务架构深度解析与最佳实践-第二部分

kimmking

微服务 微服务架构 最佳实践 深度解析 高可用

小程序的当下和未来可能 | GMTC.2019深圳站演讲文稿

崔红保

小程序 uni-app

一个运营经理人的工作两周年总结

泰稳@极客邦科技

高效工作 身心健康 项目管理 自我管理

Spring cloud 之多种方式限流

Damon

Java 阿里巴巴 Kubernetes 容器 Spr

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

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