Page 52 - 《软件学报》2021年第11期
P. 52
3378 Journal of Software 软件学报 Vol.32, No.11, November 2021
效果的影响,将在后续工作中研究.
候选评审人是开源项目中所有的贡献者,表示为 W={w 1 ,w 2 ,…,w n }.
一次新代码评审包括创建时间和一组待评审的变更文件,表示为 nr={createTime(nr),Files(nr)}.
我们定义代码评审人推荐问题为:给定一个新代码评审 nr、一组候选人员 W、历史代码评审集合 R 以及
响应时间窗ϕ(即在ϕ时间内需要进行响应),推荐目标是从候选人员 W 中选择出一个包含 k 个人员的子集 S,使得
选择出来的集合 S 中的人员能够最大化代码评审人经验、最大化在约定时间内的响应概率、最大化人员最近
时间内的活跃性.
2.2 优化目标度量
MOC2R 定义了如下 3 个优化目标.
i) 目标 1:代码评审人的经验
[5]
我们基于文件路径相似算法 设计代码评审人相关经验的度量方法,它的基本思想是:相似路径中的文件
具有相似的功能,如果代码评审人在过去的评审历史中积累了评审相似代码的经验,他们更有可能是待评审任
务的合适评审人.
给定两个文件 f i 和 f j ,其相似度定义为两个文件路径的相似程度,计算公式如下所示:
PathComparison (,f f )
Similarity (,f f ) = i j (1)
j
i
( ),Length f
Max{Length f ( )}
i j
其中,Length(f i )表示文件 f i 目录层级个数,PathComparison(f i ,f j )是两个文件相同的目录层级个数.具体来说,首先
将每个文件按照目录层级拆分成两个序列,然后计算两个序列的最长公共子序列.例如,f i 的文件路径为 src/
layout/android/settings/utils.java,f j 的文件路径为 src/com/android/settings/location/utils.java,Length(f i )的返回结果
为 5,Length(f j )的返回结果为 6,PathComparison(f i ,f j )的返回结果为 4(即 src,android,settings,utils.java).
基于文件相似性,对于新评审 nr,其和历史评审 r i 的相似度定义为两个评审包含文件集合(Files(nr)和
Files(r i ))之间的相似性,表示为
∑ Similarity (,f nf j )
i
ReviewSimilarity (,r nr = i f ∈ Files (),nf ∈ i r j Files (nr ) (2)
)
i
| Files ( ) | |r i × Files ( ) |nr
两次代码评审相似度越高,表示 r i 中的评审人员对新评审 nr 中的变更文件越有经验.
对于一个评审候选人 w,其相对于待评审任务 nr 的经验 ExpertiseScore,定义为其历史评审中与待评审任务
相似度的累积值,计算如公式(3)所示.
ExpertiseScorew ,nr = ∑ ReviewSimilarity ( ,r nr ) (3)
i
∈
i rR w
其中,R w 表示候选人 w 所完成的评审任务的集合.
ii) 目标 2:代码评审人在约定时间内的响应概率
MOC2R 方法中,基于代码评审人在历史评审中的响应速度来度量其在约定时间内进行响应的概率.我们
假设响应时间窗ϕ(即约定的响应时间),代码评审人 w 在ϕ时间内响应的概率即为评审人 w 参加过的所有代码评
审 R w 中,其响应时间在ϕ内的评审次数占全部评审任务的百分比.计算公式如公式(4)所示.
∑ response @ϕ
ResopnseScore = i rR∈ w (4)
| R w |
⎧ 1, if FastestResponseTime ( , )w r − createTime ( )r < ϕ
response @ϕ = ⎨ i i (5)
( , ) createTime r ≥
⎩ 0, if FastestResponseTime w r − ( ) ϕ
i
i
其中,在代码评审人 w 最快响应时间小于响应时间窗ϕ时,response@ϕ返回 1;否则,返回 0.
FastestResponseTime(w,r i )则计算了代码评审人 w 在 r i 中的首次响应时间,即 w 留下第 1 条评论的时间与
r i 创建时间的差值.createTime(r i )是代码评审 r i 的创建时间.
iii) 目标 3:代码评审人最近时间内的活跃性