持续交付2.0

“祖传”代码的质量到底怎么样?可以用这个指标衡量一下

Image

“用这四个工程师都认可的代码质量指标,你的代码质量与谷歌的代码质量差五倍吗?”

今天,在这里教大家一招对付“祖传”代码的办法。

1

四个基本的代码质量指标

我曾经对比某公司的产品代码与谷歌开源代码质量的差别。对比方法也非常简单,你也可以自己进行对比。

我选择了四个指标,分别是 :

(1)函数(方法)的圈复杂度;

(2)单个函数(方法)的总行数;

(3)单一文件的代码重复率;

(4)类的扇入扇出比(针对JAVA代码)。

每个指标选定适当的阈值后,分别对双方代码库进行扫描。注意:我选择的代码库规模相当。

扫描结果不应以绝对结果数值进行比较,而是要以“Error密度”进行对比。例如,平均每百行的Error数量各是多少。

由于产品是持续进行开发的,所以也针对不同时间点进行了统计。这样能够得出每增加百行代码,新增加的Error数量是多少。

这样就可以了解两个不同的软件,其相对的代码质量水平如何了?

2

如何管理代码质量

如果对以上四条指标与阈值没有异议,就可以进行代码质量的管理了。

由于很多代码是“遗留”代码,并不易对其进行全面改造。

此时就可以使用“童子军营地原则”,至少从现在起不要让代码质量变得更差。

(参见《持续交付2.0》的第九章 9.2.1,第139页)来进行管理。

Image

3

如何选择适当的阈值

你可以自己确定每个指标的阈值,只要你认为正确就可以。例如,我对圈复杂度的选择如下图所示。

Image

扫描圈复杂度得到的结果数字理论上可以认为是该函数(方法)的测试用例数,因为它对应该函数中语句的执行路径数量。

当然,对于不同的语言,圈复杂度的指标阈值应有所不同。通常认为,C++语言本身带来的复杂度就高一些,所以阈值可以选择大一点。

3

不要使用“平均圈复杂度”

平均圈复杂度的指导意义不大。因为,在一个大型代码库中,大多数函数的圈复杂度不会太高,少数函数的圈复杂度会比较高。这样,使用平均圈复杂度就会被平均。

而且,个别函数为了特定原因(比如局部性能点),相比而言,其函数圈复杂度就不那么重要,对它来说,可以超标。