前言
以前的团队,每次上线都需要一份测试报告,其中里面有一项bug相关的描述:
从项目以及测试维度,这块统计没啥问题,也比较清晰.
但是相对于研发而言,不太认可这一项,因为需求大的版本, bug
量多也是正常的,需求小的版本,很大可能也没有 bug
,如果根据 bug
数来衡量研发的质量,这个好像也不太靠谱。
因此,在研发考核这块,找了下资料,发现千行代码缺陷率,公式如下:
按照上述的公式来看,缺陷的数量越少表示质量越高。
而生产的代码越多,可以容忍的bug数量也就越多。那么这个公式应该是可以很好地检测代码质量的。
ok,到这里为止,先不管这个值是否真的有效或者好坏?这边只想知道,这个值是怎么算出来的?
因为业务比较小,因此改用百行代码缺陷率来尝试算这个值。
怎么算出来的
这里先直接贴最终的命令行,这里是统计 develop
分支2020年3月31号,用户是 jb
跟 jb2
的提交数:
git log develop --no-merges --since="2020-03-31 00:00:00" --until="2020-03-31 23:59:59" --author="jb\|jb2" --pretty=tformat: --numstat -- . ":(exclude)XXX(项目名)/src/test" ":(exclude)XXX(项目名)/src/main/resources" | awk '{ add += $1 ; subs += $2 ; loc += $1 + $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'
返回的结果是这样的:
added lines: 31049 removed lines : 14821 total lines: 45870
ok,接下来就来逐步拆分了解下。
git log,获取所有提交的历史记录。
develop,获取
develop
分支所有提交的历史记录。--no-merges ,是去除该提交中
merges
的代码,因为有可能会merge
其他分支的代码,此时应该去除。--since="" --until="",是要统计修改记录的开始和结束时间
--author ,是指修改代码的人 过滤多人时使用“|”分开,比如
git log--author="jb\|jb2"
。--pretty=,控制显示的记录格式。
--numstat,对增加和删除的行数进行统计,第一列显示的是增加的行数,第二列显示的是删除的行数。
-- . ":(exclude)folderName",排除文件夹,因为项目里面有些test目录是不应该包含进去的,因此需要排除这类文件夹。排除多个则这样写
--.":(exclude)folderName1"":(exclude)folderName2"
。
项目实践
版本对比
版本 | 总代码行数 | 百行代码bug数 |
---|---|---|
XX服务4.8.0 | 2597 | 0.04 |
XX服务4.9.0 | 6739 | 0.06 |
XX搜索4.3.0 | 6384 | 0.016 |
XX服务4.9.1 | 1077 | 0 |
XX服务4.10.0 | 2931 | 0 |
XX服务4.11.0 | 513 | 0 |
XX服务4.12.0 | 2929 | 0 |
XX服务4.13.0 | 1589 | 0 |
XX体检1.0.0 | 0 | 0 |
代码质量
计算方法:总代码行数 = added lines - removed lines 百行代码bug数 = bug数 × 100 / 总代码行数
研发对比
研发 | bug数 | 总代码行数 | 当前版本的百行代码bug数 | 上个版本的百行代码bug数 |
jb | / | / | / | 0.04 |
jb2 | 0 | 1500 | 0 | 0 |
激励
研发超过
0.5
要请下午茶。0bug就老大请下午茶。
这个统计是好还是坏
由一开始的图片可知,如果想逃避这个指标,最好的做法就是增大分母,即增加代码行数,这样就会延伸出另外的问题:
增大基数,增加无意义代码;
把定长循环分开写,写成顺序方法;
把可配置信息写死到代码中;
大量的复制、粘贴代码;
重新发明各种轮子;
但现实中,优秀的程序员是通过减少代码行数来增加功能的。这样就违背了初衷。
缺陷率
作用
回到问题的本身,缺陷率到底有什么作用?
个人觉得,主要作用一般是来评价工作产品的质量。如果bug率较高,说明系统质量较差,需要大量的返工。项目经理就需要做好缺陷分析(缺陷的类型、分布、严重程度等),找出原因,以便做好下一阶段的缺陷预防工作。
指标
目前流行的公式主要以下两个:
bug率=bug数/代码行数
bug率=bug数/功能点数
使用代码行进行计算,优点是可以通过自动统计工具计算(特别是对于大型项目,肯定会计算代码行数),比较方便,所以该方法比较普遍,是大多数公司或项目运用的计算方法。但它的缺点是受开发人能力影响大(毕竟不同开发人员的编码能力不一样),且不用编程语言差别较大。
使用功能点进行计算,优点是计算方法适用性强,不同语言之间也有可比性,但缺点是参数较多,比较复杂,而且目前还没有比较方便的工具。
所以到底哪个指标更好,这里是没有定论的。
更好的研发考核指标
目前想到的是代码覆盖率(jacoco)、圈复杂度、代码规范(sonar跟eslint)、代码重复率。
小结
百行代码缺陷率的统计,一开始不了解觉得挺复杂,但实际了解后,才觉得Git真牛逼,但是这个指标不一定适用任何场景,在小组内部使用约束没问题,但是想整个大团队进行实行,难度还是很大的:
这个指标的作用是什么?
如何让所有人都信服这个指标?
如何避免写垃圾代码增大分母?
具体规则细节是什么?
这些问题,都是会被挑战的,后面可能会针对上面提及到的其他研发考核指标来更深入了解。