天下没有免费的午餐,但是有免费的质量!- 怎样在不增加成本的前提下提高软件产品的质量?
2021-03-24 08:30:52
郑乔尹
  • 访问次数: 104
  • 注册日期: 2020-07-08
  • 最后登录: 2021-09-28
  • 我的积分: 306
  • 门派等级: 无门派

没有耕耘就没有收获,没有投入就没有产出,这是我们从小被教育大的道理。开发软件要投入人力成本,实现客户提出的需求变更也需要投入额外的成本,提高软件质量当然也需要投入。没有额外投入就想提高软件产品质量,可能吗?

 

实际上这不仅是可能的,而且业界有很多现成的例子。下面先让我证明给你看。

 

软件开发活动,不管是使用瀑布模型也好,敏捷模型也好,虽然分了几个阶段,但是从质量的角度来说,软件开发基本上只包含两种活动:缺陷注入活动和缺陷移除活动。缺陷注入活动包括编写客户需求,设计产品和编码;缺陷移除活动包括各种评审、编译和测试。如果软件开发中注入的缺陷没有100%被移除,就遗留给了客户去发现。所谓软件产品质量的好坏,就是客户发现的产品缺陷的多少。客户发现的缺陷越多,产品质量越差,反之亦然。所以,要提高软件产品质量,就要减少客户发现的缺陷。

 

为说明问题,我把软件开发活动简化成3个阶段:开发、测试和交付。假设开发阶段注入了X个缺陷,测试阶段发现了Y1个缺陷,则产品质量就是交付后客户发现的缺陷数:X– Y1。

 

假如在整个开发工作量不变的情况下,我把一半的测试工作量用代码审查取代,会有什么结果?这时注入的缺陷数X1不变,移除的缺陷数Y2分成了两部分:代码审查移除的缺陷数和测试移除的缺陷数。假设原来测试阶段总时长是T,代码审查发现缺陷的速率是V_CR,测试发现缺陷的速率是V_Test,则移除的缺陷数变成:Y2 = V_CR × T/2 + V_Test × T/2。

 

目前有大量的论文和实际数据可以证明代码审查发现缺陷的速率远远大于测试阶段发现缺陷的速率,即 V_CR >V_Test。例如,表一中WattsHumphrey的PSP数据显示,代码走查发现和修复缺陷的速率是6.9个缺陷/小时,而测试发现缺陷的速率只有3.31个缺陷/小时。而表二中列出的两个数据的差别更大。其中的主要原因有两个。一是代码审查检查的是代码逻辑本身,一些小错误很容易就被发现和修复;而测试是根据现象找本质,所以平均下来发现和修复每个缺陷花的时间就多。二是测试只能测试几个有限的条件或场景,大量的可能的数值、参数、路径和它们之间的组合就不容易测到。要把所有可能的情况都测到则需要花费大量的时间和精力。

 

表一:缺陷发现和移除的速率(基于810开发人员的4个相同的项目)

阶段

速率:缺陷/小时

与UT的比值

代码审查

6.90

2.08

单元测试

3.31

1.00

 

表二:每个缺陷发现和移除的成本

数据出处

审查(Review)

测试

IBM (Remus and Ziles 1979)

1

4.1倍审查

Ackerman et al. 1989

1小时

2-20小时

Russell 1991

1小时

2-4小时

Shooman and Bolsky 1975

0.6小时

3.05小时

vanGenuchten 1994

0.25小时

8小时

Weller 1993

0.7小时

6小时


根据以上事实,我们得出新方法发现和修复的缺陷数为:

Y2 = V_CR × T/2 + V_Test × T/2 > V_Test × T/2 + V_Test ×T/2 = V_Test × T = Y1,即Y2 >Y1。 

 

因为注入的缺陷总数没变,新方法在交付前发现和修复的缺陷多了,交付后的缺陷数就少了,产品质量因此得到提高!

 

以上证明了在总工作量(总成本)不变的情况下,通过改变软件开发的做法,我们确实可以提高产品的质量。天下没有免费的午餐,但是有免费的质量!

 

实际上,这种尽早发现问题、解决问题的方法,在我们日常管理和生活中已经成了基本常识,根本不需要去证明。在管理上我们知道,问题如果不及时处理,越到后来解决的成本越大,越难解决。在生活中我们知道,身体疾病要早发现,早解决,否则会造成不必要的后果。对危害生命的疾病,我们还会积极预防,比如雾霾天戴口罩。这些虽然都是投入,但是这些投入,对于最后等问题发生了再解决的投入要小的多!

 

正因为提前发现缺陷的作用如此重要,CMMI模型特地把同行评审(Peer Review)作为一条特定目标列出来,成为49条特定目标的一个,而且还包括3个特定实践。如果将来有人问你为什么同行评审会包含在CMMI模型里,你可以把上述的证明给他们看(Smile)。


好了,道理都清楚了。那么你们在软件开发项目中做代码审查吗?如果没有做,为什么呢?如果做代码审查,你们做的怎么样?你们是真正按照代码审查的方法去做的吗?


本文转载自公众号:CMMI论坛  作者:高山

原文链接:  https://mp.weixin.qq.com/s/CKY2J1ggcUKGN278bIg0ag