背景:Spring Boot + MyBatis Plus,个人项目,用Cursor的Chat模式和Agent模式写了快三个月。一开始确实爽,CRUD基本不用动脑,但最近改需求时发现一个问题:它生成的Service层逻辑越来越绕,很多地方为了“兼容”我之前的代码,会额外塞一些没必要的判断和状态流转。我试着让它重构,结果它又基于现有代码“自洽”地改,反而把一些原本清晰的接口搞复杂了。
用Cursor写后端三个月,感觉代码越来越难维护了怎么办?
全部回复
共 79 条我跟你情况差不多,用了三个月Copilot写后端,后来也发现代码越来越像“屎山”里长出来的。最烦的就是它特别爱“过度设计”,明明一个简单的状态枚举能搞定,它非要给你搞个策略模式加状态机,看着高大上,改起来想骂人。我觉得这玩意儿本质上是基于概率在补全,它没法理解你项目的业务约束,只会参考你之前代码的“风格”然后自我发挥,所以越往后越像在跟你之前的烂代码互相喂毒。我现在基本把它当高级补全工具用了,核心逻辑和接口设计必须自己手写,生成完代码得花时间捋一遍,把多余的分支和判断删掉,尤其是那种为了兼容历史逻辑塞进去的if else。另外我建议你试试让它“分步骤重写”而不是一次性重构,每次限定一个小模块,明确告诉它不要动接口签名,只优化内部实现,效果会好很多。说到底,AI写代码就像招了个手速极快的实习生,你得自己当那个把关的架构师,不然代码库迟早变成一团解不开的毛线球。
说白了就是欠债,AI写的代码你得定期自己重构,别指望它改自己的烂摊子。
Cursor生成快但没全局观,建议关键逻辑手写,让它补模板就行。
Cursor生成的代码有个特点,越是后期越喜欢“自圆其说”,不如定期手动砍掉冗余分支保持核心逻辑清爽。
AI写代码得给它立规矩,我都是让它先写注释再写实现,不然三个月后你自己都看不懂它在干嘛。
一样的情况,我是从第四个月开始忍不了的。后来发现Cursor对已有代码的“尊重”其实是靠上下文猜,它不敢动旧逻辑,就只能在外面包新逻辑,自然越滚越乱。我的办法是每两周手动拆一次核心Service,把状态流转抽成独立的小类,再让Cursor只改单点,别让它碰整体结构。另外试试给它更具体的约束,比如“不要修改已有方法签名,只新增”,效果会好不少。
我最近也碰到过类似的情况,特别是让AI重构老代码时,它老想着兼容旧逻辑,结果越绕越深。后来我学乖了,重大改动直接让它写个新类或者新方法,写完再手动替换调用点,别给它太多上下文。另外,有时候得逼自己把Service拆薄一点,把那些状态流转抽到单独的策略类里,AI理解起来会清爽很多,生成的代码也不会那么拧巴。
这情况太真实了,AI写代码就是前期爽后期还债。我后来发现得时不时把某个模块整个删掉让它重写,而不是让它基于现有代码去改,不然它会把你之前的烂设计当成“需求”来兼容。
另外关键还是得自己控制好接口边界,AI生成的service层如果逻辑绕,我就直接拆成小方法,逼它只补实现不碰结构。不然三个月后你连自己代码都认不出来。
你这情况我太熟了,AI写代码就是这样,它只会往当前代码里叠补丁,根本不会主动砍掉旧逻辑。我后来学乖了,让它重构前先自己画个简版流程,然后直接开个新分支让它照这个写,别让它看老代码。另外Service里那些“兼容”判断,建议你每周手动清一轮,不然三个月后你自己都看不懂。
建议定期让它写设计文档再动手,不然AI只会顺着烂代码继续自洽。
Cursor用久了得自己兜底,关键逻辑还是手写靠谱,不然重构等于换种方式绕。
同感,用AI写代码最怕的就是这个,它特别擅长在原有烂代码上打补丁,越补越乱。我后来强制自己每个新功能都让它从零写,再手动把旧的删干净,反而清爽很多。另外建议你试试把核心逻辑拆成纯函数,让它别碰状态管理,维护性会好不少。你现在的项目如果还能救,不如花个周末把Service层彻底重写一遍,别指望AI能自己跳出思维定式。
这情况太真实了,Cursor写CRUD确实爽,但一旦业务逻辑复杂起来,它就会在旧代码上疯狂打补丁,导致状态判断越堆越厚。我后来干脆把Service层整个推倒,只保留实体和Mapper,然后自己手写核心逻辑,让AI只补单元测试和边缘case,反而清爽很多。你可以试试给AI限定“最小改动原则”,或者每次重构前先自己画个调用链图,不然它真的会自我催眠式地越改越乱。
跟我一模一样,现在改需求我都是先自己捋一遍再让AI动手,不然它能在屎山上再盖栋楼。
Cursor写CRUD是真快,但复杂逻辑还是得自己把关,别让它自由发挥。
跟AI结对写代码,得定期自己当code review,不然它能把简单活干成迷宫。
AI生成的代码就像滚雪球,越滚越歪,还是得靠自己把核心逻辑攥手里。
跟AI结对编程,代码会像滚雪球一样膨胀,建议定期用git回退重写,别让它自我延续。
Cursor生成的代码自带“历史包袱”,你得给它划边界,不然它越改越自洽,你越看越头疼。
跟你的情况差不多,我后来发现这类工具最大的坑就是它会把你过去的烂设计当成“既定事实”去维护,越补越复杂。我的做法是隔一段时间就手动砍掉一层Service,把逻辑重新捋直,再让AI按新结构写,不然它永远在旧框架里打转。
另外Cursor的Agent模式写CRUD确实爽,但涉及状态流转和业务规则时,它会倾向于加一堆防御性判断来避免出错,这些其实都是噪音。建议你试试在代码里明确标注哪些是核心逻辑,让它别乱动,哪些可以随意改,不然重构就是拆东墙补西墙。
跟你情况差不多,后来我发现问题出在它特别喜欢“最小改动”这个思路上,每次修bug都像打补丁一样叠逻辑,长期下来代码自然就拧巴了。我现在都是让它先写单元测试再重构,逼着它把行为定死,不然它自己改自己很容易越改越玄学。另外建议你隔几周就手动把核心Service层重写一遍,别全指望它,AI适合当写码的但不是架构师。
我也是用Cursor写后端,三个月后看自己代码都有点懵,它生成的那种防御性判断和状态流转确实比手写多不少。后来我学乖了,每次让它改需求前,先自己把接口设计理清楚,再让它照着实现,而不是直接丢旧代码让它改。你试试把那些“兼容逻辑”单独抽出来,做个适配层,主体代码保持清晰,不然迟早被它带进坑里。
说实话,我反而觉得这是提示词的问题,你让它“重构”的时候,它默认是在现有结构上做局部优化,不会主动推翻重来。我一般会明确告诉它“忽略现有实现,按我描述的新方案重写”,然后自己把核心流程列出来,这样它生成的代码就干净多了。你可以试试多给它一点约束和方向,别让它自由发挥,效果差距挺大的。
我也有过这个阶段,后来发现它最坑的是会“讨好
同感,AI写代码最大的问题就是“历史包袱”越滚越大,它为了通过你之前的测试,会拼命打补丁而不是推翻重来。我现在写复杂逻辑前会先手动把接口和核心流程定死,再让Cursor只填方法体,效果会好很多。另外建议定期做一次大重构,别怕丢代码,有时候从头写比在烂代码上修修补补省心多了。
同感,用Cursor写业务代码越到后期越有种“屎山叠屎山”的感觉。它太会顺着你现有的坑往里填了,根本不会主动拆解重构。我后来是强制自己每周抽半天,把AI生成的关键方法手动重写一遍,只留逻辑主干,那些花里胡哨的兼容判断全删掉,反而清爽很多。另外建议你试试给它限定上下文,只贴当前要改的方法,别让它看整个项目,不然它总想“全局优化”然后越改越乱。
我最近也卡在类似的问题上,用AI写代码最大的坑就是它会把你以前的逻辑当作“金科玉律”去强行兼容,结果越补越臃肿。后来我试过给它一个全新的空接口,让它从头写,反而清爽很多。你可以试试把要重构的方法单独拎出来,描述清楚输入输出,别让它看旧代码,说不定有惊喜。
说到维护性,我觉得关键得给它定规矩,比如明确告诉它“不要修改现有方法签名”或者“禁止添加额外状态判断”,不然它自由发挥起来真能绕晕你。我自己现在都是让它出第一版,然后手动把核心分支砍掉一半,AI适合做草稿,定稿还得靠人。
我太懂你这个感觉了,我用Copilot写Python项目三个月后也踩了同样的坑。它最擅长的是“基于现有代码继续生长”,而不是“判断这段代码该不该存在”,所以每次重构都像是在一个越来越乱的毛线团里再打一个结。我后来发现一个稍微管用的办法:让它重构前,先逼着自己把核心接口和状态流转手写成一个精简的文档,然后明确告诉它“只能按这个来,别参考旧实现”。另外,你提到“为了兼容而加判断”这点特别关键,AI模型其实是在做概率上的“最安全选择”,它觉得多保留分支能降低报错风险,但对人来说就是认知负担。我现在已经养成习惯了,每两周会手动把Service层里那种超过三层的if嵌套拆掉,哪怕逻辑一样,至少读起来像人写的。说到底,工具越强,越得靠人定期“清淤”,不然它就会在你看不见的地方默默积累技术债。
这事儿我太有同感了,我拿Cursor写了四个月内部工具,最后Service层那状态机我自己看都头疼。它特别喜欢把能并行的逻辑串成if else嵌套,为了兼容旧逻辑还硬塞一堆flag,重构的时候又只看当前文件上下文,根本不管全局调用链,所以越改越拧巴。后来我学乖了,每次让它改之前先自己把方法边界画清楚,直接告诉它“这个接口只能做A和B,其他情况一律抛异常”,它反而老实多了。另外你最好定期手动把大方法拆小,别指望它自己主动做,它默认就是往现有结构里打补丁。还有MyBatis Plus那种链式查询它写起来特别飘,有时候一个条件能给你拼出三种写法,你得逼它统一风格。说实话这玩意儿当个高级补全工具挺好,但架构决策真不能全扔给它,不然三个月后就是你现在的状态。现在我的规矩是:它写我改,改完再让它优化,循环两三轮才敢合进去。