1、
数据挖掘在软件工程中的应用
在大数据时代,数据挖掘是从海量数据中获取信息的有效手段。这种手段同样可以用于软件的开发上。软件工程中数据挖掘是指:在海量的软件工程数据中利用已有的技术或者开发新的数据挖掘技术和算法,经过提取、分析、表示等步骤,发现对软件开发者有用的信息/知识的过程。为了了解数据挖掘在软件工程中的使用,我一共阅读了三篇文献:《软件工程数据挖掘的研究进展》是一篇概括性的综述类文章,它介绍了软件开发阶段,软件修复性维护阶段和软件改善性维护阶段可能用到数据挖掘的地方以及可能用到的算法。对开发阶段的数据挖掘技术深入讲解的文献是:《u
2、sing Structural Context to Recommend Source Code Examples》.它通过一个自动返回代码模式的插件详细讲解了软件工程中需数据挖掘技术在软件开发阶段的运用原理。为了理解软件开发阶段数据挖掘技术推荐的代码复用模块中关联模式的挖掘,我又阅读了《基于FPclose算法挖掘强亲密地关联模式》。这篇文章让我了解了什么是强关联模式,怎么挖掘强关联模式,从而更好的理解数据挖掘技术返回重用代码模块所用到的机制。
软件工程中的数据挖掘和传统意义中的数据挖掘所需要的步骤大致一样,都需要经过数据预处理,数据挖掘,数据分析这三步。只是预处理的数据由传统的
3、数字数据信息变成了软件开发中的必要元素:代码,注释,测试用例和缺陷报告等,单从这个角度上了说,对数据库中的数据进行预处理的难度就提升了不少。预处理后的格式化数据才可以用数据挖掘的手段进行挖掘并生成类别,频繁序列和关联规则等挖掘结果。最后再对结果进行分析和同化找到软件工程中重用的代码片段,缺陷位置等信息。
数据挖掘本身是一个近几年新晋的热门概念,软件工程中的数据挖掘的实际应用也是一个新概念。根据三篇论文的迭代和相关性,本篇报告主要阐述软件开发阶段遇到的问题。问题分为三种:第一,开发者在已有的代码库中寻找所需的代码结构;第二,开发者在数据库中寻找重用该模式的静态规则;第三,开
4、发者进一步寻找重用模式的动态规则。下面依次介绍这三个问题所运用到的机制和算法。
I 重用模式的检索
重用模式的检索最基本的重用问题是开发者知道所需的类和方法 但不知道调用这一方法所需遵循的模式。手工寻找重用模式的方法需要大量浏览包含已知关键字(类或方法的标识符)的代码,根据经验在其中选择可能的重用模式, 不断尝试所选模式。其中,必然有许多代码与用户所需的模式无关,这种浏览和尝试会浪费开发者大量的时间和精力。因此,数据挖掘技术根据已知关键字从代码库中搜索包含重用模式的代码段, 并且按符合用户需求的程度对搜索结果进行排序,标注用户感兴趣的段和行。核心思想是:重用模式必然是相
5、似的, 而这种相似性会通过上下文结构, 如类之间继承和调用关系体现出来。具体步骤包括构建代码库,用户向代码库提交查询信息,返回例程给开发者。在服务器搜索重用模式的过程中,用到了六种启发式规则。
基本启发式规则
子类规则
规则描述
继承式启发
从存储器中返回一个类的集合Cr。集合中的类按与被查询的类C有共同祖先(包括父类和实现的接口)的顺序从高到底排列。
调用式启发
基本调用式启发
返回与m调用相同目标的方法集Mr。按调用方法相同个数从高到低进行排序。
最优调用式启发
从Mr中选取匹配率最高的方法,一般而
6、言阈值为0.4
继承调用式启发
从Mr,中选取那些包含了和类c有至少一个共同祖先的类的方法。
使用型启发
基本使用型启发
找到m所涉及的对象类型,然后返回用了相同对象类型的一个方法集Ur。按所用相同类型对象的数目从高到低排序
继承使用型启发
结合了继承的使用型启发式规则
表1 重用模式检索的六种启发式规则
II静态规则的发现
首先,遍历代码库中的类间关系,将每一个继承、重载、调用其他类的关系写在数据库中;其次,对上述数据库进行关联规则挖掘。关联规则挖掘可以划分为两个子问题Apriori算法发现频繁项集和关联规则的生成。接着,进行规则的全局和局部裁剪。
7、最后,在开发者针对某一个类进行查询时,用列表的形式表示重用这个类必须遵循的规则。规则之间根据支持度进行排序。
III动态规则的发现
开发者预先设定程序所必须遵循的系统的动态规则,例如在调用函数A之前不能调用函数B;比如在解锁之前不能访问锁里的资源。事实上,由于缺乏文档等原因,在许多情况下开发者无法预先设定动态规则,这时就需要用挖掘的方法在代码和其他软件工程数据中发现这些规则。
具体步骤:①以静态代码为挖掘对象,将软件代码中调用的函数hash为ID值,将程序映射为ID序列,存入数据库。②对上述序列数据库执行FPClose算法挖掘频繁闭项集,对所得的频繁项集再次执行支持度为2
8、的FPClose算法,在闭项集中挖掘公共子集,对每个子集I和他所属的每个闭项集C,生成规则 I->(C-I).③查找程序中违反规则的代码段,这些代码段可能蕴含缺陷。
阅读这三篇文献后,我对软件工程中的数据挖掘技术有了一个概括性的了解,也掌握了一些软件工程中需要用到的挖掘算法。但是,在这三篇文章的背后,仍有一些细节性的模糊带过的概念值得思考。像《using Structural Context to Recommend Source Code Examples》贯穿通篇的数据库的构建问题,他要将每个类和类间关系存储起来,为数据挖掘提供数据源。这个数据库是几维的,是关系数据库还是其他类别的数据库,这个基本的问题文章并未提及,但是值得思考。