使用AI编写10万行Rust代码的心得(2025)
摘要
一位开发者分享了使用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%以上**。
相似文章
@ryanlpeterman:关于用AI将整个代码库重写为Rust的思考,@charliermarsh(OpenAI 和 Astral)有趣的开放问题…
一条推文线程,总结了与 Charlie Marsh(Astral/OpenAI)的访谈,讨论了在AI辅助下将整个代码库重写为Rust所面临的挑战和开放问题。
用Rust构建了一个开放的可定制代理循环的Agentic AI系统(TigrimOSR)
宣布TigrimOSR,一个用Rust构建的开源Agentic AI系统,具有可定制的代理循环。
在同一个仓库中运行混合编码代理数月之久的经验教训
本文分享了在多个代码仓库中使用多种AI编码代理数月的经验教训,涵盖了对其有效性和挑战的见解。
我对Bun的Rust重写的看法
分析了Bun从Zig到Rust的争议性重写(使用AI生成的代码),引发了对合并的6,755个AI编写的提交未经人工审查以及AI翻译代码在生产环境中的风险的担忧。
我无法判断Bun将Zig重写为Rust的AI密集型工作究竟是未来,还是一个巨大的警告信号
Anthropic收购了Bun,并使用AI代理将其代码库从Zig重写为Rust,这是一个涉及约100万行代码的重大变更,通过了99.8%的测试,既引发了人们对AI在基础设施重写方面潜力的兴奋,也引发了对可审查性、不安全Rust以及隐藏bug的担忧。