几天前突然得知 Erlang 之父 Joe Armstrong 因病过世的消息,感觉这对于计算机领域真是一个巨大的遗憾和损失,不禁对老先生的过世唏嘘不已。

不经得回想起自己与 Erlang 这门编程语言的缘分。5 年前,机缘巧合加入一家创业公司,公司很「激进」地采用了 Erlang 来作为主要技术栈去做一个基于 MQTT 的实时系统。刚进入公司,由于我没做过后端开发领域,且自己熟悉的主力编程语言是 C 和 C++,所以第一眼看到 Erlang 感觉这是一门及其诡异的编程语言:

  • 编程语言居然可以内置进程这种概念

  • 变量居然只能定义一次,后续想用新的变量只能重新创建

  • 模式匹配是什么鬼 ?TCP 的解包动作居然只需要一行代码

  • 函数式编程是什么 ?

种种不一样的理念冲撞着我,让我感觉自己在这个领域相当无知。

记得当时买了 Joe Armstrong 的 《Erlang 程序设计》,这真是一本难得一见的好书。抛开 Erlang 编程语言不说,这本书本质上是借 Erlang 为载体去讲述作者对设计高可用高并发系统的真知灼见。有很多人说 Erlang 很难学,其实不然。Erlang 的主要语法点只有薄薄的两章书,我花了一个周末在学校图书馆读完之后敲了几行代码就初窥门道,后续看项目的代码也没太大障碍。在通读这本书之后,我觉得 Erlang 最引以为傲的应该是:

  • 基于函数式编程的简洁语法

    比如你用 Erlang 进行 TCP 解包动作,只需要:

    1
    2
    3
    
    <<4:4, 5:4, ToS:8, ToL:16, Id:16,
     Flags:3, FlagOffset:13, TTL:8, 6:8, 
     Checksum:16, SrcIP:32, DstIP:32, Payload/binary>> = X.
    

    基于递归和模式匹配,还可以 3 行实现快速排序:

    1
    2
    3
    4
    5
    
    qsort([]) -> [];
    qsort([Pivot|T]) ->
        qsort([X || X <- T, X < Pivot])
        ++ [Pivot] ++
        qsort([X || X <- T, X >= Pivot]).
    

    在同等代码行数下,Erlang 的抽象程度是 C/C++ 这一类面向过程的系统编程语言所很难比拟的;

  • 优雅的基于 Actor 的并发模型

    我一直觉得 Actor 模型才是并发应有的样子,最贴近人类直觉的一种方式。最近一年一直在用 Go,花了好长一段时间去适应 Go 基于 Channel 的 CSP 通信模型,仍然觉得来得没有 Erlang 的优雅。

    在 Erlang 中,每一个进程都有自己的 Pid(类似于操作系统的进程)和 Mailbox,当我们想向进程 A 发送一条消息的时候,只需要:

    1
    
    Pid ! hello
    

    这样我们就把 atom 类型的 hello 发送给了 Pid 所代表的进程,这个模型其实就跟平时我们在 Linux 下用 kill 发送对应信号到指定进程是一致的。

  • 强大的 OTP 范式

    既然抽象出了 Erlang 进程,那必然就要有一定的手段去进行控制,这样便引入了 OTP 模型。有了 OTP 模型,Erlang 可以说是得天独厚地适应于服务端编程。比如 OTP 定义了一般服务端编程的通用的 gen_server 范式和 supervisor。这样一来,当你想要设计后端程序时,先设计 gen_server,然后根据 gen_server 之间的关系去组织成 supervisor 模型。Erlang 是运行在虚拟机之上的编程语言,虚拟机内部运行了很多 Erlang 进程,当一个 Erlang 进程挂掉之后,该进程的 supervisor 会负责将其重启恢复正常。这样,Erlang 的 Let it crash 哲学就很有意思了:对于大多数应用,出现问题就让它崩溃重启就行了。基于这个思路,Joe Armstrong 用 Erlang/OTP 构建出了极其高可用的电信系统。

当我学习了 Erlang 之后,很有兴致地写了不少 Erlang 代码,虽然都不成气候,但都在我技术成长的道路上开拓了不少眼界。后面看到 Go 的时候,觉得 Go 的很多特性其实都很平庸,许多看似很神奇的东西其实在其他编程语言就被玩了很长时间(比如 Erlang 在 20 年前就内置进程)。可惜的是,Erlang 没有一个像 Google 这么好的爹,Erlang 在很长时间就是一门小众的语言,关于这点论述可以参考我很早的一个知乎回答,Erlang 的生态一直没有很好的建设起来。最近几年,关于 Erlang 最成功的案例当属被 facebook 收购的 WhatsApp,一间只有 19 个人的团队用 Erlang/OTP 打造出了一款极其稳定的世界范围使用的亿级产品。

虽然 Erlang 不流行,学习 Erlang 并不一定能给你带来直接的物质收益,但是我觉 Erlang 的思想值得每一个程序员去欣赏。

感谢 Joe Armstrong,用他卓越的思维创造了 Erlang,从而让我们可以用 Erlang 的视角去看到一个不一样但极其有趣的世界。老爷子虽已仙去,留下的精神遗产却能穿越时空,薪火相传,RIP。