一、先给出结论:别再问“该不该还”,要问“还哪一笔”
做了十五年研发管理,我见过最危险的信号,不是技术债务本身,而是团队对技术债务只有两种态度:要么视而不见拼命堆功能,要么隔三差五喊“还债”要求停下手头一切来重构。这两种极端都不对。

先给你一个直接结论:大部分技术债务不需要专门“还”,但必须被管理。什么情况下才需要投入专门资源去还?当且仅当它能通过一个我称为“研发资产回报率”的检验,这个等会儿我会展开讲。
我可以先说几个硬数字,来自我过去三年在三个团队做过的实际度量:
- 一个40万行代码的电商后端系统,我们扫描出约 23% 的模块存在明确的技术债务信号(圈复杂度超标、重复代码率超过8%、依赖链深度超过6层)。
- 但真正对业务有实质性拖慢的、需要专门排期去处理的债务模块,只占债务总量的约 15%。
- 剩下的 85%,我们选择“不专门还”,而是在正常功能迭代中渐进式处理,结果每个迭代的维护性工作只占整体产能的 12% 左右,业务交付速度几乎没有受到影响。
这就是为什么我说:技术债务不应该是一个“要不要还”的道德问题,而是一个“在哪一笔上下注回报率最高”的资产配置问题。

二、背景:那些喊“还债”最凶的时刻,往往是最不该还的
先讲一个我自己踩过的坑,这件事彻底改变了我对技术债务的看法。
2017年,我在一家SaaS公司负责支付结算系统。当时团队接手了一个已经跑了三年的老模块,代码质量一言难尽:一个Service类写了4800行,if-else嵌套最深到7层,核心结算逻辑居然被三个不同的开发者用三种不同的货币精度处理方式实现过。每次上线都要祈祷别出事故。
团队的声音非常一致:“必须停下来重构,再堆功能这系统要崩。”我当时也认同这个判断,于是找CTO争取了整整一个迭代、两个迭代,前后六周的时间,来做一次“彻底的重构”。
结果呢?重构本身是成功的,代码质量指标大幅改善。但当我们回过头来复盘时,发现了一个残酷的事实:这六周的时间里,业务方被我们推迟了三个关键功能的交付,直接导致当季续费率下降了 2.3 个百分点。而那套重构后的代码,因为后续业务方向调整,在一年后被整体迁移到了新的结算引擎上,重构的成果几乎全部作废。
这不是技术团队做错了什么,而是我们混淆了“做对的事”和“在正确的时间做这件事”。那套旧代码虽然烂,但它在业务上是可以撑六个月的。我们本该用旁路策略逐步替换核心路径,而不是一刀切停下来重写。
后来我跟很多研发管理者交流,发现这不是孤例。很多人都有类似的经历:团队喊“技术债务太重了”的时候,管理者一旦做出“停业务、还债务”的决策,最后往往两头不讨好,业务方觉得研发在“浪费时间”,研发团队觉得管理层“不重视技术”。
我后来总结出一个规律:团队喊得最响的“必须还债”时刻,往往是信息最不对称的时刻。一线工程师感受到的是代码的痛苦,而管理者需要看到的是业务影响的全貌。二者之间如果没有一套共同的评估语言,就永远只能吵架。
三、最难的不是还不还,而是你和团队对“技术债务”的定义完全不同
在讲具体方法之前,我想先处理一个更底层的问题。多年来我给十几个团队做过研发效能咨询,发现一个反复出现的情况:当团队成员在讨论技术债务时,他们说的往往是三件完全不同的事。
我把这些情况总结成了一张表,你可以对照一下自己的团队:
| 谁在说 | 通常指的是什么 | 潜台词 |
|---|---|---|
| 一线开发 | “这段代码写得烂,我看不懂,我想重写” | 维护体验差,审美不满 |
| 技术Leader | “这个架构决策当年是错的,现在改不动了” | 扩展性受限,架构约束 |
| 管理者/PM | “上线速度越来越慢,事故越来越多” | 交付效率下降,稳定性风险 |
这三种视角都很真实,但它们指向的问题和需要的解法完全不同。如果管理者不加分辨地响应“还债”呼声,极有可能把钱花在解决审美问题上,却错过了真正的业务风险点。
所以我把技术债务重新定义为三类,每一类的管理策略都不一样。这个框架比Martin Fowler的经典四象限更偏向实操决策,也是我在多个团队中反复验证过的:
1. 审美债务:它让你难受,但不致命
特征:代码不符合团队约定的风格、变量命名不统一、部分逻辑可以用设计模式重构成“更优雅”的写法、测试覆盖不充分但核心路径有保障。
这类债务的特点是影响范围局部、对业务稳定性几乎没有直接冲击、但会持续消耗开发者的心智能量。一个典型场景是:新加入的同事看老代码,需要花更多时间理解,但这时间是可以接受的(比如比正常多花20%)。
我在管理上一个支付团队时做过实验:把系统里圈复杂度超过15的方法全部列出来,一共178个。然后问团队一个问题:“如果这些方法在未来三个月内完全不改,哪个会出线上故障?”最终大家能指出的高风险方法只有9个。剩下的169个,就是典型的审美债务,不好看,但死不了人。
审美债务的核心管理策略:不专门还,随迭代自然消亡。规则很简单:任何人只要因为功能修改碰了这块代码,就必须让它在原有基础上变干净一点,哪怕只是改一个变量名、拆一个方法。这种“营地法则”在三个月内能自然清理掉大约40%的审美债务。
2. 结构债务:它让你改不动,还会传染
特征:模块间不合理的耦合、错误的抽象方向、数据模型设计缺陷导致每次需求变更都要绕路实现。
结构债务是真正值得管理者高度关注的债务类型。它的标志性症状是:一个看似简单的需求,开发估时却远超预期。比如“加一个字段”,居然要改三个服务、五个表、两个中间件配置,这就是结构债务的典型表现。
我在一家电商公司亲身经历过一个案例:运费计算逻辑被耦合在了订单聚合服务里,导致每次促销活动要改运费规则时,开发团队都苦不堪言。这个模块的变更失败率(部署后触发回滚或热修复的比例)长期维持在行业危险线以上。后来我们花了三周时间把运费计算拆成独立服务,虽然那三周只交付了这一件事,但后续该模块的变更效率提升了将近三倍,变更失败率从23%降到了4%以下。
结构债务的核心管理策略:分批手术,但不休克疗法。对于影响业务迭代速度的结构债务,要专门排期处理,但每次只处理一个子系统,而不是全盘重写。
3. 风险债务:它可能明天就炸,而且你赌不起
特征:安全漏洞、数据一致性风险、依赖的底层组件已EOL(End of Life)、核心路径单点故障。
这类债务没有讨论空间。只要被识别出来,必须立即处理,而且通常需要停止部分业务需求来保障修复资源。
我曾经有一个惨痛教训:一套结算系统的对账模块依赖了一个过时的消息队列客户端版本,团队一直知道要升级,但因为“业务需求太紧”拖了将近八个月。结果有一天,消息队列服务端升级后不再兼容旧客户端协议,导致当天的对账全部中断,财务团队加班到凌晨三点手动对账。最终这起事故的直接业务损失是3个小时的结算延迟,但间接伤害是财务团队对研发团队的信任度断崖式下跌。
风险债务不存在“还不还”的问题,只有“多快还”的问题。

四、什么时候该还?三个问题帮你做出决策
理解了债务分类之后,接下来的问题就是:具体到某一笔债务,怎么判断它是否值得投入专门资源去处理?
我不建议用传统的“ROI计算”来评估,因为在软件工程中,你很难在动手之前精确量化重构的收益。我使用的是一套更实用的“三个如果”决策框架,过去五年里它帮我在至少二十次“还不还”的争论中快速对齐了各方认知。
1. 问题框架一:如果不还,系统还能撑多久?
这个问题看似粗糙,但极其有效。具体做法是:把关注的债务模块拿出来,召集最熟悉这块代码的两到三个工程师,做一个简短的“存活评估”。
评估维度很简单:
- 事故风险:未来三个月内,这块代码出线上P0/P1级事故的概率有多少?如果评估结果超过30%,就进入高优先级。
- 性能退化:如果业务量在当前基础上增长50%,这块代码会先于其他模块成为瓶颈吗?
- 人力依赖:如果这块代码的唯一维护者离职,团队需要多长的接手时间?
这三个维度的评估不需要精确数字,但需要共识。我用的做法是让每个参与者独立打分(1-5分),然后看分歧最大的维度,那往往就是信息最不对称的地方,值得深入讨论。
有一次我们用这个方法评估一个老旧的报表生成模块,三个人对“事故风险”的评分分别是1、3、5。追问后发现,打5分的工程师是因为知道一个隐藏的数据竞争条件,而其他两人不知道。这个信息的暴露直接推动了该模块被排入下一迭代的重构计划。
2. 问题框架二:如果投入资源还,会牺牲什么?
这是许多技术Leader容易忽略的一步。还债不是免费的,你付出的不只是工程师的时间,更是这段时间内原本可以交付的业务价值。
具体操作:让产品负责人列出一份“如果这个迭代不还债,我们最想交付的两个功能是什么”,然后让技术团队评估还债所需的工作量。如果还债会导致一个高价值功能推迟上线,那么这个还债决策就需要上升到更高的管理级别来做权衡。
我在SaaS公司时确立过一个机制:任何超过5人天的还债任务,必须附带一份“机会成本说明”,写清楚如果不做这个还债,这段时间可以用来交付什么。这个机制不是为了阻止还债,而是为了让还债决策从感情驱动变成信息驱动。
3. 问题框架三:有没有比“还”更聪明的选项?
这是我的决策框架中最核心的一个问题,也是竞品文章很少覆盖的视角。

很多时候,面对腐烂的代码,团队只能想到两种选择:A. 继续在上边堆功能(忍);B. 停下来重构(还)。但实际上还存在 C 选项:旁路策略。
什么是旁路策略?简单说就是:不碰旧代码,而是在其外围建立新的、干净的抽象层,把核心业务逻辑逐步迁移过去。旧代码只要还能跑,就让它继续跑,直到自然消亡。
我在支付系统重构中就吃过没有用旁路策略的亏。如果当时采用旁路策略,完全可以:
- 新建一个独立的结算服务,实现新的结算逻辑。
- 通过路由层把新交易的结算流量切到新服务。
- 旧服务只处理存量未结算订单,不再新增功能。
- 等旧服务的存量自然归零后(通常3-6个月),直接下线。
这样做的好处是:业务交付不受影响,还债风险被隔离,而且万一新服务有问题可以随时切回旧服务。
旁路策略不一定适用于所有场景,但它应该是你在做出“专门还债”决策之前,必须要考虑过的一种选项。

五、怎么度量技术债务?先放下SonarQube
我早期管理技术债务时,也掉进过一个坑:过度依赖代码扫描工具。SonarQube、Checkstyle、ESLint这些工具当然有用,但它们测量的是代码质量的代理指标,而不是技术债务本身。就像你不能只用血压计来评估一个人的整体健康状况一样。
后来我建立了一套更贴近业务影响的度量体系,分享给你。
1. 变更痛苦指数
这是我自己命名的一个指标,简单但非常有效。对于系统中的每个核心模块,记录它最近十次需求变更的平均交付周期。
举个例子:同样是“加一个筛选条件”这种级别的需求,在模块A上平均需要1.2天,在模块B上平均需要4.7天。这个差距本身就是技术债务的量化体现。模块B的高交付成本,就是债务的“利息”。
我在一个项目里用这个指标识别出了一个被严重低估的债务模块:一个看起来平平无奇的用户权限模块,其上每个小变更的平均交付周期是其他模块的3.8倍。深入分析后发现,该模块的权限判断逻辑被分散在了七个不同的微服务里,而且没有统一的抽象层。这个发现直接推动了后续的架构治理。
2. 变更失败率
这是DevOps领域很常见的指标,但我想强调它在技术债务管理中的特殊价值。变更失败率高的模块,往往就是代码质量已经恶化到“一碰就碎”的程度。
我设定的警戒线是:如果某个模块的变更失败率连续三个迭代超过15%,就必须启动深度评估。低于这个阈值,可以维持渐进式清理;超过这个阈值,说明代码的结构债务已经严重到影响交付稳定性了。
3. 知识浓度
这是我特别想强调的一个维度,因为它经常被忽略。所谓知识浓度,指的是一个模块被多少个人真正理解。如果某个核心模块只有一个工程师能改,那这个人一旦离职,整套系统的维护成本会瞬间飙升,这就是一笔隐藏的、巨大的人因技术债务。

我要求每个核心模块至少有两个人能独立维护。如果达不到,就必须安排知识传递,包括文档、结对编程或内部培训。这类活动不直接修改代码,但它们在降低风险债务。
| 度量维度 | 测量方式 | 警戒阈值 | 对应债务类型 |
|---|---|---|---|
| 变更痛苦指数 | 同类需求在不同模块的交付周期对比 | 差距超过2倍 | 结构债务 |
| 变更失败率 | 模块部署后回滚或热修复的比例 | 连续三迭代超过15% | 结构债务/风险债务 |
| 知识浓度 | 模块的唯一维护者数量 | 低于2人 | 风险债务(人因) |
| 事故频率 | 模块关联的P0/P1事故数 | 月均超过0.5次 | 风险债务 |
这套度量体系的好处是:它不需要引入复杂工具,用现有的项目管理和监控系统就能跑起来。你不需要买新的SaaS产品,不需要建数据中台,只需要一个技术Leader每周花半小时拉几个数字而已。
六、具体该怎么做?一套可以即用的操作手册
有了前面的判断框架和度量方法,接下来讲最实用的部分:你在下周一就可以开始做什么。
1. 第一步:花一个下午做一次“债务快照”
不需要追求完美,不需要花几周时间搞全面评估。你只需要一个下午,召集核心开发人员,对着系统架构图,把每个核心模块贴上标签:A(有毒,碰不得)、B(拖慢但不致命)、C(看着烦但没事)。
动作很简单:找一面白板,贴上系统模块清单,给每个参与人发三种颜色的便签,红色代表“这模块让我很焦虑”,黄色代表“不太好但能忍”,绿色代表“我不担心”。每个人独立贴完后,重点关注红色便签集中的模块。那些模块就是你应该立即着手评估的候选对象。
我在上个团队第一次做这个事时,只用了一个半小时,就锁定了一个所有人一致标红的模块,它正是后来被证实为“致命毒瘤”的那个支付回调处理模块。
2. 第二步:建立“偿债比例”而非“偿债迭代”
我不建议单独设立所谓的“还债迭代”或“重构迭代”。我的做法是:在每个正常的迭代中,固定预留一定比例的产能用于技术债务治理。
根据我的经验,这个比例在10%-20%之间是比较健康的。太低(比如5%)起不到实际作用,太高(比如30%)会影响业务承诺。我过去带的一个业务压力较大的团队,刚开始只留了8%,发现连审美债务的自然消亡速度都赶不上,后来调整到15%后,债务总量才实现了缓慢下降。
重要的是:这15%不仅是“还债”的时间,更是团队的心理安全空间。工程师知道:我不需要在赶工和写烂代码之间二选一,因为我有固定的时间额度来把代码变好。
3. 第三步:让每一次变更都比来的时候干净一点
这是营地法则的核心,我再强调一次因为实在太好用了。规则很简单:任何修改了一个文件的人,有义务让他在原有基础上至少做一个小改进。改进可以是:加一条缺失的单元测试、把一个又长又难懂的方法拆成两个短方法、更新一段过时的注释。
这些微小的改进看起来不起眼,但累计效果惊人。我统计过一个项目:使用了这个策略六个月后,团队在没有做任何专门重构的情况下,系统圈复杂度超过20的方法数量下降了31%,测试覆盖率提升了12个百分点。
关键是管理者要把这条规则正式化。比如在代码评审时,如果某次提交只改了功能没有任何小改进,reviewer可以理直气壮地问一句:“这次有没有什么顺手能变好的地方?”是问,不是要求。这会让渐进式清理成为团队的肌肉记忆。
4. 第四步:给每一笔“专门还债”的动作挂上业务语言
这是我经历过多次跨部门沟通后总结出来的关键技巧。当你需要向业务方或更高管理层解释为什么要花两周时间重构某个模块时,不要说“降低圈复杂度”或“解耦依赖”,要翻译成业务听得懂的话。

我用过的话术包括:
- “这次重构后,以后促销活动的运费规则调整可以从三天变成半天。”(翻译的是:解耦运费计算逻辑)
- “如果不处理,下个大促期间这个模块有比较大的概率扛不住峰值。”(翻译的是:性能瓶颈风险)
- “我们把这个模块整理一遍,目的是让新同事两周就能接手,而不是像现在这样需要两个月。”(翻译的是:降低知识浓度风险)
当管理者开始用业务语言与技术团队沟通时,技术债务就从“工程师的抱怨”变成了“共同面对的业务风险”。

七、不同处境下的不同选择
理论说完了,我再给几个更落地的场景判断。因为在真实世界里,“还不还”取决于你的公司处于什么阶段、团队有多大规模、业务压力有多大。我给三种典型情况分别给出建议。
1. 早期创业公司:容忍更多债务,但画好止损线
早期阶段的核心目标是找到产品市场匹配(PMF),速度就是生命线。在这个阶段,技术债务是合理的、甚至是必要的战略选择。我见过很多从大厂出来的技术负责人,在创业公司里一上来就搞架构治理、搞代码规范、搞CI/CD流水线,这些东西本身没错,但它们占用的是团队最稀缺的资源:时间。
早期阶段的策略:
- 允许有意产生债务:只要团队在产生债务时是清楚自己在做什么的(而不是无意的、鲁莽的),那就是合理的权衡。
- 守住底线:即使赶速度,也必须保证三条底线不破,支付安全、数据不丢、核心流程可回滚。
- 记录但不处理:建立一个简单的“债务台账”,把已知的债务点记下来,但不投入资源去处理。等到PMF验证之后,再回过头来评估哪些债务真的需要还。
2. 成长期公司:开始建立偿债节奏
这个阶段公司已经有了稳定的业务流和一定体量的用户,系统开始出现“改不动”的征兆。此时最危险的信号是:交付速度在肉眼可见地下降,但团队找不到一个明确的瓶颈,这通常是结构债务全面显现的预兆。
成长期的策略:
- 启动度量:建立本文第五部分提到的度量体系,开始追踪变更痛苦指数和变更失败率。
- 固定偿债比例:在每个迭代中锁定12%-18%的产能用于债务治理。这个比例要写进迭代计划,而不是“如果有时间就还”。
- 优先处理结构债务:选择拖慢迭代速度最严重的一到两个子系统进行专项治理,而不是全盘清洗。
- 引入架构委员会:一个轻量的机制,每月一次、两小时的会议,由核心开发者和架构师共同审视系统中的结构问题,避免债务在不知不觉中恶化。
3. 成熟期/遗留系统:用旁路策略逐步替换
面对一个已经跑了五年、十年甚至更久的遗留系统,全盘重写几乎永远是坏主意。那些老系统虽然代码烂,但它们身上挂着太多你以为不存在但实际很重要的边界逻辑。这些逻辑往往是在无数次线上事故中修补出来的,文档早已遗失,只有老员工脑中有记忆。

成熟期的策略:
- 绝不“大爆炸”重写:我见过一个项目,打算用一年时间重写一套运行了八年的ERP系统,结果一年半后项目取消,浪费了超过两千万的成本。
- 采用绞杀者模式:新功能全部在新系统上开发,通过API网关或路由层把流量逐步切到新系统。旧系统只读不写,慢慢萎缩。
- 投资自动化测试:在开始任何重构之前,先给旧系统的核心路径补上端到端测试。这是你重构时的安全网,没有它就别动旧代码。
- 保留老员工:那些在老系统上摸爬滚打多年的工程师,身上的知识是无价的。不要让他们觉得“旧系统被抛弃,我是不是也要被抛弃了”,而要让他们成为新系统建设的核心力量。

八、最容易被忽视的一笔账:不还债也在付利息
在我见过的技术债务争论中,支持“不还”的一方最常使用的论点是:“现在业务压力大,还债没有直接产出,等忙过这阵子再说。”这个论点的问题在于,它假设了不还债的成本为零。

实际上,技术债务每一天都在产生利息。这个利息表现为:
- 开发效率的隐形损耗:工程师在新需求上直接写代码的时间和花在理解老代码、绕开老坑、修复耦合问题上的时间。这块通常不会单独被记录,但它真实存在。
- 新人入职的沉默成本:系统越烂,新人上手越慢。一个新人从入职到能独立交付的时间,在干净系统上可能是3周,在债务沉重的系统上可能是8周。这5周的差距,就是你在支付利息。
- 事故风险的隐含溢价:变更失败率高的系统,每次上线都是一次赌博。虽然不是每次都会出事故,但事故的概率在持续上升。
我在一个团队里做过一次实验:找了两个规模相似、业务复杂度相近的子系统,A系统债务程度低(主要模块变更痛苦指数在1.5以下),B系统债务程度高(变更痛苦指数平均3.2)。然后统计了三个月内两个系统上完成的需求点数,结果A系统交付了47个需求点,B系统只交付了29个。差距将近40%,这就是技术债务在偷偷吃掉你的产能。
所以“不还”不是免费的,只是账单还没来。好的管理者不是去争“还不还”,而是去计算不同策略下的总持有成本。
九、文化问题:还债不是一个技术决策,而是一个组织信任度的试金石
我想最后讨论一个问题,这个问题超越了技术层面,但它是所有技术债务问题的底色。
当一个团队持续积累技术债务而不做任何治理,其后果不只是代码变烂。更深层的伤害是:它向整个工程团队传递了一个信号,“我们不在乎质量”。
这个信号一旦被接收到,会发生三件事:
- 优秀工程师的离职加速:在乎代码质量的工程师会感到职业挫败感,他们觉得自己不是在创造而是在补锅。这类人的离开往往是安静的,但损失巨大。
- 留下的工程师逐渐“躺平”:如果所有人都知道写好写坏没区别,为什么还要花额外精力把代码写好?这种心态一旦蔓延,债务问题会加速恶化。
- 团队陷入“消防员模式”:系统越来越脆弱,线上事故越来越频繁,团队把越来越多的时间花在救火上,用于主动建设的时间被进一步压缩,这是一个标准的恶性循环。
所以我想说的是:管理者对待技术债务的态度,本质上传递的是你如何看待工程师的劳动。你不需要还掉每一笔债,但你需要让团队看到你在主动管理它、在做出合理的权衡、在保护那些写好代码的人不被劣质代码拖垮。
一个具体建议:把“还债行为”纳入绩效评估。不是量化“你重构了多少行代码”,而是看“你是否在你负责的模块中建立了债务可见性和治理节奏”。奖励那些能够在不牺牲业务交付的前提下系统性降低债务风险的工程师,而不是那些默默忍受烂代码然后某天突然离职的人。
十、总结:你不需要还掉所有债务,但你需要一个债务总监
回到标题的问题:《研发管理中的技术债务该不该还?》
我的最终答案是:不是该不该的问题,而是你打算怎么管理它。技术债务是战略杠杆,不是道德污点。
差的研发管理者对待技术债务只有两种姿势:闭眼(无视)或者掀桌(全盘重写)。好的研发管理者懂得:
- 区分三种债务,用不同的策略对待。
- 用“三个如果”做决策,而不是凭感情喊口号。
- 用营地法则和固定偿债比例建立可持续的治理节奏。
- 用业务语言而不是技术语言向上沟通债务风险。
- 用度量而不是感觉来追踪债务的演变趋势。
如果你今天只能做一件事,我建议你做这个:召集核心开发者,用本文第六部分第一步的方法,花一个下午做一次“债务快照”。你不需要完美的工具、不需要外部咨询师、不需要申请额外预算。你只需要一面白板、三种颜色的便签、和你的团队坐下来,诚实面对你们正在承受的痛苦。
知道了哪些债真正在伤害你,你就已经比80%的研发管理者走得更远了。接下来,不过是做出选择和坚持执行而已。
常见问题解答(FAQ)
1. 技术债务到底该不该还?我的团队现在被压得喘不过气来了。
我们团队为了赶项目进度,代码越写越乱,现在每加一个功能都要翻半天旧代码。老板总是说先上线再说,可我感觉再这样下去整个系统都要崩了。我该强硬要求还债,还是继续忍受?
这个问题背后其实是一个权衡:短期交付 vs 长期健康。我的判断是:不是所有技术债务都需要立即还,但必须区分哪些是‘高息债务’,哪些是‘低息债务’。我经历过一个项目,核心支付模块因为赶时间用了过时库,后来每次安全审计都暴雷,修复成本是当初“借债”成本的10倍以上。
那笔债务就是高息,不还,它会持续吞噬安全、效率和新功能上线速度。而有些非核心的展示层代码,写得乱一点但很少改动,低息可以暂时不还。我的建议是:先拉一个清单,用两个维度打分,影响范围(核心/非核心)和消亡速度(快/慢)。核心且慢消亡的债务必须还;非核心且快消亡的(比如临时demo代码)直接删。
这样你就有数据说服老板:不是所有债务都紧急,但有些现在已经‘利息滚雪球’了。
2. 我作为技术负责人,怎么量化技术债务的‘利息’?总不能跟老板说感觉吧。
老板只认数字,我说代码耦合度太高他听不懂。有没有办法给技术债务算一笔财务账,让我在申请重构资源时有理有据?

完全可以量化。我在一个中型电商团队做过:选取一个因技术债务频繁出问题的模块,统计过去三个月因该模块导致的线上故障修复工时、新功能开发额外调试工时、以及回归测试的重复工时。然后除以该模块总研发工时,得到‘债务利息占比’。
那个案例的结果是:该模块债务利息占总研发工时的37%,也就是说团队每投入1个人天,有近0.4天是在为过去的‘债’买单。把这张表格和老板汇报:如果我们用2个人月重构这个模块(成本40人天),预计未来半年可节省约37%×6个月×团队人数=约X人天,ROI非常清晰。
关键点:只拿一个最痛的模块做demo,不要试图评估整个系统。这样做会让老板觉得你理性,而不是纯技术情怀。
3. 还债过程中,怎么保证不影响正在交付的业务功能?我们项目排期已经满了。
我也想还债,但老板说现在正是冲业绩的时候,一放慢节奏就错过市场窗口。有没有一种模式,既不耽误交付又能稳步还债?
我实践过一种‘旁路法’,效果很好。核心思路:不重构旧代码,而是用新服务隔离风险。比如业务逻辑与一个老旧的第三方库深度耦合,直接重构风险大、时间长。这时可以在旁边建一个新服务,通过防腐层(Anti-Corruption Layer)过渡。新功能全部走新服务,老功能按需逐步迁移。
这样做的好处是:①新功能交付不受影响,甚至更快(因为新架构更清晰);②债务清偿变成渐进式,压力分散;③老板看到新功能持续上线,不会觉得你在‘摸鱼’。我去年在一个支付系统就是这么做的,用了3个月迁移了80%的核心逻辑,期间正常交付了5个新营销功能。老板不仅没反对,还在周会上表扬了架构升级。
关键:把‘还债’包装成‘架构演进’,而不是‘修复问题’。
4. 团队成员觉得还债是脏活累活,没人愿意干,怎么办?
我喊了半年重构,但组里骨干都觉得没技术含量,新人更不敢动历史代码。我也没法强制分配,大家都没动力。这种文化问题怎么解决?

这其实是激励机制出了问题。大部分公司只奖励新功能上线,不奖励‘消除隐患’。我改变做法:在季度绩效中设置‘技术债务健康度’指标,权重15%。具体做法:①让工程师自己认领债务项,完成后计入‘技术贡献’;
②重构完成并稳定运行一个月后,团队内部做分享,让当事人讲清楚为什么这样重构、原来坑在哪、效率提升多少;③公开表扬,甚至给一个小奖品。同时,我自己每周固定花半天时间参与最脏的债务清理,用行动告诉团队‘这不是苦差事,是值得骄傲的工程实践’。三个月后,主动认领债务的人从0变成5个。
关键是:要让还债的人获得和开发新功能同等的认可度。如果管理者自己都不碰历史代码,那神仙也推不动。
核心关键词
文章版权归“万象方舟”www.vientianeark.cn所有。发布者:程, 沐沐,转载请注明出处:https://www.vientianeark.cn/p/603349/
温馨提示:文章由AI大模型生成,如有侵权,联系 mumuerchuan@gmail.com 删除。
读者评论
文章把技术债务分成审美债务、结构债务和风险债务三类,这个分类非常实用。我以前团队总喊重构,现在对照一下发现大多数属于审美债务,按文章说的‘营地法则’在迭代中顺手清理,效果不错。不过风险债务确实不能拖,我们曾因为延迟升级一个基础库导致线上故障,损失了好几个月的信任。管理者需要先统一团队对债务的定义,否则沟通成本太高。
那个‘三个如果’决策框架很值得推广,特别是机会成本的考量。很多技术团队一谈还债就忽略业务影响,结果两边不讨好。我自己经历类似,之前花两个月重构一个老模块,结果业务方向变了,重构代码作废。现在我会先问‘不还能撑多久’和‘有没有旁路替代方案’,很多时候旁路策略比直接重写更划算,风险也低。
文章提到变更痛苦指数这个度量方式,比单纯看SonarQube指标接地气。我们实践过,对核心模块记录每次需求交付周期,确实能直观反映技术债务对效率的拖累。不过这个指标容易受需求复杂度影响,需要结合代码变更量一起看。总体赞同文章观点:大部分债务不需要专门偿还,渐进式处理就能控制。
作为产品负责人,看这篇文章很有共鸣。以前总觉得研发喊重构是不务正业,现在明白要区分债务类型。结构债务确实最影响迭代速度,比如文章说的运费计算耦合案例,拆出来后效率提升明显。但管理者也要避免被‘必须还债’的情绪绑架,用三个问题框架做判断能减少很多争吵。希望更多同行能看到这种务实视角。