近期一个在 Hacker News 上引发热议的技术案例:Reco 公司利用 AI(Claude)在约七小时内将 JSONata 解析器从 JavaScript 重写为 Go,据称每年节省约 50 万美元成本。这一数字引发了广泛讨论,有人惊叹于 AI 编程能力的进步,也有人质疑这背后是否存在过度工程或营销成分。本文从工程实践角度,深入剖析这一案例的成本结构、技术方法与可复制性。

问题溯源:跨语言调用带来的隐性成本

要理解为何重写能够节省如此巨额的成本,首先需要看清原始架构的问题所在。JSONata 是一种声明式查询和转换语言,用于在 JSON 数据 payload 上执行复杂的查询和表达式求值。Reco 公司的核心业务涉及大量的安全事件检测规则,这些规则以 JSONata 表达式的形式存储和执行。

原始系统的架构设计存在一个根本性矛盾:Reco 的数据管道采用 Go 语言构建,而 JSONata 的官方参考实现是 JavaScript 版本。这种语言不匹配导致了极其低效的解决方案 —— 他们在 Kubernetes 集群中部署了大量 jsonata-js 的 Node.js Pod,通过 RPC 调用让 Go 服务远程执行这些表达式。每次事件处理都需要经历完整的序列化、网络传输、求值、结果序列化、返回的流程。据当事人透露,这一架构每年消耗约 30 万美元的计算成本,且随着客户数量和检测规则的增加而持续增长。

这意味着成本的核心来源并非 JSONata 表达式求值本身,而是跨语言、跨进程通信所带来的网络和序列化开销。将 JavaScript 实现直接替换为原生 Go 实现,本质上是将原本需要网络通信的 RPC 调用转变为进程内函数调用,这种架构优化带来的收益远大于单纯编程语言切换的性能提升。

AI 重写的技术路径:测试驱动的迁移策略

Reco 团队采用的方法并非直接让 AI 从零开始编写一个 JSONata 实现,而是采用了一种更为稳妥的策略:先获取官方 JSONata-JavaScript 版本的完整测试套件,将其移植到 Go 环境,然后逐个实现求值器功能单元,直到所有测试通过。这种方法与此前 Cloudflare 团队重写 Vinext 项目的方式如出一辙 —— 通过保留完整的测试覆盖来确保功能等价性。

具体执行层面,整个翻译过程耗时约 7 小时,消耗了约 400 美元的 Claude API 配额。最终产出一个约 1.3 万行的 Go 代码库,实现了与原版 JSONata 相同的功能。值得注意的是,重写后的实现不仅解决了性能问题,还修复了原版 JavaScript 实现中一些长期存在的 bug。此外,由于 Go 版本编译为 WASM 后可以在浏览器中运行,Reco 还获得了在客户端侧执行表达式的能力,这在安全检测场景中具有重要的应用价值。

从技术实现角度看,这种测试驱动的 AI 重写方法具有几个显著优势:测试套件提供了完整的功能规范,降低了 AI 理解需求的难度;逐个通过测试的过程相当于渐进式验证,每一步都有明确的里程碑;最终的代码虽然由 AI 生成,但通过已有测试的等价性验证,在功能层面具有较高的可信度。

成本效益的量化拆解

关于节省 50 万美元这一数字,需要进行更细致的拆解分析。根据 Hacker News 上相关讨论的估算,30 万美元的年计算成本大约对应 200 个 Kubernetes Pod 的规模。以 AWS EC2 c5.xlarge(4 vCPU)按需实例价格计算,每个实例每小时成本约 0.17 美元,200 个 Pod 24 小时运行一个月的成本恰好落在 2.5 万美元区间,与所述数据吻合。

然而,成本节省的实际构成可能比单纯计算计算资源更为复杂。首先是计算成本的直接削减:将 RPC 调用转为进程内调用后,消除了网络通信开销和额外的容器编排成本。其次是 latency 改善带来的间接收益 —— 在实时安全检测场景中,响应延迟的降低可能意味着更快的威胁阻断,这在安全产品中是重要的竞争力因素。第三是客户端 WASM 执行带来的架构简化,某些轻量级检测逻辑可以直接在浏览器端完成,减少了服务端压力。第四是 bug 修复带来的长期维护收益,原版 JavaScript 实现中的一些隐蔽缺陷被一次性解决。

不过,批评声音也指出了几个需要关注的隐性成本。维护成本首当其冲 —— 这个 1.3 万行的 Go 代码库现在需要团队自行维护,未来官方 JSONata 的功能更新都需要手动同步或借助 AI 工具进行迁移。此外,原始架构本身的设计缺陷也值得反思:一个每年消耗 30 万美元的基础设施问题为何能存在数年之久?这背后可能涉及技术债务积累、团队知识断层或优先级决策失误等深层原因。

适用边界与工程决策框架

这一案例虽然具有很强的示范效应,但并非所有项目都适合采用 AI 重写的方式来解决。判断是否应该使用 AI 进行代码迁移,需要从几个维度进行评估。

代码规模和复杂度是首要考量因素。JSONata 的参考实现约为 5.5k 到 10k 行 JavaScript 代码,这个规模对于 AI 来说是可以一次性处理的,但对于更大体量的代码库,分批迁移可能是更现实的选择。测试覆盖的完整性同样关键 ——Reco 的方法之所以可行,很大程度上依赖于官方提供了全面的测试套件,这些测试充当了功能规范的角色。对于缺乏充分测试的项目,在使用 AI 重写前,首先补齐测试覆盖率可能是更稳妥的步骤。

业务关键性程度决定了可接受的风险水平。对于核心业务逻辑,即使 AI 生成了通过测试的代码,也需要经验丰富的工程师进行深度代码审查,确保没有隐藏的边界情况或安全漏洞。长期维护需求也需要纳入考量 ——AI 重写产生的是一个代码分支,后续的 bug 修复和功能迭代都需要有明确的负责人和流程。

从工程实践的角度,以下场景比较适合考虑 AI 代码重写:存在明确的性能瓶颈且跨语言调用带来了显著开销;原项目缺乏活跃维护或存在技术债务;拥有完整的测试套件作为功能等价性的验证依据;团队具备审查和后续维护 AI 生成代码的能力。而以下场景则需要更加审慎:代码库规模过大且缺乏测试覆盖;涉及复杂的领域特定逻辑,需要深度业务理解;安全关键或生命关键系统,对代码正确性要求极高。

争议背后的行业思考

Hacker News 上的讨论反映出了更深层的行业焦虑。有人指出,这则案例本质上是一个经典的架构优化故事 —— 识别并消除不必要的 RPC 调用 —— 而非 AI 独有的魔法。已有评论者注意到,市面上其实已经存在两个独立的 JSONata Go 实现版本,团队选择自己重写而非直接采用现有方案,这一决策的合理性值得探讨。

另一个引发讨论的话题是 AI 生成代码的可维护性。1.3 万行代码由 AI 在 7 小时内生成,团队成员是否真正理解其中的每一个细节?未来的 bug 修复和功能迭代能否顺利进行?这些担忧不无道理,但在某种程度上也是新技术的常态 —— 任何代码,无论由人还是 AI 编写,都需要通过实际的工程实践来验证其可维护性。

值得注意的倒是这场讨论本身所揭示的行业心态变化。一位评论者提到 “每个重要的 AI 决策如今都像是一场赌注,赌的是通用人工智能最终会到来并清理一切混乱”。这种半开玩笑的表述背后,是技术从业者对 AI 编程能力快速进步的复杂感受 —— 既兴奋于可能性,也担忧于不确定性。

实践要点与参数建议

综合这一案例的经验,对于有意尝试类似 AI 代码重写项目的团队,以下是一些可供参考的实践参数。首先是重写预算的估算:以 JSONata 为例,7 小时、400 美元完成了约 10k 行代码的翻译,折合每千行代码约 40 美元成本和 0.7 小时工时。这个基准可以根据目标语言的复杂度、测试套件的完善程度进行调整。

测试迁移的推荐做法是先建立完整的测试环境,再进行代码生成。建议至少保留原项目 80% 以上的测试用例覆盖,确保核心功能路径得到验证。性能基准的建立也很重要 —— 在重写前后分别测量延迟和吞吐量,用具体数据而非主观感受来评估收益。

部署策略方面,建议采用渐进式切换而非一次性全量替换。可以先在非生产环境进行充分验证,再通过灰度发布的方式逐步将流量切换到新实现。同时保留原版实现作为回退方案,以便在发现问题时快速恢复。

对于维护阶段,建议建立季度性的 AI 辅助同步机制,利用 AI 工具将原项目的 bug 修复和功能更新迁移到自研版本中。这种方式的成本远低于一次性大规模重写,可以作为长期维护的可持续方案。


参考资料