Node.js 纪录片心得
2024年4月1日
Node.js 的纪录片正式公开了
在前几天 Honeypot 制作的 Node.js 纪录片正式公开了。一如 Honeypot 过去做的各类技术纪录片,这个纪录片也是非常精彩,这边分享一些从中看到特别有感的地方。
Node.js 创作者 Ryan Dahl
Node.js 的创作者是 Ryan Dahl,他原本在纽约的罗彻斯特大学读数学博士班,专攻代数拓朴学。在读博班的过程中,虽然他觉得自己研究的领域很美,但是可应用性很低,他的指导教授会说“说不定某天,某个理论物理学家,会用到这个研究的成果”。于是想要做更有应用性成果的 Ryan 决定从博班休学,跑去南美洲旅游,然后一边接案写网站赚生活费。
在南美旅行时,Ryan 交了一个女友,他当时的女友要回德国的科隆完成硕士学位,于是 Ryan 决定搬去科隆跟女友一起生活。因为在科隆的生活费很便宜,那时 Ryan 有一段时间可以自由探索想做的事情,不用过于担心经济问题。
Ryan 说,很庆幸在二十出头岁时有那段时光,可以自由自在地思考程式相关的问题 (看到这段想到程式语言 Ruby 的创作者松本行弘,也曾说过类似的话。他说当年在开发 Ruby 时,工作上特别闲;当过于忙碌时,很难去创造新东西)。
实现非同步 I/O (async I/O)
当时偶尔接案写网站的 Ryan,常觉得网站速度,慢导致网站使用体验不好。在那时的时代背景下,I/O 操作都是同步操作,换句话说在一个操作完成前,会挡住其他操作进行。
于是 Ryan 就想,有没有可能变成非同步 I/O (async I/O),这样即使有一个很耗时的复杂运算,也不会挡住其他运算,让整体速度变快? 当时的时代背景刚好 Google Chrome 推出了全新的 JavaScript 引擎 V8;虽然 V8 是被设计来用在 Chrome 浏览器上,但 Ryan 在想 V8 也完全可以用在伺服器端,来实现非同步 I/O (假如有准备过 JavaScript 面试的人,读到这大概会想到经典面试题 Event Loop,没错,Node.js 就是透过 Event Loop 来实现这个想法的)。
第一版 Node.js
有这想法后,Ryan 开始实作,并在科隆完成了第一版的 Node.js。事实上,Ryan 会选择 JavaScript 来实作他的非同步 I/O 想法,不是因为他独爱 JavaScript,而是时代脉络下,JavaScript 是最适合的,这主要有几个原因,包含
- JavaScript 有广大的社群,因为基本上世界绝大多数的前端都是 JavaScript 写的
- 当时许多 JavaScript 引擎正相继推出,其中包含上面提到 Google 的 V8
- 当时 JavaScript 还没有太多历史包袱,Ryan 在尝试 JavaScript 前也试过用 Python、Lua 等不同语言来实现,但因为其他语言已有的模式,会让导入一个新的模式相对困难
Isaac Schlueter
其实那时候想把 JavaScript 带到伺服器端的不只有 Ryan Dahl,Isaac Schlueter 正是其中的一位,当年在 Yahoo 工作时,他觉得前端用 JavaScript 写,后端用 PHP 写,要常常转换思考方式很烦;同时他认为,JavaScript 是程式语言,为什么不能也在伺服器端写 JavaScript 呢?
那时 Isaac 试过不同的方式,也试过 Node.js 的最初版本,但觉得没看头;只是隔了段时间后,有朋友再次推坑 Isaac 试试 Node.js。再次试了后 Issac 觉得 Node.js 就是他心中的理想解决方案,于是也投入贡献 (对于新技术,真的推荐定时要回去试用,可能本来觉得不好用的,隔一阵子后会被优化地很好)。
如果你觉得 Isaac Schlueter 这名字很眼熟,你没看错,他就是后来开发出 npm 的人 (npm 是 node package manager 简称,是用来做 node 的套件依赖管理),现在全世界每个月有超过百亿个套件,是透过 npm 来下载。
Node.js 与 Joyent
Node.js 是个开源的专案,换句话说即使有很多人用,Ryan Dahl 也没有从中赚到钱。然而,要能让一个开源专案走的长远,需要有人长期持续的投入,需要有一个永续的商业模式。而当时有间叫 Joyent 的云端服务公司,决定赞助 Ryan 来开发 Node.js,让 Node.js 能被持续维护与更新。
在 Node.js. 越长越大后,Joyent 向 Ryan 提议买下 Node.js 的商标与管理权,借此来透过 Node.js 宣传自己的服务。这举动让 Node.js 的社群提出许多质疑;然而因为 Node.js 是 MIT 授权条款,所以虽然商标被 Joyen 。买下,但软体本身是开源的,这点让社群暂时被安抚下来。
在 Joyent 买下 Node.js 后,Node.js 迎来一个新的里程碑,那就是支援 Windows 作业系统。与多数的开源软体一样,因为 Windows 作业系统与 Linux 不同,所以要做到兼容 Windows,通常要额外心力。与此同时,如果能支援 Windows 系统,意味着能接触到广大的 Windows 使用者;而 Node.js 支援 Windows 也带来另一波极大量的使用人数增长。
随着 Node.js 支援 Windows,以及版本逐渐稳定后,有点燃烧殆尽的 Ryan 决定把 Node.js 交棒给 Issac。后来因为 Issac 要全心做 npm,所以 Joyent 找来自家员工 TJ Fontaine 当 Node.js 的负责人,在交棒到 TJ 手上后,Node.js 迎来一个大危机。
Node.js 的危机
当时因为社群许多贡献者,与 Joyent 对于 Node.js 的发展路径有不同想法,社群中开始酝酿一个 fork 的版本,而最终 io.js 这个 fork 的版本被推出,原本 Node.js 的贡献者,转向去贡献 io.js。
当时的冲突来自于,Joyent 从公司的角度认为 Node.js 是他们的资产,所以对于 Node.js 有管理权是有理有据的;然而从贡献者的角度,他们想要的是为社群贡献,而不是为 Joyent 这间公司做免费的工。
成立基金会
最后双方的和解,有赖于当时协调者的智慧,让 Joyent 意识到 Joyent 希望透过 Node.js 壮大,必不然需要对 Node.js 有掌控,让开源社群的力量协助推进,一样能达到 Joyent 期望的目标。于是后来 Node.js 成立基金会,让基金会的治理架构来负责 Node.js 的推进;而这也是社群贡献者期望的方向,所以后来把原本的 io.js 合并回 Node.js,让 Node.js 。持续被开发到今天。
看到这段想到近期 Redis 的事件,有非常相似的情境。同样是最初的创作者,因为对于项目本身投入到燃烧殆尽,于是把商标卖给营利企业,而后营利企业跟开源社群有冲突。遗憾的是 Redis 没能跟社群有良好一致的方向;从这点来看,很庆幸当初 Joyent 愿意放手让 Node.js 成立基金会,也让后续社群能持续共现在这个开源专案中。
回顾整个 Node.js 的纪录片,可以看到 Node.js 的成功,真的需要一整个社群的力量。虽然最开始 Ryan Dahl 起头很重要,但后续 Node.js 能发展到今天几乎全世界的网站都有其身影,社群中其他贡献者也不可或缺。