Erlang 之父 Joe Armstrong 逝世,如何评价他在计算机领域的贡献?

我的回答

我只是一个半路出家的程序员,可能没有能力评价Joe老爷子在计算机领域的贡献,不过可以从自己的角度出发讲讲Erlang究竟带给了我什么。

在大二的时候我被模拟电路、数字电路、信号与系统、通信原理、数字信号处理……这一大堆专业课程折磨得要死要活,自己对它们一点也不感兴趣,产生了“叛逃”的念头。那个时候学校的ACM/ICPC集训队正好在面向全校举办讲座,过去听了几场而且跟着练了一阵子的题,发现原来写代码的感觉是如此地酸爽。虽然没有继续加入校队跟神牛们一起搞竞赛,但是后面的几年时间学习之余我都一直“不务正业”去各种OJ刷题。当时其实并不知道将来能做什么,隐隐约约觉得以后可能会写代码吧,但具体是个什么目标我也说不上来,整个人活得就像个梦虫儿一样。

到了毕业季才发现自己的菜,除了会刷几道简单或者中等的算法题以外,别的什么都不会。不懂什么是进程线程,不懂什么是网络编程,不懂数据库的基本使用……我都怀疑自己是不是选错了路自己压根就不适合。这些问题其实很基础并不难搞懂,当初自己为什么这么菜确实是不可思议,但是对于一个半路出家而且技能树点偏的人来说,它确确实实就这么发生了。最后一家眼瞎公司收了我,公司的手游服务器是用Erlang来写的。于是一边学Erlang一边码业务,我慢慢开启了程序员的入门之旅。

Erlang在一开始给我的印象是“自然”。什么是进程什么是线程?不管,反正我先spawn出来一个东西,它能够执行你写的一个函数,你可以给它发消息它可以给你发消息。然后你可以不停地spawn一大堆的东西它们之间靠着消息传递相互协作最后完成任务。这就是我这种菜鸟一开始的认识,虽然很浅显,但是完全无障碍而且很自然。好像你什么都不需要做,自然而然就会写并发程序了,代码是有些烂,但是上线以后你发现它竟然就神奇的支撑起了单机七八千的玩家在线。总之我还是不懂什么是并发编程,但是以Erlang这个点为突破口,后面再去了解什么是Actor,什么是CSP,怎么fork怎么new thread,怎么做互斥同步,就发觉不像上学时候那么懵逼了。再到后面我学会了很多写并发的套路,但还是觉得Erlang写起来最自然。

Erlang接下来给我灌输的观念是“容错”。在接触Erlang以前,我也尝试着思考过代码出错该怎么办,然而越想越发现这是个极其复杂的问题。我该返回错误码还是抛异常呢,即使返回了错误,我的调用者又该怎么处理呢?甚至更可恶的是还有一些错误压根就不在你的掌控范围以内,那么它们发生了又该怎么办呢?而我从Erlang学到的并不只是表面上的”let it crash”,而是你在设计任何系统的时候都要考虑以什么样的方式监控每一个子系统,它们出问题的时候又应该以什么样的策略重启。而我一开始纠结的那些问题并不是真正的核心,当你有心里对系统的容错有具体地方案以后,你就很容易知道在哪些地方应该做检查哪些地方不应该,哪些地方应该抛出异常哪些地方不应该。

Erlang然后也将我引进了“FP”的大门。一开始写Erlang的时候是很别扭的:凭什么不能让我修改一个变量的值?连循环都没有你让我怎么写代码?不过写得多了也就慢慢习惯了,觉得本来不就该如此吗?其实Erlang里面真正的函数式特性并不算多,不过顺着这个藤再摸后面的瓜就容易多了。学Erlang以前我也看Haskell,看不懂,学了以后再去看,至少能看懂那么一点点了。 一晃工作了四五年,项目也做了四五个,工作之余也会挑一部分源码来读,在这个过程中越来越觉得Erlang就是一个取之不尽用之不竭的大宝库。也看过一些比较出名的项目比如Nginx和Redis之类,发现还是Erlang的源码难啃啊,毕竟说Erlang是个微型操作系统也不为过。

现在已经不写Erlang了。后面我接触过不少概念:Golang、区块链、微服务、docker、k8s……发现想要上手它们其实并不难,而且能够很自然地找到具体的路径,不像刚毕业时那种懵逼状态了。我想我这个半路出家的程序员应该算是真正入门了吧,而这个过程是在Erlang的陪伴下完成的。

感谢Joe老爷子创造了Erlang。