过去的20天都没有写文章,主要是因为抽不出时间来写,原因是被拉去福州参与一个旧项目的技术改造。今天就来谈谈这个旧项目的改造以及改造过程中利用AI参与代码迁移的一些实践。
-
-
-
-
用Auto-coder对中小Service类进行批量改造
-
旧项目背景介绍
这个项目是一个慢病管理系统,原来是使用springboot 1.5 + hibernate的技术框架,由于经手的人比较多,加上很多次的迭代,导致代码结构比较庞大,service类中夹杂着很多拼接的sql语句,维护起来比较困难。
公司的一个新项目需要以这个慢病系统的业务逻辑为基础进行开发,经过分析评估,决定先对旧系统进行技术框架升级,再运用于新项目中。技术框架升级方案如下:
1、将springboot 1.5 升级到2.0以上;
2、数据持久层由hibernate 升级为mybatis;
3、将Service层中直接使用ServiceDo的数据库操作迁移至MyBatis实现(ServiceDo是一个hibernate 操作的封装类),建立规范的DAO层接口与XML映射文件,保持业务逻辑不变,仅修改数据访问方式;
1、旧系统时间比较久,经手的人比较多,导致代码结构比较庞大,web后端和小程序后端代码分开,但很多包结构和类名都是一样的,如果要合并难度不小;
2、需要改造Service类有600多个,类的行数从几百行到2万行不等,需要在2周内改造完成,并迁移到新的微服务框架中,改造周期短,改造工作量大,改造压力山大;
3、Service类中的代码,有很多sql拼接,根据不同的业务逻辑拼接不同的sql代码,有的sql拼接竟达到3500行以上,如此程度的业务逻辑几乎已经无法维护,需要将此部分sql语句拆分迁移到XML映射文件,并建立规范的DAO层接口,在如此短周期内,靠后端6个人工根本无法按时完成。
AI介入代码改造的尝试
基于上面的分析,项目组决定让AI参与旧项目代码的迁移改造,以提高改造的效率。
目前市面上的AI编程工具有很多,主要分为IDE 和 命令行 两种形式。IDE主要有Cursor、Windsurf、Trae等,命令行有 Claude code、Gemini-cli、以及国人开发的auto-coder。
1、IDE形式的AI编程工具并不擅长这种大量的service类中有多段代码的改造,一个是它需要一直点接受AI生成的代码修改,另一个是当token超出上限后会自动断开,需要人为的点“继续”才能继续进行改造,改造过程中需要有人一直盯着,对于这种需要批量改造的service类来说,效率不高;
2、IDE形式的AI编程工具,如cursor、trae针对单一的某处代码的改造效果比较好,比如对某一处dao调用的方法缺失,叫它补齐并完善对应的xml,它完成的效果会比较好,代码质量也比较高;
3、命令行方式的AI编程工具对批量处理有优势,只要配置要token限制相关的参数,编写好改造规则流程,再编写一个批量处理脚本,即可一次对十几二十个service类进行持续地改造;
4、针对5000行以上的大service类的改造,不管是IDE还是cli的AI编程工具,效果都很不理想,在实验中使用了DeepSeek-V3、Doubao-Seed-1.6、Claude-4-Sonnet、Gemini-2.5-pro等大模型进行尝试,效果都不尽人意。下图是尝试使用Gemini-cli对一个6000多行的service类进行改造,跑了2个半小时,消耗了6千万的token也没有跑出结果来。
经过项目组的讨论,最终决定用如下方案,让AI参与旧项目的迁移改造:
1、对超过5000行的大service类,先使用Cursor 携带Claude-4-Sonnet对其进行领域边界划分,并让Cursor将其拆分成几个规模小一点的service类,以便于后面的改造和维护;
2、对行数比较少的service 采用国人开发的auto-coder,根据预先制定的改造规则进行批量改造;
3、针对批量改造后的service类,有些有遗漏的代码块,采用人工介入,精准选择代码块,让Cursor或Trae对单一代码块逐一进行修复改造;
为何最终会选择国人开发的auto-coder作为AI参与改造的主力呢?原因如下:
1、Claude code本身对国人禁用,而且费用成本高,一开始就没打算使用;
2、Gemini-cli 虽然免费,但每天有限额,基本无法应用到大量service类的改造中;
3、auto-coder工具本身免费,但需要自己接入大模型,基于成本与效率的权衡,最终采用auto-coder + 火山引擎的DeepSeek-V3和Doubao-Seed-1.6
用Cursor对超大Service类进行领域划分
本章节我将记录使用cursor对EmpFlupPeService这个Service类进行职责边界分析与 DDD 重构。
1、将领域驱动策略规则添加到cursor的规则中,在.cursor\rules目录下添加ddd_strategic.mdc,规则截图如下:
这是一份来自阿里的领域驱动策略规则,是关于购物平台的,按理是需要修改成医疗领域相关的内容,但我没修改似乎也能用,想要此规则文档的,在文章末尾有获取方式。
2、引用规则,开始让AI对EmpFlupPeService的职责边界进行分析
8、创建一个门面类,整合所有拆分后的小类方法,保持向后兼容性
用auto-coder对中小Service类进行批量改造
本章节介绍auto-coder 的基本配置及如何用它来对一个Service类进行改造。
官网地址:https://auto-coder.chat/zh
https://uelng8wukz.feishu.cn/wiki/IwmGwHQaqiSHkzk6dpXcnMPSn9g?fromScene=spaceOverview
2、项目初始化
对于任何一个项目工程,首次使用auto-coder 都要进行初始化:
3、进行大模型配置
这里采用web方式进行配置比较方便,重新进入命令行窗口,输入:auto-coder.web 启用web页面:
增加供应商模型
添加新的大模型:
配置工程项目所使用的大模型:
4、进行auto-coder conf配置
在项目工程重新打开命令行,输入:auto-coder.chat,使用/conf进行参数设置:
需要配置的参数如下:
/conf enable_active_context:true/conf enable_agentic_auto_approve:true/conf enable_auto_fix_lint:true/conf enable_auto_fix_merge:true/conf conversation_prune_safe_zone_tokens:220000/conf context_prune_safe_zone_tokens:2200000/conf index_filter_model_max_input_length:220000 /conf context_prune_safe_zone_tokens:800000 /conf context_prune_sliding_window_overlap:500
5、添加规则文件
在工程项目的根目录\.autocoderrules下添加规则文件mybatis_workflow_rule_cursor.md
规则文件截图如下:
改造模版截图:
改造策略映射:
6、让auto-coder学习并理解改造规则。
7、引用规则,让auto-coder开始对Service类进行改造
AI开始创建todos 列表
生成dao和xml截图:
代码改造替换的日志输出:
改造完成的截图
生成的dao和xml截图:
auto-coder并不是每次都能完美的改造完成一个Service类,有时候会漏掉一些serviceDo的调用改造,所以有时候需要多跑几次,才能完成改造,如果有一两个错误也可以直接用trae或cursor直接进行修复。
另外auto-coder并不能严格按照改造规则执行改造,这可能是我写的Prompt不够精确,也可能是这个工具本身的局限,需要后续持续的实验获取使用经验。
另外auto-coder对上下文的引用还是偏弱,确实比不上cursor的表现。
8、采用auto-coder.run + 批处理脚本,进行批量改造
下面是单次运行模式,可以一次编辑十几个Service类改造,弄个批处理脚本让它按顺序执行,就可以晚上开着电脑让它持续执行代码改造任务:
auto-coder.run --model Doubao-Seed-1.6 "理解mybatis_workflow_rule_cursor.md中的规则,对EmpFlupSynJwService.java 按照[改造步骤] 进行改造"
改造结果与实践心得
在福州持续加班了12天,每天晚上9点离开公司,回酒店继续搞,有时候早上早早起来在酒店搞2个小时再去上班,在6个人的分工下,勉强按时完成了旧项目hibernate转mybatis的改造,这10几天搞下来身心疲惫,这大概只有一种叫做“牛马”物种才愿意干的活吧。
1、个人感觉这是一次冲动的技术改造,旧项目业务逻辑没梳理,AI做旧代码改造的效果没评估,就一股脑地往前冲,给后面的开发留下隐患;
2、因为分工,每个人负责的模块各自生成新的dao,导致相同的Entity对应的dao没有统一管理,造成部分dao方法重复定义,给后续管理和维护造成麻烦;
3、抛开上下文,说AI能帮忙完成80%的开发量那是耍流氓,每个开发任务的背景、环境、复杂程度都不同,AI需要的Prompt也不同,使用人员对AI的把控也不尽相同,不能一概而论;
4、命令行的AI编程工具确实有它的优势,它继承了UNIX系统思想,因此可以调用很多系统集成的工具,并利用管道的形式将一个工具调用的输出作为另一个工具调用的输入,这样极大的利用了系统本身的工具,可以提高一定的生产效率,大概基于这个原因,Claude Code一出来,谷歌也立马跟进开源了Gemini Cli这个工具;
5、IDE的AI编程工具同样也有它的优势,比如你可以选定一个类文件的其中几行代码让AI进行调试,这点cli的工具就不那么方便了,所以在日常开发中可以两种工具搭配使用,用其各自的优势进行开发;
6、有AI的赋能,会让你有一种不知天高地厚的状态,总感觉有很多事情可以去做了,但其实你能力没到那,还是要花很多时间去确认,长期来看它可能会提升很多的效率,但短期来看,这个磨合的过程,我觉得是要付出很多学习成本的。
总之,长期来看AI可以提升很多的效率,但用AI工具有门槛,要利用好AI需要一定的学习成本。
今天就分享到这,下次见
如果本文对你有帮助,不妨点个免费的赞和收藏备用。
👉 添加我的微信(gallop_liu),备注“加群”,交流并分享个人的一些资料。
程序猿的养生茶:
胎菊8颗+玫瑰6颗+枸杞少许
夏天胎菊多一些,枸杞少一些,冬天则相反