重构的经济效益
在适应新的代理工程世界的过程中,我构建了一个应用程序来支持我的工作。它是一个复杂的应用程序:高质量的网络 UI,具有动态刷新和查询、模态框和自动保存、与外部系统的集成、机器学习和文本分析、后台任务,以及一个适当的环境设置和完全自动化的部署。它大约有150,000行代码,主要用Rust编写(约120 kLoC),其余部分使用TypeScript和Terraform。这完全是由代理编写的。主要是Claude Code,偶尔使用Cursor。我没有阅读或审查任何代码,除了偶尔出于兴趣查看。在构建应用程序的过程中,我注意到一些问题。在终端看到对一个文件第4000行的编辑滚动过去后,我仔细查看了一下。数据访问层的代码已经增长到超过6000行。随着更多功能的加入,这个数量继续增加。每个查询,无论是读取还是写入,都重复了相同的HTTP请求设置,相同的JSON编码和解码。最终,这个文件的代码行数达到了17155行。单个Rust文件。重构试验17155行的文件就是整个数据访问层。一个独立的模块。查看代码时,没有去重,没有内部语言,函数提取有限,类的提取非常少。它确实有一个需要保留的接口的清晰边界。因此,它是重构的一个很好的目标。重构一个代理代码库的目标是现在花费资源进行重构,以降低未来工作的资源消耗。一个实验应该能够表明,随着这个文件的重构,在这个代码库中实现单独功能的资源成本将会降低。正因为代理从不学习,现在可以进行这种实验。我可以提示一个新代理在每个重构阶段后进行完全相同的更改。与人类工程师不同,实验不会受到先前步骤学习的影响。制定一个整体的重构计划,遵循严格的重构原则。创造一个代表性的更改,并用单个提示描述它。建立变化的基线成本:在一个子代理中执行该提示,包括让子代理报告资源消耗。丢弃这个更改。在一个循环中:应用整体重构的单个步骤。在一个子代理中,执行完全相同的更改,接收更改的资源成本。丢弃这个更改。记录所有资源成本、执行更改所需的时间以及每个重构步骤后代码行数,包括基线。用于代表性更改的提示和实施的重构步骤在附录中列出。一个警告:虽然Claude展示了资源计数,但并未提供可靠的实时计数方法,尽管报告了每个会话消耗的资源。我假设这只是一个临时问题,未来会有所改善。相反,子代理报告接收和发送的字符数,并使用tiktoken来近似资源,通过将字符计数除以四。结果步骤 数据访问层行数 最大文件行数 总 Rust 行数 每次更改的输入资源 token 每次更改的输出资源 token 每次更改的时间(秒) 基线 17155 17155 50359 159564 1705 342 步骤1 (FirestoreClient) 16706 16706 49910 155205 1723 530 步骤2 (extract_doc_id, new_link) 16562 16562 49766 159227 2105 574 步骤3 (link-query helpers) 16567 16567 49771 154054 2105 524 步骤4 (FakeStore predicates) 16577 16577 49781 154146 2060 654 步骤5 (value ctors) 16469 16469 49673 171251 2036 1353 步骤6 (FieldsBuilder) 16469 16469 49673 171251 2036 1353 步骤7 (queries.rs) 16474 15670 49678 151850 1800 587 步骤8 (traits.rs) 16508 13845 49712 132558 1723 446 步骤9 (traits/ split) 16508 13845 49712 132558 1723 446 步骤10 (codec.rs) 16521 12846 49725 131871 1750 540 步骤11 (fake_store.rs) 16535 11122 49739 133016 2460 600 步骤12 (store/ split) 16550 9269 49754 104080 2050 490 步骤13 (co-locate tests) 16550 9269 49754 104080 2050 490 步骤14 (complete fake_store.rs) 16553 7225 49757 107205 2453 523 步骤15 (store/ split) 16608 3695 49812 27360 2113 454 这里有趣的指标是数据访问层中的总行数、数据访问层中最大单一文件的行数,以及在产生更改时消耗的输入资源 token。这个图表展示了四个方面。第一点是基线,即步骤0,随后在应用每个重构步骤后,重复相同的指标。数据访问层整体的总代码行数。最初,这只是我开始的单个文件。随着重构的应用,这变成了很多文件。最后有19个Rust文件。数据访问层中单个最大文件中的行数。一开始,这个文件就是数据层的全部内容。到最后,单个最大文件 ...
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡