背景:Spring Boot + MyBatis Plus,个人项目,用Cursor的Chat模式和Agent模式写了快三个月。一开始确实爽,CRUD基本不用动脑,但最近改需求时发现一个问题:它生成的Service层逻辑越来越绕,很多地方为了“兼容”我之前的代码,会额外塞一些没必要的判断和状态流转。我试着让它重构,结果它又基于现有代码“自洽”地改,反而把一些原本清晰的接口搞复杂了。
用Cursor写后端三个月,感觉代码越来越难维护了怎么办?
全部回复
共 79 条同感,AI写代码最坑的就是“自洽性”——它重构时优先保证跟现有烂代码逻辑一致,而不是往简洁方向改。我后来学乖了,让它重构前先明确告诉它“删掉哪些分支、合并哪些方法”,甚至直接贴出目标伪代码,不然它只会越改越圆。另外建议你定期自己过一遍核心Service,AI生成的“防御性判断”大多是你之前某次临时需求留下的,删了反而更清晰。对了,你试过把整个模块推倒重写而不是让它基于旧代码改吗?有时候重置比修补省心得多。
这情况太真实了,AI写代码就是前期爽后期还债。我自己也遇到过,它特别擅长在你现有代码基础上打补丁,导致逻辑像滚雪球一样越滚越乱。后来我学乖了,让它重构前先自己画个清晰的调用链图,再明确告诉它哪些分支可以删,不然它真会给你“自洽”出一堆死代码。你或许可以试试定期手动梳理核心流程,把AI当成高级补全工具,别让它主导架构。
说实话,这锅不全在Cursor,也可能是MyBatis Plus的灵活性给了它太多“绕”的空间。我最近的做法是,每写完一个功能就强制自己review一遍,把那些多余的判断直接删掉,让AI重新生成。但更管用的是给它限定接口返回值,不让它自由发挥状态流转,不然维护成本真的会失控。
我跟你反着,我是被它绕怕了,现在直接不让它碰Service层,只让它写Mapper和DTO。核心业务逻辑自己手写,虽然累点但心里有底。你那个情况,不如试试拆分成更小的子任务让它做,比如“只改这一个查询条件,别动其他”,配合单元测试锁死行为,它就不会越改越乱了。
有没有可能是你之前给的上下文太宽泛了?我遇到过类似问题,后来发现是它把历史对话里的旧需求也当成了约束。试试开
说实话你这情况我太熟了,我拿它写了两个月Go项目,最后代码里全是那种“防御性”的垃圾分支,看着逻辑完整,一改需求就牵一发动全身。我觉得问题不在Cursor本身,而是它一直在做“局部最优”的改动,你让它重构,它只会基于当前这坨屎山往上堆新屎,根本不会主动帮你砍掉那些历史包袱。我现在是这么干的:每次让它写新功能前,先自己花十分钟把相关的旧代码梳理清楚,明确告诉它哪些方法可以废弃、哪些状态可以合并,不然它永远在给你打补丁。另外你试试让它先写个简短的接口设计文档,把数据流和边界条件列出来,再让它按文档生成代码,比直接描述需求靠谱得多。说到底这玩意儿就是个高级自动补全,关键的业务抽象和模块边界还是得自己拿主意,不然三个月后你连自己项目都看不懂了。
我也有类似的体感,Cursor生成的代码特别容易“过度防御”,后面加需求时牵一发动全身,看着能跑但根本不敢动。后来我改成让它只负责写独立的小工具类或者单次CRUD,涉及业务流转的逻辑还是自己手写,至少心里有数。另外它重构时特别喜欢保留旧逻辑,建议你直接给它一个干净的接口定义,让它从零实现,别让它参考现有代码。
我最近也踩过类似的坑,用AI写代码最怕的就是“历史包袱”越滚越大。它确实会为了迎合你之前写的烂代码,反过来生成更烂的兼容逻辑,这本质上是它在模仿你的坏习惯,而不是在优化架构。我后来想了个办法,就是隔一段时间强制自己用自然语言重新描述一遍需求,让它从零生成一个新版本,然后我再手动对比两个版本的差异,把关键逻辑抽出来融合。另一个问题是,Cursor在重构时特别喜欢“最小改动”,这跟人脑追求的“清晰边界”完全是两码事,你得在提示词里明确要求它“允许大规模修改调用链”,甚至给它指定具体的设计模式,不然它永远在打补丁。说实话,我现在只让它写无状态的工具类和单元测试,核心业务逻辑还是自己手写,不然等哪天它生成的状态机嵌套到三层以上,你连删都不知道从哪删起。
Cursor生成的代码就像滚雪球,越滚越臃肿,建议关键逻辑还是自己手写,让AI只干CRUD的活。
AI重构就是个死循环,它永远顺着旧代码的逻辑打补丁,不如直接推倒重写核心模块来得干净。
这事儿我也踩过类似的坑,AI写代码最大的问题就是它会“记忆”你之前所有临时补丁,然后当成设计约束去扩展。建议你找个周末把核心Service层推倒重写,别让它基于旧代码重构,直接给它定义好接口和输入输出约束再生成,反而干净得多。另外那些状态流转多的逻辑,不如自己手写,AI处理分支多的业务确实容易绕。
这问题太真实了,我拿Copilot写Python脚本三个月也有同感。最烦的是它特别擅长在旧逻辑上打补丁,你让它修个bug,它能给你套三层if,变量名还起得贼抽象。后来我学乖了,关键业务模块必须自己手写骨架,AI只负责填DTO和Mapper这种体力活。另外你试试让它“重写这个类,保持接口签名不变,但删掉所有历史兼容分支”,有时候比让它重构管用。不过说实话,个人项目维护性崩了真不全是AI的锅,三个月不写注释不画时序图,换人写也一样烂。你不如定期抽半天,把最乱的几个Service手动重写一遍,就当给AI擦屁股了。
跟你情况差不多,我是用了两个月后发现它特别爱在Service里堆状态机,改一个字段能牵扯出五六个if分支。后来我干脆把生成代码当参考,核心逻辑自己重写,只留CRUD模板,维护负担立马降下来了。
另外我试过在prompt里强制要求“最小改动、不添加额外判断”,效果有点,但别指望它能理解业务边界。建议你定期把Service层拆薄一点,让Controller直接调Mapper或者独立的小方法,别给它太多发挥空间。
还有个疑问,你让Cursor重构的时候,是直接说“重构”还是给了具体约束?我总觉得它默认理解的重构就是“在现有屎山上再盖一层”。
我也有类似的感觉,AI写代码最怕的就是“过度设计”,它为了不破坏现有逻辑会疯狂叠加条件分支,结果就是代码像滚雪球一样越来越肿。后来我干脆把那些绕的部分全部推倒,只留接口定义,逼它按我给的思路重新写,反而清爽很多。另外建议你定期让Cursor解释某段逻辑为什么要这样写,如果它答得含糊,基本就是冗余代码,可以直接删。说到底AI只能帮你提速,架构上的取舍还是得自己盯着。
AI生成的代码就像外包干的活,能跑但不敢细看,建议先自己理清业务边界再让它改。
同感,我之前用AI写Python后端也踩过这坑。它特别擅长顺着现有代码往下叠逻辑,根本不管整体设计,越补越乱。后来我学乖了,让AI改代码前先自己画个简单的数据流图,把边界划清楚,再让它只动具体实现,不然它真能把简单事办复杂了。
另外建议你试试把大任务拆碎点,每次只让它改一个方法或者一条链路,别让它看整个文件。它一看到全局就爱自作主张加状态判断,其实很多时候就是多余。还有,定期用人的思维去梳理一遍核心流程,该删的冗余就直接删,别指望AI自己发现。
同感,AI生成的代码最怕“自洽式重构”,越改越拧巴,不如定期手动梳理核心链路。
同感,Cursor生成的代码就是典型的重构陷阱——它会把历史包袱当feature,越修越拧巴。我现在基本让它写单点功能,涉及业务逻辑的改动就自己上手改,AI只当提词器用。另外建议你试试把每个Service的职责边界写进注释里再让它改,不然它真能给你捏出个四不像的状态机。
同感,我拿它写Python后端也是这样,三个月后代码里全是它为了兼容旧逻辑硬塞的防御性判断。后来我干脆每个新功能都开个新会话,明确告诉它别管之前的代码,反而清爽很多。
另外建议你试试让它先解释现有逻辑再动手改,不然它真的会顺着原来的坑继续挖。维护期还是得自己把Service层核心流程手写一遍,AI只负责具体实现,别让它碰架构。
AI生成代码的“自洽”很坑,维护成本全转移给你了。建议大改时直接重写模块,别让它自己重构。
Cursor生成的代码确实越补越乱,我现在都是让它写单点功能,业务逻辑还是自己手写靠谱。
这情况太典型了,AI生成代码的“自洽性”其实是双刃剑,它会在你原有代码基础上打补丁,而不是从全局考虑重构。建议你试着把某个Service层的核心逻辑完整删掉,只留接口定义,让它重新生成实现,别让它看到旧代码,这样反而能跳出之前的思维定式。另外,个人项目的话,可以试试把那些状态流转的判断抽成独立的策略类,别让AI在方法里堆if-else,不然越往后越不敢动。
同感,我最近也在用Copilot写Node后端,三个多月下来确实有点这个味儿。它特别擅长在你现有代码基础上打补丁,哪怕你暗示它“这里其实可以简化”,它还是会顺着之前的逻辑树去生长,结果就是方法越来越长,分支越来越多。我现在最头疼的是它生成的Service层经常混着事务边界和业务判断,改一个参数要顺藤摸瓜摸半天。后来我学乖了,每周抽半小时拿掉AI,纯手写一个核心模块,逼自己重新理清结构,再回去让Cursor照着这个思路改,效果比直接让它重构好很多。另外我发现,给它的指令不能是“重构”,得是“把这个方法的职责拆成两个,参数只保留x和y”,越具体它越老实。不然它真的会“自洽”到把你带沟里去,那种感觉就像跟一个很聪明但没主见的同事结对,你得不断拽着缰绳。
这其实是AI的路径依赖,它一直在顺着旧代码打补丁,不如定期手动理一遍关键逻辑,别全指望它重构。
同感,AI写代码就是前期爽后期还债。它特别擅长在现有代码上打补丁,但不会主动删冗余,导致逻辑像滚雪球。我后来强制自己每两周手动过一次核心Service,把那些“兼容性判断”全删了,反而好改很多。另外试试让它直接重写某个方法而不是重构,有时候推倒重来比修补更干净。