技术债治理实战:在不拖慢交付的前提下持续还债
2026-06-12 14:22:53
技术债治理实战
适用:业务压力大、历史代码多、重构诉求强的研发团队
一、什么是「真技术债」?
| 类型 | 示例 | 利息(持续成本) |
|---|---|---|
| 架构债 | 单体无法水平扩展 | 每次大促扩容困难 |
| 代码债 | 无测试的核心模块 | 改一行崩三处 |
| 测试债 | E2E 覆盖 < 10% | 发布信心低 |
| 基础设施债 | JDK 8、EOL 中间件 | 安全漏洞 |
| 文档债 | onboarding 靠 oral | 新人 3 月上手 |
不是技术债:产品需求变更、合理的技术探索失败。
二、债务登记制度
每个 Sprint 允许创建 Debt Ticket,必填:
## 债务描述
## 产生原因(何时、为何欠下)
## 影响范围(模块、团队)
## 利息估算(每 Sprint 浪费人天)
## 还债方案(≤ 3 天可完成切片)
## 验收标准
统一标签:tech-debt,Product Owner 可见不可删。
三、优先级矩阵
高影响
│
Q2 规划 │ Q1 立即
────────┼────────
Q4 忽略 │ Q3 顺手
│
低影响 ←── 低成本 ──→ 高成本
- Q1:高影响低成本,下 Sprint 必做(如升级有 CVE 的依赖)
- Q2:高影响高成本,拆 Epic 分季度(如模块拆分)
- Q3:Boy Scout——改文件时顺手修
- Q4:归档,不主动做
四、20% 容量规则
每个 Sprint 预留 15–20% 容量 给技术债,PO 与 Tech Lead 共同排期。
Sprint 容量 100 点 = 80 业务 + 20 还债
不可协商:安全 CVE、合规、生产 P0 根因修复。
五、Boy Scout 原则
「离开营地比来时更干净」:
- 改
OrderService时,补一个缺失的单测 - 发现魔法数,提取常量(不扩大 scope)
- 过时注释删掉
MR 模板增加:本 PR 顺带修复的债务(如有)。
六、Architecture Review
每季度 半天 Archery:
- 各团队报 Top 3 债务
- 架构师评估系统性风险
- 输出 季度还债 Roadmap(3–5 项)
与业务 Roadmap 并列展示,争取管理层支持。
七、可量化 KPI
| 指标 | 方向 |
|---|---|
| Sonar 技术债比率 | ↓ |
| 核心模块单测覆盖率 | ↑ |
| 平均 PR 规模 | ↓(小步合并) |
| 生产 incident 中「债务相关」占比 | ↓ |
| 新人 onboarding 天数 | ↓ |
八、还债策略示例
8.1 绞杀者模式(Strangler)
老单体旁路新建 order-service,流量逐步迁移,非 Big Bang 重写。
8.2 分支 by Abstraction
interface PaymentGateway { ... }
class LegacyPayment implements PaymentGateway { ... }
class NewPayment implements PaymentGateway { ... }
// Feature Flag 切换
九、与 PO 的沟通话术
❌ 「代码太烂必须重构两个月」
✅ 「订单模块每 Sprint 多耗 3 人天修 Bug,用 2 个 Sprint 投资可永久省 30% 维护成本」
用业务语言讲利息。
十、Checklist
- [ ] 债务 Ticket 模板上线
- [ ] Sprint 20% 容量写入团队公约
- [ ] 季度 Archery 日历 invite
- [ ] KPI Dashboard 可见
- [ ] CVE 24h 评估 SLA
十一、案例:订单模块还债两周记
某电商团队订单服务 单测覆盖率 12%,每次改促销规则回归 2 天。
Week 1:
- 登记债务 Ticket,利息估算每 Sprint 3 人天
- 为
PriceCalculator补 15 个单测(纯函数优先) - 提取
PromotionEngine接口,Legacy 实现包一层
Week 2:
- Feature Flag 切换 10% 流量到新引擎
- 监控错误率无异常后全量
- 覆盖率升至 58%,后续需求交付提速约 30%
关键:未停业务开发,20% 容量 + Boy Scout 叠加完成。
小结
技术债治理不是「停下来大扫除」,而是 持续小额投资 + 优先级透明 + 度量验证。国内高效团队把还债纳入 Sprint 常例,而非等项目「黄了才重构」。