本文正文内容共计8000字,建议阅读时间:16-18分钟。
代码评审数据分析设计:过程+指标体系+分析方法和模型;
如何做代码评审数据分析实战;
武丹,腾讯10年+研发质量管理领域,擅长疑难组织/项目的过程改进,具有多种业务场景从无到有建立研发流程和质量管理体系的可复制经验,对数据驱动研效质量提升有深刻理解并落地实践运用。多年致力于代码质量提升专项工作,2016年开始带领团队孵化并建设推行公司级的代码检查工具平台系统,2021年又成功孵化代码评审数据分析系统,擅长质量文化的营造。
“数据驱动不是万能的,没有数据驱动是万万不能的”,业务增长如此,技术领域的活动开展也是如此。今天和大家谈谈代码评审活动的数据驱动方法,重点包含代码评审相关活动指标体系设计和数据分析模型建立,以及Python自动化数据分析实施的方法,更有实际业务代码评审数据报告样例以及增长效果展示。代码评审是代码质量保证活动中一个非常重要的环节,该活动开展对于产品质量提升,工程素养提升,开发同学技术分享交流起到重要的促进作用。
相关组织在2020年就开展了代码评审数据分析和报告的尝试,解决了代码评审数据从0到1的问题,但是因为历史原因,尚未实现自动化,并且数据分析指标和纬度,以及数据分析方法和模型选择待优化。同时从数据展现和报告撰写来看,数据表展现围绕痛点表达的意不够明显,邮件报告模板配色及样式整体展示可以提升。
最大的问题是全部手工开展,每个月外包同学使用工蜂统计平台导出数据进行分析和展示及报告制定,要完成20+业务报告处理,最保守估计大约每个月7人天*2的人力投入,并且数据很容易出错。因此看来,无论是代码评审指标和指标维度,数据展示方法和样式,报告可视化以及自动化方法,都值得探索优化。
02代码评审数据分析设计
1代码评审数据分析过程
本文谈的是用数据分析的方法保持或改善代码评审活动的开展,那就要从数据分析典型的6个关键步骤说起,看看如何用科学的方法挖掘数据价值并展现数据价值,将数据背后的故事讲述出来,达到数据驱动的目的。
明确分析目的和思路
第一步至关重要,要回答的是为什么:
指标设计要注意什么除了表征开展情况的绝对指标,还需要看人均数,每日开展等相对指标进行数据观察
分析维度要注意什么时间对比,组织结构间对比,特殊人群比如TL的开展,以及每个开发同学的开展情况等
用什么分析方法最有效趋势分析看当前状态和未来走势;对比分析看组织间的开展;结构分析看详细构成;漏斗分析看代码评审活动在哪个环节不容易执行?
数据分析报告如何有说服力表是否清晰有效可视化强,能达到传递信息引发改进行动的目的,数据报告是否数据论证充分,并总结问题给用户以准确传递信息达到推动改进目的数据分析是有成本的,以上都是为了回答为什么要做数据分析的问题,以及想采用什么样的数据分析思路能够达到目的,也就是在后续数据分析实施步骤之前的数据分析设计工作。
数据收集&数据处理
用于本文的代码评审数据分析数据源来自于代码管理平台,可以导出CSV文件/excel文件,自动化之后是通过API接口读取平台数据,然后将收集到的数据进行加工、整理用于后续的数据分析工作,具体在1描述相关方法。
数据分析
在第1步“明确分析目的和思路”的阶段,就需要确定合适的数据分析方法,等到真正进入数据分析实施阶段的时候,能够从容地开展数据分析和研究。这一步有点像是开发活动中的技术方案设计阶段确定技术方案选型等等,还会影响到数据收集和数据处理的方案,数据分析的方式直接决定数据价值挖掘的程度,数据分析基本方法有对比,细分,预测等,数据分析大多是通过软件来完成的,这就要求数据分析师还要熟悉常用数据分析工具的操作,如excel,SQL,Python等,根据实际情况选择不同的工具开展分析。
数据展现
报告撰写
2代码评审指标体系建立
1什么是指标/维度/指标体系
指标与维度是数据分析中最常使用到的术语,非常基础也非常重要,其实很多时候我们是混淆不清的,这里先稍微复习下。
指标:指标就是对于一个数据的量化,一般通过对字段进行某种计算得到。在原始数据的基础上,通过统计汇总,加工处理形成的用于表征活动好坏优劣的数据。指标可以分为绝对指标和相对指标,绝对指标是反映规模大小的指标,而相对指标主要用来反映程度的高低。比如说代码评审活动中,评论数和参与人数等就是绝对指标,人均评论数和覆盖率等就是相对指标。在分析数据的时候,通常是绝对指标结合相对指标或者是多个绝对指标/多个相对指标一起来看,比如评论数趋势看不出明显异常,就要看人均发起数/人均评论数等等。
维度:维度也就是我们说的分析角度,想把指标按照什么角度拆分来看,这个角度用的字段就是维度。指标用于衡量事物发展程度,那这个程度是好是坏,这就需要通过不同维度进行对比,才能知道是好还是坏。对代码评审指标的分析维度常见的有时间,个人,组织结构,产品/业务,版本等等。
2代码评审指标体系构建思路
首先要确定代码评审活动开展的北极星指标。北极星指标随代码评审开展程度不同而不同,初期如果有发现代码评审活动开展明显不充分的组织,主要是想用数据牵引开发同学都要积极开展代码评审活动,会选择代码评审参与覆盖率等指标,所谓代码评审覆盖率,是指在某个时间段某组织代码评审活动参与人数的覆盖情况,它的下一级指标为代码评审发起覆盖率和代码评审评论覆盖率。
北极星指标是个牵引不同阶段会有不同,本文重点讲代码评审指标体系建立和指标分解思路,代码评审数据分析方法和模型建立,因此不对北极星指标进行过多纠结,这里我们以较多团队使用的“代码评审评论数”为初期北极星指标。然后用因素分解法对“代码评审评论数”进行拆解,如下所示。
1详细指标描述:
3代码评审数据分析方法和模型
1趋势分析法
趋势分析法是通过对代码评审指标的时间变化趋势做分析从中发现问题,可以对未来的发展进行判断和预测,优化后的代码评审报告中第一个就是代码评审活动开展整体大盘趋势,一张基本能够看到某个组织的代码评审活动开展状态。
趋势分析时要注意的问题:用于各期的口径必须一致;剔除偶发性项目的影响;应用例外原则,对某项有显著变动的指标做重点分析。在代码评审数据的分析中,我们一般是对北极星指标和关键指标进行时间趋势分析,看整体活动的发展和演进,然后使用对比,分布,结构,漏斗等分析方法看关键分解指标的当期数据的详细构成和原因,不会所有的指标都使用趋势分析法,因为,数据分析也是有成本的。
2对比分析法
对比分析法一般用于现状分析,通过对比能较快分析出变化、发展、异同等个性特征,从而更深刻的认识数据的本质和规律,对比也是数据分析的基本方法。
同级类别对比:产品/业务间,部门/中心/组间,个人的对比;
不同时期对比:通过时间前后的对比,可以知道在时间维度上事物发展变化是好还是差;
与目标对比:比如代码评审参与覆盖率100%,每月20条人均评论数的红线要求等;
行业内对比:和行业内相同性质的其它公司对比。一般情况下对比分析法主要用柱状进行数据展现,例如下为某业务各组创建数及人均创建数的对比,通过绝对指标和相对指标的对比,是基本能看出对比小组的代码评审活动开展情况的。
3分布分析法
对于代码评审颗粒度指标,我们使用分布分析的方法进行分析,将数据进行等距或不等距分组,研究各组分布规律,能比较直观的看到开发同学代码提交颗粒度的分布。关键点在于确定组数与组距。如下所示代码评审颗粒度分布,组数中200行就是以通用的小颗粒度要求保持一致,剩下的基本靠经验评估。开始的时候我们最大组会选择1000+行,后来发现这个粒度有些粗,还想进一步细化识别开发同学代码提交的情况,在部门TL的建议下,我们的组数增加了两组,分别是1000-5000和5000+,增加了识别精准性。
4结构分析法
如下所示:
第一张饼可以看到,在总的代码评审单中,处于Approved状态的占比66%;
第二张饼可以看到,Approved的代码评审单中,99%是通过MR的方式;
5漏斗分析法
漏斗分析主要用于原因分析,也就是从业务流程的角度进行对比分析,以漏斗的形式展现分析过程及原因,通过各环节变化查找指标变化的原因。简单地说,这里的漏斗分析可以帮助分析整个代码评审流程从发起开始有多少单能够“走到最后”,开发同学都是在哪一站下车的,每一步有多少单能够前进到下一步就叫做那个步骤的转化率。下为一个典型的代码评审活动开展漏斗。
在笔者观察数据过程中,有些团队在代码评审流程第一步“发起代码合并”就出了问题,这个出现在代码评审活动开展初期的团队,大家尚未养成代码评审习惯,写完代码直接发起Commit/MR简单痛快省事,这样的团队需要加强代码评审活动开展沟通,或者使用工具强制让Commit/MR之前的代码经过代码评审。
还有一种情况,是代码评审发起活动基本正常,但是评论活动开展不正常,有的是评审人员因为重视度不够,或者是在日常共工作计划中没有留出开展代码评审的时间等等,投入度不大,这里要和大家强调评审活动重要性,一定要开展。但是从上看,转化率最低的环节是评审活动开展了但是没有发表评论意见,在原因分析中也和开发同学沟通过,部分原因是大家当面做了代码评审沟通后没有把评审意见记录在系统,这里还是建议只要开展了就在系统留下记录,也便于后续回溯总结和开展代码分析。
03代码评审数据分析实施
1为什么是Python
当时在代码评审数据报告优化工作中我们面临的最大的问题是,指标体系建设优化后数据分析和可视化模型也通过Excel做demo很快搞定了,业务范围覆盖太广,代码评审报告面临大量的复制,excel已经很难完成这个使命了。当时相关度量平台的开发人力也很难支持这个需求,如何把这个数据量比较大又重复的行为变成自动化,成了当时面临的一个很大的难题。在了解了行业数据分析以及办公自动化的一些方法之后,把目光渐渐聚焦到了Python自动化数据分析程序实现方法。有方便数据处理丰富而强大的库,容易批量复制,易于和开发流程以及和各种处理模块相结合,这些年主流的数据科学技术,都将Python作为主要工具,并且API打通实现更加自动化,所以“人生苦短,我用Python”。
1Python之函数
在Python中进行数据分析主要就是通过使用函数来实现,函数包含函数名和参数,要执行函数定义的任务,可以调用该函数,需要在程序中多次执行同一项任务的时候,只需要调用执行该任务的函数,让Python运行其中的代码。
2Python之模块
把函数按照功能进行分组,放在不同文件里这种以.py作为后缀的文件,Python称之为模块,模块能够有逻辑的组织Python代码块,包含定义函数、类和变量。当一个模块编写完毕,就可以在其它有需要的地方进行引用,数据分析模块Pandas是python中处理数据分析的非常重要的一个模块。
Pandas提出了一套类似Excel的标准数据应用框架,包含了类似Excel表格的数据框DataFrame,以及快速便捷地处理数据的函数和方法,让数据分析整个过程变得快速,简单。绘模块matplotlib是一个数据可视化的模块,这个模块的功能更加全面,可以完成一些更高级的,这个库也是数据可视化的必学库。Matplotlib包含了大量创建各种形状的形的工具,包括简单的散点、折线、直方等,复杂的正选曲线,三维形,地等。首先要在程序中将需要使用的模块进行导入,常用的方法有使用import语句:
3Pandas之数据结构
2JupyterNotebook值得你拥有
Jupyternotebook功能强大,支持40多种编程语言,可共享,并提供在同一环境中构建可视化应用的一个交互式笔记本。它提供了一个环境,用户可以在里面写代码,运行代码,查看结果,并在其中可视化数据,很多人说它是Python做机器学习最好用的IDE。
Jupyternotebook将Python的交互式特点发挥到了极致jupyternotebook引进了Cell的概念,每次测试可以只跑一小块代码,并且在代码下方立刻就能看到运行结果,强的交互性,满足了Python程序员可以专注问题本身,不用在命令行之间来回切换就可以进行数据分析的不断调试。
轻松运行他人编写的代码同样是在机器学习和数据分析领域,我们可能会借鉴他人分享的代码,但当我们拷贝过来想要运行时,却需要使用API安装一大堆依赖的库,足以让人抓狂。而Jupyternotebook变得和GoogleDoc在线文档一样,直接打开程序就能运行。
Jupyternotebook更利于汇报和教学由于Jupyter本身的模块化和内容的清晰化,使得其天生具有如PPT一般的展示工作成果的能力。最后推荐安装数据科学和机器学习平台Anaconda,它集成了Python在数据分析,数据可视化等领域的常用模块,例如Numpy,Pandas,SciPy,Matplotlib,Networkx等,是一款以Spyder或JupyterNoteBook为开发工具的Python数据分析套件,它支持Linux,Mac,Windows操作系统,Anaconda通过集成工具包开发环境,大大简化了安装工作,而且安装时能够自动安装相应的依赖模块,可以说Anaconda是一个用于科学计算的Python发行版,我们只需要安装好它,就可以快速的使用它进行数据分析了。
安装成功anaconda后,打开anacondaprompt命令行输出jupyternotebook就可以启动,启动后,浏览器会在8888端口下打开一个新的窗口,点击Newàpython3就可以建新的任务了。
在任务界面窗口输入代码,在代码下方立刻就能看到运行结果,非常方便。
3Python实战代码评审数据分析
1数据收集处理
代码评审评论数据导出:
接下来用Python中pandas模块的read_excel来读取数据:
数据处理:接下来数据处理将收集到的数据进行加工,整理,使数据保持准确性,一致性和有效性,以形成数据分析要求的样式,一般来说即使再“干净”的原始数据也需要进行一定的处理才能使用,常用的数据处理方法:主要有数据清洗,数据合并,数据抽取,数据计算,数据转换等方法。
数据抽取:数据导入后,需要对数据进行简单处理,原始数据是没有部门、中心、小组字段的,需要对orgpath和userOrgPath进行字段拆分,分列出部门、中心、小组字段
数据清洗:数据筛选,筛出统计范围内的数据,剔除不需要统计的数据,比如把创建表和评论表把不在组织架构内的数据剔除
数据计算:数据列计算,新增代码量列,并对代码量进行分组简单计算:创建表新增代码量=insertion列+modification列函数计算:创建表新增代码量分布列,使用cut函数对代码量列进行分组,分成0-200,200-400,400-1000,1000-5000,5000+
数据转换:原始数据的创建时间字段类型为字符型,需要转换成时间类型,并抽取其中的年月
创建表得到如下的15681rows×31columns的清洗过后的数据:
2数据分析和展现
代码评审评论数排序分析
使用groupby和agg函数的组合,按照username进行分组,统计每个人的评论数,用sort_values排序,筛选出评论数为前10名的人进行排行分布;
使用matplotlib.pyplot.barh函数进行绘制展现数据。
代码评审创建数对比分析使用groupby和agg函数的组合,按照中心进行分组,得出各个中心的创建数,进行对比;然后使用matplotlib.pyplot.bar函数进行绘制进行数据分析展现。
代码评审颗粒度分布分析按照代码量分布进行分组,按照iid列进行计数统计,计算不同代码量的比例;使用matplotlib.pyplot.pie函数进行绘制。
代码评审活动开展趋势分析计算出每周期的创建数、评论数、覆盖率,使用matplotlib.pyplot.bar函数和matplotlib.pyplot.plot函数绘制组合表,以下仅为部分代码:
以上用几个典型的代码评审数据报表展示了Python强大的数据分析能力,不太熟悉Excel的同学很难实现的数据表,在Python中有的时候是一个函数就搞定了。
4代码评审数据报告展示
北极星指标:数值及趋势
关键指标:代码评审发起数,人均代码评审发起数,代码评审评论数,人均代码评审评论数等
细分指标:代码评审颗粒度,代码评审评审时长等
整体看代码评审数据分析主要改进:
代码评审指标体系建设,相关数据分析方法和表模型探索,数据展示得到优化;
探索并实施了Python自动化表的方法,API自动获取数据,表展示美观制作高效并且不容易出错;
发布的邮件报告整体组织得到优化,点评总结比较清晰结构化。
04总结和展望
1代码评审数据的增长
以上比较多的篇幅讲了代码评审指标体系建立和数据的分析和展示,这些都只是第一步,我们的意是:通过用数据分析的方法挖掘数据价值,并进行有效的分析和展示,让数据得到更好的使用,促进代码评审活动开展,如下所示为一个典型的数据反馈闭环。
增长案例某业务相关研发团队3月份制定北极星指标人均评论数作为牵引目标,每周技术周会看各组代码评审数据,很容易看到差距进行改进,从下看增长显著。
如何突破瓶颈,继续增长:
提高工程素养:比如代码规范的相关要求和培训等
工具先行:MR本地发起代码评审,自动标签问题分类等等
比如代码评审活动北极星指标“代码评审评论数”是我们努力要推进的一个数字,但是从开发角度看,是合入入的代码得到了评审,是代码质量提升和产品质量提升,是工程能力提升,工程素养提升。增长模型量化了代码评审活动开展的关键指标,我们在追求数据的更多的要去分析开发同学的日常开发行为和状态,现在的数据是否健康,和目前的开发状态是否匹配,什么因素影响的结果,中间的问题是什么。要记住数据只是辅助的手段,我们只有深入的了解开发行为习惯,才能有效的驱动增长,达到推动该活动开展的目的。
2代码评审分析系统建设助你实现代码评审数据自由
数据分析和表实现自动化之后,尚不能自动发布报告
需要依赖程序,不能做到实时数据可观察,数据时间范围可选
代码评审数据需要适应经常变化的组织结构自动选择调整组合该功能在腾讯目前已经在相关研效度量平台实现,各层级组织/开发同学们可以在任意时间查看相关代码评审数据分析结果,实时了解组织/个人代码评审的开展情况,并且该平台还支持定制自动代码评审邮件报告,支持周报和月报两个模式,定制后每周每月1号都能收到平台自动发布的邮件报告。到这一步,我们终于实现了代码评审数据自由。
——结束——
如果您想了解更多关于代码评审的内容,可查看思码逸网站获取;
思码逸Merico研发效能分析平台,致力于帮助研发团队解决研发效率、研发质量和人才发展三大痛点,提升研发效率与软件工程质量;
欢迎在评论区交流探讨!
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点