How-toSelected73°

Mole v13 Maintaining AI-Generated Code

Why we picked it

For developers working with AI-generated code, Mole's approach shows how extensive testing and documentation can maintain code quality without human testing slowing progress.

Mole has reached version 13 with 110,000 lines of Swift product code and 3347 XCTest cases. The test code now accounts for 66% of the production code, up from just 56 tests in version 1.0. The project contains over 1000 commits prefixed with 'fix', with 900+ having associated tests. The developer maintains a separate Rules document to document functional boundaries and historical decisions.

Original · Tw93

想从产品工程师视角和大伙聊聊,在代码全部由AI生成的时代,如何保证产品的代码可以持续迭代、好维护、不腐化。 最近 Mole 发布到了第 13 个版本,看了看整个项目大概有 11 万行 Swift 产品本身代码、7.3 万行测试代码和 3347 个 XCTest,测试代码部分远多余之前在公司写业务时候有QA来保障下的代码,我一直秉承一个观点,AI 写的代码应该 AI 来测试,而非人,把人引入到这个环节反而会拖慢整体的进度。 想着基于上面这个经验实操来总结一下,我都做了哪些有意思的事情,让这些代码一直可以在我和 AI 之间非常听话的实现功能。 1、即使 AI 能够大幅提升代码生产的速度,产品本身的技术架构、分层、同类抽象,什么东西放到什么地方能够让后续更好的扩展以及解耦,还是需要工程师本身的判断,这一块可以在项目第一个版本可以跑起来后就可以和你最好的 AI 仔细讨论,设定好对应的架构,并通过可沉淀可修改的文档记录下来,持续跟随项目迭代。 2、我目前最依赖的还是单测,1.0 只有 56 个 XCTest,到 1.13 已经有 3347 个,测试代码大约是生产 Swift 代码的 66%,不过数量只是顺手统计出来的结果,我平时更关心测试有没有覆盖那些容易想当然的地方,比如扫描结束以后文件又变了、进程检查失败、命令返回成功但 App 根本没有更新、旧任务很晚才回来覆盖了新结果。正常情况一般不难写,麻烦的是那些结果看起来没问题,实际上已经错了的情况如何可以及时去更新。 3、特别是修 Bug 的时候,我会多留一些东西下来,除了把问题修复,还会加一个让旧代码失败的回归测试,然后沿着同类路径去找有没有类似的问题,最后把当时为什么这么改写到规则里面去,到目前 Mole 已经有 1000 多个以 fix 开头的提交,其中 900 多个提交过测试,很多测试和规则都是用户真实踩过一次以后留下来的经验,或许我认为这个是当前这个项目最宝贵的资产。 4、测试能记住输入和结果,但记不住当时为什么放弃一种做法,所以项目里还有一批 Rules,主要记录功能边界、历史原因和不能碰的地方。比如为什么某类文件宁可漏掉也不能自动删除,为什么有些看起来重复的组件不能随便合并,哪些系统数据不属于 Mole。Rules 一多又很费上下文,我就按模块把它们拆开,只在改到相关代码时加载,再把经常重复的检查做成 Skills。bugs 会从以前的修复里找同类问题,design-system-review 看界面有没有越写越乱,release 则负责检查签名、公证、远端文件和更新链路,这样不需要每次都从头跟 AI 解释一遍。 5、还有一个对我很有用的法子,就是少做一些没有实际用的功能。现在 AI 加一个设置项、兼容分支或者后台监听太容易了,几分钟就能写出来,留下来的状态和维护成本反而腐化的最大的原因。比如Mole 现在对新功能设置了一些规则,比如尽量不增加常驻开销,不增加新的特权和系统权限,有合理默认值就不继续加设置项,更新和清理也不会因为发现一种新的可能性就一直扩范围,很多时候有很多功能是开发者自以为重要,但是使用者完全不在乎的功能,更多还是建议从用户中来,到需求中去,如无必要勿增实体。 6、需要充分利用好 Github 自动化 actions 的能力,这个会是你最后的兜底,其实代码写完、跑通、测试变绿以后也还没结束,我的项目里还有一套检查负责九种语言、网站生成结果、Appcast、Xcode 工程和公开部署文件之间的一致性,make verify 会把这些检查和测试一起跑,CI 再换到云端干净机器上重新来一次。到了发布的时候,本地代码、Git 提交、签名后的安装包、线上文件和用户实际收到的更新也是几种不同状态,我会分开确认。之前也遇到过源码完全正确,线上还在提供旧文件的情况,只看一个绿色结果很容易过早觉得已经做完了,其实是有错误的。 7、上面的一切,假如需要说特别的地方,我能想到的就是执行流程完全我没有插手干扰,每一步是 AI 自动化的去执行验证,出错了 AI 自动去解决,只不过会在不同的时候设置必要的流程卡点,让 AI 主动去验证,得到明确的结果才确定通过,并持续的去迭代规则,保持现有规则的新鲜度,并及时移除旧的逻辑,让本身的校验逻辑和本身的业务代码同步升级。 或许,这是我认为 AI 时代的工程师更需要培养的能力,如何让 AI 写的代码更好维护、更清晰、更好扩展,即使半年、一年、两年都不会腐化,而且会越来越听话,越来越符合开发者的心意,也给多 Agent 合作开发确立一个很稳靠的根基。之前手写代码的乐趣已经没有了,好在有这个弥补了一些纯 AICoding 过程无聊,让工程师的一些专业度得以延续下去。 💬 7 🔄 1 ❤️ 37 👀 2716 📊 15 ⚡