写点什么

用户价值覆盖率高于代码覆盖率

  • 2015-11-25
  • 本文字数:1523 字

    阅读完需:约 5 分钟

在用户价值多变的情况下进行软件开发,为了能更快速地向用户交付有价值的软件,开发团队应该专注于用户价值覆盖率,而不是代码覆盖率。

代码覆盖率(Code Coverage)[1] 是一种用来描述程序的源代码被特定的测试套件所测试的程度的度量手段。与具有低代码测试覆盖率的程序相比,具有高代码测试覆盖率的程序会被更加全面地加以测试,并且其缺陷会更少。

代码覆盖率是 Miller 和 Maloney 两人在 1963 年出版的 Communications of the ACM 杂志上首先提出的。对于那时以用户价值变化很少的科学计算为主的软件应用开发来说,开发团队将软件开发质量的重心放到代码覆盖率上是适宜的。但随着强调用户体验的互联网时代的到来,在当前大量的软件开发过程中,用户价值的变化速度已经大大超过 50 多年前的水平。如果开发团队继续“将软件开发质量的重心放到代码覆盖率上”,那么会造成大量的工作时间被浪费在开发和测试已无用户价值的代码之上,从而导致开发有用户价值的代码时间减少,进而延期交付对用户有价值的软件产品。

下图以一个新项目的开发过程为例来说明上述问题。

上图中红圈代表团队识别出来并要实现的用户价值,蓝圈代表系统已有的代码所实现的功能,两个圈相交的部分,表示代码实现了用户价值的部分。

在项目启动时,红圈较小,且随着识别的用户价值的增多而不断地增大,另外,它会随着用户价值的变化而不断变化,从而产生移动。此时由于编程工作刚刚起步,所以蓝圈很小。

重要通知:接下来 InfoQ 将会选择性地将部分优秀内容首发在微信公众号中,欢迎关注 InfoQ 微信公众号第一时间阅读精品内容。

随着项目的进展,代码实现也逐渐变多。但由于下面 3 个原因,代表代码实现的蓝圈会与代表用户价值的红圈发生偏离:1)由于诸如程序员和领域专家各讲各自的方言所致的误解等原因,代码仅实现部分甚至没有实现原先识别的用户价值;2)当针对原先识别的用户价值的代码编写完毕后,团队识别出原先的用户价值有部分功能需要删减(用上图中最下边那个右边缺了半圆的红圈来代表);3)团队又识别出新的尚未编写代码的用户价值(用上图中最下边那个左边多了半圆的红圈来代表)。

而在面对上述第 2)个原因中那些不再具备用户价值代码时,程序员会将其删除吗?在自动化测试覆盖不全面、手工测试反馈较慢、代码逻辑和耦合复杂、进度很紧等等这些很“骨感”的现实情况下,程序员往往选择不去删除。“谁会保证在删代码时,不会把系统搞挂?”程序员不删那些已经不具备用户价值的代码,又加剧了红圈与蓝圈的分离。随着过时的用户价值不断被删减,那些不会被删除的已经失去用户价值的代码就会越积越多,这使得蓝圈右侧删不掉的尾巴会越拖越长。

在这种情况下,就出现了“代码覆盖率悖论”:如果 IT 企业只将注意力放到提高代码覆盖率,而忽视提高不断变化的用户价值覆盖率,那么就导致团队会把时间浪费在阅读和测试哪些已经失去用户价值的代码上,从而延误开发那些新演进出来的用户价值,无法快速满足用户需求。

相对“用户价值”这个“终”来说,代码仅仅是一个阶段的“始”。要快速地交付用户价值,我们需要“以终为始”地进行软件开发,将注意力放到以红圈所代表的用户价值这个“终”之上,随着它的不断变化来持续追求用户价值的覆盖率,也就是用自动化测试来把红圈所代表的用户价值保护起来,而不是盲目地追求已有代码的覆盖率。

[1] 引自: https://en.wikipedia.org/wiki/Code_coverage


感谢丁晓昀对本文的审校,张凯峰对本文的策划。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-11-25 17:322098

评论

发布
暂无评论
发现更多内容

上海锡鼎正式加入openGauss社区

即将开营|报名获取跨平台与热更新技术操作秘籍!

字节跳动终端技术

flutter 移动开发 插件化 动态化 SDK热更新

Java 函数式编程

Ayue、

java8

什么是DataOps?DataOps与DevOps 有什么区别?

雨果

DataOps

跟着卷卷龙一起学Camera--金字塔融合法01

卷卷龙

ISP camera 10月月更

详解MySQL之事务

C++后台开发

MySQL mysql事务 中间件 后端开发 C++开发

Dubbo Mesh 总体技术架构方案

阿里巴巴云原生

阿里云 云原生 dubbo

大数据ELK(十七):Elasticsearch SQL 订单统计分析案例

Lansonli

10月月更 Elasticsearch SQL

OpenStack第26版Zed已发布

极客天地

书单推荐|不惧复工,工作轻松

图灵教育

书单 复工

书单推荐|不惧复工,工作轻松

图灵社区

书单 复工

开拓“流程智能蓝海”丨九科信息董事&产品VP傅恺受邀分享流程挖掘实践案例

九科Ninetech

AI RPA 数字化转型 企业服务 流程挖掘

浪潮信息成为龙蜥理事单位,共建开放计算生态和行业方案

OpenAnolis小助手

开源 操作系统 产业链 龙蜥社区 浪潮信息

leetcode 94. Binary Tree Inorder Traversal 二叉树的中序遍历(中等)

okokabcd

LeetCode 数据结构与算法

这道JS经典面试题不要背,今天带你彻底搞懂它!

茶无味的一天

JavaScript 面试

借助小程序框架打破APP开发壁垒

Geek_99967b

小程序

跟着卷卷龙一起学Camera--金字塔融合法02

卷卷龙

ISP camera 10月月更

【Nacos源码之配置管理 七】服务端增删改配置数据之后如何通知集群中的其他机器

石臻臻的杂货铺

nacos 10月月更

小程序该怎么挖掘App流量

Geek_99967b

小程序

数据工程师吐槽:数据API开发的那些烦心事

雨果

数据api

企业应该如何进行知识管理?

Baklib

知识管理 知识库

【愚公系列】2022年10月 Go教学课程 022-Go容器之字典

愚公搬代码

10月月更

Qt|编译QuaZip以及程序应用

中国好公民st

c++ qt 10月月更

技术管理 之 技术

码猿外

技术管理

【Nacos源码之配置管理 八】客户端怎么获取服务端集群列表

石臻臻的杂货铺

nacos 10月月更

学会一行CSS即可提升页面滚动性能

茶无味的一天

CSS JavaScript chrome 前端 js

微信朋友圈高性能复杂度分析

Geek_1264yp

跟着卷卷龙一起学Camera--ISO

卷卷龙

ISP camera 10月月更

小程序插件其实很简单

Geek_99967b

小程序 小程序插件

2022-10-8

留白的艺术

《高性能MySQL 第四版》正式上市

MySQL 数据库

用户价值覆盖率高于代码覆盖率_语言 & 开发_伍斌_InfoQ精选文章