Waves同Ruby on Rails一样是一个MVC框架,采用了被称为Request Lambdas的技术,即由规则和代码块来组成映射。当一个规则匹配了一个请求时,相应的代码块就会运行。这只是Waves独有的特性之一。
Waves其他迷人的特性包括:
InfoQ有幸和Waves的创始人Dan Yoder一起聊聊这个框架。
Robert Bazinet (RB): Waves究竟是什么呢?
Dan Yoder (DY): Waves是基于MIT证书发布的下一代Web应用框架。基本上说,它实现了Rails所没有做到的,这也是让它成为“下一代”的原因。这其中的一些很基 本,包括线程安全和更节省资源等等。有些特性利用JITR(Just In Time Resources)这样的技术来将DRY带到了一个更高的层次,可以让你很轻松的实现跨应用的MVC代码重用,甚至重用整个应用(因为应用被封装在模块 之中)。Waves更加开发,也更加易于扩展。例如,你可以很容易编写自己的视图类来改变视图选择和渲染的方法,或者为模型换用另一个数据库平台(默认的 Ruby的Sequel)。它的基本思路和Rails相同——用Ruby实现MVC的Web应用,但是它建立在我数年使用Rails的经验之上,这让我可 以创造出一个更加强大的框架。
RB: 你为什么要创建它?
DY: 简而言之,是Camping。
说的再详细一些,主要是因为我在编写Rails应用的时候遇到了一些很难逾越的限制。Waves实际上一开始只是一个扩展插件集合。然后,我都不知 道什么时候我才能够发布它们,因为实际上我发现我就是在Rails之上重新构建一个新的框架。比起普通的插件来说,它更加现代化。我同时也发现我在 Rails代码上的修修补补,本质上是改变了框架预期的行为,所以这样就没必要再和其他的Rails部分搞在一起了。一个很明显的例子就是我最初实现的 Just In Time Resources:ActiveDependency重写(override)了对象和模块中的const_missing方法来处理代码重载。我想要 修改这个行为,于是我不得不再重写Rails的做法。我并不喜欢这个解决方案,因为我完全可以不需要去碰对象或者模块,但是由于Rails这样做了我也只 能这样做。
直到有一天我发现了Camping。原因我不记得了,我只记得我对其代码的简明大为惊奇。有一种醍醐灌顶的感觉,如果只是简单的创造一个新的框架, 有我要的那些特性,而不需要再围着Rails转。这是一个艰难的决定,因为我的原计划是为Rails编写插件,这比起写一个框架要容易多了。而且,我需要 重写很多代码。这让人很痛苦。但是最终我认为代码会变得更精益、更易于扩展和使用。来自 DuckTyped.com的Ben向我推荐了Rack,我当时正在锤炼代码,于是就采纳了。与此同时,DataMapper和Sequel也逐渐成熟, 这些都可以让制作一个全特性的、能够完全专注于Web应用的MVC部分的框架成为可能。
RB: Waves框架已经开发了多长时间?
DY: 我在07年的八月才开始开发Waves。第一个beta发布版是在今年2月初。所以这是一个非常年轻的框架,一切才刚刚开始。我是个老学究:beta对我来说就是“还不能实际投入应用”。
RB: 对于开发者来说,怎样才能更好地去尝试通过Waves来开发应用?
DY: 有个教学视频可能是最好的起点,你可以跟着这样一个指导来发挥你的想象力。当然RDocs也是一个好途径。也有一个支持论坛,我会尽量在几个小时、最多一 天以内回答任何问题。综上来说,你可以从教程开始玩转Waves,关注RDocs和论坛,如果你有了麻烦可以去论坛问问题。
RB: Waves和Rails一样是一个MVC框架,和Rails相比Waves有什么不同呢?
DY: 非常多的不同。正如我说的,它是“下一代”的,是Rails的进化版。它线程安全,而且更节省资源。它更关注与重用,包括应用程序和它们之间的:JITR 或者通过模块封装的应用等等。路由的等价是Request Lambdas,是非常强大的,可以为MVC添彩不少。它们可以允许你在一个地方加固所有的控制器的安全性。模型可以绑定任何你想要的ORM框架,但是如 果你不需要的话,你也不比为非要使用一个而付出内存和性能的开销。例如,我有一个基于Waves的CMS,采用的是文件存储,那就不需要ORM。 Waves拥有顶级试图,和Waves中的控制器基本上没有耦合。拿布局来说,是制定在试图本身内而不是在控制器中的。类似的,你可以在试图中绑定布局或 引入控制器方法。另一个很关键的不同是Waves支持真实代码重载。这就是说,代码可以在重载前自动卸载,这样上次加载的产出就不会留下来。这样的好处不 光是可以让debug更加容易,还可以使你可以通过LiveConsole对产品代码做热补丁。这是一个很好的例子来说明不同点。它确实是Ruby下的一 次MVC革新。
RB: 是那么类型的站点是基于Waves的?
DY: 我有一个已经发布的CMS为很多站点提供了支持,当然也包括Ruby Waves的站点RubyWaves.com本身。还有一个我通过Waves实现的主题建设的应用程序。它们最初都是运行在Rails上的,现在它们都运 行在Waves上。它们的内存占用只是以前的三分之一到四分之一,而且代码比起Rails来也更少了。它们稳定的运行了数周。对此我颇受鼓舞。我希望从别 人那里再看到一些数据相关的应用。希望可以很快很到。
RB: Waves是开源的吗?如果是的话,开发者们如何参与?
DY: Waves是基于MIT证书的,可以自由的得到。我也非常希望有核心参与者加入来帮助Waves前进。想要参与进来的第一步就是在支持论坛中找到我并让我 知道你希望做哪类工作。目前非常欢迎参与进来。目前有成堆的事情要做,而且我不认为Waves或者任何其他重要的框架是可以离开社区的开发还能取得成功 的。Waves已经站在了Rack、Sequel和Markaby的肩头,从中取得了巨大的收益。很多工作已经被这些优秀的开源产品所简化了。这使得 Waves可以非常非常专注于提供MVC接合。但是依然能有很多机会可以让它更好。
RB: Waves是线程安全的,你可以解释一下吗?
DY: Waves支持每请求一个线程的模型,在处理请求的时候引入信号量来做到不同的线程之间不会影响对方。因为Waves支持集群,并使用了Rack。这并不 是被支持的唯一一个模型,但是我认为它很重要,给了开发者选择的机会,特别是当Ruby 1.9将会支持原生操作系统线程以后。目前,在Ruby社区中线程还不是很火,但是一旦原生线程支持了以后,我断定它们会因为运行更快而迎来回归。收益是 你可以通过增加你的应用运行的实例来提高性能,特别是在那些带有并行架构的、对线程支持良好的机器上。而Waves可以让这些变得简单。
RB: 鉴于Ruby 1.9已经支持“原生”线程,你是如何看待和Ruby 1.9一起工作的?
DY: 我很清楚目前Waves不支持1.9。然而,这是Waves前进的一个主要的目标。并不只是因为1.9拥有太多迷人的特性可以让Waves享用,显然还因 为线程安全可以让Waves在1.9上做到性能的飞跃。这是我并不过分担心性能的原因之一,然而例如Merb社区就会。另外下一个发布版你将会可以让 Waves精简运行以获得更好的性能。但是我认为当我们转向1.9将会越来越有趣。
RB: 你对JRuby支持的态度是什么?Waves使用的Sequel并非100%支持JRuby吧?
DY: 这可能在路线图上排在1.9支持以后,但是我愿意接受建议。我要指出的是Waves并不支持Sequel,它只是新应用的默 认而已。但是现在我相比性能来更注重的是特性,所以JRuby优先级并不高。我很喜欢Sequel中的特性,这个例子真不错。希望在Waves的关键库迁 移到1.9以后JRuby会排上日程。再重复一遍,Ruby社区的反馈会改变这些,尤其是有人愿意贡献。(暗示,暗示!)
RB: 能说说一些你对Waves计划的细节吗?
DY: 好的。首先,我已经从社区中获得了很多建议,包括增加对Tenjin、Haml和Sass模板库的支持以及一个轻量级Web服务器,这些很快就会实现。另 外,还有一个对集群支持的bug修复。我还计划添加目前缺乏的对数据库后端会话的支持,还有增强Request Lambdas等等。
对于Waves需要做出很大努力在增强模式(Schema)反射能力上。目前这还是Sequel和DataMapper的弱点。我希望Waves可以拥有一些ORM独立模式的概念,因为我认为反射是扩展JIT到试图的关键。
我需要指出的是什么才是测试的默认方法。我使用过很多方法而且很喜欢RSpec,但是我犹豫该不该将它加入默认Waves应用之中,因为在Ruby 社区中目前关于测试有太多其他的选择。对Sequel的选择决定就简单多了,因为它支持迁移和Ruby表达式作为查询,我认为都是很酷的特性。但是我没有 信心把RSpec作为默认,所以在这个问题上也欢迎社区的反馈。
我也开始做性能方面的工作,最初做了些基准测试和性能测试来看看问题出在哪里。真的,这里有很多很多有趣的事情去做。我认为Waves已经很酷了,但是那些酷的部分恰恰有很多可做之处。这还只是冰山的一角而已。我维护着一个路线图的单元列表,目前还只是初期阶段,地址在http://rubywaves.com/roadmap,如果感兴趣的话可以在这里得到更多的细节。
RB: Dan,感谢你抽出时间和我们聊Waves。
Waves官方站点有一个创建blog的多章节教程。我曾经试图安装Waves并跟随教程来做,它就和所说的那样工作良好并创建了一个相当不错的应用。还有一个跟随教程的视频教学。其他关于Waves的信息可以在Waves的站点上找到。
查看英文原文:Riding the Waves of a new Ruby Web Framework