松本行弘:我喜欢模式匹配,包括右侧赋值。同时,我对 Ractor 和静态类型检查也很感兴趣,因为我认为它将改变并增强 Ruby 编程的文化。
松本行弘:是的。当我开始 Ruby 编程时,Ruby 社区还很小。因此,可以抛弃旧版本并打破当时的 Ruby 语言语法。但随着时间的推移,Ruby 社区变得越来越大,世界各地有数百万的 Ruby 程序员,现在即使是最微小的改变也能造成破坏。
我们上次在 Ruby 1.9 中做了一个大的破坏,我们吸取了教训,即大的破坏可以长期分裂社区。在 Ruby 1.9 后,我做了一个决定,即使是在主版本上,我们也不会做大的破坏。其他语言,如 Python 3 或 PHP 6,也有类似的问题,这让我们认识到向后兼容的重要性。
语言设计师希望不断进步,做出改变,改进语言。但如果要以兼容性为代价,那就不好了。我们应尽量保持兼容性。
然而,另一方面,就像你说的,开发人员喜欢新的东西,所以我们必须添加新的特性,这有点矛盾。但我想我们已经尽力了,至少对于 Ruby 3.0 来说是这样。
我记得,10 或 15 年前,所有这些悲剧都发生在 Python 从版本 2 过渡到版本 3 的过程中。这种情况持续了几年,核心开发人员甚至不确定他们是否应该继续开发 Python 3,或者干脆退回到版本 2 会更好。同样,PHP 也发生过类似的事情。我很高兴,目前,我们正处于开发阶段,我们可以在不让数以百万计的开发人员感到难过的情况下提供令人惊叹的特性。
我们来谈谈特性吧。编程语言都是彼此借鉴的。我们可以在 Ruby 中看到模式匹配,其他开发人员也可以在 Python、JavaScript 和现在的 Ruby 中使用 hash destructuring。也许右侧赋值将来也会被 Python 或 JavaScript 借鉴。您对下一个版本有什么计划嘛?您有什么疯狂的想法,您想借鉴什么,或者只是尝试些什么?
松本行弘:这是个很好的问题!但是我们关注 Ruby 3 已经有很长一段时间了,而且它才发布了一个月,所以我对未来还没有那些疯狂的想法。它可能是增强 Ruby 的 Ractor 和模块(Module)系统。Java 和 Python 都有模块系统。另外,提供一个结构化的打包(Packaging)系统可能也很有用。我有一些模糊的想法,但还不够具体,所以无法透露太多。也许你得等一年左右的时间才行。
松本行弘:是的,我们可能会准备一些容器,以便不同版本的 Gem 可以存放在不同的容器中。
松本行弘:我的主要信息渠道是 Ruby Redmine。我们有收到来自社区的大量建议,这些建议激励我设计新特性。我不得不拒绝其中的大多数,但是这些改进语言的想法启发我去设计新的想法。
在疫情之前,我参加了许多会议,并与人们讨论了 Ruby 和编程问题,这样我就能看到语言和环境的障碍、烦恼或弊端,然后我尝试改进它们。这些讨论给了我很大的启发。但在过去的一年半里,我再也无法进行这样对话了,这是疫情的一大弊端。
此外,我还上网冲浪,阅读有关编程语言和 Ruby 的博客。这些文章也给了我启发。
松本行弘:日常的开发并没有太大的改变。我住在离东京很远的地方,即使是疫情之前,我们开发人员的会议和沟通都是在线上进行的,所以这个过程并没有变化。但正如我之前所说的,我们现在没有实体会议了,所以这是一件坏事。
但是,另一方面,我不必经常出差了。我可以呆在家里,有更多的时间呆在我的电脑前,花更多的时间在编程或 Ruby 身上。
松本行弘:对于与会者来说,线上会议的价值仍然存在,但是以演示的形式存在的。但没关系,与此同时,线下交流,一起吃晚饭或是傻乎乎的聊天,这些侧面渠道都从线上会议中消失了,这是我非常怀念的事情。会议的价值在于这种交流。
松本行弘:当 Ruby 社区还很小的时候,他们并不关心更改,一切都是实验性的。如果无法解决问题,我们就会删了它,没有人关心兼容性。但是那些美好的时光已经一去不复返了,现在我们有了一个庞大的社区。
因此,这类更改的成本每年都在增加。这意味着 Ruby 的设计决策无法逆转。这意味着设计师不能犯错。我只是个普通人,我承认我犯了很多错误。
同时,虽然 Ruby 社区很庞大,但我们的 Ruby 核心开发人员团队还不足以预测未来。
如果我能提出一些建议,或者我们能在核心社区内尝试这些想法,那是没问题的。但我们的核心社区还不够大,无法在发布之前对这些想法进行试验。我们对 Ruby 特性所做的实验是一种折衷,适合当前核心开发人员社区的规模。大型 Ruby 社区不允许我犯错,但是核心开发人员社区的规模不允许我们在内部进行所有实验。我们必须让社区去尝试一些东西。
一旦我们的核心社区足够大,可以进行内部实验,我们就不再需要公共实验过程了。但是现在,这是一种妥协。
其他语言也会这样。Python 和 PHP 社区的规模足够大,可以在核心开发人员内部进行各种实验。但是目前的 Ruby 社区规模不允许这样的过程。
松本行弘:语言设计很有趣。语言实验的一个非常大的好处是邀请用户社区来帮助设计语言。即使我们有一个足够大的核心开发人员社区,我们也可以邀请广大的 Ruby 社区来参与一些语言实验。
松本行弘:大多数 Ruby 用户甚至都没有考虑加入到设计过程的可能性!那会很有用。
松本行弘:对于 Web 应用程序,Web 开发人员无需关心并发性,因为像 Unicon、Puma 和 Falcon 这样的应用服务器会处理并发性。Unicorn 使用进程,Puma 使用线程,Falcon 使用 Fibers。应用服务器的选择直接影响并发系统的选择。也许将来我们会有一个基于 Ractor 的应用服务器。但目前还没有,因此应用服务器的选择会直接影响并发模型的选择。因此,Web 开发人员不必关心并发性。
典型的开发人员在研究应用程序瓶颈时会进行并发性试验。如果输入 / 输出是瓶颈,那么明智的做法是选择异步 Fibers。异步 Fibers 针对 I/O 多路复用进行了优化。如果你的程序使用了大量的 I/O 通信,则选择异步纤程。如果你想试验多核及 CPU 密集型任务,那么选择 Ractor。
这是基本的选择,因为当前 Ractor 实现是将一个 Ractor 与一个原生 OS 线程相匹配。现在还无法创建数百万个 Ractor,因为每个 Ractor 都会消耗几兆字节的堆内存。这是巨大的。而 Fibers 只消耗几千字节或更少的内存。因此,你不必担心 Fibers 的内存成本,你可以创建任意数量的 Fibers。这是选择的第二个标准。负责 Ractor 的 Koichi 正在努力改进这些。也许,在未来,Ractor 也不会再消耗那么多内存了。
也许将来,我们能够像在 Go 中使用 Goroutines 一样使用 Ractors。但这是一个未来的故事。
Grigory:是的,听起来前途一片光明。到目前为止,我真的很喜欢框架(Framework)作者的想法,将一些著名的 Ruby 约定置于配置之上,这样 Ruby 开发人员可以使用框架作者预先选定的模型。然后,如果运行缓慢,Ruby 开发人员可以更深入地研究并将 Rails 切换到其他的并发原语上。能有选择的余地真是太好了。
还有一个关于速度的问题。
最近,我偶然发现了一篇由 David Heinemeier Hanson 撰写的短文,他提到了一个有趣的发现:在他提供 Basecamp 和 Hey.com 电子邮件服务的所有服务器中,只有 15% 的 Basecamp 运维预算花在 Ruby 上。即使把 Ruby 的速度提高 10 倍也改变不了游戏规则。Ruby 的原始速度重要吗?
松本行弘:我有点百感交集。对于大多数 Web 应用程序而言,Ruby 和业务逻辑并不是瓶颈。大部分时间都是花在数据库、网络连接以及处理操作系统上。Shopify 和 GitHub 使用 Ruby,所以速度并没有那么重要。它们已经成长壮大了,是没有任何问题的。如果我们关注程序员的生产力,那么性能并不是最大的问题。
很长一段时间,我都是这么认为的,直到几年前,我意识到很多人都是基于微基准测试来做决定的。
所有这些斐波纳契(Fibonacci)数和 n-body 基准测试都有点愚,但这是开发人员的本能。几年前,我放弃了让开发人员违背本能的做法,开始改进 Ruby 的性能,甚至在微基准测试上也是如此。
JIT 编译器就是其中之一。JIT 编译器目前并没有提高 Rails 应用程序的性能,因为应用程序将时间花在数据库和网络连接上了。但是 JIT 编译器可以提高微基准测试的性能。
但是目前,由于存在瓶颈,编译器并没有对 Rails 应用程序的性能提高多少。应用程序是在数据库访问或网络实践中设置的,但编译器可以提高微基准测试的性能。我们在各个方面都正在改进 Ruby 的性能,包括微基准测试。
几年前,我就开始关注微基准测试的性能了。这有点傻,但这是 Web 开发人员的本能。
松本行弘:是的,我们不能与本能抗争。
松本行弘:是的,Ruby 1.8 采用了“胖标准库”的方法,但是随着时间的推移,有些库没有得到维护。我们改变了方法,把库分成了多个 Gem。
很少有人在 Ruby 1.9 时使用 RubyGems,但是在 Ruby 2.0 的时候,RubyGems 被设置成更具通用性的了。有了 Ruby 2.0,RubyGems 社区变得越来越大,每个人都在使用 RubyGems。所以,如果每个人都使用 Gem,我们就不需要打包所有东西。因此,我们逐渐将标准库划分成不同的 Gem,使标准发行版本更精简且易于维护。
请记住,我们的核心开发人员社区还不够大,不足以成为所有领域的专家。一般来说,我们的语言核心开发人员不是 Web 开发人员。我们不擅长维护基于 Web 的技术,比如 Webrick、HTTP 客户端,甚至处理 XML。
最好的办法将这些难以维护的零件远离标准发行版本,并使其成为 Gem。现在,开发人员可以创建具有竞争力、更好维护的 Gem。自然竞争是一件好事!
松本行弘:在 2021 年,railstutorial.org 以及 guides.rubyonrails.org 为初学者提供了最佳的学习资料。Web 应用程序是编程的一个很好的示例,它接近于真实的产品。现在,运行脚手架并编写几行 Ruby 代码就可以创建一个简单的 Web 应用程序。您可以在几秒内增强这些 Web 应用程序,并查看更新后改进了的 Web 应用程序。
较短的开发周期鼓励开发人员学习更多的知识。在开发人员学习了 Rails 或 Ruby 的内部架构之后,他们可以学习任何他们想要的东西:机器学习、嵌入式系统。对于初学者来说,Web 应用程序本身就是一个很好的起点。
那么,政府和所有官方所举办的活动对 Ruby 的这种赞赏是日本或日本文化所特有的吗?或者这是 Ruby 所特有的,还是两者都有?
松本行弘:无论是在日本还是日本以外的地方,比如俄罗斯、美国和欧洲,开发者社区都是非常相似的。但不同的是,Ruby 被认为是在日本本土的,一些日本人希望鼓励它,特别是当地政府部门。
我个人和一些城市的州长、市长的关系都很好。他们希望通过组织会议和颁奖来鼓励 Ruby 社区。这是他们鼓励一种被认为是在日本诞生的技术社区的方式。从这个意义上说,这些地方政府项目是日本所特有的,但当地的开发人员社区与其他国家的是非常相似的。
视频采访连接:
https://youtu.be/B-UFFo4M-04?fileGuid=jKdG9qXdRQ6q9t69
通过对松本行弘先生的采访,我们了解了更多关于 Ruby 的最新特性以及社区的发展是如何影响语言发展的。我们也对 Ruby 的未来有了一些深刻的了解。
原文链接:
https://evrone.com/yukihiro-matsumoto-interview-2021?fileGuid=jKdG9qXdRQ6q9t69
领取专属 10元无门槛券
私享最新 技术干货