AI Coding 实战:2周重构54万行代码,真的吗?

发布时间:2026/6/4 0:52:16

AI Coding 实战:2周重构54万行代码,真的吗? 有人说这是吹水有人说这是给老板递刀子也有人很认真地追问你们到底是怎么做到的说实话有些质疑我都能理解。因为如果换作是我看到10年系统、54万行代码、2周重构完成这几个词摆在一起第一反应大概率也不是“牛”而是这怕不是又一个 AI 神话笑话但问题在于这件事确实发生了他不是 PPT也不是 Demo而是已经灰度、已经上线的系统…所以这篇文章我不想再重复讲AI 有多强也不想把它写成一篇爽文。而是认真的回答四个问题这件事到底是怎么做到的它真正成立的前提是什么它的边界在哪里普通团队能不能复制老板又该怎么理解要注意的是我这边尽量在不透露过多课件特有的知识的情况下真诚的回答。也希望大家在以后的工作中不要对 AI Coding 有太多的误解。无论是神话 AI Coding觉得他无所不能还是妖魔化他觉得在给老板画大饼都是不对的还是建议拥抱他切不可故步自封…2周重构完成首先先把最容易引战的问题说清楚这到底是不是“2周重构完成的”这是评论区里最集中的质疑。因为在很多工程师的理解里重构完成这四个字默认包含的东西很多业务梳理技术方案核心开发回归测试灰度观察线上稳定长尾问题收口…如果按这个口径理解“2周搞定 10 年老系统”确实很像天方夜谭。所以这里我先把口径说清楚两周指的是核心迁移开发 关键行为对齐 基础验证的时间。后续灰度切流、线上观察、零星修复又持续了一周多也就是说这里的“两周重构完成”更准确地说是代码层面的主体迁移在两周内交付完成。而不是说两周之内所有上线后问题、所有隐性分支、所有历史兼容细节都被彻底清空了。只不过虽然这两个说法差别很大。好像前者是一个高压但真实的工程案例后者就很容易变成营销叙事。但是 2周 跟 4周这个事情差异很大吗重构还是翻译整个评论里面我认为最专业的就是这个问题了他是值得讨论的。因为很多人一看到“重构”这个词脑子里想到的是另一种画面重新梳理领域模型重新划分边界重写架构借机修掉历史债务顺便把不合理的业务也整理一遍…如果按这个标准这次项目当然不能算那种理想意义上的大重构。因为我们这次项目最核心的目标从来不是重做一个更先进的系统而是在不改变外部行为的前提下把一套跑了 10 年的 PHP 老系统迁到 Java并把后续维护成本降下来所以更准确一点说这次项目本质上是平迁行为对齐强类型改造工程能力补齐带有局部优化的重构…所以如果你说它是翻译 小部分优化这个说法不算错。但如果只说它是翻译又低估了它的工程含量。因为真正纯翻译不会做这些事把 PHP 的弱类型 Map 全链路替换成 Java DTO把一堆历史逻辑拆成可维护的模块补齐缓存、RPC、序列化、并发的工程约束做双端验证、日志闭环、差异追踪、PHP 同步监控在上线阶段设计灰度和回滚策略所以如果非要找一个更准确的表述我会这样定义这次项目这是一次以平迁为主、以行为一致为约束、以强类型化和工程补齐为核心的重构它不是纯翻译也不是理想化的大重构它更像是一场开着车换轮胎的工程迁移。他可信吗到这里我们才来讨论为什么很多人会觉得这事不可信因为按传统路径这件事根本推不动。你想一下一个运行了 10 年的老系统54 万行 PHP文档缺失自动化测试几乎为零很多逻辑混着业务补丁、历史兼容和临时修复。面对这种系统传统做法一般是先花很长时间理解全貌梳理业务和技术债补测试再逐步开始重构…听起来很合理但现实里经常会死在第一步。因为这类系统最麻烦的地方不是“代码多”而是你根本不知道你眼前看到的这段烂代码到底是在解决一个真实问题还是只是在堆历史屎山很多老系统最危险的不是复杂而是**“复杂且有效”**。这些老系统的很多部分它可能很丑、很绕、很反直觉但它已经在线上跑了很多年。你今天看不懂不代表它没用你今天觉得可以简化不代表简化后不会炸。所以这种系统迁移最容易犯的错误就是还没搞清楚它现在实际上怎么工作就急着把它改成你觉得更合理的样子。而这恰恰是 AI 最爱干的事。AI 很容易在局部看起来很聪明动不动就帮你优化一下顺便简化一下这里可以更优雅但对遗留系统来说很多时候优雅反而是危险的。所以这次项目能推进不是因为我们先理解了整个系统而是因为我们换了一个问题定义方式。改变战局/改变思路这次项目最关键的转折点我认为不是不是先理解代码而是先还原真实行为。我们没有先追求理解这个系统为什么这么设计而是先追求这个系统现在实际上是怎么工作的。换句话说我们把问题从理解意图改成了还原事实。因为对迁移来说最重要的不是你能不能讲清楚当年作者脑子里在想什么而是这个接口输入什么输出什么会经过哪些链路哪些字段必须一致哪些差异其实不重要哪些逻辑是历史兼容不能乱动一旦把问题改写成这个样子事情就从“无底洞式理解系统”变成了“可拆解、可验证、可收敛的工程任务”。这一步非常重要。因为它决定了我们不是在做理解全系统后再编码的项目而是在做一边建立行为基线一边推进迁移一边持续收敛差异这也是为什么两周能够推进。不是因为系统突然变简单了而是因为任务被重新组织了。两周没日没夜很多人其实很好奇那两周你们到底做了什么答案很简单**我们在没日没夜的加班啊**我说的两周跟你说的两周你们以为真的是一回事哦这件事就这么轻轻松松就完成了我 TM 每天工作15个小时还不能吹个牛了…第一周先让系统跑起来第一周的目标非常明确不是优雅不是完美而是让系统先跑起来。这一周我们大概提交了 300 多次日均 45 次左右代码量大概 10 万行核心工作主要有几类一、DTO 改造PHP 老系统大量使用弱类型 Map 传参。迁到 Java 后如果继续保留这种写法代码虽然能“翻”过来但根本不具备长期维护价值。所以第一周我们做了大量 Map → DTO 的转换把原本散乱的参数传递逐步拉回强类型体系。// PHP弱类型 map 传参$params [ goodsId $goodsId, countryCode $countryCode, lang $lang, currency $currency,];$result $this-goodsService-queryGoodsDetail($params);二、核心逻辑批量翻译这一步包括ES 查询层Filter 逻辑缓存层Sticker / 价格 / 颜色等业务处理逻辑这里 AI 起到的作用非常直接吞掉大规模机械翻译劳动。如果没有 AI这一部分会非常耗体力而且极其容易把工程师拉进低质量重复劳动里。三、基础设施补齐除了业务代码基础设施也要一起补ES 模型建立Redis 缓存接入Feign 客户端封装这一步其实很关键因为它决定了你不是在“翻源码”而是在把系统真正迁到另一个可运行的工程环境里。四、第一轮 Bug 修复BUG 当然会很多啦比如序列化问题Final Sale 判断逻辑类型转换错误这一周结束的时候系统的状态大概是它已经可以启动了接口开始有响应了。虽然里面还有很多不够优雅的地方虽然很多地方还是 Map 味很重但至少我们完成了最关键的一步把巨大未知系统变成了可以继续验证和推进的工程对象。紧接着就进入第二周了第二周让系统“跑对”如果说第一周解决的是能不能跑那第二周解决的就是跑得对不对。这一周的提交次数暴增大概 500 多次日均 70 次以上代码量也到了 20 万行以上重点工作主要有1 继续做强类型改造第一周为了抢进度很多地方先保留了中间形态。第二周开始集中清理这些技术债把遗留的 Map 逐步替换成更稳定的 DTO 和强类型结构。2 开始做真正的逻辑对齐这里不是说第一周不对齐而是第一周更像“先让接口跑起来”第二周开始针对那些不一致的地方做逐层核对为什么这个字段类型不一样为什么 PHP 返回了Java 没有为什么顺着查是一样的结果却还是不同3 清理和重构局部结构包括拆解冗长函数清理废弃代码加 PHP 源码映射注释把一些“能工作但很脆”的实现改成更稳定的结构4 补性能优化例如多线程并行多级缓存一些高频请求链路的极致性能优化所以两周下来我们做的并不是“读完系统再重写”而是先把它跑起来再把它跑对再把它逐步拉回可维护状态这是一个很典型的工程推进思路先求活再求准最后再求优。最难的地方对错整体下来我们感受最难的不是写代码而是没有测试你怎么知道它“对”这是评论区里最合理、也最尖锐的质疑之一。因为原系统几乎没有自动化测试零单元测试零集成测试零回归测试如果按传统思路这种项目应该先补测试再动代码。但问题是54 万行代码真按这个路径来项目大概率会死在“理解”和补测试阶段。所以我们换了个思路不用“先理解代码再写测试”这条传统路径改成先建立行为基线再做双端验证一、双端对比同一输入打 PHP 和 Java 两边核心逻辑很简单同一组请求参数同时发给 PHP 老系统和 Java 新系统然后逐字段比对返回值。这个方法的价值在于你不需要先完全理解代码内部每一层是怎么写的你先回答一个更硬的问题对同一个输入这两个系统给出的输出是不是一致只要行为一致迁移就有了基础可信度。二、为什么直接对比不够因为缓存会骗人一开始我们直接对比很快就发现一个问题PHP 和 Java 的缓存数据不同步你直接一比满屏都是差异…这时候如果没有方法论很容易被噪音淹死。所以后来我们把验证拆成两轮***第一轮带缓存请求。***模拟真实用户流量先把所有差异都找出来。***第二轮跳过缓存请求。***只有在第一轮有差异时才触发用来判断差异到底是不是缓存导致的。交叉分析规则是这样的第一轮有差异、第二轮消失 → 缓存差异不是 Bug两轮都有差异 → 业务逻辑差异必须修第一轮没有、第二轮新增 → 缓存掩盖了底层问题这套方法最大的价值就是把差异变成了可解释的差异。差异对比 → 降噪一开始做双端对比时报告里动不动就是几百条差异但后来发现绝大多数都不是真 Bug。比如“1” vs 1“59.00” vs 59.00requestId、traceId_id 的不同生成策略这些差异放在报告里看起来很吓人但其实都不影响业务。真正的痛苦是这些噪音会把真正该修的问题淹没掉。所以我们后来不断补忽略规则把这些PHP 弱类型天然差异、请求级动态字段差异从报告里剔除掉。最后把整个差异对比的信噪比大概从 10% 提升到了 80%。这个数字不是为了显得厉害而是想说明工程验证的关键不只是能不能发现问题而是能不能把问题筛成值得处理的问题。AI 会不会犯错当然会而且会犯得很离谱…如果你真正用 AI 做过复杂工程你一定知道AI 最大的问题从来不是不会写而是太敢写它很容易写出那种局部看起来没问题整体却埋了坑还一副很自信的样子我们这次踩过的坑举几个最典型的。坑一message 变成了 msgJava 默认返回体用 message 字段PHP 用 msg。AI 在翻译时识别到了这个差异但修复方向搞反了结果前端拿不到错误提示。这个 Bug 发现得不算晚灰度 5% 时就暴露出来了修起来也不难10 分钟就搞定。但它给人的警示非常大AI 能看见差异不代表它就知道该怎么处理差异坑二ES 查询明明对了商品数却还是少有一次接口返回的商品数量比 PHP 少。AI 看完 ES 查询逻辑后判断“没问题”人看第一眼也觉得查询条件对得上。结果最后一路 debug 才发现问题根本不在查询而在返回值格式化阶段Java 在组装响应时把一部分商品丢掉了。这个坑直接逼出了后面的核心规则不能只看入口逻辑必须递归追踪到最终赋值的那一行。坑三AI 未经确认直接执行破坏性操作调试某个接口时AI 直接跑了 mvn compile把现场全清了。这一类问题特别像一个“有热情但没边界感”的实习生它不是故意搞你它是真觉得自己在帮忙。所以后来我们把这类行为也写进了规则里任何可能影响编译或运行环境的操作必须先确认不允许未经确认执行破坏性操作不允许顺手优化不允许扩大改动范围好看到这里的一定是真爱粉所以我们给出一点干货方法论管住 AI到这里问题就来了那我们是怎么把 AI 管住的答案可不是一句多写提示词能说清楚的真正有效的是两件事规则Rules 技能SkillsRules把工程师脑子里的常识写成 AI 必须遵守的约束最开始最痛苦的一件事就是每开一个新对话AI 都会重复犯同样的错。比如用反射去处理弱类型自作主张简化逻辑不按项目规范做序列化不走统一 RPC 封装catch 里默认打 warn到处保留 toMap / fromMap后来我们采取了一个非常笨、但非常有效的办法AI 每犯一个重复性错误就补一条规则最后我们沉淀出了一份865 行的规则文件里面没有什么花哨的提示词魔法全是项目里的硬约束。比如 翻译行为约束 - 翻译 PHP 代码时不要应用反射- 全部按照原代码实现不要简化实现- 确保每次实现都完整不允许“剩余逻辑类似省略”- PHP 中是 API 访问的统一封装到 Feign 序列化规范 - 序列化 / 反序列化统一用 JsonUtil- Redis 写入前先 toJson- 读取后必须按约定方式反序列化 性能约束 - 强类型优化全链路不需要 toMap/fromMap- Redis 多 key 场景按项目封装约束实现 工程规范 - catch 中日志统一 error 级别- import 规范统一不允许内联全路径翻译行为约束翻译 PHP 代码时不要应用反射全部按照原代码实现不要简化实现确保每次实现都完整不允许“剩余逻辑类似省略”PHP 中是 API 访问的统一封装到 Feign序列化规范序列化 / 反序列化统一用 JsonUtilRedis 写入前先 toJson读取后必须按约定方式反序列化性能约束强类型优化全链路不需要 toMap/fromMapRedis 多 key 场景按项目封装约束实现工程规范catch 中日志统一 error 级别import 规范统一不允许内联全路径这些规则看起来都不高级很多工程师甚至会觉得这不就是常识吗。但关键就在这里人脑里的常识如果不写出来AI 是不会自动继承的所以加完这套规则之后AI 代码的一次性可用率确实从50%\60%提升到了90%。不是 AI 变聪明了而是它终于被工程纪律管住了。**Skills**把高重复劳动封装成一条命令除了规则我们还把一系列重复性工作做成了 Skills。因为有些事情如果一个人做超过 3 次还在手工操作那大概率就值得自动化了比如/api_diff输入一条命令自动完成构造 PHP / Java 双端请求拉接口响应逐字段对比分类差异输出报告这个 Skill 本质上解决的问题是把手工比 JSON这种低效劳动变成稳定可复用的验证流程。/api_diff US站列表页价格差异/api_diff re-diff US站列表页价格差异对比规则 - 按 goodsId 做主键匹配逐商品对比关键字段 - 关键字段goodsId、title、url、color、price、originalPrice、shipsNow、stickers... - 差异类型value_mismatch / missing_field / type_mismatch忽略规则 - costTime、requestId、traceId - _id - string ↔ number 类型差异交叉分析 - 第一轮有、第二轮消失 → 缓存差异 - 两轮都存在 → 业务逻辑差异需修复 - 第一轮无、第二轮新增 → 缓存掩盖的差异PS篇幅问题后面我就不插入 Skills 示例了/log_investigate输入一行日志或一个关键词自动提取 traceId / 时间 / 类名 / Pod查日志频率定位代码分析根因生成排查记录这个东西的价值也很大每排查完一个问题就多一篇可复用的知识文档。php_sync_check每天自动拉 PHP 最新代码对比 Java 实现发现逻辑分叉。这个 Skill 的出现是因为重构期间老系统还在继续迭代。 如果没有这类同步机制两边很容易越跑越偏。所以回头看这套 Rules Skills 干的其实是同一件事把原本只存在于工程师经验里的东西外化成 AI 可执行的工程系统AI 编程的可验证性很多人看这类案例最容易只盯着一件事代码是怎么那么快写出来的但如果你真的做过线上系统迁移你就会知道写出来只是第一步并且不是很重要的一部真正决定你能不能活着上线的是后面这三件事验证、灰度、回滚验证不是我觉得差不多而是我知道哪里还不一样双端对比、两阶段缓存分析、递归追踪、日志定位这些东西的目的都不是为了显得方法论高级而是为了回答一个最现实的问题上线前你到底知不知道自己还有哪些风险没压下去**灰度**这是修正机会上线前我们设计了完整的灰度方案影子验证 → 小流量灰度 → 分批切流 → 全量替换不是一下子全推而是带着数据一步步往上走。这里最核心的不是勇气而是节奏。复杂系统上线最怕的不是慢而是你没有观察窗口。**回滚**这是命…回滚方案也是提前准备好的而且是按分钟级恢复来设计。很多人会觉得都这么有信心了为什么还强调回滚因为工程不是赌徒游戏并且我们心里其实慌得不行…所以必须有兜底策略我们要确定就算出问题也能把损失控制住来了最终效果还不信的同学们到这里就真的可以坐下了上线效果这个问题也不能靠感觉良好来回答只能靠数据说话。AB 测试结果脱敏数据指标Java实验组PHP对照组差异订单量7,4187,475-0.8%营收差异——-0.6%客单价157 美元149 美元无显著差异结论迁移未对业务指标产生负面影响。灰度状态站点比例状态US 站100%全量上线CA 站80%灰度中当前系统运行状况项目状态回滚情况无回滚P0 故障无日常修复零星对齐修复进行中PHP 仍在改动Java 需同步这里再补一句全量上线至今没有回滚没有出现 P0 级故障仍然有零星的对齐修复在持续进行。对吧可能大家也看到想要的结果了他确实是有 BUG 的对的这不是一次完美翻译而是一次风险可控的迁移复杂系统迁移尤其是还在演进中的老系统不可能用一篇文章就画上句号。后续持续监控、持续同步、持续收口本来就是常态。可复制性如何之前就有粉丝加微信质疑过这件事我统一给的回答就是假的忽悠人的原因很简单没必要去强行改变别人的认知你愿意信自然就会去尝试你不信哪我又何必白费口舌呢但我也有一些担忧的店因为如果有人看完这篇文章只记住了“别人 2 周都能搞定 54 万行你们为什么不行”那这个案例就真的变成给团队递刀子了。所以我必须把前提条件讲得非常明确。1团队不是纯靠 AI核心 4 个人都是有多年经验、熟悉 Java 生态、做过复杂系统改造的人。AI 是提效工具不是替代判断的人。2这是有成本投入的两周大概消耗了 1800 美元9 个 Cursor Ultra 账号主要用的是高性能模型。这不是“免费版随便聊聊”能干出来的活。3系统本身有可收敛性我们迁的是一套相对模块化、电商接口边界比较清晰的系统。如果换成那种盘根错节的单体系统、状态高度隐式传播、上下游依赖一团乱麻的系统难度会高很多。4业务和流程能配合重构期间业务需求没有停。但我们有专门的 PHP 同步检查机制能持续对齐两边逻辑。这件事不是“程序员开干就行”背后其实也需要组织和流程支撑。给老板们的话所以老板们可以从这个案例里获得些什么我最希望老板们学到的不是***“两周”***这两个字。而是下面这句话AI 不是把复杂工程变成了无需经验的体力活恰恰相反它把工程能力的重要性进一步放大了因为 AI 确实能吞掉大量脏活累活批量翻译差异比对日志分析调用链追踪知识沉淀流程自动化但它吞不掉的东西依然非常关键边界判断风险评估规则制定验证设计灰度策略回滚预案对结果负责所以如果老板只看到了效率提升没看到工程纪律和风险控制那大概率会误用这个案例。而一旦误用这个案例带来的就不是效率红利而是组织灾难。我话是说清楚了的你们老板还要乱搞可就不怪我了…结语如果让我用一句话总结这次项目我会这么说AI 省掉的是重复劳动省不掉的是判断力并且有一点特别关键使用 AI Coding 后我乃至我身边的同学都更加的累了AI 并不让我们变得轻松这让我挺气馁的…AI可以在很短时间里把 57 万行 PHP 翻成 22 万行 Java。但它不能告诉你翻得对不对。但这挺重要的。因为他背后是人真正的价值人定义边界人制定规则人做关键判断人设计验证体系人扛最终责任学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关新闻