DAVID ZHANG
<< Back
Ruby 相见恨晚

大学时因为好奇的原因在图书馆借阅过几次 Ruby 和 Ruby on Rails 的书籍,大概是道行不够的原因,完全体会不到它的优点。

两个月前,因为 Jekyll 接触到了 Ruby,并且成为了 Jekyll 的忠实贡献者。之后,不仅所有的个人做的网站都变成了 “Powered by Jekyll”,还学会了 Jekyll 整个 Project 极致的自动化工具链。Jekyll 通过测试驱动 (TDD, Test Driven Development) 覆盖 lib 层功能,通过行为驱动 (BDD, Behavior Driven Development) 回归整体功能,并在 Travis 和 AppVeyor 分别进行 Linux 环境和 Windows 环境下的持续集成。Jekyll 还通过 rake 实现同个 Project 下网站部分的生成发布到 gh-pages 分支、发布时从打包到上传 gem push 等操作。甚至说,Jekyll 的维护者还引入了一个账户名为 jekyllbot 的机器人完成 PR Merge、追加 Changelog、Issues/PR 自动分配 assignee 和发布 Releasenotes 等工作。

现在,我的网站也成为了自动化工具链的受益者,使用 rake 来自动完成生成博客和生成简历等各项操作,并且通过 GitHub Webhooks 自动触发更新部署。

受到自动化的 Workflow 以及红火发展的聊天机器人和 ChatOps 的启发,我发起了 Heelbot 项目来建设自己的自动化工具链和 Workflow,并能够完成聊天机器人的工作。Jekyll 在测试方面的做法被引入了 Heelbot 的自动化测试中,结合应用了 TDD 和 BDD,以后有时间会专门写文章讲述。达成的结果就是,改过代码后,不需要手动操作任何东西,只需要跑一次测试脚本,就可以完成对底层库和整体功能的测试及回归。

然后,我买了 Matz 的两本书:《松本行弘的程序世界》和《代码的未来》,了解 Ruby 的设计背景和哲学。Matz 对于编程语言的设计有着很深刻的理解,阐述了 Ruby 在各种语法中设计的思路和取舍,尤其是对于面向对象、多继承问题 (mixin) 和 block 这几方面。

对 Ruby 最大的感受就是整体体验很舒服,其次就是生态非常完善。Ruby 的舒服体现在方方面面,无论是语法、生态还是库接口的设计。使用 Ruby,你得到的就是完善的生态,包括 RubyGems 包管理机制、Bundler 依赖管理、Ruby-Doc 库文档平台等。而不是一个编译器或者是解析器。现在各种包管理器已经成为了标配,各种新老语言理所当然的都包含了自己的包管理系统,如 Python 的 pip,Node.js 的 NPM,Rust 的 Cargo 之类。但 RubyGems 早在 2003 就被创立了!

内在的体验就是,Ruby 的程序员很有自己的思想,尤其是在“如何利用高级语言更好、更优雅、更舒服、更高效的编程”这个主题上。因此,在这些主题相关的领域,在 Ruby 上的发展都非常完善,即使 Ruby 整体的人气和我原来常用的 PHP 有一定差距。当然,Ruby 本身灵活动态的语法和自身的一些特性,也让开发的便捷成为了可能。

但国内很多 PHP 程序员却不那么关注这块。就我对狼厂 PHP 程序员们的了解,他们往往心中想着“高并发”、“性能”、“分布式”等“高大上”的主题,本质上对“世界上最好的语言”并无多大好感,只是造化弄人不得不写罢了。他们最希望的是什么时候能够改用性能更好的底层的语言——老牌的 C/C++ 或者 Golang,甚至说在脚本语言中也希望能用上更优雅飘逸的 Python 什么的。

我承认,我起初也是这样的人,也对 PHP 没什么兴趣。但不用多长时间,每个任何语言的使用者可以发现几个事实(或许不会承认):

  • 不是所有程序都需要自身执行效率很高,有些只是希望开发效率高
  • 用 C/C++ 或 Golang 或某些框架写出了表现“很牛”程序,那是人家自身的优势,和程序员本人关系不大
  • 不管用什么语言,都需要一些软素质,其中很重要的一块就是“代码可维护性”

这是氛围上带来的某种误区,奥运会并不是只有赛跑,做得最成功的产品也很可能不是响应时间最低的。

作为 Web 产品研发工程师,我觉得在产品迭代中,排除掉对业务和体验的关心外,在纯技术事务上,工程师更应该关注的是开发效率和代码可维护性。性能当然需要时刻考虑,但这只是工程师追求的一小块。但事实是,性能被过多考虑了,而在协同环境中会提供更大收益的代码可维护性却被忽略了。我们有时循规蹈矩用着刀耕火种式的开发模式,然后轻易地就放弃了文档、自动化测试、Code Review 等环节。软素质问题日益阻碍着团队的发展。

代码可维护性是衡量一个程序员 craftmanship 的重要指标,这也是 Rubyist 哲学中很重视的一块。因此,他们发明或实现了很多理念上领先的东西提高可维护性。比如:Ruby on Rails,它当然比 Sinatra/yaf 这样的框架重、复杂、不易入门,但却能得到真正的极致的开发效率。

因此,更加精英化的外国初创企业很流行使用 Ruby on Rails 作为后端解决方案。比如:Twitter, Airbnb, GitHub, Shopify 等。

End.