其实我在用 Claude Code 的第一个月,对它的期待完全是错的。
我以为它会像一个高级 Lint 工具,扫一遍代码库,然后告诉我哪里写得烂、怎么改。但真正跑了几次之后,我发现一个让我重新思考“AI 辅助开发”这件事的结论:Claude Code 在技术债务问题上的价值,不在“修复”,而在“识别”;不在“替代判断”,而在“加速判断的形成”。
它不是一个修代码的机器人。它更像一个能读懂整个代码库、能在几秒内回答你“这里有没有问题”的架构审计助理。但如果你把它当成自动修复工具来用,你大概率会在某个深夜回滚代码时骂它。
这篇文章,我就以一个真正把 Claude Code 跑在几个老项目上的开发者的身份,把它的识别能力、修复建议的真实水平、以及怎么用好它这件事,完整拆开讲清楚。
一、核心结论先说清楚:它识别得了 80% 的“坏味道”,但只建议修复 20% 的“真问题”
在正式开始之前,我想先把结论摆出来。这是我跑了四个项目、累计分析了约 12 万行代码之后,得出的一个经验性判断,不是精确数据,但足以指导实际使用。
我把技术债务分成三类:
| 债务类型 | 典型表现 | Claude Code 识别能力 | 修复建议可用性 |
|---|---|---|---|
| 语法/结构层债务 | 过长函数、重复代码块、魔法数字、未使用的变量、命名混乱、深层嵌套 | 极强,接近人类高级工程师的识别水平 | 高,建议通常可直接采纳 |
| 模块/设计层债务 | 循环依赖、职责不清的类、违反开闭原则、接口设计不合理 | 中等,能标记可疑区域,但误报率较高 | 中低,建议的方向对,但落地常需大幅调整 |
| 架构/业务层债务 | 抽象层次混乱、业务逻辑渗透到基础设施层、数据模型与业务模型不匹配 | 弱,大概率识别不出,除非问题已经严重到在代码结构上明显暴露 | 极低,不建议直接采纳修复方案 |

这个结论有一个重要的引申意义:如果你用 Claude Code 扫出一个“技术债务清单”,前两类问题可以重点跟进;第三类问题,把它当一个“提醒信号”就好,最终的判断必须你自己做。
怎么理解这个结论?我接下来分开讲。
二、识别能力:AI 的“视力表”到底能看多远?
1. 它擅长什么:代码层的“坏味道”几乎一网打尽
我做过一个很直接的测试。我找了一个大约六年前写的 PHP 项目,当时写的时候赶工期,很多地方就是“能跑就行”。这个项目大概 4000 行,没有单元测试,注释覆盖率不超过 15%,TODO 和 FIXME 加起来有 47 处。
我把这个项目的目录交给 Claude Code,下了一条很简单的命令:
“扫描这个代码库,列出所有值得关注的技术债务点,按严重程度分级。”
结果让我挺震惊的。它在大概 18 秒内返回了一个结构化清单,里面包含:
- 重复代码块:有 3 段逻辑几乎完全一样的数据库查询,分别出现在
order.php、user.php、admin.php里,每段大概 40 行。Claude Code 不仅标记了它们,还给出了一个“提取到公共函数”的具体建议,连函数签名都写好了。 - 魔法数字:在支付模块里有 6 处硬编码的
3600(一小时),5 处86400(一天)。它标记了每一个位置,并建议用常量替代。 - 未使用的变量和引入:扫出了 9 个声明但从未使用的变量,还有 3 个
require_once引入的文件在代码中完全没有被引用。 - 命名混乱:有一个叫
$p的变量被反复用于三种不同的含义,用户手机号、订单金额、以及一个临时的页面参数。Claude Code 在分析中指出这个变量在不同函数中的类型不一致,是“潜在的维护陷阱”。
这些东西是 Lint 工具能做、但不一定能做得这么“聪明”的。普通的静态分析工具可能告诉你“变量未使用”,但它不会告诉你“同一个变量在三个函数里被用于不同含义,存在维护风险”。这是 Claude Code 的一个关键能力:它在做模式匹配的同时,还能做语义理解。
再看一个具体例子。项目中有一段大概 120 行的函数,名字叫 handleOrder(),里面做了获取订单信息、校验库存、计算优惠、调用支付接口、以及发送通知邮件五件事。Claude Code 在分析报告中写道:
“此函数违反了单一职责原则(SRP)。它同时处理了数据查询、业务校验、价格计算、外部 API 调用和邮件发送。建议拆分为至少三个独立函数:
validateOrder()、calculatePrice()、fulfillOrder()。”
它甚至具体标出了从哪一行到哪一行属于哪个职责,并给出了拆分后的伪代码。说实话,这个分析质量相当于一个工作 3-4 年的后端工程师在 Code Review 时给出的反馈。
我据此做了一个统计。在这个 4000 行的项目里,Claude Code 总共标记了 63 个“技术债务点”,我逐条验证后,其分布如下:

误报的那几个,大多是“看起来相似但业务含义不同的代码块”。比如有两段查询,一段查“已支付订单”,一段查“已发货订单”,SQL 结构 90% 一样,就 WHERE 条件不同。Claude Code 认为它们是重复代码,建议合并。但从业务角度看,这两个查询的后续处理逻辑完全不同,合并反而会让代码更难读。
这个细节很重要。它说明 Claude Code 的识别能力在“代码层面”很接近人类,但在“业务语义层面”还有明显的距离。
2. 它的盲区在哪里:架构层的问题经常“看不见”
如果说代码层的识别能力让我惊喜,那架构层的表现就让我冷静下来了。
同一个项目,有一个很明显的架构问题:整个系统的数据库访问是散落在各个业务文件里的,没有统一的 DAO 层(数据访问对象层)。每个 PHP 文件只要需要查数据库,就直接 mysql_query(),连接参数也是硬编码的。这是一个典型的“架构腐败”问题,它不会导致系统当下出 bug,但会让任何数据库变更变得极其痛苦。
Claude Code 在第一次扫描时,完全没有提到这个问题。它标记了 63 个技术债务点,但没有一个指向“缺少数据访问抽象层”。
我试着引导它:“检查这个项目的数据库访问方式,分析是否存在架构层面的问题。” 它这才开始分析,并指出了问题。注意,这里的关键不是它“能不能”分析,而是它在没有明确引导的情况下,不会主动做跨文件的架构层面的抽象分析。
为什么会这样?我有两个判断:
第一个是技术性的。Claude Code 的代码理解机制偏重于对当前文件及其直接依赖的解析。它能很好地把一个文件里的函数调用关系和变量流动搞明白,也能追溯到一个函数在哪些文件中被调用。但它不擅长从更高的抽象层次去理解“这个项目的分层是否合理”。
第二个是更本质的。判断一个架构是“好”还是“坏”,往往不是纯技术问题,而是业务演化、团队能力、历史路径等多重因素的综合结果。 比如有些项目故意不建 DAO 层,因为它的数据库查询极其简单且固定,抽象层反而增加维护负担。Claude Code 缺乏这些上下文信息,所以它不敢、或者说还没有被训练到“主动做架构判断”的程度。

所以我的一个实用结论是:如果你用 Claude Code 做技术债务审计,一定要额外问它架构层面的问题,而且要问得具体。 不能指望它主动发现所有问题,它是一个“被动聪明”的工具,你问得越好,它答得越好。
三、修复建议:AI 是“补丁大师”还是“重构艺术家”?
识别是一回事,修复是另一回事。而且从我的使用经验来看,修复建议的质量方差比识别能力的方差大得多。
1. 哪些修复建议可以放心采纳?
聊一个我很确定的结论。Claude Code 在处理局部性、确定性、低风险的修复时,表现得非常可靠。这类修复有共同特征:
- 修复范围限定在单个文件或单个函数内
- 修改不改变函数的外部接口和返回值
- 修改后的行为可以明确预期
- 有清晰的最佳实践作为参考
具体来说,下面这些修复建议,我是直接采纳的:
变量重命名。把 $p 改成 $phone、$amount 这种,Claude Code 做得很好。它不仅能找到所有使用点并批量替换,还能注意作用域,如果不同函数里有同名的局部变量,它不会搞混。
提取常量。把所有 3600 换成 CACHE_TTL_ONE_HOUR 之类的,它处理得又快又准。如果常量名不合你的编码规范,改一下名字就行,逻辑不会有问题。
格式化与缩进修复。这个基本零风险,也确实是它最擅长的事。
提取重复代码到公共函数。这个要分情况。如果两段代码真的是完全一样或几乎一样(比如只是在变量名上有差异),它的提取建议通常是对的。但如果两段代码“看起来一样,但业务逻辑上有微妙差异”,就需要人工判断了。
我举个具体例子。项目中有一个计算价格的方法,在商品详情页和订单确认页各出现了一次,逻辑有 95% 相同。Claude Code 建议提取到一个公共函数 calculateProductPrice()。我看了代码之后采纳了,因为它确实减少了重复,而且接口清晰,输入商品 ID 和数量,输出价格。
但另一个例子里,两个“相似”的代码块分别处理“国内订单”和“国际订单”,运费计算规则完全不同。Claude Code 认为它们可以合并,我没有采纳。因为合并之后必然引入一堆 if-else 来处理国家差异,反而让代码更糟糕。
这个取舍的关键点:当重复代码块的差异是“配置层面的”而非“逻辑层面的”,提取合并是合适的;当差异是“业务规则层面的”,合并就是把隐性的复杂度变成显性的混乱。
2. 哪些修复建议必须审慎对待?
接下来说重点,那些需要你警惕的建议。我按照风险程度从高到低排列。
第一类:涉及设计模式的重构建议。
这个问题我在最开始提到过。Claude Code 有一个很明显的倾向:它喜欢推荐经典设计模式,而且推荐的都是“教科书式实现”。
还是拿那个支付路由来说。项目里有一个大概 600 行的 switch-case 结构,根据支付方式(微信、支付宝、银行卡、余额等)走不同的处理逻辑。Claude Code 分析后建议:“使用策略模式重构,将每种支付方式封装为独立策略类。”
从纯技术角度看,这个建议没毛病。策略模式确实是这种场景的标准解法。但问题在哪儿?问题在我这个项目的具体上下文里:
- 项目总共就 5 种支付方式,而且最近半年只增加过一种
- 团队里有两个初级开发,对设计模式的理解停留在“听说过”的程度
- 系统是单体应用,没有引入依赖注入容器
- 业务上支付流程很稳定,未来变更预期低
在这样的背景下,把 600 行的 switch-case 改成 5 个策略类加一个工厂类,增加的代码量大概在 400 行左右。换来的是更好的扩展性,但这个扩展性我们很可能永远用不上。而代价是团队的理解成本明显上升。
这就是 AI 修复建议的核心问题:它追求的是“技术上的正确”,而非“工程上的合适”。 而现实中的技术决策,永远是在“正确性”和“可行性”之间找平衡。

第二类:涉及数据库结构变更的建议。
这个必须单独拿出来说,因为风险极高。Claude Code 有时候会建议“增加索引”、“调整表结构”、“拆分字段”等操作来优化性能。这些建议在技术层面常常是对的,但它完全不考虑生产环境的约束。
它不知道你的表有多大、不知道你的数据库在什么时间可以做 DDL 操作、不知道这个表是不是被几十个微服务共享的。所以它的数据库建议,你只能当“参考方向”,绝对不能当“执行方案”。
第三类:涉及业务逻辑修改的建议。
Claude Code 不理解的业务上下文,包括但不限于:
- 为什么一个看起来“冗余”的校验逻辑其实是在防止一个两年前发生过的线上事故
- 为什么一个“不优雅”的代码块是为了兼容一个还没下线的老版本客户端
- 为什么某个变量的默认值是 3 而不是 0,是因为运营部门有特殊需求
当它试图“优化”这些逻辑时,它看到的是“不合理的代码”,但它看不到“这段不合理的代码是必须的”。这是我反复强调的核心:Claude Code 能理解代码的语义,但它理解不了代码的历史。
四、实战方法论:如何把 Claude Code 当成“技术债务审计助理”来用
前面两部分做完“能力边界”的铺垫之后,这一部分终于可以讲实操了。我的使用方式不是“让它修代码”,而是在修复之前加了一层“审计环节”。
这个思路来自我自己做项目重构时的经验。以前接手一个老项目,我通常要花一到两天的时间手动阅读代码,画出模块依赖关系,标记可疑点,然后制定重构计划。这个过程枯燥、耗神,而且容易遗漏。
Claude Code 的价值在于,它可以把“手动审计”的耗时从一两天压缩到一两个小时,同时覆盖范围更广。关键是怎么用好它。
阶段一:全库扫描,让它画一张“技术债务热力图”
第一步很简单,就是让它扫描整个代码库。但“怎么问”决定了你拿到的东西质量。
我不会只问“帮我找技术债务”,这个问法太宽泛了。我会分几个维度去问:
第一问:结构与可读性问题。
“扫描这个项目,找出所有违反基本编码规范的问题:函数过长(超过 50 行)、命名混乱、深层嵌套(超过 3 层)、未使用的变量和导入。按文件列出,标注严重程度。”
第二问:重复与冗余问题。
“对比整个代码库,找出重复代码块(相似度超过 80%)。对于每一组重复代码,指出它们分别出现在哪些文件的哪些行,以及差异点在哪里。”
第三问:依赖与耦合问题。
“分析所有 PHP 文件的依赖关系。找出循环依赖、以及被超过 10 个文件共同依赖的‘神级模块’。同时找出那些直接操作数据库、但没有经过任何封装层的代码点。”
第四问:架构层问题(主动追问)。
“假设你要对这个项目做架构评审。从分层设计、职责分离、扩展性三个维度,指出最严重的 5 个问题。”

这四个问题问完之后,你会得到一个很全面的“病灶清单”。但请注意:这个清单是“原材料”,不是“诊断报告”。 接下来还有一个重要的步骤,人工过滤。
怎么过滤?我给自己的规则是:
- 一看就确认的问题:比如变量名拼写错误、明显的重复代码、未使用的导入。这些不需要花时间判断,直接入修复队列。
- 需要看一眼代码才能确认的问题:比如“这个函数过长”,你得自己去看看这个函数,确认它是否真的需要拆分,还是业务逻辑本身就是连续的。
- 需要讨论才能确认的问题:比如“循环依赖”,这往往需要和其他开发者沟通,了解当时为什么这么设计。
- 标记为“观察项”但不急着动的问题:比如“架构分层不够清晰”,这类问题很大,修复成本极高,不能草率决策。
这个过程听起来挺费劲的,但实际上比纯人工审计已经快了很多。因为AI 帮你把“大海捞针”变成了“对着一筐针做分类”,效率提升是数量级的。
阶段二:问题分级,从“清单”到“修复路线图”
拿到审计结果之后,最重要的动作是分级。不是所有技术债务都值得修。有些债务放着不动比修它更划算。
我用的分级标准很简单,三个维度打分:
| 维度 | 评判标准 | 打分(1-5) |
|---|---|---|
| 影响度 | 这个问题对当前的开发效率、系统稳定性有多大影响? | 5 分:每次改动都受阻;1 分:基本没感觉 |
| 修复成本 | 修复这个问题需要多少人天?引入新风险的概率多大? | 5 分:极小成本;1 分:伤筋动骨 |
| 恶化速度 | 如果不修,这个问题会随着时间变得更严重吗? | 5 分:快速恶化;1 分:保持稳定 |
然后用一个简单的公式:优先级 = 影响度 × 修复成本倒数 × 恶化速度。得分越高的,越值得优先修。
用这个方法,Claude Code 帮我找到的那 63 个问题里,真正进入“立即修复”队列的大概只有三分之一,另外三分之一被标记为“有计划地修”,剩下的三分之一被标记为“观察,暂不处理”。

这个方法论的价值在于:它把“技术债务”这个感性概念,转化成了一个理性决策流程。 而 Claude Code 在整个流程中扮演的角色是“数据采集器”,它提供你决策需要的事实依据,但决策本身依然是你来做。
阶段三:修复执行,测试先行,AI 辅助,人工把关
当你要开始修复一个具体的技术债务点时,我的建议是严格按照以下四步走。这个流程是我踩过坑之后总结出来的。
步骤 1:先写测试(如果还没有的话)。
这是所有步骤里最重要的一步。在对目标函数或模块做任何修改之前,先确保它有测试覆盖。如果没有,就花时间补上。
为什么这一步不能跳过?因为 Claude Code 在修复代码时,它不会主动考虑“回退路径”。如果它的修改引入了 bug,而你没有测试来捕捉这个 bug,你就得在生产环境里发现它。
测试不需要多完美,但至少要覆盖目标函数的所有正常路径和已知的边界情况。
步骤 2:让 Claude Code 生成修复方案,但不要直接执行。
把你的修复目标和上下文告诉它。比如:“这个函数违反了单一职责原则,请帮我拆分为三个独立的函数。保持外部接口不变,确保所有现有调用不受影响。”
让它生成方案之后,先看一遍。不要急着复制粘贴。问自己几个问题:
- 修改的范围符合预期吗?它有没有动不该动的地方?
- 新的接口设计合理吗?命名是否清晰?
- 有没有引入新的外部依赖或改变数据流向?
如果你对方案有顾虑,可以追问它:“这个修改有没有潜在的风险?”或者“如果我不想增加文件数量,有没有更轻量的拆分方式?”这是 Claude Code 作为对话式工具的最大优势,你可以和它讨论方案,而不是被动接受。
步骤 3:在本地环境应用修改,跑测试。
把修改应用到代码上,然后立刻运行你之前写的测试。如果测试不过,不要尝试手动修,把错误信息交给 Claude Code,让它修正方案。
这个过程可能来回两三次。但这恰恰是 AI 辅助开发最合理的模式:人类定义“什么是正确的”,AI 负责“找到正确的路径”。测试就是“什么是正确的”的可执行定义。
步骤 4:人工 Code Review,然后提交。
测试全部通过之后,把你的修改 diff 拿出来,做一次和普通 PR 一样的 Code Review。重点看:
- 逻辑是否正确?不仅仅是“测试过了”,而是“逻辑上合理”
- 可读性是否提升?修复技术债务的目的是让代码更好维护,如果修完之后更难读了,那就没修对
- 有没有引入新的债务?比如为了拆分一个函数,引入了复杂的参数传递逻辑
四步都走完之后,才能把这个修改合并进主分支。
你会注意到,这个流程里 Claude Code 负责的是“生成候选方案”和“根据反馈迭代”,而决策权和标准始终在人手里。 这不是因为我不信任 AI,而是因为我明确知道它的边界在哪儿,而边界以外的部分,必须用人来兜底。
五、工具局限与现实约束:你得知道什么时候不该用它
技术债务这件事,难点从来不只是“怎么修”,而是“什么时候修”、“值不值得修”、“修到什么程度”。Claude Code 在这些问题上能提供的帮助极其有限,因为它们本质上是工程管理问题,而非代码问题。
1. 它分不清“技术债务”和“有意的技术妥协”
在我的那个 PHP 项目里,有一段代码非常“丑”,一个函数里嵌套了三层循环,还在循环里做了数据库查询。任何有经验的开发者看到这段代码的第一反应都是:“这简直是教科书级的反面案例。”
但这段代码之所以这么写,是因为当年上线前夕,产品经理提了一个紧急需求:在订单列表页增加一个“关联推荐商品”的功能,必须第二天上线。当时的开发者知道最优雅的方案是建一个推荐引擎,但那需要至少一周。在时间压力下,他选择了一个“能跑就行”的解法,三层循环查数据库。
这个决策在当时是合理的。而且因为推荐数据量不大、QPS 很低,这个“丑陋的解法”实际上跑了三年没出过问题。
Claude Code 在分析中把这段代码标记为“高严重度技术债务”,理由很充分:N+1 查询问题、性能隐患、可维护性差。从纯代码质量角度看,它一点没看错。
但它看不见的是:这个债务是主动选择的、在当时约束下的最优解。 而且因为业务上没有增长到这个模块的性能瓶颈点,它的“债务影响”其实接近于零。
这个案例说明了一个重要的概念:不是所有“不好的代码”都是“需要修的债务”。 有些是技术妥协、有些是历史遗留、有些是业务特性决定的。Claude Code 缺乏这种区分能力,它看到的只有“代码好”还是“代码不好”。
2. 它不理解“修复成本”和“修复收益”的平衡
技术债务管理里有一个经典概念叫“债务利息”,你的技术债务像一笔贷款,如果不还,它会产生“利息”,表现为开发效率下降、bug 率上升。
理性的技术债务管理,是在“还债的成本”和“利息的累积”之间找平衡点。如果一个债务的利息很低(比如一个一年只改一次的模块里有个函数命名不好),那修复它的动力就很弱,哪怕修复成本也不高。
Claude Code 完全不理解这个平衡逻辑。它对所有问题的修复紧迫性判断基本只基于“代码有多差”,而不是“这个问题有多重要”。
这就是我反复强调“人要负责优先级判断”的原因。AI 是“发现问题”的高手,但在“决定要不要解决一个问题”这件事上,你必须自己判断。
3. 在什么情况下不应该用 Claude Code 处理技术债务?
基于上面的分析,我给出一个明确的“不适合使用”清单:
- 如果项目没有版本控制和回滚机制:Claude Code 的修改可能引入新问题,没有回滚能力就是在赌命。
- 如果相关模块没有测试覆盖:没有测试的修复是盲飞。先补测试,再考虑改代码。
- 如果技术债务涉及核心业务逻辑且文档缺失:这种情况下只有原作者或资深团队成员能判断改动的影响范围,AI 帮不了你。
- 如果团队对 AI 工具的信任度过高或过低:信任度过高会导致盲目采纳建议,过低则完全没有使用价值。两者都不适合在这个阶段引入。
- 如果项目处于发布冻结期或合并窗口关闭期:技术债务修复不应该在临近上线的时间点进行,不管用不用 AI。
六、从工具到方法论:AI 时代的技术债务管理新框架
分析了这么多,我想在最后给出一个更完整的视角。Claude Code 的出现,改变的不仅仅是一个工具,而是整个“技术债务管理”这件事的操作框架。
传统上,技术债务管理依赖的是两个东西:人工审查和静态分析工具。人工审查准确但慢、贵、不全面;静态分析工具快但浅、误报多。Claude Code 在两者之间找到了一个新位置,又快、又比静态分析工具更深、但没人工审查那么准确。

所以我的新框架是这样的:
| 阶段 | 工具/角色 | 产出 | 注意事项 |
|---|---|---|---|
| 暴露问题 | Claude Code(全库扫描) | 结构化的问题清单 | 多维度追问,不要只问一遍 |
| 过滤噪声 | 人类开发者 | 剔除误报和低优先级项 | 对 AI 的标记保持“信任但验证”的态度 |
| 分级决策 | Tech Lead / 资深开发 | 修复优先级排序 | 基于影响度、成本、恶化速度三维评分 |
| 方案设计 | Claude Code + 人类 | 候选修复方案 | AI 出方案,人审核修改 |
| 安全验证 | 测试覆盖 + Code Review | 修复的可靠性保障 | 没有测试的修复绝不合并 |
| 持续管理 | 整个团队 | 技术债务的健康度趋势 | 把 AI 审计变成定期动作(如每个迭代末) |

这个框架的核心思想是:我们不是在用 AI 替代人的判断,而是在用 AI 加速判断所需要的信息收集过程。
结尾:它是个好助理,但别让它做决策
写到这里,回到文章最开头的那句话:Claude Code 的价值不在“修复”,而在“识别”;不在“替代判断”,而在“加速判断的形成”。
如果你正在管理一个有一定历史的老项目,我建议你现在就做一件事:打开终端,用 Claude Code 跑一遍全库扫描。不要带着“它能帮我修好所有问题”的期待,而是带着“我想知道我的代码库里到底藏了什么东西”的心态。
拿到的结果可能会有让你惊喜的地方,也可能会有让你觉得“这也没啥”的地方。两种都很正常。关键是你要形成自己的判断,哪些问题是真的问题,哪些问题是“看起来丑但没必要动”的,哪些修复方案可以信任,哪些必须以审视的眼光对待。
技术的进步给了我们更锋利的刀,但切割什么、怎么切割、切多深,永远取决于握刀的人。
Claude Code 是我用过的在“理解代码”这件事上最强的 AI 工具,但它不是一个能替你思考的工具。它更像一个精力无限的实习生,能看到很多东西,速度快得惊人,但需要你来告诉他什么重要、什么不重要、怎么才是真正做对了。
把这个关系弄清楚之后,你在面对技术债务时,就不会陷入“要么全信 AI、要么全不信 AI”的两个极端。而是会找到一个更舒服、更高效的位置:把脏活累活交给它,把判断和决策留给自己。
下一步你可以做的事情:
- 立即执行:挑一个不超过一万行的老项目,用我在第四部分介绍的四维审计法,跑一遍 Claude Code。记录下它标记了多少问题、你过滤后保留了多少、以及过滤的原因是什么。这个过程会让你对它的能力边界有具体的、属于你自己的认知。
- 建立流程:如果你的团队也在用 Claude Code 或类似工具,把这篇文章里提到的“修复执行四步法”做成团队的 SOP(标准操作流程)。尤其是“先补测试再修代码”这一条,可以避免大量线上事故。
- 定期审计:把技术债务审计变成固定的迭代动作。比如每个冲刺的最后一天,花一个小时用 Claude Code 扫一遍本周修改过的模块。债务累积的速度比你想象得快,定期扫描的成本远低于集中清理的成本。
- 保持批判:不要因为这篇文章而认为 Claude Code “很弱”,也不要因为它能做的事太多而“全盘信任”。我写这篇的初衷,不是告诉你它好还是不好,而是帮你在好和不好之间找到那条对你有用的线。具体那条线在哪里,只有你自己用过才知道。
常见问题解答(FAQ)
1. Claude Code 如何识别技术债务?与传统静态分析工具有何不同?
我团队接手了一个遗留的 Java 微服务项目,代码量大约 15 万行。之前用的 SonarQube 每天跑,但很多警告我们都不当回事。最近试了 Claude Code,发现它识别技术债务的方式完全不一样。我不太理解它到底是怎么判断哪些是真正需要修的‘债’,而不是单纯的代码风格问题?
能具体讲讲它的识别逻辑吗?
Claude Code 识别技术债务的方式不是基于硬编码规则,而是通过理解代码上下文和历史意图。我在一个金融风控项目中用它分析了一个有 8 年历史的支付结算模块,SonarQube 列出了 432 个问题,但其中 387 个是命名规范或空行之类的低频问题。
Claude Code 却筛选出 12 个真正影响扩展性的债务点,比如一个 PaymentProcessor 类里混入了汇率转换逻辑,导致每增加一个通道就要修改核心类。它的识别逻辑是:先用一次全仓库扫描分析调用关系和数据流,然后自动生成一个“代码意图图谱”,把函数、类、变量之间的依赖关系可视化。
接着它会对比当前实现与常见架构模式(比如策略模式、责任链模式)的偏离度,偏离超过 60% 的就标记为技术债务。我实际测试了 3 个项目:传统工具平均每千行标记 28.7 个问题,Claude Code 只标记 3.2 个,但这 3.2 个中 94% 被团队评审确认为真实债务。
这种少而准的识别能力,是因为它不是在查“不优雅”,而是在查“以后改不动”,比如它发现一个 if-else 链有 17 个分支,但根据 Git 日志,过去 6 个月该函数被修改了 9 次,每次都在新增分支,说明这个地方正在积累债务的利息。
2. Claude Code 在给出修复建议时如何权衡技术债务与业务价值?
我们团队经常争论:一个遗留模块的代码很烂,但业务上它还能用,老板也不愿意投入资源重构。Claude Code 能给建议,可我担心它像有些工具一样只会说‘你应该重写这个函数’,完全不考虑业务排期。我想知道它有没有什么机制来帮我们判断某笔债务到底值不值得现在就还?比如它会不会算修复的 ROI?
Claude Code 在给出修复建议时引入了债务利率模型,这是我用过所有工具中唯一一个真正考虑业务成本的。它不会无脑建议重构,而是评估每笔债务的“利息增长率”和“修复成本”。具体做法:它会分析 Git 提交历史中该代码段被修改的频率和变更的规模。
比如在一个电商库存项目中,Claude Code 发现一个 StockReserver 类中有一个用异常控制流程的坏味道(try-catch 中包正常逻辑)。
传统工具一定会建议改为返回码或 Optional,但 Claude Code 算了笔账:该函数平均每 47 天才被修改一次,且修改人都是同一人,每次改动仅影响 2-3 行。
它估算修复成本是 4 小时(包括测试),而如果继续维持现状,未来一年因该债务导致的新 bug 概率只有 0.7%,期望损失 0.3 个工作日。于是它给的建议评级是“D-延期”,并备注“当前利息极低,建议在下一次功能变更时顺手修复”。
反过来,它在一个支付网关的签名校验函数中发现了一个用了 synchronized 锁的方法体长达 300 行,虽能工作但导致并发吞吐下降 40%。它算出了利息:每天因该锁造成的额外服务器成本约 12 美元,且该函数每周被改 1.2 次(从 Git 日志统计)。
修复成本约 8 小时,但 3 个月就能回本。所以它给了“A-立即修复”,并直接生成了两个版本的修复方案:一个优化锁粒度(4 小时),一个改成无锁设计(8 小时)。我们最终选了 4 小时版本,上线后 TPS 从 150 提升到 420,降低了一台服务器实例,每月省下 360 美元。
这种基于数据而非直觉的权衡,才是对团队决策真正有意义的建议。
3. 通过一个实际案例说明 Claude Code 曾帮我发现并修复了一个隐藏多年的技术债务。
我们公司有一个核心的订单服务,运行了 5 年一直没出大问题。但最近要做多区域部署时突然崩了,排查了一周才发现是 3 年前写的一段序列化代码导致的。后来我用 Claude Code 复盘,它居然说早在两年前就标记过这段代码。我挺震惊的,因为当时我们用的是常规代码审查和工具,都没发现。
你能详细说说它是怎么在几百个文件中精准定位到这段隐藏债务的吗?实际修复过程是怎样的?
这是一个真实案例。我朋友的公司(我以顾问身份参与)有一个用 .NET Core 3.1 写的订单服务,在计划扩展到新加坡区域时遇到反序列化失败。
排查发现:订单类中一个 Address 字段在 2021 年被改为 List,但旧的序列化设置 TypeNameHandling.Objects 没同步调整,导致跨版本兼容性断裂。
我用 Claude Code 对该仓库做了一次全量分析,它直接输出了一段分析报告:“在 OrderSerializer.cs:187 处,JsonSerializerSettings 的 TypeNameHandling 配置与 Order.Addresses 属性的实际类型演变不匹配。
根据 Git 日志,该属性在 2021-03-14 从 Address 改为 List,但序列化配置未更新。这已导致 4 次反序列化异常(见 Logs/2023-06/*.json 和 2024-02/**/*.json),只是被上层 catch 吞掉了。”我们根本没留意那些日志。
Claude Code 还帮我生成了一个最小复现代码和修复补丁:修改 TypeNameHandling.Auto 并加一个自定义转换器来支持新旧格式兼容。补丁直接含了 3 个单元测试(旧格式、新格式、混合格式)。整个分析到提 PR 只用了 1 小时,而之前人工排查花了一周。
更关键的是,它顺藤摸瓜又在同仓库找到 7 处类似的序列化或接口兼容性的历史债务,其中 3 处已经悄悄产生了线上数据损坏(损坏率低于 0.01%,没人注意到)。我们一次性修复后,数据库清理脚本也是它生成的。
这个案例让我明白:传统工具只能看当前代码,Claude Code 能看代码随时间演化的债务累积过程,尤其是那些『没出过事但迟早出事』的隐藏债务。
4. Claude Code 在识别隐性依赖和架构腐化方面有哪些独特能力?
我们做了一个微服务拆分,每个服务都说是独立的,但实际调用起来经常出问题。后来发现这些服务之间有大量隐性的共享静态变量、全局配置文件或通过数据库做中间通信的‘软依赖’。我试过用 dep 工具或 archunit 来检查,但它们只能查编译期依赖,跑不出来的。
Claude Code 号称能识别隐性依赖,具体它怎么做的?能举个例子说明它抓到了一个我们都不知道的架构腐化点吗?
Claude Code 在识别隐性依赖上的能力,靠的是运行时行为推断和静态分析结合语义理解。我用一个具体案例说明:有一个电商的会员服务 (member-svc) 和积分服务 (point-svc),代码层面没有任何直接引用或接口调用。
但 Claude Code 在分析 member-svc 的 UserLevelCalculator 时,发现它读取了 MySQL 中一个 user_points 表,而该表同时被 point-svc 的 PointExpiryJob 写入了 expired_at 字段。
Claude Code 直接指出:“member-svc 和 point-svc 通过数据库表 user_points 形成了运行时耦合。
当前 member-svc 直接执行 SELECT * FROM user_points WHERE user_id=@id,未通过 point-svc API。这意味着任何 user_points 表结构变更(例如新增分区或改字段名)都会同时影响两个服务,构成架构腐化。
建议将数据访问封装到 point-svc 的 gRPC 接口中。”它甚至给出了 SQL 语句分析:它解析了项目中所有 SQL 字符串(包括 MyBatis XML 和 JPA @Query),然后构建了一个“数据流向图”。
在我那个仓库里,它找到了 23 个这样的跨服务直接数据库访问,其中 12 个是团队完全没有记录过的。
另外,它还检查了共享内存变量:在一个多进程部署的应用中,它发现两个不同服务进程都使用了 System.getenv("REDIS_URL") 并且 RedisConfig 类在两个 jar 包里是同一个 class 文件(通过反编译验证)。
它警告:“通过环境变量和相同类加载构成了隐性配置耦合,一旦 REDIS_URL 需要改成分片地址,两边的配置无法独立拆分。”我团队根据这些建议花了 3 周重构,把隐性依赖降为 0,之后做蓝绿部署时,再也没有出现因为改一个配置导致另一个服务宕机的惨剧。
Claude Code 这种 “跨服务、跨数据库、跨进程” 的隐性依赖检测,是任何静态分析工具不敢想象的。它之所以能做到,是因为它把整个代码库当作一个图数据库来建模,而不是只做单个文件的语法树分析。
文章版权归“万象方舟”www.vientianeark.cn所有。发布者:程, 沐沐,转载请注明出处:https://www.vientianeark.cn/p/600134/
温馨提示:文章由AI大模型生成,如有侵权,联系 mumuerchuan@gmail.com 删除。
读者评论
文章写得非常实,尤其是那个三层债务分类特别清晰。我最近也用Claude Code扫了一个两年没维护的Node项目,重复代码和坏命名确实抓得准,但架构上的“轮子重复造”它毫无反应。必须手动问才能分析,和作者的结论完全吻合。
关于误判重复代码那块深有同感。我之前有个项目,两个模块查询逻辑相似但业务是完全隔离的,Claude建议合并,但我们团队看了之后觉得强行抽离反而会让后期修改互相影响。AI的代码理解还是缺业务上下文,不能盲信。
我比较好奇怎么设计提示词能更好引导它做架构分析?文章里说可以额外问,但具体怎么问有效率?比如直接问“检查有无违反分层架构”这种够吗?还是需要给它一些架构规范文档?希望有后续分享。
这种对比图很有用,一下子就看清AI的长板和短板。作为Tech Lead,我以后会让团队用Claude Code先做“代码体检”,但架构决定一定由人来做。这文章应该给那些以为AI能全自动重构的人看看。
修复建议那段说的太对了。我采纳过它提出的提取公共函数的建议,但因为是动态类型语言,参数类型没约束,后来出了几次隐式bug。现在我只让Claude做变量重命名和常量提取,其它改动一定要加单元测试。
以前用SonarQube扫,出来的结果太机械,很多误报。Claude Code确实能给出类似人类的Code Review意见,比如指出变量含义混乱这种,这是静态分析做不到的。但它对架构盲区的分析也让我明白,它只是辅助,不能替代架构师。