Beyond What?——十年之后,谈谈 Ruby, Rails,过去和未来

版权声明:所有博客文章除特殊声明外均为原创,允许转载,但要求注明出处。

Beyond Java

2005年,Java 开发者和专栏作家 Bruce Tate 写下了 《Beyond Java》 一书(中译本《超越 Java》,2007年出版)。该书的主要目标是探讨 Java 企业开发的发展方向。尽管作者尽力避免对未来做出明确的预言,但通读全书后,含义仍然是非常明显的:以 Ruby 编程语言和 Rails 框架为代表的新一代编程技术将会超越 Java,引导下一个时代的开发潮流。

需要说明的是,该书提出的观点并不只是作者的个人意见,而是在很大程度上代表了当时很多具有前瞻思想的开发者、包括一些著名业界领袖的共识。要理解这一点,首先需要了解 Ruby / Rails 兴起的历史背景。

Ruby 是在 1995 年由日本人 Matz (松本行弘)创建的,和 Java / Python 创立的时间其实相去不远,但很长时间内一直处于默默无闻的状态。在这些年里,Java 几乎统治了 Web 企业开发平台。但从结果上看,抛开设计拙劣和笨重的 J2EE 早期规范不说,即使使用 SSH 这样的“轻量级”框架,开发 Java 应用仍然是非常低效的。阅读大量 J2EE 规范、集成各个设计风格迥然不同的框架、管理冗长的 XML 配置、慢如蜗牛的应用服务器部署,使得即使是建立一个最基本的应用,都需要花费大量时间。

当时,已经有很多聪明人意识到:这个事情不对劲。创建 Web 应用本不应该这么复杂。但在 Java 平台的视野内,他们找不到合理的解决方案。

Java 年轻的时候,你不需要太多知识就可以建立一个基本的 applet。但是现在,建立一个简单的 Web 应用程序,使用最普遍的框架,你必须先学会一箩筐的知识。

我的客户从别的语言移到 Java, 当他们看到我建议五周的教育训练时,他们吓坏了,而五周只是个皮毛罢了。对他们来说,Java 不再是一个可亲近的语言。 ———— Bruce A. Tate,《超越 Java》

在这个背景下,我们就不难理解:为什么在 2005 年由 DHH 编写的 Rails 框架能够在短短时间内赢得广大开发社区的普遍关注,以及当时 Rails 布道者打出的 “10分钟创建博客应用” 口号对骄傲的 Java 开发者心理上造成了多么巨大的冲击。虽然开发者普遍认同“没有银弹”,但是从早期实践者的反应来看,Rails 对比 Java Web 开发似乎真的有10倍以上效率上的差距;而且——违反直觉的是——Rails 应用甚至在一些场合表现出比 Java Web 性能更高。那么,人们还有什么理由不拥抱 Ruby / Rails 呢?

在先行者的带领下,Rails 开发成了一时显学。从国外的 Twitter, Github, Groupon 等网络新贵,以及国内的知名编程社区 JavaEye(后改名 ITEye)等,都选择了用 Rails 来搭建。一些Ruby 语言长期以来的短板——比如原始资料很多为日语,影响了在其他国家的推广——在社区的热情支持下很快也得到了解决。Ruby 还很快被移植到其他平台 (JRuby / IronRuby),横跨本地代码、JVM、CLR ,大有无所不在的架势。Ruby / Rails 的前景看起来一片光明,甚至于很多开发者有了这样的想法:Ruby 全面取代 Java, 看起来只是时间问题。

然而几年过去了,事情却发生了戏剧性的转折。这些变化是以一些著名的网站纷纷“逃离” Rails ,迁移到其他平台而再次引起开发界关注的。迁移事件的具体细节和负责人的观点可以参考下面文章:

按照这些描述,网站的开发者将 Rails 架构迁移到 Java/Scalar/Nodejs/Go 等平台后,在性能上竟然普遍有超过10倍的性能提升,还带来了稳定性和资源占用等其他方面的优势。这个差距如此之大,看上去颇令人怀疑。因为按照一般的观点,网站的主要瓶颈通常在数据库/磁盘 IO,并没有太多复杂的计算,Rails 即使在语言性能上远远落后于编译型语言,在网站的整体性能上也不应该有如此巨大的差距。但要说这些杰出的网站开发者在撒谎,也不太可能。那么问题到底处在哪呢?

从技术角度讲,国内 JavaEye 站长 范凯的观点 可能是最具说服力的。按照他的意见,问题并非出自 Ruby 语言,而是 Rails 框架的设计思路为了追求简单方便,默认加载了太多并非绝对必要、却严重消耗资源的内容。此外,Rails 的多进程/线程模型在高并发情况下性能也相当差(和后来的 Nodejs/Go 重新设计的并发模型相比)。

范凯的上述观点应该是令人信服的。但是从另外一个角度出发来解读,可能还有值得重视、却容易被人忽略的原因:这些开发者在对网站不断优化的过程中,已经积累了丰富的经验,知道哪里会有大坑;同时,对原有架构存在哪些弱点,他们也非常清楚。这样,当他们有机会重构整个网站时,不论沿袭原有技术还是采用新的平台,都极有可能要比第一版更加优秀。如果这个解释成立的话,那就意味着,新的技术仍然可能比 Rails 更快、更稳定,但未必有表面上看起来那样有 10 倍的差距;其背后还是有人的因素在发挥作用。

不管人们对上述现象的原因如何理解,这些大型网站架构的变迁在业界确实起着风向标的作用,由此引发的大讨论,也使得人们对 Ruby /Rails 的未来产生了怀疑,过去几年的发展势头也受到了沉重的遏制。从各大主流编程语言榜单,如TIBCO、StackOverflow、Github 公布的数据看,Ruby 语言这些年来的趋势从市场份额来看是缓慢下降的(虽然绝对数量可能还有所上升)。从 Google Trends 看同样如此:

Beyond Java

今天,Ruby / Rails 仍然是以风格优雅、变幻奇妙、容易构建 DSL 而倍受赞誉的语言。但十年前被普遍看好的“取代 Java”,显然并没有成为事实,而且 Ruby / Rails 看起来在今后也不大有机会再进入主流的行列。反而是它的竞争对手们:

  • Java 并没有显现出被其他语言包括 Ruby 所取代的明显趋势,反倒在移动领域(Android)开辟了新的领地。JVM 上的其他新贵语言如 Scala, Clojure, Kotlin 等也分别雄踞一方;
  • 在许多年里一直不温不火,声势一直被 Ruby 盖过的 Python,最近几年不声不响地把自己的领地拓展到许多领域,而且在各大编程语言榜单上也有不俗的表现;
  • Nodejs, Golang 等一干新贵,各有绝技,上升势头也相当惊人,当然在成熟度和稳定性方面还是比较欠火候;
  • Erlang,LISP 等小众语言继续冷艳高贵,吸引一批死忠,生存绝无问题,但成为主流几无可能。

以史为鉴,可以知兴替。今天记录下一些历史的片段,并不是为了批判 Ruby /Rails,也不是为了嘲笑前人的预言。而是为了站在历史的角度,理解我们是从哪里出发,站在何处,今后又将去往何方。

(待续)