本文作者的中心思想不是唱衰 Rust 语言,正相反,他非常看重 Rust 语言。他回顾了 Haskell 语言从王者“沦落至此”的原因,希望这能给目前充满朝气的 Rust 社区敲响警钟。以下为正文。
那些杀死 Haskell 的,也会杀死 Rust。
为什么这个时候我会提到 Haskell?好吧,Haskell 和 Rust 有着千丝万缕的联系。可以说,Rust 就是没有高阶类型(HKT)的 Hashkell。Rust 的很多风格与 Haskell 很像。在某种程度上,可以说 Rust 就是 Haskell 的化身,只是它带了那么一点点 C 语言风格的语法。
Haskell 曾经也是一门人们想要关注的语言。从 2000 年到 2010 年间,Haskell 是每一个程序员都希望能用上的语言,但除了少数人,没有人真的这么做。有一些令人印象深刻的项目是用 Haskell 开发的,比如很多金融项目和薪资系统。但是,从一门纯函数式编程语言的角度来看,Pandoc 才是真正称得上具有 Haskell 内核的项目。有人说“Haskell 太慢”、“Haskell 干不了实事”,结果让 Pandoc 给打了脸。
然而,Haskell 究竟发生了什么?为什么突然间止步不前了?现在没有人用它来开发重要项目。还有人在用 GHC Haskell 吗?或许还有那么一两个。GHC Haskell 已经沦为一门学术性语言,没有人真正关心它。
在 Haskell 时代,它处于函数式编程的最前沿,诠释了函数式编程的真正含义。当然,除了 Haskell,还有其他函数式编程语言,只不过它们没有那么纯粹,我说的是 Scala 或 JavaScript。在 2000 年代中期,这两门语言是 Haskell 最主要的竞争者。Go 和 C++ 是跟随者,Haskell 在引领着它们,它们从 Haskell 身上学到了很多。Scala 程序员都知道,for 循环语法和很多代码库的灵感都来自 Haskell。
那个时候,Haskell 独占鳌头的气势是其他语言所不具备的。它为程序员带来的生产效率可以用因数“5”来衡量。一个开发团队使用 Haskell 开发并交付一个应用程序的速度比 Scala 或 C++ 快 5 倍。因数“5”成了一个非常重要的指标。
Haskell 的锋芒渐渐显露出来。有多少人在用 monad?我在 JavaScript 中用了,在 Rust 中也用了一些。在 Go 中,我可以用 monad 完成一些很有意思的事情。而这些,在 2000 年中期,都是 Haskell 程序员玩剩下的。当大多数人开始琢磨 monad,Haskell 早就有了 monad 和代数数据类型。
在很多方面,Haskell 是个王者,但还是死掉了。是什么杀死了它?
我想用一个词来形容,但请你们不要误解了这个词。你可能认为它是“邪恶(evil)”,或者是“无知(ignorant)”,但其实我想说的是“自大(arrogance)”。
Haskell 社区里弥漫着一股傲慢的味道。不是那种邪恶的傲慢,而是那种让他们觉得自己比别人更好的傲慢。他们使用的工具在某种程度上更好,他们做的事情在某种程度上更好,有些人甚至傲慢地认为他们获胜是不可避免的。这不是那种扇了你一巴掌然后说“你这个愚蠢的 Go 程序员”那种傲慢,相反,这是一种力量的傲慢。Haskell 程序员写出了一种强大的代码,一种强大的编译器,一种强大的语言,他们知道他们可以创造奇迹。
这些还不够。一些阴险而微妙的事情发生了,导致他们将自己与行业的其他部分隔离开来。社区外的程序员开始注意到 Haskell 程序员在做什么:“Haskell 社区的人似乎不太喜欢我们,我想我们也不会喜欢他们的。”
有些人可能还记得 2000 年代中期 Reddit 论坛上的一些讨论。有一群人在那里谈论很酷的数学问题。他们经常窃笑其他语言,比如 Go。这不是什么大事情,也不是什么邪恶的事情,他们是这样窃笑的:“主流的人们,哈!”那个时候我就是一个主流的 Go 用户!但我不喜欢他们那样。在接下来的几年里,我参与了编程语言之争。当时我对他们说:“我们真的想要在 Reddit 上展开编程语言之争吗?”有趣的不是他们在窃笑什么,因为他们有权那么做,有趣的是我的反应。我的反应带有防御性:“好吧,继续用你们的 Haskell 吧,但我们才是真正能解决问题的人。”
这种对立在当时非常有趣,而且相当普遍。Haskell 社区出现了一种态度,但不是邪恶的那种,也不是出于恶意。但有一种态度是这样的:“我们的工具很好,我们的语言很好,我们不需要遵守规则。我们可以做自己的事情,不需要和别人讨论。我们不需要写其他类型的程序。”Haskell 程序员不想写常规的程序,不想处理与数据库有关的问题。他们不想面对已经发展了 20 年的数据库模式。这太令人讨厌了。他们找到了替代方法,比如使用范畴理论和依赖类型。他们在自己周围筑起了一堵墙,生活在一个技术泡泡里,把自己与外部世界的邪恶隔离了起来。
我要在这里定义一个词。这个词大家都知道,我的定义只是众多定义中的一个。如果你喜欢,你也可以找到这个词的其他定义。这个词就是“专业”。我把它定义为"运用力量的纪律"。我们的工具和语言为我们提供了一些力量,但我们需要一种纪律来运用这些力量。这不仅仅是一种使用工具的纪律,更是一种社区纪律。这个纪律是这样的:它是一个强大的工具,而工具越是强大,杀人就越快,所以我们要小心使用它。另外,我们不会诋毁那些不太愿意使用我们工具的人。
我们不妨把“进步”重新定义为:“仅仅因为我们能做一件事,并不一定意味着我们必须去做那件事”。
所以,杀死 Haskell 的是它的狭隘和无法满足企业的需求。
Haskell 在某些受限的环境下表现出色,但它的力量很有限,或者说无法满足用户想要解决企业问题的愿望。这些人不愿意走到外面去,不愿意让自己踏进真正的土壤。他们表现出一种“对立”感,而站在另一边的人能够清楚地感觉到。这种狭隘主义就像是在屏幕上挂一个大横幅,上面写着“我按我的方式做事,你们自己玩去吧”。这就好比是在说:“在我们自己的天地里,我们很伟大,让其他人见鬼去吧”。
我想拯救 Rust 和社区的工作成果,避免它们遭遇同样的下场。坦白说,我不认为它会走上那条路。首先,我认为 Rust 社区更有活力、更强大,我相信不再存在 Haskell 的那种对立局面。那些“强大的 C++ 激素程序员”已经变温和了。每个人都在想:“或许有一些东西会让 Rust 变得不一样”。那么它们是什么呢?有什么能防止 Rust 重蹈 Haskell 的覆辙呢?
我想说三件事:
第一个是纪律。特别是在文档方面的纪律,这可不是件容易的事。写完代码,不要忘了那些该死的文档。大家都知道,写出好的文档,让其他人都可以轻松地使用你的程序是一件多么困难的事情。
如果在专业的基础上再加上谦逊,或许 Haskell 就不会死掉。对立的态度,以及我知道有一些有趣的广告,比如“Mac 对 PC”、“我是 Rails,我是 Java”之类的,我不认为这有什么害处,问题在于你是否把它们看得太重。除非你筑起高墙,或者,另一些人在另一面筑起高墙作为回应。
最后一件事就是去解决“肮脏”的问题。我们必须静下心来,说:“我们会处理的”。如果我们要生存下去,就必须想办法解决所有的问题。如果你不去解决,就会有其他人来解决。
记住这门在本世纪头十年最具影响力的编程语言的命运吧。它为纯函数编程开了一个头,对我们现在所做的事情影响很大,但它几乎要被遗忘了。而那些使用和喜爱它的人不得不为了生计转向了 Scala,它几乎要了他们的命。
Rust 非常强大,但要毁灭它也很容易,制造混乱、傲慢和忽视企业需求,这些都可能会杀了它。我希望我们不要重蹈覆辙。
英文原文:
https://gist.github.com/graninas/22ab535d2913311e47a742c70f1d2f2b