阻塞 I/O 是服务器端编程最大的谎言
传统线程模型在等待磁盘和网络时浪费大量 CPU 时间;事件驱动的非阻塞 I/O 可以用单线程处理数万并发连接,Apache 的多线程模型注定无法扩展。
来源:Ryan Dahl, 'Node.js: The JavaScript Runtime Built on Chrome's V8 Engine', JSConf 2009
Loading Thinker Node
正在读取方法论、关键决策和影响关系。

Node.js 与 Deno 的创造者,异步 I/O 的布道者
Ryan Dahl 于 2009 年创造了 Node.js,将 Chrome V8 引擎带到服务器端并以事件循环和非阻塞 I/O 重新定义了服务器端编程。2018 年,他在 JSConf EU 发表了著名的「我为 Node.js 感到遗憾」演讲,列举了 callback hell、npm 权限模型、缺乏 TypeScript 等设计失误,随即发布了新运行时 Deno,以安全性和 TypeScript 原生支持为核心重新设计。他的两次创造都深刻影响了 JavaScript 生态的演化方向。
传统线程模型在等待磁盘和网络时浪费大量 CPU 时间;事件驱动的非阻塞 I/O 可以用单线程处理数万并发连接,Apache 的多线程模型注定无法扩展。
来源:Ryan Dahl, 'Node.js: The JavaScript Runtime Built on Chrome's V8 Engine', JSConf 2009
对自己创作的技术公开列举缺陷,需要巨大的勇气;但只有诚实面对设计失误,才能在下一个版本中做出真正的改进。Deno 的存在本质上是一封写给 Node.js 的情书与检讨书。
来源:Ryan Dahl, '10 Things I Regret About Node.js', JSConf EU 2018 (youtube.com/watch?v=M3BM9TB-8yA)
Node.js 的 npm 包默认可以访问文件系统、网络和环境变量,这是一个根本性设计错误。在 Deno 中,所有访问都需要显式授权——这是受浏览器沙箱启发的设计哲学。
来源:Ryan Dahl, '10 Things I Regret About Node.js', JSConf EU 2018 / Deno documentation, Security model, deno.land/manual/getting_started/permissions
Node.js 随着时间累积了大量与最初设计不符的特性;好的系统应该保持简单,复杂性一旦引入就很难清除。Deno 的设计目标之一是从一开始就拒绝不必要的复杂性。
来源:Ryan Dahl interview, Changelog podcast, 2020
把所有 I/O 操作视为「发出请求,注册回调,继续执行」的三步模式,而非「等待结果再继续」。
Node.js 的 http.createServer 只需几行代码就能处理数千并发连接,而传统 Apache+PHP 模型每个请求需要独立线程。
定期回顾自己创造的系统,列出哪些决策在当时看起来合理但事后证明是错误的。
Ryan Dahl 在 Node.js 10 周年时发表「十个遗憾」演讲,系统性地列举了 callback、npm、package.json、node_modules 等设计失误,每个问题都附上了当时的决策原因。
将浏览器中成熟的安全模型(沙箱、权限请求、模块系统)移植到服务器端运行时。
Deno 的权限系统(--allow-read, --allow-net)直接借鉴了浏览器对位置/摄像头/通知的权限请求模式;ES Modules 的使用也与浏览器保持一致,消除了 CommonJS 的碎片化。
Ryan Dahl 创造了 Node.js 并让其成为全球最广泛使用的服务器端运行时,但他也是公开批评 Node.js 设计缺陷最直接的人。他的批评并非嫌弃,而是对理想的坚持。
正因为 Node.js 成功了,Ryan 才有资本重新出发——Deno 若出自无名之辈则无人关注,但 Node.js 创造者的再创业让整个 JS 社区认真对待。成功是重新出发的背书,而非理由。
发明非阻塞 I/O 服务器运行时,颠覆服务器端编程范式
从一个对高并发 Web 服务器的深刻洞察出发,Ryan 将 V8 引擎和 libuv 结合,创造了 Node.js。JSConf 2009 的演讲是技术社区里少见的即时改变了行业方向的时刻。
离开 Node.js 核心开发,研究 Go 语言与系统编程,沉淀对设计错误的认知
Ryan 逐渐淡出 Node.js 核心团队,对自己早期决策进行反思。这段时期他研究了 Go 的并发模型和 Rust 的内存安全,这些影响后来体现在 Deno 的设计中。
以「修正版 Node.js」的姿态创造 Deno,将安全性和 TypeScript 作为一等公民
Deno 在发布后迅速获得技术社区关注,原生支持 TypeScript、内置测试工具和安全权限系统。2022 年 Deno 公司获得 2100 万美元融资,开始商业化探索。
背景:Ryan Dahl 在研究 Flickr 上传进度条的实现时,发现 Apache 服务器阻塞式 I/O 的根本局限——为了展示上传进度,需要开两个连接,本质上是一个被浪费的线程问题。
决策:将高并发 Web 服务器问题作为核心研究课题,探索事件驱动解决方案。
决策推理:现有的多线程 I/O 模型根本无法优雅地解决这类问题,需要范式转移。
结果:这一发现成为 Node.js 诞生的根本动力。
洞见:真正的创新往往来自对现有方案「为什么这么难」的追问。
背景:Ryan Dahl 将 Google Chrome 的 V8 JavaScript 引擎与异步 I/O 库 libuv 结合,创造了 Node.js,使 JavaScript 首次可以运行在服务器端且具备高并发能力。
决策:选择 JavaScript 而非 Ruby、Python 或 C 作为 Node.js 的语言。
决策推理:JavaScript 没有固化的 I/O 模型(不像服务器端语言),事件回调是其固有特性,V8 引擎性能出色。
结果:Node.js 开源发布,开始积累早期用户和贡献者。
洞见:选择没有历史包袱的语言,可以从零开始构建正确的抽象。
背景:Ryan Dahl 在柏林 JSConf 欧洲峰会首次公开演示 Node.js,展示了用少量 JavaScript 代码处理数千并发 HTTP 连接的能力,全场起立鼓掌。
决策:选择在 JSConf 而非学术会议发布,直接面向开发者社区。
决策推理:开发者社区的采用速度比学术认可更重要;JSConf 是最活跃的 JavaScript 社区聚集地。
结果:演讲视频在网络上迅速传播,Node.js GitHub stars 在数周内爆炸式增长,成为最受关注的开源项目之一。
洞见:面向正确的受众做第一次公开展示,可以产生远超预期的传播效应。
背景:Node.js 的包管理器 npm 正式发布 1.0 版,提供了集中式的包注册表和命令行工具,快速成为 JavaScript 生态系统的核心基础设施。
决策:采用集中式 package registry 模式,而非去中心化的包分发方式。
决策推理:集中式注册表降低了发布和发现的摩擦,有助于快速积累包生态。
结果:npm 成为史上最大的软件包注册表,但 node_modules 目录规模问题和安全漏洞也随之而来。
洞见:生态系统的快速增长会放大早期架构决策的缺陷。
背景:创建 Node.js 约三年后,Ryan Dahl 将项目控制权交给 Isaac Schlueter(npm 作者),自己退出核心开发。他在公开信中说项目已足够成熟,不再需要创始人的直接参与。
决策:主动放弃对 Node.js 的控制权,选择退出而非成为长期维护者。
决策推理:他对系统工程的兴趣大于对项目管理的兴趣;Isaac 对 npm 生态的深度了解更适合领导社区。
结果:Node.js 在社区治理下继续发展,Ryan 进入沉淀期,为后来的 Deno 积累了视角。
洞见:创造者不必成为永久守护者;知道何时离开是技术领导力的重要部分。
背景:Ryan Dahl 在 JSConf EU 发表了可能是 JavaScript 历史上最自省的技术演讲,系统列举了 Node.js 的十个设计失误:Promises 的抛弃、安全问题、构建系统、package.json/node_modules、index.js 惯例、没有扩展名的模块解析等。
决策:公开批评自己创造的技术,并在演讲结束时揭示正在开发 Deno。
决策推理:如果创造者本人不坦诚地承认设计失误,社区会为遗留问题辩护,永远不会产生真正的改进。
结果:演讲迅速成为 JavaScript 社区的历史性时刻,Deno 的公告引起了巨大关注,标志着服务器端 JS 进入「后 Node.js」时代的讨论。
洞见:技术透明度是建立长期信任的最有效方式;承认错误不会降低权威,反而会增强。
背景:Deno 1.0 正式发布,内置 TypeScript 支持、安全权限系统、ES Modules、标准库和内置测试工具。与 Node.js 不同,它不依赖 npm 而是直接从 URL 导入模块。
决策:使用 Rust 而非 C++ 重写运行时底层,以获得内存安全保证。
决策推理:Rust 的所有权模型可以在不引入垃圾回收的情况下保证内存安全,这对运行时性能至关重要。
结果:Deno 1.0 在发布当天登上 Hacker News 头版,获得 GitHub 数万 stars,成为当年最受关注的开源项目之一。
洞见:用户对「做对的事」的渴望比对「向后兼容」的需求更强烈,只要来自可信赖的创造者。
背景:Deno Land Inc. 完成 2100 万美元 A 轮融资,投资方包括 Threshold Capital Partners,标志 Deno 从开源项目转型为商业公司。
决策:以边缘计算(Deno Deploy)作为商业化切入点,而非对核心运行时收费。
决策推理:开源运行时的商业化应该通过云服务而非许可证来实现;Deno Deploy 提供了低延迟的边缘执行能力。
结果:Deno Deploy 进入商业化,与 Cloudflare Workers 和 Vercel Edge Functions 竞争边缘计算市场。
洞见:开源项目的商业化需要找到比「卖运行时」更可持续的模式。
Ryan Dahl 在多个访谈中提到 Unix 哲学对其设计思想的深刻影响,这本书是 Unix 设计哲学的经典阐述,直接影响了他对工具简洁性和「做好一件事」原则的坚持。
Ryan Dahl 在 JSConf EU 2018 演讲的语气和自省风格,与这本书倡导的「批判性评估自己工作」的程序员修炼精神高度一致;他在早期采访中提到过此书对其工程思维的影响。
JavaScript 作为 Node.js 的宿主语言,Brendan Eich 的设计(特别是事件驱动模型和回调函数)直接影响了 Node.js 的架构选择。
Unix「做一件事并做好」的哲学影响了 Ryan 对工具简洁性的追求;Deno 的设计体现了这一原则。
TJ Holowaychuk 是 Node.js 最多产的贡献者,创建了 Express.js、Koa 等框架,将 Ryan 的运行时基础变成完整的 Web 开发生态。
全球数千万 Node.js 开发者,以及整个 npm 生态(超过 200 万个包),都是在 Ryan 创造的基础上建立的。
libuv 的联合创建者,Node.js 跨平台异步 I/O 库的核心作者,与 Ryan 共同构建了 Node.js 的底层基础设施。
Ryan Dahl created Node.js, which single-handedly showed that JavaScript could be used for serious server-side development. His willingness to publicly admit the mistakes in his own creation — and then fix them with Deno — shows a rare intellectual honesty in the tech industry.