
编者按:Erlang 编程语言联合创始人乔·阿姆斯特朗(Joe Armstrong)于 2019 年 4 月去世。本文基于其生前论文、演讲、采访及共事者记述重构,采用第一人称视角还原其技术思考历程。除直接引用外,其余内容为叙事性重构。
斯德哥尔摩,2014 年 2 月
消息通过手机屏幕传来:Facebook 以 190 亿美元收购 WhatsApp。作为一名关注 Bug 而非并购的工程师,这条新闻令我驻足。WhatsApp 拥有约 4.5 亿月活用户,日均处理数百亿条消息,而其工程团队仅约 50 人。这意味着每位工程师需对约 1000 万用户负责。支撑这一奇迹的,正是我们在 1986 年为防止电话掉线而开发的编程语言——Erlang。
彼时我 63 岁。大半辈子以来,Erlang 被视为怪异、学术且小众。但那天早上,这门“最奇特的语言”承载的人类对话量已超越历史上任何软件。这是一种无需我参与的最佳成功。
物理学家走进电话公司
我出生于 1950 年的英国,受训为物理学家而非程序员。物理学教会我谦逊:宇宙不在乎理论是否优雅,事物终将损坏。1985 年,我加入位于斯德哥尔摩郊外的爱立信计算机科学实验室。当时,爱立信面临一个难题:电话交换机软件必须完美无缺,但现有开发流程耗时漫长且无法保证质量。
电话交换机需同时处理数千个独立呼叫,硬件故障不可避免,但系统绝不能停止运行——否则可能危及生命。这种确定性规则在电信业不可协商。比亚恩·达克(Bjarne Däcker)的团队曾测试 Lisp、Prolog 等二十多种语言,均不适用。于是,迈克·威廉姆斯(Mike Williams)、罗伯特·弗丁(Robert Virding)和我决定自研语言。
1986 年,我用 Prolog 编写了首个版本解释器,确立了“一切皆进程”的架构:成千上万个微小隔离进程互不共享内存,仅通过消息通信。若某进程死亡,不影响其他部分。迈克随后用 C 语言编写了名为 JAM(Joe's Abstract Machine)的虚拟机以提升性能。我们将语言命名为 Erlang,既致敬电话排队论奠基人艾格纳·克拉鲁普·厄朗,也暗含“Ericsson Language”之意。
热代码加载与“九个九”
1990 年,爱立信制作了一部名为《Erlang: The Movie》的宣传短片。片中展示了 Erlang 的核心特性:热代码加载。系统可同时持有新旧两个版本的代码,新呼叫转向新版本,旧进程结束后旧代码悄然消失,全程通话不中断。这一技术在三十多年后仍鲜有语言能完美实现。
90 年代初,Erlang 走出实验室。1995 年,爱立信新一代交换机 AXE-N 项目失败,公司转而采用 Erlang 开发宽带交换机 AXD301。1996 年,团队构建了开放电信平台(OTP),封装了包括“监督者(supervisors)”在内的容错组件。监督者的唯一职责是监视进程并在其死亡时重启。
AXD301 包含超过 200 万行 Erlang 代码,实现了“九个九”(99.9999999%)的可用性,即年停机时间仅约 31 毫秒。尽管该数据特定于当时网络环境,但在电信行业,不崩溃即是最高赞誉。
被禁用的语言与开源突围
1998 年,就在 AXD301 证明 Erlang 价值之际,爱立信无线系统部门发布备忘录,禁止在新产品中使用 Erlang。理由并非技术缺陷,而是出于商业考量:C++ 和 Java 人才易得,便于外包;而 Erlang 开发者全球仅数百人。为了降低“意外”风险,大公司选择了平庸的标准。
同年 12 月,爱立信将 Erlang 和 OTP 开源。我和部分同事创立了 Bluetail 公司,利用 Erlang 构建互联网基础设施。Bluetail 两年后以约 1.4 亿美元出售,随后在互联网泡沫破裂中解散。这段经历让我意识到,“意外”将成为互联网商业的核心,而大企业往往对此准备不足。
五十岁失业与博士论文
2001 年失业后,我重返校园,于 2003 年完成博士论文《在软件错误存在的情况下构建可靠的分布式系统》。核心观点直指痛点:程序永远存在 Bug。防御性编程试图预判所有失败,但真正的可靠性应允许进程在遇到未知错误时立即崩溃,由监督者重启干净副本。这与硬件故障后重启的逻辑一致,赋予软件同样的“尊严”。
我也因此留下了关于面向对象编程的著名批评:“你想要一根香蕉,却得到了一只拿着香蕉的大猩猩,以及整片丛林。”Erlang 的隔离进程避免了对象间复杂的隐式依赖,后来我才意识到,这恰恰符合艾伦·凯(Alan Kay)对纯粹面向对象系统的定义。
WhatsApp 的无声胜利
2009 年,WhatsApp 创始人扬·库姆(Jan Koum)在 ejabberd(一款基于 Erlang 的开源聊天服务器)邮件列表中提问。他们选择 Erlang 是因为其能在糟糕的网络环境下可靠传递消息。我在其中未扮演任何角色,但 WhatsApp 的本质就是一个全球规模的电话交换机:数百万并发连接,运行在不可靠硬件上,且需持续升级。
2011 年,WhatsApp 在单台服务器上维持百万级并发。工程师里克·里德(Rick Reed)团队通过优化锁争用,将单机并发连接数提升至 200 万,峰值甚至达到 280 万。2012 年跨年夜,WhatsApp 单日传输 180 亿条消息,服务器平稳运行。讽刺的是,Facebook 曾在 2008 年基于 ejabberd 开发聊天功能,后因缺乏 Erlang 人才改用 C++ 重写。六年后,Facebook 以 190 亿美元收购了坚持使用 Erlang 的 WhatsApp。
语言的孩子们
Erlang 开源后,衍生出新的生态。2012 年,何塞·瓦林(José Valim)创建了 Elixir,它在 BEAM 虚拟机上运行,保留了 OTP 优势,但提供了更现代的语法。Discord 等公司基于 Elixir 构建了支持千万级用户的实时系统。2016 年,路易斯·皮尔德(Louis Pilfold)构建了 Gleam,引入了严格的编译时类型系统。
并非所有故事都圆满。基于 Erlang 的分布式数据库 Riak 背后公司 Basho 于 2017 年破产,代码被博彩公司 Bet365 收购并继续维护。软件比公司更长寿,这在强调“允许崩溃”的语言哲学中显得尤为恰当。
后记
乔·阿姆斯特朗于 2019 年 4 月 20 日去世,享年 68 岁。他的理念通过 Elixir、WhatsApp 及 Actor 框架继续影响世界。RabbitMQ 至今仍承载着全球企业流量;Discord 成为 AI 产品发布的重要平台,其图像请求流经源自 Erlang 思想的 Elixir 进程。Meta 为 Erlang 开发了类型检查器 eqWAlizer,并用 Rust 替换部分 C++ 代码,保留 Erlang 作为协调者。Gleam 于 2024 年发布 1.0 版本,Elixir 社区也开始在 GPU 上运行机器学习管道。那部戴着耳机的《Erlang: The Movie》仍在 YouTube 上,而电话呼叫,依旧保持连接。