我们如何对写出的代码进行质量评估?在这一块的方法、标准一直都比较模糊。传统意义上,我们一直使用CMMI中bug率(千行代码缺陷率=bug数量/1K行代码)对软件代码质量进行评估。这种方法也被广泛的应用到6西格玛质量管理方法里。
千行代码缺陷率(bug率):
CMM1级 11.95‰
CMM2级 5.52‰
CMM3级 2.39‰
CMM4级 0.92‰
CMM5级 0.32‰
企业通过CMMI级别的资质认证有助于招投标,但是这种评判标准对于我们实际项目参与者则显得遥不可及,因为在快速迭代中随着成本与投入的不匹配、开发者个人编程风格及技术实力不一样、再结合实际的项目关注点,用这种方法显得苍白无力。
在实际的项目经验中,我们一直在寻找新的方法来更有效的代码质量进行评估,这即能评估一个项目组的代码开发实力,也能细分到对一个开发人员的绩效进行评估。
通过自己经历的几个项目,我觉得可以对目前的千行代码缺陷率的计算公式进行改良,改动如下:
代码缺陷率 = (bug数/功能点个数)*(1/∏每个功能点权重)
比如项目组A负责开发的代码实现了50个功能点,找到的bug数是100个,每个功能点所对应的权重为w1,w2,w3.....w50, 代码缺陷率 = (100/50)*(1/(w1*w2*w3*..w50).
大家可能会对功能点权重有疑问,什么叫做功能点权重?
在这里我对功能点权重的定义是:功能代码在代码编译、代码转移、代码修改及代码运行这四个纬度上值的总和。
每个纬度的值要考虑的因素为:
基于自己的项目每个纬度的评值因素、纬度单位值可以再定义。比如,A项目每个纬度的总值为5,一个功能点如果满足一个纬度的所有因素就是5,不满足就相应的扣分,所扣分数大小直接取决于对项目的影响大小,比如“可评估”-功能实现难易对分配任务影响大,那么可以直接分配3分,非常难的实现给3分,很简单的给0.5,变动的单位值可以项目组讨论决定。一个功能点的权重就是每个纬度评值后的总和。
基于前面的铺垫,举个例子来讲实际运用。
一个项目组在过去的6个月中完成了一个平台开发的2个模块,30个功能特性,发现了110个bug,那么其代码缺陷率(代码质量指标)为 = (110/30)*( 1/∏f(1)...f(50))
每个功能权重可以在创建story(如果是敏捷开发),或是制作WBS(工作任务分解)时通过项目组讨论、评估获得。
使用这种方法不管是对项目组的代码开发能力、开发者能力等都能进行一个有效、可见、合理的评判。走我的实践来看,这是软件质量管理一个好的方法。