Go 很快、很美、好迭代,为什么 Vercel 还是改成了 Rust?CEO 说:计算公式变了

Go 很快、很美、好迭代,为什么 Vercel 还是改成了 Rust?CEO 说:计算公式变了

💡 原文中文,约8600字,阅读约需21分钟。
📝

内容提要

Vercel CEO Rauch 透露,Turborepo 已从 Go 迁移到 Rust,但内部对投资回报率存在争议。2023 年因 Go 与构建系统需求不匹配而启动迁移,采用增量移植策略,通过 JSON 传参解决 FFI 问题,并在 Windows 和 Alpine 平台上遇到问题。Rauch 认为在 AI Agent 时代,“对人类最好”不再等同于“对业务最好”,迁移成本的计算方式已经改变,Rust 也未必是终点。

🔎

延伸解读

迁移决策的权衡:技术优势与人力成本

Vercel 将 Turborepo 从 Go 迁移到 Rust,核心矛盾在于技术优势与人力成本的权衡。Rust 在底层 OS 交互和编译期正确性上更符合构建系统需求,但迁移需要大量人力投入,导致内部对 ROI 存在争议。这提醒团队,技术选型不能只看语言特性,还需评估迁移对开发效率和业务交付的实际影响。

增量移植策略:降低风险与保持交付

Vercel 采用增量移植而非完全重写,通过先实现新功能(global turbo)打通 Rust 工具链,再逐步迁移模块。这种策略允许新旧代码共存,确保迁移期间持续交付功能,但代价是引入互操作复杂度。对于大型项目,增量移植能平衡风险与进度,但需配套严格的测试来保证行为一致。

跨平台发布的挑战:细节决定成败

迁移过程中,Windows 的 MinGW/MSVC 工具链差异、UNC 路径问题,以及 Alpine Linux 上 glibc 与 musl 的兼容性,都成为棘手障碍。最终通过将 Go 和 Rust 拆分为两个二进制、以 JSON 传参解决。这表明跨平台发布工程极其复杂,语言迁移不仅要考虑代码本身,还需应对底层系统差异带来的调试成本。

AI Agent 时代:迁移成本计算方式的变化

Rauch 指出,在 AI Agent 参与编码后,“对人类最好”不再必然等于“对业务最好”。Agent 擅长重复性迁移工作,可能降低人力成本,而 Rust 的编译期约束对 Agent 反而是护栏。但这不意味着迁移成本为零,跨平台调试等难题仍需人类解决。未来语言选型可能更注重机器可读性与验证效率,而非单纯的人类工效学。

❓

Q&A

Turborepo 为什么从 Go 迁移到 Rust?

因为 Go 的设计优先级与 Turborepo 的需求错位:Go 擅长数据中心网络计算,偏好简洁而非表达力,错误常留到运行时;而 Turborepo 是装在用户机器上的构建系统,需要精细的底层 OS 交互和编译期正确性。此外,CGO 的全局代价和 Turbopack 团队已在用 Rust 也是推动因素。

Turborepo 从 Go 迁移到 Rust 采用了什么策略?

采用增量移植策略,而非完全重写。先用 Rust 写一个全新小功能(global turbo)打通工具链,再逐步迁移 CLI 解析等模块。新旧代码同时运行,要求被移植部分行为与之前完全一致,只做翻译,不做改进。

迁移过程中遇到了哪些跨平台问题?如何解决?

遇到 Windows 工具链不一致(MSVC vs MinGW)和 UNC 路径问题,通过切换 Rust 工具链到 MinGW 和使用 dunce crate 解决;Alpine Linux 上因 glibc 和 musl 问题,最终将 Go 和 Rust 编译成两个独立二进制,通过 JSON 传参通信。

Vercel CEO 为什么说迁移的 ROI 有争议?

Rauch 认为虽然 Rust 技术上更适合,但人类写代码的迁移成本非常高。在 AI Agent 时代,'对人类最好'不再必然等于'对业务最好',迁移成本的计算方式已经改变,因此 ROI 存在争议。

AI Agent 如何改变语言迁移的成本计算?

AI Agent 擅长重复性工作,如逐模块翻译、对照行为、补测试,这降低了人类迁移成本。语言的'人体工学'权重下降,Rust 的编译期约束对 Agent 可能是天然护栏。'新语言'的评判标准可能按 Agent 需求重新设计。

Vercel 从迁移中总结了哪些经验?

四条经验:序列化是 FFI 的好朋友,用 JSON 可最小化接触面;移植需要充分准备,提前写好测试作为规格说明;跨兼容性很难,跨平台发布工程极具挑战;尽管遇到棘手问题,迁移期间仍能持续交付,当时认为值得。

🏷️

标签

➡️

继续阅读