工程质量-04-数据支撑

在讲具体的方法之前,我们需要一些数据来做为支撑,建立一个基线,让我们整个目标能够更加聚焦一些。

在软件工程领域,评估一种方法是否能够有效的检测出软件缺陷有一个量化的指标:缺陷清除效率(Defect Removal efficiency, DRE)

2011年前后,美国的缺陷清除效率平均值为85%,其变化范围从75%到极少案例才能够达到的99%。缺陷清除效率的计算根据发布前修复的缺陷总数加上发布后头90天内客户报告的缺陷数。例如,如果发布前开发者发现了90个BUG,客户在头3个月报告了10个BUG。那么本例中的缺陷清除效率是90%。这是非常重要的流程质量度量方法,因为和缺陷清除效率较低的类似应用程序相比,缺陷清除效率能够达95%的应用程序往往工期更短并且成本更低。这样的应用程序的消费者也更愉快,其维护成本也更低[4]。

从缺陷清除效率(DRE)理论中获取最重要的数据就是缺陷清除效率表,如下表所示,是《Code Complete》提供的缺陷预测率表[2]。

Removal Step Lowest Rate Modal Rate Highest Rate
非正式的设计审查(Informal design reviews) 25% 35% 40%
正式的设计审查(Formal design inspections) 45% 55% 65%
非正式的代码审查(Informal code reviews) 20% 25% 35%
正式的代码审查(Formal code inspections) 45% 60% 70%
建模或者原型(Modeling or prototyping) 35% 65% 80%
个人桌面审查(Personal desk-checking of code) 20% 40% 60%
静态代码分析(Static code analysis) 5% 10% 15%
单元测试(Unit test) 15% 30% 50%
新函数/组件测试 (New function (component)test) 20% 30% 35%
集成测试(Integration test) 25% 35% 40%
回归测试(Regression test) 15% 25% 30%
系统测试(System test) 25% 40% 55%
低密度beta测试(少于10人)(Low-volume beta test (<10 sites) 25% 35% 40%
高密度beta测试(大于1000人)(High-volume beta test (>1,000 sites) 60% 75% 85%

这个表说明了一些非常重要的事实

上面还有一点值得注意,《Code Complete 2nd》成书于2002年,它的数据比较老。最近十年,上面的方法的检测率有一定的提升[6]。但是它们的相对效率并没有变,并不会影响到这一篇文章的方法。

还有一点,缺陷清除率并不是一成不变的,有研究表明,功能点越多的软件项目,缺陷清除率会越低,功能点越少的软件项目,缺陷清除率会越高[4]。在这一篇文章中,为了简化问题,我们假设这些方法的清除率是不变的。

要计算多种方法的缺陷检出率只需要使用最简单的概率计算。如果有两种方法,A方法的缺陷检出率是30%,B方法的缺陷检出率就40%。那么使用两个方法的缺陷检出率,为58%。

P_{mix} = 1 - (1 - P_{A}) * (1 - P_{B}) = 1 - 0.70 * 0.60 = 0.58

我见过的大部分普通团队只有非正式的设计审查、开发完成之后的集成测试以及提交了测试组之后的系统测试,其它的质量流程,可能会有,但是大多数流于形式,已经没有什么实际效果。整体的缺陷清除率如下所示

Removal Step Lowest Rate Modal Rate Highest Rate
非正式的设计审查(Informal design reviews) 25% 35% 40%
集成测试(Integration test) 25% 35% 40%
系统测试(System test) 25% 40% 55%
缺陷排除预期累计效率值 57.81% 74.65% 83.80%

通过上面的表,可以看,即使在最好的情况下,它的缺陷清除率只有83%左右,离及格的85%还差一些。然而真实的平均值可能只有74%左右。这样的软件质量维护成本是很高的。

我们后面的流程都会引用到这一张表,我们关注的是下限,会重点关注最低的情况下的缺陷清除率,只要保证最低的下限,高于这个值的都是惊喜。

值得特别注意的是,我们引用这一个指标只是用来做一个目标参考。这一张表里面很多活动看起来DRE值很高。但是他们由于成本很高,所以被淘汰了。我们后面的流程会引入代码审查、单元测试之类的,看起来DRE值并不高。但是

在引入各项流程的时候,我们会综合考虑各种因素。并不是简单的谁的DRE值最好,我们就优先引入什么流程。我们会考虑投入产出比,考虑引入的难度,考虑接受程度、考虑可持续性各方面的因素。

引用