企业架构中的"技术债务量化":用架构 Fitness Function 给遗留系统打分

将架构治理与适应度函数结合,量化技术债务

为什么"技术债务"总是一笔糊涂账

几乎每一家拥有十年以上历史的企业,都面临同一个困境:系统越来越臃肿,但没人能准确说出"到底欠了多少债"。

技术债务不像金融债务那样有清晰的本金和利率。它隐藏在耦合过紧的模块里、藏在没有文档的接口背后、潜伏于早已停止维护的依赖库中。架构评审会上,各方都在抱怨"系统太烂",但当下一个季度的预算摆在桌面上时,“还债"的需求总是被"新业务"挤掉。

有句话说:你无法管理的,正是你无法度量的。

问题的根源不在于企业不重视技术债务,而在于缺乏一套可量化、可追踪、可纳入治理流程的度量体系。传统的架构评审依赖专家经验打分,主观性强、覆盖面窄、难以持续执行。而纯粹靠自动化扫描工具产出的"代码质量报告”,又往往脱离业务语境,无法回答"这笔债务到底值不值得还"这个关键问题。

本文试图提供一条中间路径:将 TOGAF(The Open Group Architecture Framework)的架构治理框架与演进式架构(Evolutionary Architecture)中的 Fitness Function 概念融合,构建一套面向遗留系统的技术债务量化评分方案。


两个世界的交汇:TOGAF 治理与 Fitness Function

TOGAF 的架构治理:结构化但缺乏自动化

TOGAF 的架构开发方法(ADM)提供了从愿景到迁移规划的完整生命周期。在 Phase H(架构变更管理)中,明确要求对已部署架构进行合规性审查持续监控

TOGAF 的架构治理框架通常包含以下要素:

治理维度 核心关注点 典型产出
架构合规性 实现是否符合目标架构 合规评估矩阵
架构变更管理 变更是否经过评审和批准 变更请求与审批记录
架构度量 架构质量的可观测指标 KPI 仪表盘
架构成熟度 架构能力的演进水平 成熟度等级评估

问题在于,这些治理活动大多依赖周期性的人工评审——每季度一次架构评审会、每年一次架构成熟度评估。在系统变更日益频繁的今天,这种节奏远远不够。

Fitness Function:演进式架构的"健康指标"

Fitness Function 这个概念借自进化生物学。在演进式架构的理论体系中,Fitness Function 被定义为对架构某一特征的自动化评估机制,用于确保系统在持续演进过程中不偏离预期的质量属性。

一个典型的 Fitness Function 具备以下特征:

  • 可自动化执行:不依赖人工判断,由工具链自动触发
  • 有明确的阈值:通过/不通过的判定标准是预设的
  • 持续运行:集成在 CI/CD 流水线中,每次变更都触发评估
  • 多维度覆盖:从性能、安全、可维护性等多个视角评估

有句话说:好的架构不是一次性设计出来的,而是通过持续的约束和反馈"长"出来的。

融合的逻辑:用 Fitness Function 驱动架构治理

将两者结合的核心思路是:

  1. 用 TOGAF 的治理框架定义"该度量什么"——从架构原则、目标架构、架构路线图出发,明确度量的维度和标准
  2. 用 Fitness Function 定义"怎么度量"——将治理要求转化为可自动执行的评估函数
  3. 用量化评分连接两者——把离散的 Fitness Function 结果聚合为一个可比较、可追踪的技术债务评分

技术债务的四个维度与度量指标

在构建 Fitness Function 之前,需要先明确技术债务的分类。借鉴业界广泛使用的分类方法,结合企业架构的实际场景,我们将技术债务划分为四个维度:

维度一:代码与依赖债务

这是最表层、也最容易自动化的债务类型。

关注点:代码复杂度、过时依赖、重复代码、测试覆盖率不足

典型 Fitness Function

指标名称 计算方式 阈值示例 检测频率
循环依赖检测 模块间依赖图的环路数量 0(零容忍) 每次构建
依赖库版本老化度 当前版本与最新稳定版的主版本差之和 ≤ 3 每周
圈复杂度超标率 圈复杂度 > 15 的方法占比 < 5% 每次构建
测试覆盖率 行覆盖率 ≥ 70% 每次构建
废弃 API 调用数 调用已标记 @Deprecated 的接口数量 0 每次构建

维度二:架构耦合债务

这一层债务更隐蔽,对系统演进能力的阻碍也更大。

关注点:模块边界侵蚀、接口契约违反、跨层调用、共享数据库

典型 Fitness Function

指标名称 计算方式 阈值示例 检测频率
跨域调用比例 跨限界上下文直接调用的接口占比 < 10% 每日
接口契约违规数 实际请求/响应与 OpenAPI 定义的偏差 0 每次部署
共享数据库表数 被多个服务直接读写的数据表数量 0(目标值) 每周
扇出异常度 单个服务调用下游服务数量的 P95 ≤ 8 每日

维度三:基础设施与运维债务

很多技术债务并不在代码里,而在基础设施的配置和运维方式中。

关注点:手工部署、缺乏监控、配置漂移、容灾缺失

典型 Fitness Function

指标名称 计算方式 阈值示例 检测频率
基础设施即代码覆盖率 IaC 管理的资源 / 总资源数 ≥ 90% 每日
监控盲区比例 无告警覆盖的核心服务占比 < 5% 每周
配置漂移指数 生产环境与声明式配置的差异项数 0 每小时
灾备演练间隔 距上次灾备演练的天数 ≤ 90 天 每月

维度四:文档与知识债务

这是最容易被忽视、却在关键时刻"要命"的债务类型。

关注点:架构决策缺失、接口文档过期、人员知识孤岛

典型 Fitness Function

指标名称 计算方式 阈值示例 检测频率
ADR 覆盖率 重大架构变更有对应 ADR 的比例 ≥ 80% 每月
文档新鲜度 架构文档最后更新距今的平均天数 ≤ 60 天 每月
Bus Factor 风险 关键模块仅一人掌握的比例 < 20% 每季度

从指标到评分:构建技术债务综合评分模型

单个 Fitness Function 只能告诉我们"某个维度是否达标"。要形成对遗留系统的整体判断,需要一套评分聚合机制

步骤一:指标标准化

不同指标的量纲不同——有的是百分比,有的是绝对数量,有的是时间间隔。首先将它们统一归一化到 0-100 的分值区间。

标准化公式的一般形式:

1
得分 = max(0, 100 - (实际值 - 目标值) / (最差可接受值 - 目标值) × 100)

当实际值优于目标值时,得分为 100。当实际值达到最差可接受阈值时,得分为 0。超出最差阈值的仍记 0 分,但触发告警。

步骤二:维度权重分配

不同企业、不同业务阶段的权重应有所差异。以下是一个典型的权重参考:

维度 建议权重 适用场景说明
代码与依赖债务 20% 基础层,易于改善
架构耦合债务 35% 对演进能力影响最大
基础设施与运维债务 25% 直接影响稳定性和恢复速度
文档与知识债务 20% 影响团队效率和人员风险

权重的设定本身就是一个架构治理决策,应在架构评审委员会中讨论确定,并随业务阶段动态调整。

步骤三:系统级聚合与分级

将各维度加权求和,得到系统的综合技术债务评分(Tech Debt Score, TDS),范围 0-100。分数越高,代表债务越轻、架构越健康。

根据评分划分等级:

等级 分数区间 含义 治理动作建议
A 85-100 架构健康 维持现状,预防性监控
B 70-84 轻度债务 纳入迭代计划逐步改善
C 50-69 中度债务 设立专项还债预算
D 30-49 重度债务 架构重构立项
E 0-29 危机状态 考虑系统替换

步骤四:趋势追踪

单次评分的意义有限,真正的价值在于趋势。建议以双周或月度为周期绘制 TDS 趋势图,关注以下信号:

  • 持续下降:说明新引入的债务超过了偿还速度,需要干预
  • 平台期:改善措施停滞,需要检查执行力度
  • 波动剧烈:可能存在"突击还债后放松"的周期性问题

落地实施:将 Fitness Function 嵌入治理流程

与 TOGAF ADM 的对齐

将 Fitness Function 集成到 TOGAF 的架构开发方法中,可以在以下阶段发挥作用:

Phase E(机会与解决方案):利用 TDS 评分识别最需要改造的遗留系统,作为迁移规划的输入依据。不再依赖"谁嗓门大谁优先"的资源争夺模式,而是用数据说话。

Phase G(实施治理):在开发实施阶段,Fitness Function 作为持续集成流水线的一部分自动运行。每次代码提交、每次部署,都触发相关评估。这弥补了传统架构合规性审查"事后追溯"的不足。

Phase H(架构变更管理):TDS 趋势作为架构变更管理的核心输入指标。当某个系统的评分持续走低,自动触发架构评审流程。

工具链选型建议

构建 Fitness Function 工具链不需要从零开始,很多开源工具可以组合使用:

  • 代码与依赖分析:SonarQube、Dependabot、ArchUnit
  • 架构耦合检测:ArchUnit、Structure101、自研依赖图分析工具
  • 基础设施合规:InSpec、OPA(Open Policy Agent)、Terrascan
  • 文档与知识:ADR 管理工具(adr-tools)、文档过期告警脚本、代码贡献者分析

关键不在于工具本身,而在于将工具的输出聚合到统一的评分平台。可以是一个简单的仪表盘,也可以是集成到企业架构管理平台(如 Mega、LeanIX 或自研系统)的模块。

实施路径:从小处开始

不要试图一次性覆盖所有维度。建议的推进节奏:

  1. 第 1-2 个月:选择 1-2 个最痛的系统,仅实现"代码与依赖债务"维度的 Fitness Function,跑通自动化采集和评分流程
  2. 第 3-4 个月:扩展到"架构耦合债务"维度,引入 ArchUnit 等工具定义架构规则
  3. 第 5-6 个月:覆盖基础设施和文档维度,完善评分模型,开始在全组织范围内推广
  4. 持续迭代:根据实践反馈调整指标、阈值和权重

治理中的常见陷阱与应对

陷阱一:指标博弈

当评分与绩效考核挂钩时,团队可能会"优化指标"而非"改善架构"——比如为了提升测试覆盖率而编写大量无意义的测试。

应对:设置"对抗性指标"。例如,在追踪测试覆盖率的同时,追踪变异测试(Mutation Testing)得分,确保测试真正在检测行为而非仅仅覆盖代码行。

陷阱二:阈值僵化

随着技术栈演进,半年前设定的阈值可能已经不合时宜。一个曾经合理的"依赖版本老化度 ≤ 3"在新框架发布后可能过于宽松。

应对:建立阈值的定期回顾机制,将其纳入架构评审委员会的固定议程。Fitness Function 的参数本身也需要"治理"。

陷阱三:忽视业务语境

一个面向内部员工的报表系统,和一个日活千万的面向消费者系统,对架构健康度的要求不应相同。用同一套标准评估所有系统,会导致资源错配。

应对:根据系统的业务重要性分级(Business Criticality Tier),为不同级别设定差异化的 Fitness Function 阈值和权重。核心系统的架构耦合债务权重可以提高到 45%,而辅助系统可以降低到 25%。

陷阱四:评分沦为报告

如果 TDS 评分只出现在季度报告中,从未影响过实际的技术决策,那么整套体系就只是一个"昂贵的摆设"。

应对:建立硬性关联规则。例如:

  • TDS 低于 C 级的系统,新功能开发必须包含 20% 的还债工作量
  • TDS 持续两个季度下降的系统,自动触发架构重构评审
  • TDS 低于 D 级的系统,限制新增功能范围,仅允许修复类需求

一个实际的评分示例

为了更直观地展示这套方案的效果,以下是一个假设的遗留系统评分案例。

系统背景:某企业的订单管理系统,运行 8 年,经历了多次业务变更,当前由三个团队共同维护。

各维度评分

维度 关键发现 得分 权重 加权得分
代码与依赖 3 个核心依赖已停止维护,圈复杂度超标方法占 12% 45 20% 9.0
架构耦合 订单模块与库存模块共享 17 张数据库表,跨域调用占 35% 28 35% 9.8
基础设施 70% 资源由 IaC 管理,核心链路有完整监控 65 25% 16.25
文档与知识 最近一次 ADR 是 14 个月前,核心模块仅 1 人掌握 35 20% 7.0

综合评分:42.05(D 级)

治理建议:该系统已进入"重度债务"区间。建议立项架构重构,优先拆分订单与库存的共享数据库,同时将基础设施 IaC 覆盖率提升到 90% 以上。在重构完成前,限制新功能的范围,每个迭代至少投入 30% 的工程量用于还债。


技术债务量化与架构演进的长期关系

技术债务的量化不是一个孤立活动,它应该成为企业架构演进能力的底层基础设施。

当 Fitness Function 的评分数据积累到一定量级,就可以支撑更高层次的决策。比如:哪些技术栈的债务增长速度最快?哪些架构模式在长期运营中表现出更好的可维护性?团队的工程实践成熟度是否与系统健康度正相关?

这些洞察反过来又能指导架构原则的修订、技术选型的决策、以及组织能力建设的优先级。形成从度量到治理、从治理到演进的闭环。

架构治理的本质不是"控制",而是建立一套让系统持续保持健康状态的反馈机制。Fitness Function 是这套机制的执行层,TOGAF 框架是决策层,而技术债务评分则是连接两者的共同语言。

当技术债务不再是一个模糊的形容词,而是一个可以追踪、可以比较、可以设定改进目标的数字时,架构治理才真正从"开会讨论"走向了"数据驱动"。遗留系统的改造优先级不再取决于谁的声音更大,而是取决于数据告诉我们的事实。这才是企业架构治理应有的样子。

本博客文章采用 CC BY-NC-SA 4.0 许可协议
服务器推荐

腾讯云 · 新用户专属优惠

本博客部署在腾讯云服务器,稳定运行一年多。如果你是新用户或想搭建个人项目,推荐试试腾讯云的优惠活动。

查看优惠详情 →
阅读
上一篇
大模型评估不靠感觉:一套面向企业场景的 LLM Benchmark 自建方法
广告

📚 关注公众号,免费获取技术材料

扫码关注公众号,回复「资料」领取:

  • 📘 企业架构设计模板
  • 📗 数据治理实施指南
  • 📙 工业软件技术白皮书
公众号二维码

长按或扫描二维码