使用AI编写10万行Rust代码的心得(2025)

Hacker News Top 新闻

摘要

一位开发者分享了使用AI编程助手构建一个基于Rust的10万行多Paxos共识引擎的心得,实现了显著的生产力提升和性能改进。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/20 11:25

# 从10万行Rust与AI协作中获得的经验 来源:https://zfhuang99.github.io/rust/claude%20code/codex/contracts/spec-driven%20development/2025/12/01/rust-with-ai.html 过去几个月,我一直在极限测试AI编码代理在构建真实生产级分布式系统时能走多远。 结果:一个基于Rust的多Paxos共识引擎,它不仅实现了Azure复制状态库(RSL)[1 (https://github.com/Azure/RSL)]的所有功能——该库支撑着大多数主要Azure服务——还针对现代硬件进行了现代化改造。 整个项目耗时约3个月:约4周内编写了10万行Rust代码,然后约3周时间将性能从每秒23K次操作优化到每秒300K次操作。 除了前所未有的生产效率外,我还发现了几项关键技巧。本文分享了我最有价值的经验:如何使用代码契约确保正确性、应用轻量级规范驱动开发、以及进行激进的性能优化——外加我对AI辅助编码未来的愿望清单。 ## 为什么要现代化RSL? Azure的RSL实现了*多Paxos*共识协议,是许多Azure服务复制功能的基础。然而,RSL编写于十多年前。虽然健壮,但它未能跟上现代硬件和工作负载的步伐。 本项目源于三个关键差距: 1. **无流水线:** 当投票正在进行时,新请求必须等待,增加了延迟。 2. **不支持NVM:** 非易失性内存在Azure数据中心现已普及,它能大幅减少提交时间。 3. **硬件感知有限:** RSL并非为利用RDMA而设计,而RDMA在Azure数据中心已经无处不在。 消除这些限制可以显著降低延迟并提高吞吐量——这对现代云工作负载和AI驱动服务至关重要。 鉴于我对Rust和AI加速开发的兴趣,我决定从头构建一个现代的RSL等价实现。 ## 巨大的生产力提升 在大约六周内,我驱动AI并实现了超过13万行Rust代码,覆盖了RSL的完整功能集,包括多Paxos、领导者选举、日志复制、快照和配置变更。 我使用了多种可用的AI编码代理:GitHub Copilot、Claude Code、Codex、Augment Code、Kiro和Trae。我的工作流程演变迅速,但如今我的主要工具是**Claude Code**和**Codex CLI**,VS Code用于处理差异和小型编辑。 我发现从CLI编码创建了一个完美的异步工作流,最大化生产力。我还发现了一个简单的心理技巧: > 我每月支付100美元购买Anthropic的最高套餐。这成了一个强制因素——如果我不在睡前用Claude启动一个编码任务,就觉得在浪费钱。 当Codex CLI到来时,我增加了第二个ChatGPT Plus订阅以应对速率限制——一个订阅用于周一至周三,另一个用于周四至周日。 ## 代码契约——由AI编写,为AI服务 我经常被问到的问题是:*AI怎么可能正确实现像Paxos这样复杂的东西?* 测试是第一道防线。我的系统现在包含1300多个测试——从单元测试到最小集成测试(例如,仅提议者+接受者),再到带有注入故障的多副本完整集成测试。见项目状态 (https://zfhuang99.github.io/rust/claude%20code/codex/contracts/spec-driven%20development/2025/12/01/rust-with-ai.html#appendix-project-stats)。 但真正的突破来自AI驱动的**代码契约**。 代码契约为关键函数指定*前置条件*、*后置条件*和*不变量*。这些契约在测试期间转换为运行时断言,但在生产构建中可以禁用以提高性能。虽然我很早就在.NET [2 (https://learn.microsoft.com/en-us/dotnet/framework/debug-trace-profile/code-contracts)]中使用这种方法,但AI使契约变得更加强大。 以下是我在三个层面的应用方式: **1. 让AI编写契约。** Opus 4.1能写出好的契约,但GPT-5 High能写出优秀的契约。我专注于审查和完善。例如,`process_2a`方法(处理Paxos中的阶段2a消息)有**16个契约**,包括这个: **2. 从契约生成测试。** 一旦定义了契约,我让AI为每个后置条件创建针对性的测试用例。它非常擅长这一点,会自动生成有意义的边界情况。 **3. 基于属性的契约测试。** 这是我最喜欢的。AI将契约转化为基于属性的测试,探索大量随机输入的空间。任何契约违规都会触发panic,及早暴露深层错误。 例如,一个AI生成的契约发现了一个微妙的Paxos安全性违规: 那个单一契约避免了可能严重的复制一致性问题——远在生产环境之前。 ## 轻量级规范驱动开发 我尝试过各种规范驱动开发(SDD)工具。事实上,早期组件(如领导者选举、提议者、接受者和学习者)都是按照严格的SDD方法实现的。我会从需求markdown开始,将其转化为设计markdown,然后是任务列表markdown。但我逐渐发现这个过程过于僵化;在进行更改时确保所有文档保持一致变得令人头疼。 我现在改用更轻量级的方法。当处理一个功能(例如,快照)时,我使用`/specify`来自**spec kit**[3 (https://github.com/github/spec-kit)]生成一个规范markdown。这个规范包含几个用户故事和验收标准。 以下是快照的一个示例用户故事: 然后我使用`/clarify`让AI自我批评并改进用户故事和标准。我还让它建议初始规范中未涵盖的其他用户故事。我把大部分时间花在这里。 一旦满意,我进入**计划模式**,让AI为特定用户故事生成计划。鉴于当今AI编码代理的能力,单个用户故事感觉像是它们可以有效管理的“最佳点”工作量单位。在此过程中,我们可能会发现新增或调整,这可以在同一编码会话中轻松处理(代理可能会压缩上下文,但我通常不担心丢失太多)。 以下是配置变更的`/clarify`交互示例: ``` ● 问题 4:起始槽位确定 新配置的起始槽位应如何相对于结束槽位确定? 推荐:选项 A - 始终为 ending_slot + 1 这确保了槽位序列中无间隙,并保持配置之间的连续性,防止任何槽位被孤立或未分配。 | 选项 | 描述 | |------|--------------------------------------------------------| | A | 始终精确地为 ending_slot + 1 | | B | 允许操作符指定任何大于 ending_slot 的值 | | C | ending_slot 之后的 1000 的下一个倍数,以获得更清晰的边界 | | D | 与 ending_slot 相同(两个配置共享最终槽位) | 你可以回复选项字母(例如“A”),通过说“yes”或“recommended”接受推荐,或提供你自己的简短回答。 ``` ## 激进的性能优化 性能优化是AI真正大放异彩的地方。在确保初始正确性之后,我花了大约三周时间专门进行吞吐量调优——AI成了我性能工程中的副驾驶。 通过迭代循环,我们在单台笔记本电脑上将吞吐量从约23K ops/sec提升到了约300K ops/sec。以下是我反复执行的循环: 1. 让AI在所有代码路径上插入延迟指标。 2. 运行性能测试并输出跟踪日志。 3. 让AI分析延迟分解(它会编写Python脚本计算分位数并识别瓶颈)。 4. 让AI提出优化方案,实现一个,重新测量,然后重复。 这个过程揭示了我可能忽略的见解——例如,异步路径上的锁争用、冗余的内存复制以及不必要的任务生成。 Rust的安全模型使得我们能够放心地进行这些优化。关键收益来自于最小化分配、应用零拷贝技术、避免锁以及有选择地移除异步开销。每一次改进都像是从高性能引擎上剥离一层延迟——而无需担心内存损坏。 ## AI辅助编码的愿望清单 回顾我的旅程,我一直在想AI还能在哪些方面提供更多价值。以下是我愿望清单上的一些项目: **端到端用户故事执行:** 我仍然更喜欢自己定义用户故事。作为架构师,我觉得我对构建什么以及如何构建有更好的感觉。然而,完美执行的能力我认为AI可以越来越擅长。目前,我仍然需要花费相当多的时间来引导AI——告诉它在暂停时继续、建议重构、审查测试覆盖率以及建议额外的测试。我希望AI能承担更多自主权来驱动这个端到端过程。 **自动化契约工作流:** 应用契约的流程似乎大部分可以自动化。虽然我仍然希望审查契约并提供建议,但我希望AI能推动其余部分:基于契约生成测试、调试单个测试用例、确保测试与契约之间的一致性,以及编写基于属性的测试。当测试失败时,我希望AI能自动调试并修复琐碎问题,只有在契约或实现中出现真正的正确性问题时才通知我。 **自主性能优化:** 性能调优似乎已经准备好实现更多自动化。我做过的大部分工作是重复性的且可并行化的。像AlphaEvolve(或OpenEvolve)这样的项目显示了这方面的前景。理想情况下,我会建议可能的优化方向,而AI完全自行执行实验。虽然当前工具处理小的代码库,但将类似技术应用于更大的代码库并结合端到端测量似乎是可行的。 ## 附录:项目状态 该项目的种子是由微软研究院的Jay Lorch [4 (https://jaylorch.net/)]编写的优雅设计markdown。这个设计极大地简化了多Paxos中的所有组件,使其更易于实现和推理。 到目前为止,RSL的3个限制中已有2个得到解决:流水线和NVM支持(Jay集成了经过完全验证的NVM持久化日志,该日志发表在`PoWER Never Corrupts`论文 [5 (https://www.usenix.org/conference/osdi25/presentation/leblanc)] 中,发表于OSDI 2025)。RDMA支持仍待定。 迄今为止,该项目已增长到超过**13万行Rust代码**,拥有**1300多个测试**,占代码库的**65%以上**。

相似文章

我对Bun的Rust重写的看法

Lobsters Hottest

分析了Bun从Zig到Rust的争议性重写(使用AI生成的代码),引发了对合并的6,755个AI编写的提交未经人工审查以及AI翻译代码在生产环境中的风险的担忧。