用光标重构遗留代码(测试第一,勇气第二)
没有测试的 600 行模块符合 Cursor。在不中断生产的情况下重构它的工作流程更多地是关于测序,而不是人工智能。
该模块有 600 行,已有 10 年历史,可以承载,并且仅通过生产流量进行测试。 Cursor 很好地重构了它,但人工智能可能只是故事的三分之一。另外三分之二是排序:测试、边界和拒绝让代理快速移动。
第一步是特征测试,Cursor 确实擅长帮助编写它们。我要求它读取模块并列出每个可观察到的行为:输入、输出、边缘情况、错误路径。然后生成断言当前行为的测试,包括奇怪的东西,明确标记为“特征:断言当前行为,而不是正确性”。这些测试是使一切成为可能的安全网。
第二步是手术前的界限。我让 Cursor 首先在接缝处提取纯函数(解析、计算、格式化),而不改变任何行为,每次提取都验证为绿色。只有到那时,真正的重构才开始,逐个函数地进行,并遵循最重要的指令:“每次更改一件事,运行测试,停止。”大胆重构的代理自信地重写并巧妙地打破。相互之间进行验证的小传递是您保持控制的方式。
没人认为这一步骤很重要:在应用之前,我让 Cursor 用一句话解释每一项更改。这些解释发现了测试没有发现的两件事:仅在并发情况下发生的共享对象的突变,以及在测试时区而不是生产时区安全的操作重新排序。读一句话的理由是每次变化十秒,抓住了篮网错过的东西。
最终统计:该模块现在有 300 行,其结构可供新员工阅读,行为由特征套件验证相同,并且生产事故为零。人工智能负责打字。纪律进行了重构。两者都是必要的;其中只有一项是可选的。
