掌桥专利:专业的专利平台
掌桥专利
首页

一种面向多样性的代码审查者推荐方法及存储介质、设备

文献发布时间:2024-04-18 19:59:31


一种面向多样性的代码审查者推荐方法及存储介质、设备

技术领域

本发明属于开源软件生态服务技术领域,具体涉及一种面向多样性的代码审查者推荐方法及存储介质、设备。

背景技术

在GitHub开源软件协作开发平台中,开发者基于拉取请求(Pull Request,PR)的协作开发模型进行协作开发。开发者通过向拉取请求提供修改代码参与项目开发,开发团队通过审查拉取请求进行代码质量检查以完成项目正常迭代。开源软件项目中对拉取请求开展高效的代码审查是项目能够健康快速迭代的基础保障。近年来,部分研究表明开源软件项目中一半以上拉取请求的审查周期超过一个月,且审查时间受到提交时间、审查人员数量等因素影响。低效率的审查工作严重阻碍了项目的发展,为提高审查效率,为拉取请求分派合适的审查者是必要的,这种分派可以是贡献者主动邀请,也可以是开源软件项目指定,GitHub为软件项目提供了assign这一功能。但一项研究发现16%-66%的审查请求中至少有一个被邀请的审查者没有回应。

由于上述多项挑战,代码审查在实践中受到了很多关注。现有的主流代码审查者推荐方法以推荐专业的审查者为目标,且是在假定实际数据中的审查者即为最合适的审查者的前提下进行评估的。这导致推荐的审查者多是项目团队的核心开发者,使得项目知识被囤积到少数开发者中,增大了项目知识流失风险,也容易造成核心团队审查负载过重、审查资源分配不均衡,造成严重的审查等待。

为了解决上述技术问题,给拉取请求分派合适的代码审查者,诸多现代代码审查(Modern Code Review,MCR)方法提出并应用到实际开发中。比如:基于拉取请求修改文件路径集相似性进行代码审查者推荐;以每个审查者在过去的审查中对所审代码的具体贡献如审查次数、审查时间、审查工作负载等为依据,评估代码审查者的专业技能,并据此进行审查者推荐;结合审查历史交互记录,通过挖掘和分析历史记录中拉取请求创建者与审查者之间的社会关系,构建评论网络,以寻找具有共同兴趣的开发者作为审查者;通过挖掘和分析历史记录中拉取请求创建者及拉取请求审查者之间的合作关系以及拉取请取之间的相似关系,构建超图,并利用超图排序算法来推荐审查者。

部分研究逐渐关注到开源软件项目中的知识流失风险问题,提出开发者可以通过多种开发行为进行交流并传递知识。另有研究表明开发者负载等非技术性因素对代码审查响应时间及最终审查质量有重大影响。一些研究通过分析开发者与软件工件的交互行为来探究开发者的知识传播问题,也有学者从拉取请将审查队列长度、代码变更规模等方面衡量开发者工作负载。这些方法大多基于简单的审查交互历史和代码提交行为来衡量知识传播、工作负载,或进一步推荐代码审查者,没有全面的分析开发者和拉取请求的多种交互行为,对面向减少知识流失风险和平衡开发者工作负载的多样化代码审查者推荐策略也缺少研究。

开发者在开源项目完成协作开发工作时,能够获取项目知识,同时,开源软件项目也会因为开发者的离职而导致项目知识的流失。开源软件项目中核心开发者承担了大部分开发任务和代码审查任务,使得开发团队工作负载不均衡。现有代码审查者推荐方法倾向于推荐经验丰富的代码审查者,这会导致项目知识在小团队内传播,从而具有因开发者离职带来的较大流失风险,也会使得部分核心开发者工作负载过大。

发明内容

本发明从知识流失风险与开发者工作负载角度出发,推荐面向多样性的代码审查者,旨在减少项目知识的流失风险,并平衡开发者工作负载。

本发明提出的一种代码审查者推荐方法包括:

基于开源软件项目中拉取请求与开发者间的协作行为,将开源软件项目中的文件按照文件安全等级分为风险文件和安全文件,并计算开发者保留率,以文件安全等级和开发者保留率作为知识流失风险计算的指标;

基于开源软件项目中拉取请求与开发者间的协作行为,获取开源软件项目的开发者工作负载;所述开发者工作负载包括代码审查工作负载、代码修改工作负载、遗留任务工作负载,如果候选人是待推荐拉取请求的代码提交者,开发者工作负载还包括目标拉取请求的待审查工作负载;

基于开源软件项目中拉取请求与开发者间的协作行为构建超边,并计算超边权重,获取开发者与拉取请求的交互关系超图;

根据开发者与拉取请求的交互关系超图,获取目标拉取请求的最优超图切向量,作为目标拉取请求的关联值向量;

根据目标拉取请求的关联值向量,以降低知识流失风险和平衡开发者工作负载为目的选择推荐排序策略,计算候选审查者推荐得分,输出代码审查者推荐结果。

进一步地,基于开源软件项目中拉取请求与开发者间的协作行为,将开源软件项目中的文件按照文件安全等级分为风险文件和安全文件,并计算开发者保留率,包括:

定义一段时间为一个观察期,统计观察期内开源软件项目文件与开发者基于代码提交、代码审查和审查评论的交互行为次数,将观察期内交互行为次数低于规定阈值的开源软件项目文件定义为风险文件,交互行为次数大于等于规定阈值的开源软件项目文件为安全文件;

基于开发者在过去一年的交互行为数据,计算开发者保留率

其中,

进一步地,代码审查工作负载具体为:

拉取请求相关的提交记录先于拉取请求创建时,将代码审查完成时间与拉取请求创建时间的差值作为代码审查工作负载;

拉取请求相关的提交记录后于拉取请求创建时,将代码审查完成时间与拉取请求相关的提交记录时间的差值作为代码审查工作负载;

拉取请求审查时间超过设定值,将对应拉取请求相关的提交记录的修改文件集在其他代码审查记录中的平均审查时长之和作为代码审查工作负载。

进一步地,代码修改工作负载具体为:

仅存在一次代码提交记录,或者两次代码提交间隔超过设定值,将项目团队中的行平均代码修改时间与修改代码行的乘积作为代码修改工作负载,其中行平均代码修改时间是已完成的所有代码修改的所有文件的每行代码修改时间的平均值;

对于采纳代码审查意见后重新提交修改代码的开发者,将两次代码提交时间差作为代码修改工作负载;

对持续依次参与多个拉取请求的开发者,以连续两个拉取请求涉及的提交记录的时间差作为代码修改工作负载,若时间差超过设定值,则将项目团队中的行平均代码修改时间与修改代码行的乘积作为代码修改工作负载;

对同时参与多个拉取请求的开发者,若平均代码行修改工作量超过3天,则将项目团队中的行平均代码修改时间与修改代码行的乘积作为代码修改工作负载;否则直接计算两次代码提交创建时间差作为代码修改工作负载。

进一步地,遗留任务工作负载具体为:

遗留任务指观察期内已进入审查阶段但尚未完成审查的拉取请求遗留的工作任务。将遗留任务涉及的所有文件在已进行的审查过程中的代码审查工作负载,在审查记录中的审查时间总和,作为遗留任务工作负载。

进一步地,目标拉取请求的待审查工作负载具体为:

根据拉取请求的修改文件在历史审查记录中的工作负载情况,计算拉取请求所涉及代码修改的行平均审查工作负载,将拉取请求所涉及代码修改的行平均审查工作负载与待审查的修改行乘积作为目标拉取请求的待审查工作负载。

进一步地,基于开源软件项目中拉取请求与开发者间的协作行为构建超边,并计算超边权重,获取开发者与拉取请求的交互关系超图,具体为:

遍历项目所有拉取请求,获取拉取请求集合与开发者集合,并将拉取请求和开发者初始化为超图节点;

根据项目中开发者在拉取请求中的提交代码记录,构建拉取请求与代码提交开发者超边,并计算该超边权重,具体计算方式如下:

式中,

根据开发者的拉取请求代码审查记录,构建拉取请求与代码审查者超边,并计算该超边权重,具体计算方式如下:

式中,

根据开发者创建拉取请求记录,构建拉取请求与创建者超边,并计算该超边权重,具体计算方式如下:

其中,

根据开发者在拉取请求中的问题评论记录,构建拉取请求与问题评论者超边,根据开发者在拉取请求文件变更内容中的审查评论记录,构建拉取请求与审查评论者超边,并计算该超边权重,具体计算方式如下:

式中,

根据拉取请求的相似度,构建相似拉取请求超边,并将其相似度作为超边权重,具体计算方式如下:

其中,

进一步地,根据目标拉取请求的关联值向量,以降低知识流失风险和平衡开发者工作负载为选择推荐排序策略,计算候选审查者推荐得分,输出代码审查者推荐结果,具体为:

对于目标拉取请求,考虑面向降低知识流失风险进行代码审查者推荐,具体计算方式如下式:

其中,

在降低知识流失风险的基础上,考虑开发者工作负载平衡策略,候选人推荐得分计算公式如下所示:

式中,

本发明还提出一种存储介质,存储介质上存储有数据处理程序,数据处理程序被处理器执行时实现上述的一种代码审查者推荐方法的步骤。

本发明还提出一种电子设备,包括处理器和存储器,所述处理器与所述存储器相互连接,其中,所述存储器用于存储计算机程序,所述计算机程序包括计算机可读指令,所述处理器被配置用于调用所述计算机可读指令,执行上述的一种代码审查者推荐方法。

本发明提供的技术方案带来的有益效果是:

本发明公开了一种代码审查者推荐方法,所述方法基于开源软件项目中拉取请求与开发者间的协作行为,进行开源软件项目的知识流失风险评估和开发者工作负载评估;并构建开发者与拉取请求的交互关系超图;根据交互关系超图确定各拉取请求的超图切向量,根据知识流失风险和开发者工作负载进行推荐排序,输出代码审查者推荐结果。本发明的方案能够充分考虑开发者在与拉取请求协作过程中的知识传播和工作负载分布,能够有效减少知识流失风险,并平衡开发者工作负载。

附图说明

图1是本发明实施例一种代码审查者推荐方法的流程图;

图2是本发明实施例一示例性实施例中的一种电子设备的框图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地描述。

本发明实施例的一种代码审查者推荐方法的流程图如图1所示,包括:

本发明基于GitHub平台上Scala项目中的代码审查者推荐为实施例,选取其中2018年6月1日至2021年11月31日的数据构建实验所需项目数据集,数据集共计3111个拉取请求数据和6407条代码提交记录,以及包括11581个问题评论、7222个审查评论和8974条审查记录的交互数据。

(1)基于开源软件项目中拉取请求与开发者间的协作行为,进行开源软件项目的知识流失风险评估。将开源软件项目中的文件按照文件安全等级分为风险文件和安全文件,并计算开发者保留率,以文件安全等级和开发者保留率作为知识流失风险计算的指标。

(1.1)定义选定的某段时间(3个月)为一个观察期,统计观察期内开源软件项目文件与开发者基于代码提交commit、代码审查review和审查评论comment的交互行为次数,将观察期内与低于2个开发者交互的项目文件定义为“风险文件,大于等于2个开发者的为“安全文件”。

(1.2)基于开发者在过去一年的交互行为数据,来计算开发者继续留在开发团队任职的概率,即开发者保留率

其中,

(2)基于开源软件项目中拉取请求与开发者间的协作行为,评估开源软件项目的开发者工作负载,开发者工作负载包括代码审查工作负载、代码修改工作负载、遗留任务工作负载,如果候选人是待推荐拉取请求的代码提交者,开发者工作负载还包括待审查工作负载。

具体包括以下步骤:

(2.1)分析拉取请求关闭时间规律,为开发者及拉取请求工作负载的评估设定观察期。观察期过长会掩盖开发者在该段时间内的负载差异,观察期过短则可能无法准确反映开发者的当前负载状况。因此统计开源项目的拉取请求关闭时间分布情况,若90%的拉取请求均能够在一定时间长度被关闭,则设定该时间长度为观察期。

(2.2)代码审查工作负载评估。基于代码审查机制,审查者需要对拉取请求涉及的提交记录(commit)进行审查,直至该拉取请求满足项目合并要求。因此将拉取请求相关的提交记录到被审查完成的时长作为代码审查者在该拉取请求上的代码审查工作负载,具体计算方式如下:

(2.2.1)commit先于拉取请求创建时,将审查完成时间与拉取请求创建时间的差值作为审查工作耗费的工作负载。

(2.2.2)commit后于拉取请求创建时,将审查完成时间与commit时间的差值作为代码审查工作负载。

(2.2.3)拉取请求审查时间过长时(一般认为超过3个月),将对应commit的修改文件集在其他审查记录中的平均审查时长之和作为代码审查工作负载。

(2.3)代码修改工作负载评估。开发者以功能实现、缺陷修复等为目标修改一到多个源代码文件后进行代码提交,因此将开发者的代码提交记录时间间隔作为其代码修改工作的工作负载,具体计算方式如下:

(2.3.1)对于仅存在一次代码提交记录,或者两次代码提交间隔过长(一般认为超过3个月),则将项目团队中的行平均代码修改时间与修改代码行的乘积作为代码修改工作负载,其中行平均代码修改时间是已完成的所有代码修改的所有文件的每行代码修改时间的平均值。

(2.3.2)对于采纳代码审查意见后重新提交修改代码的开发者,将两次代码提交时间差作为代码修改工作负载。

(2.3.3)对持续依次参与多个拉取请求的活跃开发者,例如,开发者

(2.3.4)对同时参与多个拉取请求的开发者,若平均代码行修改工作量超过3天,则视为代码提交间隔过长,通过2.3.1计算,否则直接计算两次代码提交创建时间差作为代码修改工作负载。例如,开发者

(2.4)遗留任务工作负载预估。遗留任务是指观察期内已进入审查阶段但尚未完成审查的拉取请求留下的工作任务。将遗留任务涉及的所有文件在已进行的审查过程中的代码审查工作负载,即所有被修改文件中的代码行修改,在过去的审查记录中的审查时间总和,作为开发者在遗留任务中的预估的待完成工作负载。

(2.5)基于拉取请求的修改文件集合以及这些文件在历史审查记录中的审查工作负载,评估目标拉取请求的待审查工作负载。具体是根据拉取请求的修改文件在历史审查记录中的工作负载情况,计算拉取请求所涉及代码修改的行平均审查工作负载,将其与本次待审查的修改行乘积作为目标拉取请求的待审查工作负载。具体计算步骤为:

(2.5.1)对于有修改记录的文件,按照上面的方法获取该文件对应的开发者审查工作负载,基于其在历史审查记录中对应拉取请求中所提交的代码修改行数,获取行平均审查工作负载。将该行平均审查工作负载与本次待审查的代码修改行的乘积作为该文件所需要的待审查工作负载。

(2.5.2)对于没有修改记录的文件,以项目所有文件的行平均审查时间为该文件的行平均审查工作负载。将该行平均审查工作负载与本次待审查的代码修改行的乘积作为该文件所需要的待审查工作负载。

具体的,以拉取请求

表1 拉取请求pr

(3)基于开源软件项目中拉取请求与开发者间的协作行为构建超边,并计算超边权重,获取开发者与拉取请求的交互关系超图。具体步骤包括:

(3.1)遍历项目所有拉取请求,获取拉取请求集合与开发者集合,并将拉取请求和开发者初始化为超图节点。

(3.2)根据项目中开发者在拉取请求中的提交代码记录,构建拉取请求与开发者超边,该情况下,开发者是代码提交的开发者,并计算该超边权重,具体计算方式如下:

式中,

(3.3)根据开发者的拉取请求审查记录,构建拉取请求与开发者超边,该情况下,开发者是审查者,并计算该超边权重,具体计算方式如下:

式中,

(3.4)根据开发者创建拉取请求记录,构建拉取请求与开发者超边,该情况下,开发者是创建者,并计算该超边权重,具体计算方式如下:

其中,

(3.5)根据开发者在拉取请求中的问题评论记录,构建拉取请求与开发者超边,该情况下,开发者是问题评论者。根据开发者在拉取请求文件变更内容中的审查评论记录,构建拉取请求与开发者超边,并计算该超边权重,该情况下,开发者是审查评论者。具体计算方式如下:

式中,

(3.6)根据拉取请求的相似度,构建相似拉取请求超边,并将其相似度作为超边权重,具体计算方式如下:

其中,

(4)根据开发者与拉取请求的交互关系超图,获取目标拉取请求的最优超图切向量,作为目标拉取请求的关联值向量;根据目标拉取请求的关联值向量,以降低知识流失风险和平衡开发者工作负载为目的选择推荐排序策略,计算候选审查者推荐得分,进而输出代码审查者推荐结果,具体包括如下步骤:

(4.1)根据构建好的开发者与拉取请求的交互关系超图,计算超图拉普拉斯矩阵;

(4.2)初始化待推荐代码审查者的目标拉取请求

其中,f为关联值向量,

其中,λ是用于权衡标准化损失与经验损失的正参数,

(5)根据目标拉取请求的关联值向量,以降低知识流失风险和平衡开发者工作负载为选择推荐排序策略,计算候选审查者推荐得分,输出代码审查者推荐结果。

(5.1)对于目标拉取请求,考虑面向降低知识流失风险进行代码审查者推荐,具体计算方式如下式:

其中

(5.2)在降低知识流失风险的基础上,考虑开发者工作负载平衡策略,候选人推荐得分计算公式如下所示:

式中,

在一示例性实施例中,包括一种存储介质,存储介质上存储有数据处理程序,数据处理程序被处理器执行时实现上述的一种代码审查者推荐方法的步骤。

参考图2,在一示例性实施例中,包括包括一种电子设备,包括至少一处理器、至少一存储器、以及至少一通信总线。

其中,存储器上存储有计算机程序,计算机程序包括计算机可读指令,处理器通过通信总线调用存储器中存储的计算机可读指令,执行上述的一种代码审查者推荐方法。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

技术分类

06120116516280