引用
Weiqiang Zhang, Shing-Chi Cheung, Zhenyu Chen, Yuming Zhou, Bin Luo, File-level socio-technical congruence and its relationship with bug proneness in OSS projects, Journal of Systems and Software, Volume 156, 2019, Pages 21-40.
摘要
关键词: 交技术一致性,协作故障,软件质量,开源软件,开发者 络。
研究背景
STC 的测量包括计算两个逐个开发者的矩阵,协作需求矩阵(CR)与协作活动矩阵(CA)。而计算 CR 需要任务分配矩阵(TA)与任务依赖矩阵(TD)。以下给出每个矩阵的定义。
· CR:如果 cr_ij 是 CR 中的一个元素,cr_ij > 0 意味着开发者 i 和开发者 j 需要相互协作。
· CA:如果 ca_ij 是 CA 中的一个元素,ca_ij > 0 意味着开发者 i 和开发者 j 实际上是相互协作的。根据某种特殊类型的实际协作活动,可以得到矩阵 CA。
· TA:如果 ta_ij 是 TA 中的一个元素,ta_ij > 0 意味着任务 j 被分配给开发者 i。
· TD:如果 td_ij 是 TD 中的一个元素,td_ij > 0 意味着任务 i 和任务 j 具有依赖关系。
那么我们可以通过以下公式计算 CR。
通过比较协作要求和协作活动来计算最终的 STC 值。协作需求的总数是 CR 中非零元素的数量(对角线上的元素除外):
由此我们可以计算出协作活动满足的协作要求数量 Match(CR,CA),而 STC 即为满足的协作要求与所有协作要求的比率:
1.文件级 STC
之前的研究通过商业项目通常由修改请求(Modification Requests,MRs)来计算 STC。对于我们研究的项目来说,一个问题/错误的 告是一个比 MR 小得多的工作单元。如果有与问题/错误相关的提交,它们几乎总是来自仅仅一个开发人员。另一方面,协作活动不能像以前那样确定,许多开源软件项目的开发人员主要通过互联 相互协作,其协作形式趋于间接和隐含的。所以,我们通过每个文件计算其协作需求,即文件级 STC,所以对于上述 STC 框架进行新的定义:
· TA 表示开发人员和软件工程任务之间的关系,可以由开发人员的提交活动来明确确定。
· 由于最典型的任务是编写代码,因此任务通常被视为源文件,我们使用文件 络(FN)来描述 TD,在文件 络中,两个文件有依赖关系就链接在一起。
· 我们使用开发者 络(DN)来描述 CA,如果两个开发人员有协作活动,他们就在 DN 中连接。
1.1构建 络
我们总结了三种类型的文件依赖关系和三种类型的开发人员协作关系。它们在表 1 中列出,并在图 1 中以图形表示。
1.1.1文件 络
文件 络是任务依赖矩阵的另一种形式。它们可以建立在源文件之间的三种依赖关系之上:
· 语法依赖包括数据依赖和控制依赖。函数调用是一种典型的控制依赖。语法依赖表示两段源代码之间的显式关系。
· 逻辑依赖在当两个文件一起改变时出现。如果两个文件在同一次提交中一起提交,它们被认为具有逻辑依赖性。这可能由多种原因造成(如代码重复)。
· 工作依赖,如图 1 (c)所示。这意味着来自不同提交的两个文件被修改以完成相同的问题/错误 告。只有当有多个提交链接一个相同的错误 告时,才会出现工作依赖。在我们研究的项目中没有使用这一依赖。
1.1.2开发者 络
开发者 络建立在三种开发者关系之上,其中的每一个都是隐含的,需要以特殊的方式提取。我们认为这些关系是开发人员的协作活动。
· 工作协作意味着两个开发人员提交文件来完成相同的问题/错误 告。在这种情况下,两个开发人员可能彼此意识到,并且发生间接协作。
· 交叉提交是指开发人员关系建立在提交相同文件的开发人员对之间,如图 1 (e)所示。这种链接表示两个开发人员合作编写同一个源文件。这种开发人员关系也被称为“节点纽带”。
· 注释利益是一种通讯关系。这意味着两个开发人员对同一个问题/错误 告进行评论或工作,如图 1 (f)所示。这种联系表明两个开发者有共同的利益或责任。
使用如下步骤计算文件的 STC 值(以图 2 为例):
步骤二:获取文件 络中链接到 file0 的所有文件:
步骤四:获取 file0 的协作需求 CR,即 file0 的每个开发者与那些与 file0 连接文件的每个开发者之间的所有链接(所有可能的{a,b}与{a,b,x,y}之间的无向链接):
步骤五:获取 file0 的协作活动,即 file0 和开发者 络中的链接:
步骤六:通过 CA 和 CR 的比率,获得 file0 的 会技术一致性:
显然,STC(file0)是一个 0 到 1 之间的数字。它的值量化了文件 0 的协作要求和实际协作活动之间的匹配程度。
1.2 MDL:一种 STC 的转换变体
我们提出了文件级版本的一致性差距“congruence gaps”,并将其称为“缺失开发人员链接”(Missing Developers Links, MDL)。MDL 是测量协作活动不能满足的协作需求的数量。其计算如下:
根据 MDL 和 STC 的定义,我们可以得到它们的数学关系:
我们假设 MDL 可能比 STC 更与软件故障相关。根据其定义,MDL(fa)显然是非负整数。它的值意味着在文件 fa 上检测到的缺少的开发者链接(协作故障)的数量。当 MDL(fa)>0 时,fa 被认为是一个有风险的文件。对于图 2 中的示例,文件 0 的 MDL 值计算如下:
1.3实例计算与 络构建
经过实际构建,我们发现 FN3 和 DN1 络太稀疏而无法使用。因此,我们在实证研究中忽略了 FN3、DN1 和所有涉及 FN3 或 DN1 的结果。我们需要研究三种类型的文件 络(FN1、FN2 和 FN3)和三种类型的开发人员 络(DN2、DN3 和 DN23)。总共有 3×3 = 9 个不同的 STC/MDL 指标研究什么类型的文件 络和开发 络可以使 STC 或 MDL 最容易出错。我们根据研究项目中每个版本的原始数据和构建的 络,按照要求计算 STC 和 MDL。
在进行详细的统计分析之前,我们还需要得到每个版本中每个文件的 bug 数量。在我们研究的两个项目的问题跟踪系统中,我们考虑每个版本的问题。在项目中,问题有三种类型:bug、增强和特性请求。我们只考虑关闭的 bug。一个关闭的 bug 可以被标记为“已修复”、“重复”、“无法修复”、“无法重现”或“无效”。如果被标记为“已修复”,“重复”或“无法修复”那么一个关闭的 bug 就会被认为是“有效 bug”。然后 bug 按照以下规则统计:如果一个文件在一个版本中被提交以修复一个有效的 bug,那么这个文件在这个版本中的 bug 数就增加一个。
度量分为 STC 和 MDL 度量,并且每种度量都是基于三个文件 络中的一个和三个开发者 络中的一个来计算的。总之,每个文件有 2×3×3 = 18 个度量。通过讨论分析这 18 个度量中的每一个度量与这个文件的 bug 编 之间的 Spearman 相关性(即,为了修复当前版本的有效 bug 而修改的次数),STC 都与 bug 数量显著负相关。又根据 STC 和 MDL 之间的数学关系,即 MDL = |CR|*(1-STC),显然 STC 和 MDL 是强负相关的。因此,MDL 与 bug 数量显著正相关。换句话说,如果一个文件有一个更大的 MDL 值,它更有可能是错误的。
同时,通过比较基于不同 络计算的 bug 数量和 STL、MDL 之间的 Spearman 相关系数(图 3,图 4),我们可以发现 FN2 (逻辑依赖文件 络)是文件 络的最佳选择,DN2(提交重叠开发者 络)是开发者 络的最佳选择。
可行性分析
· 回归分析——多元线性回归模型
在这一部分中,我们进行回归分析,以验证缺陷倾向性和 STC/MDL 度量之间的关系。在构建软件缺陷预测模型时,通常使用两种度量作为质量指标,即产品度量和过程度量。最典型的产品度量是代码行(LOC)。最典型的过程度量之一是变动计数,即对文件所做的更改的数量。
在我们的实证研究中,我们计算每个发布版本中每个文件的 LOC,并统计每个文件在每个版本的开发过程中被提交的次数。LOC 和变动计数用于构建基线回归模型。由于上述两个指标都具有指数分布,我们使用对数滤波器来归一化它们的值。对于变动计数,结果等于 ln(变动计数+1)。因为如果一个文件在这个版本中没有变化,那么 ln(变动计数)就没有意义了。经过对数滤波后,两个变量都接近正态分布,可以用作线性回归模型中的解释变量。WordPress-3.1 的样本量是 633。它足够大,可以得到有统计意义的回归结果。
实验结果表明,多重线性回归结果是可靠的。基线模型的调整 R^2 为 0.468。基线模型有两个因变量:log_LOC 和 log_CC,系数分别为 0.144 和 0.615。换句话说,LOC 和变动计数都与 bug 数正相关,变动计数比 LOC 更相关。基于所有 19 个模型,变动计数是比 LOC 更好的指标,这与以前的研究一致。
当一个 STC/MDL 度量被添加到基线模型中时,模型拟合变得更好,无论是哪种 STC/MDL 度量 (除了 STC(FN2+DN3),调整后的 R^2 是 0.464 < 0.468)。我们进行了一个单样本 t 检验,以检查 18 个模型的调整后的 R^2 值是否与 0.468(基线模型的调整后 R^2)有显著差异。结果表明,这 18 个样本在 0.001 显著性水平上显著大于 0.468。因此,在多元线性回归模型中加入 STC/MDL 度量可以显著提高模型的拟合度。
· 回归分析——二元逻辑回归模型
使用相同的自变量,我们还建立了二元对数回归模型,但是因变量变成了文件出错的概率。bug 是一个二进制变量,这意味着一个文件是干净的或有问题的。其计算如下:
那么基线模型具有以下形式:
而其他 18 个带有 STC/MDL 指标的模型有以下形式(X 代表一个 STC/MDL 指标):
我们选择 Trac-0.12 来表示它的逻辑二元回归结果。高 Nagelkerke R^2 值表明二元逻辑回归具有良好的解释力。我们还 告了 X^2 作为拟合优度的度量。比较 X^2 是具有 STC/MDL 度量的模型和基线模型之间的 X^2 差异。自变量的所有回归系数都被列出。需要注意的是,不能直接比较 STC 和 MDL 之间的系数,因为它们的取值范围不同。STC 是 0 到 1 之间的实数,而 MDL 是自然数。
实验结果表明,所有具有 STC/MDL 指标的 18 个模型都比基线模型具有更强的解释力。这些模型的 Nagelkerke R^2 和模型 X^2 都大于基线模型的同类度量。使用单样本 t 检验证实该观察具有统计学显著性。STC 的系数为负。这意味着 STC 与漏洞倾向负相关。MDL 的系数为正,这意味着 MDL 与 bug 倾向性正相关。因此,在二进制逻辑回归中控制了 LOC 和变动计数后,STC/MDL 度量仍然与 bug 倾向性有关。对于比较 STC 和 MDL 的性能而言,在表 12 中,我们可以看到 MDL 的 X^2 值(或比较 X^2 值)总是大于 STC。使用配对样本 t 检验也证实了这种观察具有统计学意义。基于 Nagelkerke R^2 的度量也发现了相同的结论:在二进制逻辑回归中,在控制了 LOC 和变动计数之后,MDL 比 STC 与缺陷倾向性更相关。
研究哪种类型的文件 络和开发者 络可以获得与漏洞倾向最相关的 STC/MDL 度量。仅考虑具有 MDL(或 STC)度量的模型,我们发现 FN2+DN2 是最佳组合。Nagelkerke R^2、X^2、比较 X^2 和系数显示了一致的结果。在三种类型的文件 络中,FN2 总是表现最好。在三种类型的开发者 络中,DN2 总是表现最好的。因此,我们得出结论:在控制了 LOC 和变动计数后,FN2 和 DN2 可以得到与 bug 倾向性最相关的 STC/MDL,并使二元逻辑回归模型达到最佳拟合。由于因变量是 bug 倾向,表 12 的结果也直接证明了,如果一个文件有更大的 MDL 值,它更有可能是 bug。
· 回归分析——多元线性回归模型
由于 STC/MDL 度量与 bug 倾向性有关,因此在传统的 bug 预测模型中研究它们的性能是很有意义的。我们使用以上两种回归模型来预测 bug。多重线性模型用于预测 bug 数字,二元逻辑模型用于预测缺陷。为了评估多重线性模型的预测性能,我们计算了 bug 的预测数量和错误的实际数量之间的 Pearson 和 Spearman 相关系数。为了评价二元逻辑模型的预测性能,我们计算了模型的精度和召回率。
对于每个项目,我们使用三个连续发布的版本(WordPress-3.0/3.1/3.2 和 Trac-0.10/0.1 1/0.12)作为训练集来构建回归模型(多元线性模型和二元逻辑模型),并使用后续版本(WordPress-3.4 和 Trac-1.0)作为测试集来预测 bug。我们比较了每种模型的三组不同的自变量,即基线(log_LOC 和 log_CC)、STC(基线+STC)和(基线+MDL)。文件 络和开发者 络的组合是 FN2+DN2,在所有组合中表现出最好的预测力。
从结果可以看出,STC/MDL 度量可以提高错误预测的性能,MDL 是一个比 STC 更好的指标。WordPress 和 Trac 的结果是一致的。多元线性回归预测 bug 数时,无论考虑 Pearson 还是 Spearman 系数,带 STC 的模型比基线模型具有更好的预测性能,带 MDL 的模型比带 STC 的模型更好。当用二元逻辑回归预测 bug 时,STC 提高了精度,MDL 的性能优于 STC,而三种模型的召回率保持不变。因此,我们得出以下结论:STC/MDL 度量可以提高传统缺陷预测模型中的精度,并且 MDL 的性能优于 STC。
STC/MDL 度量标准用于找出有协作故障的错误文件。它们很可能是通过传统的 bug 预测模型发现的。在我们的实证研究中,STC/MDL 度量没有发现基线模型未发现的额外错误文件,因为 STC/MDL 指标不会增加召回率。但是 STC/MDL 度量可以提高精度。对于这些情况,基线模型错误的将它们分类为有缺陷的,但是具有 STC/MDL 度量的模型不会。在预测 bug 数量时,STC/MDL 度量也可以使模型更加精确。MDL 比 STC 表现更好,因为它与 bug 倾向性更相关。与传统的 bug 预测模型相比,MDL 可以进一步提供潜在的协作故障。
致谢
感谢国家自然科学基金(61772014,61832009,61802171)支持!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!