论文部分内容阅读
软件维护占据了软件产品的很大一部分成本,以往的研究显示软件维护消耗了70%左右的软件开发成本。随着现代软件工程的发展,软件缺陷(bugs)是不可避免的产物。修复软件缺陷是软件维护过程中的一个重要的行为。大部分开源软件社区和商业软件公司会使用软件缺陷追踪系统(Issue Tracking Systems),比如Bugzilla和JIRA,来帮助软件工程师管理软件缺陷报告。随着软件的规模不断的增加,和软件开发的复杂程度的增加,软件缺陷报告的数量和管理难度也不断增加,这使得软件修复的成本不断的增加。 缺陷报告的管理与挖掘技术主要用于从海量的缺陷报告中挖掘出有用的信息,帮助软件工程师提高工作效率,以及减少修复缺陷的代价。本文基于前人对于软件缺陷报告管理的研究,提出了一系列新的自动化技术来分析和挖掘软件缺陷报告,旨在为软件工程师提供高性能的自动化工具,并且通过一系列的实证研究来进一步帮助开发人员理解缺陷修复过程中的一些现象。本文主要内容如下: 1.第一次提出了对软件缺陷报告字段重置问题的实证学习。一个软件缺陷报告有很多的字段,比如,产品,部件,平台,严重程度,优先等级等等,这些信息对于缺陷的修复有着很重要的作用。以往的研究显示这些字段的错误赋值会延长缺陷的修复时间,甚至导致软件产品交付的延期。因此,保证这些字段的正确性非常重要。但是,这些字段有的时候会被重置。为此本文进行了一个实证分析来调研为什么这些字段会被重置,以及重置会造成什么影响。通过与开源社区的工程师们的交流,本文总结了3种导致缺陷报告字段重置的原因:新提交的缺陷报告的勘误,缺陷修复过程中的交互,管理人员后续的批操作。在此基础上,本文进一步分析了八种不同的缺陷报告字段重置问题,对OpenOffice、Netbeans、Eclipse和Mozilla等4个开源社区共190,558个软件缺陷报告进行实证分析。研究结果表明大概有80%的软件缺陷报告遭遇过至少一种以上的字段重置,并且那些遭遇过字段重置的缺陷报告需要的修复时间比那些没有遭遇过的要多。 2.提出了一个新的复合模型的算法来推荐合适的开发人员参与软件修复过程。缺陷修复是一个协同的工作,不同的软件工程师贡献他们的知识来帮助解决缺陷。给定一个缺陷报告,推荐一系列的可以帮助缺陷修复的开发人员可以更好的修复这个缺陷。以上问题称为缺陷修复的开发人员推荐。为了解决这个问题,本文提出了一个新的算法(DevRec),它从缺陷报告本身和开发人员两个角度来分析软件缺陷修复过程。DevRec最终整合这两个分析过程,从而达到更好的推荐效果。为了验证DevRec的效果,本文收集了包括Gcc、OpenOffice、Mozilla、Netbeans和Eclipse等5个开源社区共107,875个软件缺陷报告。实验结果显示DevRec在Recall@5和Recall@10上比Bugzie高57.55%和39.39%,比DREX高165.38%和89.36%。 3.整合了多种不同的多标记学习算法进行缺陷行为学习。当一个故障产生的时候,学习这个故障的行为(哪些类型的缺陷造成了这个故障的产生)可以更快地帮助开发人员修复这个故障。由于一个故障可能由多种缺陷类型同时造成,可采用多标记的算法来预测当前故障的缺陷类型。当前有很多多标记学习的算法,并且不同的多标记算法在不同的数据集上效果不同,因此本文提出了一种复合模型算法(MLL-GA),它采用基因算法集成了多种不同的多标记算法。为了验证MLL-GA,本文在tcas,printtokens,printtokens2,replace,flex,和grep等6个数据集上进行实验。实验结果显示MLL-GA的平均F-measure达到0.6078到0.8665,比Feng和Chen提出的方法提高14.43%。 4.第一次对软件构建系统中的缺陷进行了实证分析。软件构建系统将源代码、类库以及其他类型的数据通过编译器和其他的一系列工具转化成一个可执行的程序。分析软件构建中的缺陷可以帮助软件工程师更好的理解构建系统。为此,本文对软件构建系统中的缺陷进行了一个实证分析。首先,本文采集了来自Ant,Maven,CMake,和QMake等四个构建系统的缺陷报告,并随机的从这四个系统中选取800个缺陷报告进行分类。在这个分类基础上,本文进一步研究缺陷的类别与缺陷的严重程度分布,缺陷修复时间,缺陷收到的评价的关系。研究结果表明发现21.35%的缺陷属于外部接口(external interface)类别,18.23%的缺陷属于逻辑(logic)类别,以及12.86%的缺陷属于配置(configuration)类别。