背景:Spring Boot + MyBatis Plus,个人项目,用Cursor的Chat模式和Agent模式写了快三个月。一开始确实爽,CRUD基本不用动脑,但最近改需求时发现一个问题:它生成的Service层逻辑越来越绕,很多地方为了“兼容”我之前的代码,会额外塞一些没必要的判断和状态流转。我试着让它重构,结果它又基于现有代码“自洽”地改,反而把一些原本清晰的接口搞复杂了。
用Cursor写后端三个月,感觉代码越来越难维护了怎么办?
全部回复
共 79 条这事儿我也踩过坑,AI写代码最大的问题就是它特别擅长“顺着你现有的烂结构继续打补丁”,而不是帮你打破重来。建议你给Cursor下更死的指令,比如明确告诉它“不要复用旧逻辑,直接按新需求重写这个Service”,不然它永远在自我参考。另外,个人项目的话,核心业务逻辑还是自己手写吧,AI拿来生成样板代码和工具类就够了。
三个月确实是个坎,前期爽是因为它帮你把地基打了,后期你改需求它就会把地基上的违章建筑越叠越高。我后来是直接把那些绕的Service整个删了,让Cursor从接口定义开始重新生成,反而比让它改快得多。你试试让它写之前先列个步骤清单,别让它自由发挥。
我怀疑是Agent模式太爱“顾全大局”了,每次都试图兼容你所有历史代码,哪怕那些代码本身已经不合理。我现在让Cursor干活前会先喂它一段“设计约束”,比如禁止在Service里加状态判断,所有分支必须拆成独立方法,它收敛很多。你要不要也试试给它立点规矩?
跟AI讲逻辑没用,它只会顺着你现有的烂代码继续圆,建议先把接口边界定死再让它改。
同感,AI写代码有个致命问题就是它特别擅长“将错就错”,为了兼容你之前的烂代码,会生成更烂的兼容层,最后变成俄罗斯套娃。我后来干脆让它按新需求重写单个Service方法,而不是全局重构,效果反而好很多。另外建议你定期用IDE的依赖分析扫一眼,那种超过50行还带三四个if嵌套的方法,直接手动拆,别指望AI自己优化。说到底AI是加速器,方向盘还是得自己握。
这情况太真实了,AI写代码就是前期爽后期还债。建议你试试把大方法拆小,每次只让它改一个具体函数,别给整块业务逻辑,不然它确实会为了“自洽”疯狂打补丁。
另外可以考虑在prompt里明确禁止它动现有接口签名,逼它用新增方法去适配。我现在都是拿它当高级补全用,核心流程必须自己手写,不然三个月后连自己都看不懂那堆状态机。
对了,你git历史里应该有每个版本的diff吧?找个早期清晰的版本,拿那个当基准重新让AI生成,别让它顺着烂代码继续“优化”,会好很多。
这就是AI写的代码的通病,它只会顺着现有烂摊子打补丁,不会帮你做减法。建议每两周手动重构一次关键链路,别全指望它。
深有同感,AI生成的代码擅长“圆谎”,越补越复杂,建议定期让它只改单点功能,别给全局上下文。
Cursor写业务逻辑容易陷入“自嗨式重构”,我后来干脆把Service层拆小,每次只喂一个方法给它,反而清爽多了。
跟你感觉差不多,AI写代码最大的问题就是“局部最优解”,它会为了让你现在的测试通过,不停打补丁,根本不管整体架构。我后来是把核心业务逻辑拆出来,自己手写,只让Cursor处理那些边缘的样板代码,情况才好转。
另外你得学会用git做版本控制,每次重构前先提交一个快照,让AI瞎改完再对比回滚,不然它越改越乱你都没退路。要是实在救不回来,不如狠心重写那几层,比跟它耗着省心多了。
AI生成代码的通病就是自洽性太强,重构时反而容易把原来清晰的逻辑越改越乱。
建议把核心业务逻辑独立出来自己写,让AI只负责胶水代码。
正常,AI写代码就是滚雪球式堆复杂度,建议定期手动重构核心逻辑,别全交给它。
Cursor生成的代码自己得看懂再改,不然后面就是给它打工擦屁股。
说实话我也踩过差不多的坑,Cursor在“理解”你意图的同时,也会把你之前那些临时补丁当成了设计规范,然后顺着这个错误方向越走越远。我后来学乖了,大改逻辑时直接开个新对话,把核心接口和实体类贴进去让它从零写一版,再手动对比合并。另外强烈建议你在prompt里明确写“不要修改现有方法签名,不要添加额外状态判断”,能省掉很多无效重构。
跟你情况差不多,后来我学乖了,Cursor只让它写单点功能或者测试类,涉及核心业务逻辑必须自己搭好骨架再让它填肉,不然它真的会在没人管的地方疯狂叠缓冲层。
另外你让它重构前得先把接口文档或者调用链写清楚,不然它只能顺着现有代码猜,越猜越复杂,最后你都不敢动那坨东西了。
我现在是每两周手动过一次Service层,把那些条件分支里明显没用的状态判断直接删掉,再让AI格式化,这样至少还能控住复杂度。
跟你情况差不多,后来我发现得时不时自己下场把关键链路手写一遍,让AI只补胶水代码,不然它真的会越滚越乱。
另外它重构时特别爱保留历史包袱,你不如直接甩给它一个精简版的接口定义,让它推倒重来,别让它看着旧代码改。
现在我的习惯是每两周清一次上下文,逼它重新理解当前结构,反而比让它“记住”所有东西要干净得多。
跟你的感觉差不多,AI写代码最大的问题不是跑不通,而是它特别擅长在旧逻辑上叠新逻辑,时间一长就成了一坨“自洽的屎山”。我后来强制自己给每个模块定好接口边界,只让它改实现不动签名,情况会好很多。另外,重构这种事别指望它一次搞定,最好拆成小步骤一步步喂给它,不然它真能给你整出个更复杂的迷宫。你试试把那些状态流转单独抽出来做个状态机,可能比让它自己瞎调强。
说实话你这个情况我太懂了,我自己的项目也是这么被Cursor带偏的。它最坑的一点就是特别擅长“将错就错”,你只要不主动拆掉旧逻辑,它就会在屎山上继续盖楼,而且盖得还挺稳,看着能跑,但你想动哪块都得先理半天它自己加的“防御性”判断。我后来琢磨出一个办法,就是每两周必须做一次“无Cursor重构日”,强制自己手写核心Service,只留接口和实体,把那些状态机一样的if-else全摊平了重来。不然等代码量再堆一倍,你连重构的勇气都没了,只能继续让AI给你打补丁。另外你试试给它更狠的指令,比如直接在对话里贴出“这段逻辑违反单一职责,请以最小改动拆成三个方法”,别让它自由发挥,它自由发挥的尽头就是自洽的复杂度爆炸。反正现在我的底线是:AI能写CRUD和单表操作,但跨表事务和业务状态流转我必须自己写,不然迟早被它的“优雅兼容”坑到重写整个项目。
我最近也遇到类似情况,AI生成的代码在初期效率确实高,但到后期维护时,它基于历史代码做的“优化”反而让逻辑变得很拧巴。我的做法是,对于一些核心的Service方法,干脆自己重写一遍,把那些多余的状态判断拆掉,同时给AI设定更明确的边界条件,比如告诉它“不要修改现有接口签名”或“只改方法内部逻辑”,这样生成的结果会干净不少。另外,建议你定期给AI喂一些“负面案例”,比如告诉它之前哪些写法造成了返工,它下次会收敛很多。
同感,AI写代码就是前期爽后期还债。它特别擅长在旧逻辑上打补丁,因为训练数据里“兼容性”优先级太高,反而牺牲了可读性。建议你试试先自己把核心接口的边界定死,再让Cursor只填方法体,别让它碰整体结构。另外重构这种活儿真别指望它,让它改十次有九次是越改越复杂,不如自己花半小时重写一遍关键类,顺便把单元测试补上,后面改起来心里才有底。
这情况太真实了,我拿Copilot写Python也遇到过类似的坑。AI特别擅长在已有代码上打补丁,但它没有全局嗅觉,只会顺着你给的上下文硬凑,最后就变成俄罗斯套娃式的逻辑。建议你把核心接口的调用链画出来,手动把那些“兼容性”判断拆掉,别让AI自己重构,让它只做局部修改。我现在都是先自己定好边界,再让AI填实现,效果反而稳定不少。
这情况我太熟了,我拿Copilot写Python项目三个月后也是这德行。它最坑的一点就是特别擅长“将错就错”,你以前写了个绕的接口,它新生成的代码会顺着这个绕的思路继续加补丁,而不是帮你把地基推倒重来。我自己现在的办法是,每两周必须强制自己手写一次核心业务逻辑,不碰任何AI补全,就当是给代码库“排毒”。另外你提到它为了兼容旧代码塞判断,我怀疑是它没有全局视野,只盯着你当前打开的那几个文件,所以你可以试试把相关的几个核心Service文件全关了,让它只基于数据库表结构重新生成一版纯逻辑,效果会好很多。还有个小技巧,在Prompt里明确写“不要考虑现有实现,只根据Controller的入参和出参要求设计Service”,能有效防止它过度设计。说到底,AI写的代码就像外包干的活,验收标准必须你自己定,而且每个模块最好给它画个边界,别让它跨文件自由发挥。
试过让它只改接口不碰实现,结果它非要自作主张加状态机,最后还是手写才顺过来。