对于大多数工程团队而言,「不要用自己不熟悉的语言重写核心服务」几乎是一条默认准则。但一名长期使用 TypeScript 的开发者,借助 Claude Code 完成了一个生产级 Rust 服务的落地:一个用于接收 webhook 的网关,在高峰期可处理约 1,100 requests/sec。他没有职业 Rust 开发经验,却把原有 Node.js 服务的 p99 latency 从 340ms 降至 14ms,内存占用也从约 800MB 降到 38MB。更关键的是,这次尝试并不是一次玩具项目,而是被纳入了真实生产环境和 on-call 轮值体系。
不是让 AI 重写,而是把任务拆到可验证的粒度
最初的 Node.js 网关基于 Node 22.x 和 Fastify,职责并不复杂:验证 HMAC 签名、标准化来自十余个外部提供商的 payload,再把数据推入队列。问题出在 CPU。大约 800 req/sec 时,p99 latency 就超过 300ms,HMAC 验证加上部分 2MB JSON payload 的解析,直接压住了事件循环。团队不得不部署 6 个副本,而这个服务在纸面上原本只需要 1 个。
作者并没有直接给 Claude Code 输入「把这个服务用 Rust 重写」这类模糊指令,而是先写了一份一页的英文设计文档:HTTP 层使用 axum,异步运行时使用 tokio,HTTP handler 和 queue publisher 之间只保留一个 bounded channel,遇到背压时直接拒绝请求而不是缓存。之后,他把任务按模块拆开逐个交给 agent。
- 先给设计约束,再给参考行为,避免模型自由发挥
- 用已有 TypeScript 代码作为行为基准,让 Rust 版本做「翻译」而不是「发明」
- 对关键安全逻辑提出明确要求,例如 constant-time comparison、缺少签名头时在 body parsing 前拒绝请求
在 HMAC 验证这个模块里,Claude Code 根据 TypeScript 参考实现生成了 Rust 版本,并发现旧代码中的一个隐藏问题:Node 的 timingSafeEqual 在 buffer 长度不一致时会抛错,导致畸形 header 会触发 500 而不是 401。Rust 版本显式处理了长度不匹配、非法 hex 等边界情况,把错误响应归入更合理的 401。
Rust 编译器成了 AI 代码的自动质检员
在这次实践中,Rust 的编译机制意外地成了 AI 生成代码的一道护栏。在 TypeScript 里,AI 写出的错误代码可能顺利通过编译,测试也未必能拦住,最后在生产环境爆发;而在 Rust 中,很多 agent 容易犯的错误——例如 use-after-move、共享状态中的数据竞争、遗漏错误路径——会直接变成编译错误。
这就形成了一个可循环的工作流:agent 写代码,运行 cargo check 和 clippy,读取报错,再自动修复。作者举了一个例子:agent 最初写的 queue publisher 在多个任务间共享连接,导致类型无法满足 Send 要求。如果是在 Node 中,这类问题可能表现为难以排查的竞态;而在 Rust 中,它被编译器直接拦截,agent 经过两轮迭代后,按照既定设计把 producer 包进 channel 结构中,问题消失。
最难的不是写代码,而是「没人能 review」
项目推进到第二周时,作者遇到了真正的心理关口。Claude Code 生成了一段包含 Pin、手动 Future 实现和复杂生命周期标注的 retry 模块。代码能编译,测试也通过,但他意识到:如果合并这段代码,公司里没有人能真正审查它。
对于需要半夜被人叫醒处理故障的生产系统来说,这是不可接受的。为此,团队定下三条规则:
- 凡是工程师无法清楚解释其行为的代码,一律不合并
- 优先选择简单、可读、可维护的实现,而不是炫技式的高级写法
- 把人工审查重点放在架构、边界条件和运行瓶颈上,而不是逐行盯语法细节
这意味着,AI 可以承担大量翻译、生成、修错、补测试的工作,但工程师仍然要对系统取舍负责。哪些路径必须保守,哪些抽象值得引入,哪些性能收益不足以抵消维护成本,这些判断仍然属于人。
灰度发布与对照验证:把不确定性压到最低
在正式上线前,团队把 Rust 网关以 canary 方式接入 5% 的真实流量,同时用 shadow mode 镜像 100% 流量,并把输出结果与 Node 服务逐条比对。用于比对的 diff harness 也由 agent 生成,但使用 TypeScript 编写,因为这是作者最熟悉、能够完整审查的语言。
这次对照发现了一次真实差异:某个外部提供商会发送未签名的测试 ping,Node 版本会接受,Rust 版本则按安全规则拒绝。最终,团队把它认定为 bug fix,而不是回归。三周后,服务完成全量切换。在相同硬件等级下,新服务把 p99 latency 从 340ms 降到 14ms,内存占用从约 800MB 降到 38MB。
这次经验说明,AI 编程助手正在改变跨语言开发的成本结构。它可以让工程师在不熟悉目标语言的情况下,更快搭建脚手架、修复编译错误、补齐测试并验证性能;但同时,它也把另一件事推到了台前:当代码生成变得更容易,团队对可审查性、可维护性和工程责任的要求反而更高。
原创文章,作者:点点,如若转载,请注明出处:https://www.dian8dian.com/typescript-gong-cheng-shi-yong-claude-code-jiao-fu-sheng