代码库里有一个函数,命名很随意,没有注释,分散在十几个文件里被调用。你知道应该改,但每次想动手都打退堂鼓——要理解每个调用点的上下文,要确保改完之后行为一致,要写测试覆盖改动……最后的结论往往是:先放着,等"有时间"再说。这个"有时间"可能是几个月后,可能是永远。
这不是懒,是理性的成本计算:重构的执行成本太高,收益又是慢慢体现的,当然往后推。
AI 改变了这个计算。
重构的执行成本接近于零了。 以前让你推迟的那些原因——要读文档、要手动搜替换、要理解陌生代码、要写测试——大部分都可以交给 AI 完成。这不只是"更快",而是整个决策模型变了:以前"值不值得做"主要取决于执行成本,现在主要取决于判断成本。
这篇文章讲清楚这个转变是什么,以及它意味着什么。
一、以前重构的摩擦力从哪里来
一次完整的重构,大概有这几个成本来源:
理解成本。 在改之前,你必须读懂要改的代码——不只是这一个函数,还有它的所有调用方,它依赖的上下文,它在整个系统里的位置。这经常是最耗时的部分,特别是面对陌生的历史代码。
执行成本。 实际动手改:全局搜索替换、调整每个调用点的参数、处理各种边界情况。改的文件越多,这个成本越高。
验证成本。 改完了要验证对不对。写测试、跑测试、手动验证行为——这步不能省,省了就是埋雷。
风险成本。 改了之后出问题怎么办?越是陌生的代码,越是大范围的改动,这个心理负担越重。
这四个成本加在一起,让很多"明知道应该改"的重构一拖再拖。技术债的本质,有很大一部分就是"执行成本超过了当时能负担的预算"。
二、AI 消灭了哪些成本
理解陌生代码:从小时到分钟
面对一段不熟悉的代码,以前的路径是:读代码、猜意图、查 git log、问写它的人(如果还在的话)。现在可以直接把代码丢给 AI:
"这个函数做了什么?它的调用方需要注意什么?如果我把返回值从 List 改成 Optional,哪些地方会受影响?"
AI 会把你需要知道的东西梳理出来,通常比自己读代码快 10 倍。不是因为 AI 更聪明,而是因为它不需要从头建立上下文——它可以直接回答你关心的问题,而不是让你从原始代码里自己提取答案。
大范围修改:描述意图,不写代码
把一个同步函数改成异步——以前需要修改函数签名、所有调用点加 await、调整错误处理、更新测试。手动做可能要一两个小时,还容易漏。
现在的路径:
# 告诉 AI:
# 把 fetch_user 改成 async,同时更新所有调用它的地方
# 调用方用 await,如果在非 async 函数里调用,帮我把那个函数也改成 async
# 原代码
def fetch_user(user_id: int) -> User:
return db.query(User).filter_by(id=user_id).first()
# AI 输出的结果(含所有调用方的修改建议)
async def fetch_user(user_id: int) -> User:
return await db.async_query(User).filter_by(id=user_id).first()
这类"改一处,影响一片"的重构,以前是最容易出错的,现在是最适合交给 AI 的。AI 不会漏改,不会因为改第 15 个文件时走神而引入 bug。
迁移库/框架:几天变几小时
把 requests 换成 httpx,把 unittest 换成 pytest,把 Flask 路由改成 FastAPI 风格——这类工作以前需要读两份文档对照差异,一个个改,碰到不熟悉的 API 就卡住。
现在可以这样做:把一个文件的原始代码给 AI,说"帮我把这里所有的 requests 调用改成 httpx 的异步版本,保留原始逻辑"。AI 能处理 API 差异(比如 requests.get → await httpx.AsyncClient().get),也知道哪些地方需要额外注意(比如 context manager 的用法不同)。
一个 500 行的文件,这类迁移以前可能要半天,现在十五分钟内能完成——其中大部分时间是你在审查 AI 的输出,不是你在动手写。
补测试:以前最容易省略的一步
重构完了要写测试,但测试本身就是费时间的工作——所以很多重构的测试覆盖不足,不是因为人懒,是因为精力真的花完了。
AI 可以根据重构后的代码自动生成测试用例:边界情况、异常路径、常见场景。你的工作变成审查和补充,而不是从头写。这让"改了就要有测试"从一句空话变成可执行的标准。
三、几个真实的速度对比
以下是一些有代表性的重构场景,前后时间差异:
给 1000 行的旧代码加类型注解:以前需要读懂每个函数的参数和返回值,逐行添加,大概 3-4 小时。现在把文件给 AI,说"帮我加上 Python 类型注解,用 TypedDict 处理复杂字典参数",20 分钟拿到带注解的版本,再花 10 分钟审查。
把回调式错误处理改成异常式:代码库里有 200 处 if err != nil { return err } 风格的处理,要统一换成异常。以前逐文件改,几天的工作。现在:一次性给 AI 说明改法,让它批量处理,一天内能完成所有文件,重点时间花在测试上。
提取重复逻辑为公共函数:五个地方有相似的数据校验逻辑,略有差异。以前要先读懂五处代码,找出共同点,再设计抽象。AI 可以直接分析这五处代码,找出可以复用的核心逻辑,生成抽象后的版本,还能告诉你哪些差异需要参数化。
理解一个陌生模块然后重构它:接手别人写的复杂模块,要先理解再改。以前可能要花一整天读代码、画流程图。现在把模块给 AI,20 分钟能拿到清晰的模块说明和改进建议,然后针对性地重构,效率提升 3-5 倍不夸张。
四、什么没有变
执行成本降低了,但有一件事 AI 做不了:判断该不该重构,以及重构成什么样。
AI 可以帮你把函数命名改得更清晰,但它不知道这个函数在三个月后会不会被废弃,改了值不值。
AI 可以帮你把两段相似的代码抽成公共函数,但它不知道这两段代码看起来像但实际上处理的是不同业务规则,强行合并会带来耦合。
AI 可以帮你把一个 1000 行的类拆成几个小类,但它不知道你的团队接下来要给这个类加什么功能,哪种拆法未来扩展起来更顺。
这些判断需要你对业务背景、系统演化方向、团队习惯有深度理解——这些都不在代码里,AI 看不到。
换句话说:重构的瓶颈从"有没有时间和精力执行"变成了"有没有正确的判断力"。这个转变对高级工程师是好消息——他们有判断力,现在执行成本不再是障碍;对初级工程师是挑战——执行能力不再是壁垒,判断力才是。
五、这意味着什么
技术债的阈值降低了。 以前"值得改"要求重构带来的收益显著超过执行成本。现在执行成本接近于零,理论上任何有改进价值的重构都值得做。这意味着代码库可以维持在更高的质量水平,而不需要定期"还债冲刺"。
重构可以更小、更频繁。 以前因为重构代价高,工程师倾向于积累到一定程度再大规模重构。现在可以"发现就改"——看到一个不好的命名,顺手改掉;发现重复逻辑,顺手提取。小重构的风险更低,也更容易审查。
审查能力变得更重要。 AI 生成的重构不是总是对的。它可能改掉了不该改的东西,或者用了一种在你的代码库里不合适的模式。你需要有足够的能力去审查它的输出——不是逐行读,而是能快速发现不对劲的地方。这是一种新的技能要求。
"没时间重构"不再是理由。 执行成本降下来之后,"没时间"变成了一种不太站得住脚的说法。真正的问题是"不确定该怎么改"或者"不确定改了值不值"——这才是诚实的表述,也才能推动真正有价值的讨论。
六、总结
AI 改变了重构的成本结构:执行成本(读文档、搜替换、写测试)大幅下降,判断成本(该不该改、改成什么)没有变化。
这不只是"效率提升",而是工程实践的边界条件改变了。以前因为执行成本高而推迟的重构,现在大多可以做。以前"等有时间"的技术债,现在更多是"等有判断"的技术债。
对工程师个人来说,值得重新审视自己的工作方式:把 AI 消除执行摩擦腾出来的时间,用在更需要判断力的地方——架构设计、业务理解、系统演化方向。执行的快感让位给判断的价值,这是 AI 时代工程师最重要的转型之一。