4.0

4.0 第4部分导言:代码与质量指标

第2部分和第3部分衡量的是工作如何移动,以及生产它的人过得如何。这一部分转向产出物本身:代码,以及一项指标能够,以及不能够告诉你关于它质量的什么信息。代码质量指标是本书中所有指标家族中历史最悠久的,圈复杂度可以追溯到1976年,与之相配的,是同样悠久的滥用历史。这一部分认真对待这段历史:每个主题都会指出一个真正有用的信号,同时指出这个信号一旦成为目标之后,会被以哪种具体的、有据可查的方式操纵。

贯穿这六个主题的一条主线是,没有任何单一的代码指标能够独立捕捉质量,而一些最流行的指标,一旦被孤立地追逐,就会主动带来误导。一个高测试覆盖率百分比,可以与不验证任何有意义内容的测试共存。一个低复杂度分数,可以与技术上简单、但概念上不连贯的代码共存。这一部分的每个主题,都把自己的头条指标与能够捕捉其特定盲点的补充检查配对:复杂度配上可维护性背景,覆盖率配上变异测试,代码变动量配上热点分析,静态分析配上人的判断,技术债务配上有优先级的补救,而不是一份不断增长、无人问津的积压清单。

对大团队而言,代码与质量指标让管理一个大到任何一个人都无法完全装在脑子里的代码库成为可能。一个五人团队可以依赖对系统哪些部分脆弱的共享默契知识;一个横跨数十个服务、拥有五百名工程师的组织,需要埋点信号来系统性地找出那种脆弱性。往往拥有以数十年而不是数年计的代码库的企业和政府组织,依赖这一部分的指标来确定有限的维护投入用在哪里能发挥最大作用。

本部分各主题

  • 4.1 代码复杂度指标: 圈复杂度及其相关指标,它们真正能预测什么,以及它们有据可查的操纵风险。
  • 4.2 测试覆盖率与测试有效性: 为什么单靠一个覆盖率百分比所能告诉你的,比看起来的要少,以及变异测试如何弥补这个缺口。
  • 4.3 代码变动量与热点分析: 找出代码库中对不成比例份额的缺陷和维护成本负责的那一小部分特定代码。
  • 4.4 静态分析与代码异味指标: 自动化代码质量信号,它们真正的价值,以及它们相对于人的判断的局限。
  • 4.5 技术债务测量: 把一项不可见的、只是非正式讨论的负债,变成一个可见的、有优先级的、可管理的组合。
  • 4.6 文档与知识指标: 衡量文档是否真正有帮助,而不只是它是否存在。

这些主题如何相互关联

这六个主题从代码最小的单元逐步向外扩展。主题 4.1 从单个函数或方法的层面开始;主题 4.2 问的是测试是否真正验证了那个单元的行为;主题 4.3 拉远视角,找出整个代码库中哪些文件和模块最值得优先关注;主题 4.4 加上了持续扫描全部这些内容的自动化工具层;主题 4.5 把前面四个主题积累下来的发现,转化为一份被管理、有优先级的积压清单,而不是一种弥散的、无人处理的担忧;主题 4.6 以衡量安全维护这一切所需的知识是否真正被记录下来、可以被找到,为这一部分收尾。

这一部分直接连接回第2部分的稳定性指标:变更失败率(主题 2.10)在很大程度上,是这一部分在上游所衡量的代码质量的一个下游后果。它也向前连接到第5部分的产品指标,因为逃逸缺陷(主题 5.1)常常可以追溯到这一部分本应在它们抵达生产环境之前就揭示出来的那些复杂度热点和覆盖率缺口。