Mole开发者分享如何让AI代码持续迭代不腐化,测试代码是产品代码的66%,还有1000多个fix提交的经验。
Mole 项目已发布至第13个版本,包含11万行Swift产品代码和7.3万行测试代码。作者通过3347个XTest实现AI代码的自动化测试,测试代码占比达66%。项目建立了1000多个以fix开头的提交和Rules系统,记录功能边界和历史原因。作者强调减少无用功能,利用GitHub自动化actions进行多语言一致性检查。
想从产品工程师视角和大伙聊聊,在代码全部由AI生成的时代,如何保证产品的代码可以持续迭代、好维护、不腐化。 最近 Mole 发布到了第 13 个版本,看了看整个项目大概有 11 万行 Swift 产...
想从产品工程师视角和大伙聊聊,在代码全部由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 ⚡