6/18/2022
阅读约需
16
分钟
代码管理
效能度量
提效增速

如何用度量数据驱动代码评审的改善

行业观察
研发效能行业洞见

数据驱动代码评审的实践分享


阅读本文你将收获:

1、为什么要做代码评审的背景介绍;

2、代码评审数据分析设计:过程+指标体系+分析方法和模型;

3、如何做代码评审数据分析实战;


作者简介

武丹,腾讯10年+研发质量管理领域,擅长疑难组织/项目的过程改进,具有多种业务场景从无到有建立研发流程和质量管理体系的可复制经验,对数据驱动研效质量提升有深刻理解并落地实践运用。多年致力于代码质量提升专项工作,2016年开始带领团队孵化并建设推行公司级的代码检查工具平台系统,2021年又成功孵化代码评审数据分析系统,擅长质量文化的营造。


本文来源:武丹老师的研发效能系列文章,本文全篇收录于QECon组委会发布的白皮书之《研发效能实践指南


代码评审背景介绍


“数据驱动不是万能的,没有数据驱动是万万不能的”,业务增长如此,技术领域的活动开展也是如此。今天和大家谈谈代码评审(CR)活动的数据驱动方法,重点包含代码评审相关活动指标体系设计和数据分析模型建立,以及Python自动化数据分析实施的方法,更有实际业务代码评审数据报告样例以及增长效果展示。代码评审(CR)是代码质量保证活动中一个非常重要的环节,该活动开展对于产品质量提升,工程素养提升,开发同学技术分享交流起到重要的促进作用。

代码评审活动开展程度需要量化数据做参考,腾讯代码管理平台提供了代码评审开展的原始数据,申请权限后可以按照组织结构查看或导出每一个发起代码评审的详细信息和每一条评论开展的信息,但是,数据要产生价值,还需要根据做进一步分析。

相关组织在2020年就开展了代码评审数据分析和报告的尝试,解决了代码评审数据从0到1的问题,但是因为历史原因,尚未实现自动化,并且数据分析指标和纬度,以及数据分析方法和模型选择待优化。同时从数据展现和报告撰写来看,数据图表展现围绕痛点表达的意图不够明显,邮件报告模板配色及样式整体展示可以提升。

最大的问题是全部手工开展,每个月外包同学使用工蜂统计平台导出数据进行分析和展示及报告制定,要完成20+业务报告处理,最保守估计大约每个月7人天*2的人力投入,并且数据很容易出错。因此看来,无论是代码评审指标和指标维度,数据展示方法和样式,报告可视化以及自动化方法,都值得探索优化。

代码评审数据分析设计

代码评审数据分析过程

本文谈的是用数据分析的方法保持或改善代码评审活动的开展,那就要从数据分析典型的6个关键步骤说起,看看如何用科学的方法挖掘数据价值并展现数据价值,将数据背后的故事讲述出来,达到数据驱动的目的。


明确分析目的和思路

第一步至关重要,要回答的是为什么:

●为什么要开展代码评审数据分析工作代码评审活动是研发过程中的一个关键活动,我们希望了解开展状态,促进该活动的推广实施

●从哪些角度分析数据才系统 代码评审活动包含发起和评论开展活动,一般是先观察发起情况,再观察评论情况,同时代码评审的颗粒度以及开展过程也需要关注

●指标设计要注意什么除了表征开展情况的绝对指标,还需要看人均数,每日开展等相对指标进行数据观察

●分析维度要注意什么 时间对比,组织结构间对比,特殊人群比如TL的开展,以及每个开发同学的开展情况等

●用什么分析方法最有效趋势分析看当前状态和未来走势;对比分析看组织间的开展;结构分析看详细构成(好的原因是什么?哪部分贡献的?哪部分开展并没有按照预期?);漏斗分析看代码评审活动在哪个环节不容易执行?

●数据分析报告如何有说服力图表是否清晰有效可视化强,能达到传递信息引发改进行动的目的,数据报告是否数据论证充分,并总结问题给用户以准确传递信息达到推动改进目的数据分析是有成本的,以上都是为了回答为什么要做数据分析的问题,以及想采用什么样的数据分析思路能够达到目的,也就是在后续数据分析实施步骤之前的数据分析设计工作。

数据收集&数据处理

用于本文的代码评审数据分析数据源来自于代码管理平台,可以导出CSV文件/excel文件,自动化之后是通过API接口读取平台数据,然后将收集到的数据进行加工、整理用于后续的数据分析工作,具体在3.3.1描述相关方法。

数据分析

在第1步“明确分析目的和思路”的阶段,就需要确定合适的数据分析方法,等到真正进入数据分析实施阶段的时候,能够从容地开展数据分析和研究。这一步有点像是开发活动中的技术方案设计阶段确定技术方案选型等等,还会影响到数据收集和数据处理的方案,数据分析的方式直接决定数据价值挖掘的程度,数据分析基本方法有对比,细分,预测等,数据分析大多是通过软件来完成的,这就要求数据分析师还要熟悉常用数据分析工具的操作,如excel,SQL,Python等,根据实际情况选择不同的工具开展分析。

数据展现

数据展现主要目的是借助图形化手段,将枯燥的数据变得生动,展现数据中隐含的信息,更高效和清晰有效的传达与沟通数据背后的故事,得出结论和假设。一般情况下,数据是通过表格和图形的方法来呈现的,我们常说的用图表说话就是这个意思,也称为数据可视化,常用的数据图表包括饼图,柱形图,条形图,折线图,散点图,雷达图等等。目前有太多的数据可视化工具可以使用,本文选择的是Python强大的数据可视化模块开展,3.3.2章节会做详细介绍。

报告撰写

数据分析报告其实是对整个数据分析过程的一个总结与呈现。通过报告,把数据分析的结果及建议良好呈现供组织参考,如何写好一个报告,可以单独再写一篇分享文章。数据分析设计这一部分重点讲第1步:明确分析目的和思路。先介绍如何围绕痛点设计代码评审指标和指标体系,再介绍中间用到的数据分析方法设计。这两个问题搞清楚了,等到真正进入数据分析实施的阶段时,能够更好的开展达到预期的效果并尽量避免返工。

代码评审指标体系建立

什么是指标/维度/指标体系

指标与维度是数据分析中最常使用到的术语,非常基础也非常重要,其实很多时候我们是混淆不清的,这里先稍微复习下。

指标:指标就是对于一个数据的量化,一般通过对字段进行某种计算得到(比如加和,求平均等)。在原始数据的基础上,通过统计汇总,加工处理形成的用于表征活动好坏优劣的数据。 指标可以分为绝对指标和相对指标,绝对指标是反映规模大小的指标,而相对指标主要用来反映程度的高低。比如说代码评审活动中,评论数和参与人数等就是绝对指标,人均评论数和覆盖率等就是相对指标。在分析数据的时候,通常是绝对指标结合相对指标或者是多个绝对指标/多个相对指标一起来看,比如评论数趋势看不出明显异常,就要看人均发起数/人均评论数等等。

维度:维度也就是我们说的分析角度,想把指标按照什么角度拆分来看,这个角度用的字段就是维度。指标用于衡量事物发展程度,那这个程度是好是坏,这就需要通过不同维度进行对比,才能知道是好还是坏。对代码评审指标的分析维度常见的有时间,个人,组织结构,产品/业务,版本等等。

指标体系:指标体系是一系列指标的组合,是把数据指标系统化的组织起来,有利于我们从更多的维度来看数据表现,得出的结论可靠度更高,比如说我们的BSC,KPI等就是常见的指标体系,那本文接下来介绍的就是代码评审指标体系。

代码评审指标体系构建思路

首先要确定代码评审活动开展的北极星指标。北极星指标随代码评审开展程度不同而不同,初期如果有发现代码评审活动开展明显不充分的组织,主要是想用数据牵引开发同学都要积极开展代码评审活动,会选择代码评审参与覆盖率等指标,所谓代码评审覆盖率,是指在某个时间段某组织代码评审活动参与人数的覆盖情况,它的下一级指标为代码评审发起覆盖率和代码评审评论覆盖率。

当代码评审参与覆盖率到一定程度之后,有的团队会选择代码评审评论数作为北极星指标,成熟度再高些的团队会选择月度人均评论条数作为北极星指标。(补充说明:作者以前在研发团队用了人均平均数作为北极星指标,并且有制定20条作为红线目标,那么为什么是20条不是30条或50条呢,大概的逻辑是,开发同学应该每天开展代码检视活动,至少可以发现一个问题并提交一条检视意见,这就是人均每月20条评论数的来源。)还有根据代码评审的实际情况也会有不同的北极星指标选择,比如某些组织会选择代码评审的效率,即代码评审单从发起到关闭的时长等作为关注重点。

北极星指标是个牵引不同阶段会有不同,本文重点讲代码评审指标体系建立和指标分解思路,代码评审数据分析方法和模型建立,因此不对北极星指标进行过多纠结,这里我们以较多团队使用的“代码评审评论数”为初期北极星指标。然后用因素分解法(会影响到该指标的主要因素)对 “代码评审评论数”进行拆解,如下图所示。


图1 详细指标描述:


健康的数据指标体系是数据分析和驱动的前提,多种指标相结合看数据,更能发现数据背后的故事,当然数据指标体系构建要注意避免以下几个问题:1)贪多会造成指标体系混乱,重心缺失,大多数时候只需要关注北极星指标+有效的周边指标即可,不要贪多2)对活动的价值判断是取舍指标的重要依据,需要对活动有思考和价值判断,才能保留核心指标而不是迷失方向,注意避免指标存在过度优化的风险以上解决了代码评审指标体系的问题,接下来会选择代码评审数据分析中用到的几个典型数据分析方法和模型进行介绍。

代码评审数据分析方法和模型

趋势分析法

趋势分析法是通过对代码评审指标的时间变化趋势做分析从中发现问题,可以对未来的发展进行判断和预测,优化后的代码评审报告中第一个图就是代码评审活动开展整体大盘趋势,一张图基本能够看到某个组织的代码评审活动开展状态。


趋势分析时要注意的问题:用于各期的口径必须一致;剔除偶发性项目的影响;应用例外原则,对某项有显著变动的指标做重点分析。在代码评审数据的分析中,我们一般是对北极星指标和关键指标进行时间趋势分析,看整体活动的发展和演进,然后使用对比,分布,结构,漏斗等分析方法看关键分解指标的当期数据的详细构成和原因,不会所有的指标都使用趋势分析法,因为,数据分析也是有成本的。

对比分析法

对比分析法一般用于现状分析,通过对比能较快分析出变化、发展、异同等个性特征,从而更深刻的认识数据的本质和规律,因此,对比也是数据分析的基本方法。

1)同级类别对比:产品/业务间,部门/中心/组间,个人的对比;

2)不同时期对比:通过时间前后的对比,可以知道在时间维度上事物发展变化是好还是差;

3)与目标对比:比如代码评审参与覆盖率100%,每月20条人均评论数的红线要求等;

4)行业内对比:和行业内相同性质的其它公司对比。一般情况下对比分析法主要用柱状图进行数据展现,例如下图为某业务各组创建数及人均创建数的对比图,通过绝对指标和相对指标的对比,是基本能看出对比小组的代码评审活动开展情况的。


分布分析法

对于代码评审颗粒度指标,我们使用分布分析的方法进行分析,将数据进行等距或不等距分组,研究各组分布规律,能比较直观的看到开发同学代码提交颗粒度的分布。关键点在于确定组数与组距。如下所示代码评审颗粒度分布图,组数中200行就是以通用的小颗粒度要求保持一致,剩下的基本靠经验评估。开始的时候我们最大组会选择1000+行,后来发现这个粒度有些粗,还想进一步细化识别开发同学代码提交的情况,在部门TL的建议下,我们的组数增加了两组,分别是1000-5000和5000+,增加了识别精准性。

结构分析法

结构分析法主要用于原因分析,计算各组成部分所占的比重,重点在于占整体的比重,得到对总体的影响大小,一般用饼图展现。比如代码评审过程中我们希望了解代码评审评审结果类型(处于各个状态的单子数的占比),代码评审活动开展方式占比,以及MR的代码评审中有多少评论数为0的情况,

如下图所示:

第一张饼图可以看到,在总的代码评审单中,处于Approved状态的占比66%;

第二张饼图可以看到,Approved的代码评审单中,99%是通过MR的方式;

第三张饼图可以看到,Approved的MR的代码评审单中,72%是没有评论就通过的(重点关注)。


漏斗分析法

漏斗分析主要用于原因分析,也就是从业务流程的角度进行对比分析,以漏斗的形式展现分析过程及原因,通过各环节变化查找指标变化的原因。简单地说,这里的漏斗分析可以帮助分析整个代码评审流程从发起开始有多少单能够“走到最后”,开发同学都是在哪一站下车的,每一步有多少单能够前进到下一步就叫做那个步骤的转化率。下图为一个典型的代码评审活动开展漏斗图。

在笔者观察数据过程中,有些团队在代码评审流程第一步“发起代码合并”就出了问题,这个出现在代码评审活动开展初期的团队,大家尚未养成代码评审习惯,写完代码直接发起Commit/MR简单痛快省事,这样的团队需要加强代码评审活动开展沟通,或者使用工具强制让Commit/MR之前的代码经过代码评审。

还有一种情况,是代码评审发起活动基本正常,但是评论活动开展不正常,有的是评审人员因为重视度不够,或者是在日常共工作计划中没有留出开展代码评审的时间等等,投入度不大,这里要和大家强调评审活动重要性,一定要开展。但是从上图看,转化率最低的环节是评审活动开展了但是没有发表评论意见,在原因分析中也和开发同学沟通过,部分原因是大家当面做了代码评审沟通后没有把评审意见记录在系统,这里还是建议只要开展了就在系统留下记录,也便于后续回溯总结和开展代码分析。

这里介绍个优秀实践,某部门为了改进这个活动,部门TL用可视化工具配置了实时数据看板并自动进行每日0评论邮件提醒,取得较好效果,4.1有专门介绍。

代码评审数据分析实施

为什么是Python

当时在代码评审数据报告优化工作中我们面临的最大的问题是,指标体系建设优化后数据分析和可视化模型也通过Excel做demo很快搞定了,但是,业务范围覆盖太广,代码评审报告面临大量的复制,excel已经很难完成这个使命了。当时相关度量平台的开发人力也很难支持这个需求,如何把这个数据量比较大又重复的行为变成自动化,成了当时面临的一个很大的难题。在了解了行业数据分析以及办公自动化的一些方法之后,把目光渐渐聚焦到了Python自动化数据分析程序实现方法。有方便数据处理丰富而强大的库,容易批量复制,易于和开发流程以及和各种处理模块相结合,这些年主流的数据科学技术,都将Python作为主要工具,并且API打通实现更加自动化,所以“人生苦短,我用Python”。

Python之函数

在Python中进行数据分析主要就是通过使用函数来实现,函数包含函数名和参数,要执行函数定义的任务,可以调用该函数,需要在程序中多次执行同一项任务的时候,只需要调用执行该任务的函数,让Python运行其中的代码。


Python之模块

把函数按照功能进行分组,放在不同文件里这种以.py作为后缀的文件,Python称之为模块(Module),模块能够有逻辑的组织Python代码块,包含定义函数、类和变量。当一个模块编写完毕,就可以在其它有需要的地方进行引用,数据分析模块Pandas是python中处理数据分析的非常重要的一个模块。

Pandas提出了一套类似Excel的标准数据应用框架,包含了类似Excel表格的数据框DataFrame,以及快速便捷地处理数据的函数和方法,让数据分析整个过程变得快速,简单。绘图模块matplotlib是一个数据可视化的模块,这个模块的功能更加全面,可以完成一些更高级的图,这个库也是数据可视化的必学库。Matplotlib包含了大量创建各种形状的图形的工具,包括简单的散点图、折线图、直方图等,复杂的正选曲线,三维图形,地图等。首先要在程序中将需要使用的模块进行导入,常用的方法有使用import语句:


Pandas之数据结构



Jupyter Notebook值得你拥有

Jupyter notebook功能强大,支持40多种编程语言,可共享,并提供在同一环境中构建可视化应用的一个交互式笔记本。它提供了一个环境,用户可以在里面写代码,运行代码,查看结果,并在其中可视化数据,很多人说它是Python做机器学习最好用的IDE。

●Jupyter notebook将Python的交互式特点发挥到了极致jupyter notebook引进了Cell的概念,每次测试可以只跑一小块代码,并且在代码下方立刻就能看到运行结果,强的交互性,满足了Python程序员可以专注问题本身,不用在命令行之间来回切换就可以进行数据分析的不断调试。

●轻松运行他人编写的代码同样是在机器学习和数据分析领域,我们可能会借鉴他人分享的代码,但当我们拷贝过来想要运行时,却需要使用API安装一大堆依赖的库,足以让人抓狂。而Jupyter notebook变得和Google Doc在线文档一样,直接打开程序就能运行。

●Jupyter notebook更利于汇报和教学由于Jupyter本身的模块化和内容的清晰化,使得其天生具有如PPT一般的展示工作成果的能力。最后推荐安装数据科学和机器学习平台Anaconda,它集成了Python在数据分析,数据可视化等领域的常用模块,例如Numpy,Pandas,SciPy,Matplotlib,Networkx等,是一款以Spyder或Jupyter NoteBook为开发工具的Python数据分析套件,它支持Linux,Mac,Windows操作系统,Anaconda通过集成工具包开发环境,大大简化了安装工作,而且安装时能够自动安装相应的依赖模块,可以说Anaconda是一个用于科学计算的Python发行版,我们只需要安装好它,就可以快速的使用它进行数据分析了。

安装成功anaconda后,打开anaconda prompt命令行输出jupyter notebook就可以启动,启动后,浏览器会在8888端口下打开一个新的窗口,点击Newàpython3就可以建新的任务了。

在任务界面窗口输入代码,在代码下方立刻就能看到运行结果,非常方便。

Python实战代码评审数据分析

数据收集处理

数据导入:外部数据主要有excel,csv,txt,数据库文件等存在形式,本文重点介绍Excel为输入的数据处理方法(当然后面我们是全面实现了自动读取代码管理平台API接口实现),以下两个表格为代码评审活动开展的发起数据原始表格和评论开展原始数据表格。代码评审发起数据导出:


代码评审评论数据导出:


接下来用Python中pandas模块的read_excel来读取数据:


数据处理:接下来数据处理将收集到的数据进行加工,整理,使数据保持准确性,一致性和有效性,以形成数据分析要求的样式,一般来说即使再“干净”的原始数据也需要进行一定的处理才能使用,常用的数据处理方法:主要有数据清洗,数据合并,数据抽取,数据计算,数据转换等方法。

1、数据抽取:数据导入后,需要对数据进行简单处理,原始数据是没有部门、中心、小组字段的,需要对orgpath和userOrgPath进行字段拆分,分列出部门、中心、小组字段


2、数据清洗:数据筛选,筛出统计范围内的数据,剔除不需要统计的数据,比如把创建表和评论表把不在组织架构内的数据剔除


3、数据计算:数据列计算,新增代码量列,并对代码量进行分组简单计算:创建表新增代码量=insertion列+modification列函数计算:创建表新增代码量分布列,使用cut函数对代码量列进行分组,分成0-200,200-400,400-1000,1000-5000,5000+


4、数据转换:原始数据的创建时间字段类型为字符型,需要转换成时间类型,并抽取其中的年月

创建表得到如下的15681 rows × 31 columns的清洗过后的数据:  

数据分析和展现

数据处理好了之后,就可以进入数据分析阶段了,如2.3部分介绍的数据分析的各种方法和模型,本部分重点介绍如何在Python中简单实现分析和展示。

代码评审评论数排序分析

1、使用groupby和agg函数的组合,按照username进行分组,统计每个人的评论数,用sort_values排序,筛选出评论数为前10名的人进行排行分布;

2、使用matplotlib.pyplot.barh函数进行绘制展现数据。


代码评审创建数对比分析1使用groupby和agg函数的组合,按照中心进行分组,得出各个中心的创建数,进行对比;2、然后使用matplotlib.pyplot.bar函数进行绘制进行数据分析展现。


代码评审颗粒度分布分析1按照代码量分布进行分组,按照iid列进行计数统计,计算不同代码量的比例;2、使用matplotlib.pyplot.pie函数进行绘制。


代码评审活动开展趋势分析计算出每周期的创建数、评论数、覆盖率,使用matplotlib.pyplot.bar函数和matplotlib.pyplot.plot函数绘制组合图表,以下仅为部分代码:


   以上用几个典型的代码评审数据报表展示了Python强大的数据分析能力,不太熟悉Excel的同学很难实现的数据图表,在Python中有的时候是一个函数就搞定了。

代码评审数据报告展示

这一部分我们将介绍如何将前面讲的代码评审指标体系和数据分析结果进行展示和报告,需要显示以下指标:

1)北极星指标:数值及趋势

2)关键指标:代码评审发起数,人均代码评审发起数,代码评审评论数,人均代码评审评论数等

3)细分指标:代码评审颗粒度,代码评审评审时长等

4)重要人群分组:按照组织结构分,按照模块分,按照业务分,TL的识别以一份业务代码评审月报为样例进行介绍:




整体看代码评审数据分析主要改进:

1、代码评审指标体系建设,相关数据分析方法和图表模型探索,数据展示得到优化;

2、探索并实施了Python自动化图表的方法,API自动获取数据,图表展示美观制作高效并且不容易出错;

3、发布的邮件报告整体组织得到优化,点评总结比较清晰结构化。

总结和展望

代码评审数据的增长

以上比较多的篇幅讲了代码评审指标体系建立和数据的分析和展示,这些都只是第一步,我们的意图是:通过用数据分析的方法挖掘数据价值,并进行有效的分析和展示,让数据得到更好的使用,促进代码评审活动开展,如下图所示为一个典型的数据反馈闭环。


增长案例1:某业务相关研发团队3月份制定北极星指标人均评论数作为牵引目标,每周技术周会看各组代码评审数据,很容易看到差距进行改进,从下图看增长显著。


增长案例2:某部门今年春节后开始关注代码评审数据, 5月份部门TL和代码评审数据团队一起梳理更新指标进行进一步关注,重点整改了MR中notecount为0的代码评审,同时月度在部门开展代码评审活动总结,从数据看,改进后增长明显。


如何突破瓶颈,继续增长(促进代码评审活动开展):

1、提高工程素养:比如代码规范的相关要求和培训等

2、固化流程并规范流程:每个MR的代码必须要经过代码评审,日常开发活动关注

3、工具先行:MR本地发起代码评审,自动标签问题分类等等

4、重点人群关注:比如TL的带头作用,新员工以及实习生代码重点关注等

5、北极星指标的牵引调整:月代码评审覆盖率->周代码评审覆盖率->评论数->人均评论数等数据是非常有用的武器,但是增长的背后是活动的实际价值和真实的关注度。

比如代码评审活动北极星指标“代码评审评论数”是我们努力要推进的一个数字,但是从开发角度看,是合入入的代码得到了评审,是代码质量提升和产品质量提升,是工程能力提升,工程素养提升。增长模型量化了代码评审活动开展的关键指标,我们在追求数据的同时,更多的要去分析开发同学的日常开发行为和状态,现在的数据是否健康,和目前的开发状态是否匹配,什么因素影响的结果,中间的问题是什么。因此,要记住数据只是辅助的手段,我们只有深入的了解开发行为习惯,才能有效的驱动增长,达到推动该活动开展的目的。

代码评审分析系统建设助你实现代码评审数据自由

本文介绍的是一种通用的用Python程序解决研效数据分析及报告的方法,上面洋洋万字文介绍的方法适用于需要大量数据但是暂无系统平台支持的情况,是一个用极小成本孵化的研效数据分析成功应用场景,但是局限性也是不可避免的:

1、数据分析和图表实现自动化之后,尚不能自动发布报告

2、需要依赖程序,不能做到实时数据可观察,数据时间范围可选

3、代码评审数据需要适应经常变化的组织结构自动选择调整组合该功能在腾讯目前已经在相关研效度量平台实现,各层级组织/开发同学们可以在任意时间查看相关代码评审数据分析结果,实时了解组织/个人代码评审的开展情况,并且该平台还支持定制自动代码评审邮件报告,支持周报和月报两个模式,定制后每周一,每月1号都能收到平台自动发布的邮件报告。到这一步,我们终于实现了代码评审数据自由。


与同行交流效能提升经验
扫码加入研发效能交流群
与同行交流效能提升经验
扫码加入研发效能交流群
立即预约
在线客服
在线客服
扫码添加咨询微信
立即试用
用数据驱动
研发质效提升!
预约思码逸效能专家,一起探讨如何提升研发效能!
立即试用