AI重构实战:两周迁移54万行代码,核心方法论揭秘
近期进行了两次企业AI咨询,发现市场对AI编码(AI Coding)的需求已非常迫切,几乎成为刚需。为此,我们调整了课程重点,并从中提炼部分核心内容,撰写了以下文章: 这些案例均源于真实的生产实践。出乎意料的是,评论区的热烈讨论甚至超过了正文本身。 有人质疑其为夸大其词,有人认为这是在给管理者提供“压榨”工具,也有不少人诚恳地追问:你们究竟是如何做到的?

坦率地说,部分质疑是可以理解的。如果是我初次看到“十年老系统、54万行代码、两周重构完成”这些词汇组合在一起,第一反应恐怕也不是赞叹,而是怀疑:
这该不会是又一个关于AI的神话(或者说笑话)吧?
然而关键在于,这件事确实发生了。它并非PPT演示,也不是概念验证,而是一个已经过灰度测试并上线的真实系统。 因此,本文不再赘述AI能力有多强大,也不打算将其写成一篇“爽文”。我们将认真探讨以下四个核心问题:
- 这件事的具体实现路径是什么?
- 其成功真正依赖的前提条件有哪些?
- 这种方法的边界和局限性在哪里?
- 普通技术团队能否复制?管理者应如何正确理解?
需要说明的是,我们会在尽量不透露过多课程专属细节的前提下,真诚地进行解答。也希望大家在今后的工作中,避免对AI编码产生极端误解。无论是将其神化、认为无所不能,还是将其妖魔化、视为给老板画饼的工具,都是不恰当的。正确的态度是拥抱变化,切勿故步自封。

质疑焦点:真是两周完成的重构吗?
首先,澄清最易引发争议的问题:这算不算是“两周重构完成”? 这是评论区最集中的质疑点。因为在许多工程师的认知中,“重构完成”默认包含了大量工作:
- 业务逻辑梳理
- 技术方案设计
- 核心功能开发
- 回归测试
- 灰度观察
- 线上稳定运行
- 长尾问题闭环
- … 如果按照这个标准来理解,“两周搞定十年老系统”确实像天方夜谭。 因此,我们首先明确口径:
这里的“两周”,特指核心迁移开发、关键行为对齐以及基础验证的时间周期。 后续的灰度切流、线上观察及零星修复,又持续了一周多。
换言之,所谓的“两周重构完成”,更准确的表述是:代码层面的主体迁移工作,在两周内交付完成。 这并不意味着两周内就解决了所有上线后问题、所有隐性分支逻辑以及所有历史兼容性细节。这两种说法差异显著:前者是一个高强度但真实的工程案例;后者则容易沦为营销叙事。不过,两周与四周的时间差异,真的具有决定性意义吗?
项目本质:是翻译还是重构?
整个讨论中,我们认为最专业的问题是:这究竟算重构还是翻译?这个问题值得深入探讨。 因为很多人一看到“重构”这个词,脑海中浮现的是另一幅图景:
- 重新梳理领域模型
- 重新划分服务边界
- 重写系统架构
- 借此修复历史技术债务
- 顺便整理不合理的业务逻辑
- … 若按此理想标准,本次项目当然不能算作那种彻底的“大重构”。 因为我们最核心的目标,从来不是“重做一个更先进的系统”,而是:
在不改变外部行为的前提下,将一套运行了十年的PHP老系统,迁移至Java技术栈,并降低后续维护成本。
因此,更准确地说,本次项目的本质是:
- 平迁(Lift-and-Shift)
- 行为对齐
- 强类型化改造
- 工程化能力补全
- 包含局部优化的重构
- … 所以,如果说它是“翻译 + 小部分优化”,这个说法并不算错。但如果仅仅视其为“翻译”,则低估了其中的工程含量。 因为纯粹的翻译不会做以下工作:
- 将PHP的弱类型Map全链路替换为Java DTO
- 将一堆历史逻辑拆分为可维护的模块
- 补全缓存、RPC、序列化、并发等方面的工程约束
- 实施双端验证、日志闭环、差异追踪、PHP同步监控
- 在上线阶段设计灰度与回滚策略

如果非要寻找一个更精准的定义,我们会如此描述本次项目:
这是一次以平迁为主、以行为一致为约束、以强类型化和工程能力补全为核心目标的重构。
它既非纯粹的翻译,也非理想化的大重构,更像是一场“开着车换轮胎”的工程迁移。
可信度挑战:为什么传统路径行不通?
至此,我们再来探讨:为何许多人觉得此事不可信? 因为按照传统路径,这类项目几乎无法推进。试想一下,一个运行十年的老系统,54万行PHP代码,文档缺失,自动化测试几乎为零,大量逻辑混杂着业务补丁、历史兼容代码和临时修复。 面对这样的系统,传统做法通常是:
- 花费大量时间理解系统全貌
- 梳理业务逻辑和技术债务
- 补充测试用例
- 再逐步开始重构
- … 听起来合理,但在现实中经常倒在第一步。 这类系统最棘手的并非“代码量大”,而是:
你根本无法确定眼前这段糟糕的代码,究竟是在解决一个真实问题,还是仅仅在堆积历史遗留的“屎山”。
许多老系统最危险的特性不是复杂,而是“复杂且有效”。系统的很多部分可能丑陋、迂回、反直觉,但它已在线上稳定运行多年。你今天看不懂,不代表它没用;你觉得可以简化,不代表简化后不会引发故障。 因此,此类系统迁移最容易犯的错误是:尚未弄清系统当前实际工作方式,就急于将其改造成你认为更合理的模样。 而这恰恰是AI最容易犯的毛病。AI在局部看起来非常聪明,动不动就:
- 帮你“优化”一下
- 顺便“简化”一下
- 觉得那里可以写得更“优雅” 但对遗留系统而言,很多时候:“优雅”反而是危险的。 本次项目能够推进,并非因为我们先完全理解了整个系统,而是因为我们换了一种定义问题的方式。
关键转折:从理解意图到还原行为
本次项目最关键的转折点,我们认为不是“先理解代码”,而是先还原“真实行为”。 我们没有首先追求“理解这个系统为何如此设计”,而是首先追求:这个系统目前实际上是如何工作的。 换言之,我们将问题从“理解意图”转变为“还原事实”。 因为对于迁移而言,最重要的并非你能否说清当年开发者的设计思路,而是:
- 这个接口接受什么输入?
- 产生什么输出?
- 会经过哪些处理链路?
- 哪些字段必须严格一致?
- 哪些差异其实无关紧要?
- 哪些逻辑是历史兼容所需,不能随意改动? 一旦将问题重新定义为上述形式,任务就从“无底洞式的系统理解”,转变为“可拆解、可验证、可收敛的工程任务”。 这一步至关重要。它决定了我们不是在执行一个“理解全系统后再编码”的项目,而是在进行:
一边建立行为基线,一边推进迁移,一边持续收敛差异。
这也正是两周能够取得进展的原因。不是因为系统突然变简单了,而是因为任务被重新组织和定义。
高强度交付:两周到底做了什么?
很多人好奇:那两周你们究竟做了什么? 答案很简单:我们在进行没日没夜的高强度工作! 我们所说的两周,与大家通常理解的两周,并非同一回事。 难道这件事是轻松完成的吗?我每天工作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(Elasticsearch)查询层
- 过滤(Filter)逻辑
- 缓存层
- 标签(Sticker)、价格、颜色等业务处理逻辑 在此环节,AI的作用非常直接:吞噬大规模、机械性的代码翻译工作。 如果没有AI,这部分将极其耗费体力,并容易将工程师拖入低质量的重复劳动中。
三、基础设施补全 除了业务代码,基础设施也需同步迁移和补全:
- ES数据模型建立
- Redis缓存接入
- Feign客户端封装 这一步非常关键,它决定了你不是在“翻译源码”,而是在将系统真正迁移到另一个可运行的工程环境中。
四、第一轮Bug修复 Bug当然非常多,例如:
- 序列化问题
- Final Sale(最终销售)判断逻辑错误
- 类型转换错误 第一周结束时,系统的状态大致是:已经可以启动,接口开始产生响应。 虽然仍有许多不够优雅之处,许多代码仍有浓厚的“Map风格”,但至少我们完成了最关键的一步:将一个巨大的未知系统,转变为一个可以继续验证和推进的工程对象。
紧接着,便进入了第二周。
第二周:目标是让系统“跑对”
如果说第一周解决的是“能不能跑”,那么第二周解决的就是“跑得对不对”。

本周提交次数暴增,约500多次,日均70次以上,代码量也达到20万行以上。
重点工作主要包括:
1. 继续深化强类型改造 第一周为了追赶进度,许多地方保留了中间形态(如仍有Map使用)。第二周开始集中清理这些技术债务,将遗留的Map逐步替换为更稳定的DTO和强类型结构。
2. 开始真正的逻辑对齐 并非第一周没有对齐,而是第一周更侧重于“先让接口跑起来”。第二周则开始针对已发现的不一致之处进行逐层核对:
- 为何这个字段类型不一样?
- 为何PHP返回了某个字段,而Java没有?
- 为何顺着链路查询结果一致,但最终输出却不同?
3. 清理与重构局部结构 包括:
- 拆解冗长函数
- 清理废弃代码
- 添加PHP源码映射注释(便于追溯)
- 将一些“能工作但脆弱”的实现改为更稳定的结构
4. 补充性能优化 例如:
- 多线程并行处理
- 多级缓存设计
- 对高频请求链路进行极致性能优化
综上,两周下来,我们并非采用“读完系统再重写”的模式,而是遵循:
先让它跑起来,再让它跑对,最后把它逐步拉回可维护状态。
这是一个典型的工程推进思路:先求存活,再求准确,最后追求优化。
最大难点:如何判定“正确”?
在整个过程中,我们感觉最困难的不是编写代码,而是:在没有测试的情况下,如何知道它“对”了? 这是评论区最合理、也最尖锐的质疑之一。 因为原系统几乎没有任何自动化测试:
- 没有单元测试
- 没有集成测试
- 没有回归测试 若按传统思路,此类项目应先补充测试,再改动代码。但问题是,面对54万行代码,若真按此路径进行,项目大概率会死在“理解系统”和“补测试”阶段。 因此,我们转换了思路:
摒弃“先理解代码,再编写测试”的传统路径。 改为“先建立行为基线,再进行双端验证”。
一、双端对比:同一输入,请求PHP与Java两套系统
核心逻辑非常简单:将同一组请求参数,同时发送给PHP老系统和Java新系统,然后逐字段比对返回值。 此方法的价值在于,你无需事先完全理解代码内部每一层的实现逻辑,而是先回答一个更硬性的问题: 对于相同的输入,两个系统给出的输出是否一致? 只要行为一致,迁移便具备了基础的可信度。
二、直接对比的陷阱:缓存造成的干扰
初期直接对比时,很快发现一个问题:PHP和Java的缓存数据不同步,直接比对会导致满屏差异,全是“噪音”。 此时若缺乏方法论的指导,很容易被噪声淹没。因此,后来我们将验证拆分为两轮: 第一轮:携带缓存的请求。 模拟真实用户流量,找出所有差异点。 第二轮:绕过缓存的请求。 仅在第一轮发现差异时触发,用于判断差异是否由缓存导致。 交叉分析规则如下:
- 第一轮有差异、第二轮差异消失 → 缓存差异,非Bug
- 两轮均存在差异 → 业务逻辑差异,必须修复
- 第一轮无差异、第二轮出现新差异 → 缓存掩盖了底层问题 这套方法最大的价值在于,将“差异”变成了“可解释、可分类的差异”。
差异降噪:从海量报告中提炼真问题
初期进行双端对比时,报告动辄显示数百条差异。但后来发现,绝大多数并非真正的Bug。例如:
"1"(字符串) vs1(数字)"59.00"vs59.00requestId、traceId等请求级动态字段_id等字段的不同生成策略 这些差异在报告中看起来很吓人,但实际上并不影响业务。真正的痛苦在于:这些噪声会将真正需要修复的问题淹没掉。 因此,我们后续不断补充“忽略规则”,将这类 PHP弱类型带来的天然差异、请求级动态字段差异 从报告中剔除。 最终,我们将整个差异对比的“信噪比”,从大约10%提升到了80%以上。 这个数字并非为了显示能力,而是想说明:工程验证的关键,不仅在于能否发现问题,更在于能否将问题筛选成值得处理、必须处理的问题。
AI会犯错吗?当然,而且很离谱
AI当然会犯错,有时甚至会犯得很离谱。
如果你真正使用AI进行过复杂工程开发,你一定会认同:
AI最大的问题,从来不是“不会写”,而是“太敢写”。
它很容易写出那种:
- 局部看起来毫无问题
- 整体却埋下隐患
- 并且表现得非常自信的代码 我们在本次项目中踩过的坑,举几个典型例子:
坑一:message字段变成了msg
Java默认的返回体常用message字段,而PHP老系统使用msg。AI在翻译时识别到了这个差异,但修复方向搞反了,导致前端无法获取错误提示信息。
这个Bug发现得不算晚,在5%灰度流量时就暴露了,修复起来也不难,大约10分钟搞定。
但它带来的警示非常深刻:
AI能“看见”差异,不代表它知道该如何“处理”差异。
坑二:ES查询正确,但返回商品数却变少
某次接口返回的商品数量比PHP端少。AI检查ES查询逻辑后,判断“没问题”;人工第一眼也认为查询条件对得上。 最终一路Debug才发现,问题根本不在查询阶段,而是在返回值格式化阶段:Java在组装响应时,意外丢弃了一部分商品数据。 这个坑直接催生了一条核心规则:不能只看入口逻辑,必须递归追踪到最终赋值的那一行代码。
坑三:AI未经确认,执行破坏性操作
在调试某个接口时,AI直接执行了mvn compile命令,导致整个编译现场被清空。
这类问题特别像一个“有热情但缺乏边界感”的实习生:它并非故意捣乱,而是真心认为自己是在帮忙。
因此,后来我们将此类行为也写入了约束规则:
- 任何可能影响编译或运行环境的操作,必须先获得人工确认。
- 禁止未经确认执行任何破坏性操作(如清理编译产物、重启服务)。
- 禁止“顺手”进行未经授权的优化。
- 禁止擅自扩大代码改动范围。
核心方法论:如何有效“管理”AI?
那么,我们是如何“管住”AI的呢? 答案绝非一句“多写提示词”能概括。真正有效的是两件事的结合:
规则(Rules) + 技能(Skills)
规则(Rules):将工程师脑中的“常识”,编写成AI必须遵守的硬性约束
初期最痛苦的事情之一是,每开启一个新的对话会话(Session),AI都会重复犯同样的错误。例如:
- 试图用反射(Reflection)处理弱类型问题
- 自作主张地简化业务逻辑
- 不遵循项目统一的序列化规范
- 不使用封装好的RPC客户端
- 在catch块中默认打印warn级别日志
- 到处保留
toMap/fromMap这类过渡性方法
后来,我们采用了一个看似笨拙、却极其有效的方法:
AI每重复犯一个错误,我们就补充一条对应的规则。
最终,我们沉淀出一份长达865行的规则文件。其中没有花哨的“提示词魔法”,全是项目中的硬性工程约束。例如:
===== 翻译行为约束 =====
- 翻译 PHP 代码时不要应用反射
- 全部按照原代码实现,不要简化实现
- 确保每次实现都完整,不允许“剩余逻辑类似,省略”
- PHP 中是 API 访问的,统一封装到 Feign
===== 序列化规范 =====
- 序列化 / 反序列化统一用 JsonUtil
- Redis 写入前先 toJson
- 读取后必须按约定方式反序列化
===== 性能约束 =====
- 强类型优化,全链路不需要 toMap/fromMap
- Redis 多 key 场景按项目封装约束实现
===== 工程规范 =====
- catch 中日志统一 error 级别
- import 规范统一,不允许内联全路径
这些规则看起来并不高级,很多工程师甚至会认为“这不就是常识吗”。但关键恰恰在于:
人脑中的“工程常识”,如果不明确地写出来,AI是不会自动继承的。
在加入这套规则体系后,AI生成代码的一次性可用率,确实从50%-60% 提升到了90%以上。 这并非因为AI变聪明了,而是因为它终于被“工程纪律”有效约束住了。
技能(Skills):将高重复性劳动封装为一条条可执行的命令
除了规则,我们还将一系列重复性工作封装成了“技能”(Skills)。
因为有些事情,如果一个人工操作超过3次还在手动进行,那么它很可能就值得被自动化。例如:
-
/api_diff(接口差异对比) 输入一条命令,自动完成:- 构造PHP与Java双端请求
- 拉取接口响应数据
- 逐字段对比差异
- 对差异进行分类
- 输出结构化报告 这个技能本质上解决的痛点是:将手工比对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 类型差异 交叉分析: - 第一轮有、第二轮消失 → 缓存差异 - 两轮都存在 → 业务逻辑差异(需修复) - 第一轮无、第二轮新增 → 缓存掩盖的差异 -
/log_investigate(日志调查) 输入一行日志或一个关键词,自动:- 提取
traceId、时间戳、类名、Pod信息 - 查询相关日志出现的频率
- 定位到具体的代码位置
- 分析可能的根因
- 生成排查过程记录 这个工具的价值巨大:每排查完一个问题,就多了一份可复用的知识文档。
- 提取
-
php_sync_check(PHP同步检查) 每天自动拉取PHP最新代码,与Java实现进行对比,及时发现因老系统持续迭代而产生的逻辑分叉。 这个技能的出现是因为:重构期间,老系统(PHP)的业务需求并未停止。如果没有这类同步检查机制,新旧两套系统很容易渐行渐远。
因此,回看这套 Rules + Skills 体系,它们做的是同一件事:
将原本只存在于工程师经验、直觉和肌肉记忆里的东西,外化为一个AI可以理解、可以执行的工程化系统。
工程核心:可验证性、灰度与回滚
很多人观摩此类案例,最容易只关注一点:代码是怎么那么快写出来的? 但如果你真正负责过线上系统的重大迁移,你就会明白:写出代码仅仅是第一步,而且并非最关键的一步。真正决定项目能否成功上线的,是后续三件事:验证、灰度、回滚!
验证:不是“我感觉差不多”,而是“我清楚哪里不一样”
双端对比、两阶段缓存分析、递归追踪、日志定位等方法,其目的并非为了展示方法论的高深,而是为了回答一个最现实的问题:
在上线之前,你究竟知不知道还有哪些风险未被排除?
灰度:这是修正错误的宝贵机会
上线前,我们设计了完整的灰度方案:
影子验证(Shadow Testing)→ 小流量灰度 → 分批切流 → 全量替换 并非一次性全部切换,而是带着实时监控数据,一步步谨慎推进。这里最核心的不是勇气,而是对节奏的掌控。 复杂系统上线最忌讳的不是慢,而是:你没有观察和反应的窗口期。
回滚:这是最后的生命线
回滚方案也是提前准备好的,并且是按照“分钟级恢复”的标准来设计的。 很多人会疑惑:既然这么有信心,为何还如此强调回滚? 因为工程不是赌徒游戏,而且我们心里其实非常紧张… 因此,必须有兜底策略。我们必须确保:
即使出现问题,也能将损失和影响控制在最小范围内。
最终效果:数据说话
仍有疑问的朋友,请看最终的客观数据。

A/B测试结果(数据已脱敏)
| 指标 | Java(实验组) | PHP(对照组) | 差异 |
|---|---|---|---|
| 订单量 | 7,418 | 7,475 | -0.8% |
| 营收差异 | — | — | -0.6% |
| 客单价 | 157 美元 | 149 美元 | 无显著差异 |
| 结论:本次迁移未对核心业务指标产生负面影响。 |
灰度状态
| 站点 | 切流比例 | 状态 |
|---|---|---|
| US 站 | 100% | 已全量上线 |
| CA 站 | 80% | 灰度进行中 |
当前系统运行状况
| 项目 | 状态 |
|---|---|
| 回滚情况 | 无回滚 |
| P0 级故障 | 无 |
| 日常修复 | 零星的对齐修复仍在进行中(因PHP端仍在改动,Java需持续同步) |
在此补充一句:自全量上线至今,未发生回滚,未出现P0级故障。 当然,零星的对齐修复工作仍在持续,这是迁移仍在演进的遗留系统的常态。
是的,大家可能也看到了想要的结果:它确实存在Bug。 这正是关键所在:
这不是一次完美的翻译,而是一次风险可控的、成功的工程迁移。
对于复杂系统迁移,尤其是一个仍在持续演进的老系统,不可能用一篇文章就画上完美的句号。后续的持续监控、同步、问题收口,本就是工程工作的一部分。
可复制性探讨:普通团队能否效仿?
此前已有读者通过微信质疑此事的真实性,我们统一的回应是:这是假的,忽悠人的!
原因很简单:没必要强行改变他人的认知。你愿意相信,自然会去尝试;你不信,我也无需白费口舌。
但我们也有一些担忧。如果有人读完本文,只记住了:“别人两周能搞定54万行,你们为什么不行?” 那么这个案例就真的变成了给技术团队施加不合理压力的“刀子”。因此,我们必须将成功的前提条件阐述得非常明确。
1. 团队并非“纯靠AI”
核心团队有4名成员,均为拥有多年经验、熟悉Java生态、并处理过复杂系统改造的工程师。 AI是提效工具,而非替代人类判断的决策者。

2. 存在明确的成本投入
两周大约消耗了1800美元,使用了9个Cursor Ultra账号,主要调用高性能模型(如GPT-4级别)。 这不是“用免费版随便聊聊”就能完成的工作。

3. 系统本身具备“可收敛”特性
我们迁移的是一套相对模块化、电商接口边界较为清晰的系统。 如果换成那种盘根错节的单体巨石应用、状态高度隐式传播、上下游依赖混乱的系统,难度会呈指数级上升。
4. 业务与流程能够配合
重构期间,业务需求并未暂停。但我们建立了专门的PHP同步检查机制,能够持续对齐新旧两套逻辑。 这件事并非“程序员埋头苦干就行”,其背后也需要一定的组织协调和流程支撑。
给管理者的启示
那么,管理者可以从这个案例中获得什么? 我最希望管理者学到的,不是“两周”这个时间数字,而是下面这句话:
AI并未将复杂工程变为无需经验的体力活;恰恰相反,它将工程能力的重要性进一步放大了。
因为AI确实能“吞噬”大量脏活、累活:
- 批量代码翻译
- 自动化差异比对
- 智能日志分析
- 调用链追踪
- 知识沉淀与复用
- 流程自动化 但它“吞不掉”的东西,依然至关重要:
- 边界判断与决策
- 风险评估与控制
- 规则与规范的制定
- 验证体系的设计
- 灰度发布策略
- 回滚预案制定
- 对最终结果负责
因此,如果管理者只看到了“效率提升”,而忽视了“工程纪律与风险控制”,那么大概率会误用这个案例。
一旦误用,这个案例带来的将不是效率红利,而可能是组织灾难。
话已说清,若管理者仍要乱用,可就怪不得我了…
结论与展望
如果要用一句话总结本次项目,我会说:
AI节省的是重复性劳动,节省不掉的是人类的判断力。
并且有一个特别关键的点:使用AI编码后,我和身边的同事普遍感觉更加疲惫了。AI并未让我们变得更轻松,这让我颇感气馁… AI可以在极短时间内,将54万行PHP“翻译”成22万行Java。但它无法告诉你:翻译得对不对。 而这恰恰至关重要。因为它凸显了人类在工程中的核心价值:
- 人定义工程边界。
- 人制定规则与规范。
- 人做出关键的技术与业务判断。
- 人设计验证与质量保障体系。
- 人承担最终的责任。
AI编码已不仅适用于编写Demo、补全函数或创建简单页面。 在约束清晰、边界明确、验收方式可执行的前提下,它已经能够参与相当一部分真实的、复杂的软件交付工作了。
AI编码的时代,确实已经到来。