山西大学,山西 太原,030031
摘要:软件工程数据是软件工程整个过程中所产生的各种数据,包括软件的源代码、文档、缺陷报告等。在绝大多数情况下,软件工程数据是开发者获取信息的唯一来源。随着计算机软件规模的不断扩大,手工获取开发和维护软件所需的信息越来越困难。数据挖掘技术可从软件工程数据中自动发现所需信息,加快软件开发进程,提高软件质量。本文针对软件工程数据挖掘的若干问题进行研究,并对软件工程数据挖掘意义及研究进展进行分析。
关键词:软件工程,数据挖掘,算法
1.软件工程数据挖掘简介
软件工程的每一个阶段都会产生相应的数据:可行性分析阶段产生的可行性文档,需求分析阶段的需求文档,设计阶段的设计文档,实现阶段的代码和注释,维护阶段的缺陷报告和维护日志等。在绝大多数情况下,软件工程数据是开发者进行软件开发和维护工作的唯一信息来源。
随着计算机软件规模的不断扩大,手工获取开发和维护软件所需的信息越来越困难。例如,著名的开源集成开发平台(Intergrated Development Environment,IDE)Eclipse 3.6共有0.82Gb的源代码、1.13Gb的缺陷报告、82Mb的帮助文档等数据,如果将这些数据打印在一本16开的书上,那这本书的厚度将达至lJ400米,相当于金茂大厦的高度。企图通过通读这些数据以获取对Eclipse软件的整体了解,其工作量是不可想象的。即使只是对Eclipse的所有缺陷进行手工分派,以每五分钟分派一个缺陷计,也需要一个开发者不吃不喝地工作三年。因此,对软件工程数据上信息自动发现的方法展开研究是十分必要的。
2.软件工程数据挖掘意义
数据挖掘(Data Mining)是在海量数据集中发现有用信息和知识的过程。相应的,软件工程数据挖掘(Data Mining for Software Engineering)是数据挖掘技术在软件工程领域的应用和发展,是指在海量的软件工程数据中利用数据挖掘技术和算法,经过提取、分析、表示等过程,发现对软件开发者有用的信息/知识的过程。数据挖掘技术使软件工程的海量数据不再是开发者不得不背负的负担,而是软件开发的助力。
就学术意义而言,软件工程数据挖掘是目前软件工程、数据挖掘、人上智能和模式识别等领域的研究热点,受到学术界的广泛关注,新的研究成果不断产生。以软件工程领域最具影响力的学术会议之⋯ICSE(International Conference on Software Engineering)的会议论文集为例,近四年(2007.2010)共收录论文229篇,其中有69篇与软件工程数据挖掘相关,接近总数的1/3。
就实践意义而言,软件工程是一门应用型很强的学科,软件工程数据挖掘的研究成就在提高软件开发效率、软件可信度和可用性方面有诱人的应用前景。其最直接的应用即是在软件开发和维护的过程中,向开发者提供所需信息,推进开发过程。
3.相关研究进展
Andrew等人对Microsoft公司的17个软件开发小组进行了两个月的跟踪调查,以了解软件开发过程中开发者所需的信息。在这项工作中,他们主要完成了两件事情:
其一,证实了在软件开发的各个阶段,单个开发者并不完全具备推进开发过程所需的信息,同时又缺乏从软件工程数据中获取这些信息的有效方法。而如果缺乏这些信息,开发者的工作将不得不陷于停顿。
其二,对软件开发过程中所需的信息进行了分类,明确了每一类信息应包括哪些“问题”和对应的“答案”、开发者通常从哪些渠道获取这些信息以及有哪些因素阻碍了开发者获取这些信息。根据他们的分析和总结,下面给出在软件开发的各个过程中开发者需要的各种信息:
(1)代码编写(Writing Code):即开发者基于自身经验和对开发任务的理解编写相应代码。一般情况下,开发者倾向于参考或重用结构、功能都与目前任务类似的模块,而重用这些模块又必须遵循特定的重用规则。目前,找到有效的重用模块需要开发者浏览大量的文档、代码和注释,而这些文档往往难以理解、不完整或不准确。
(2)提交更改(Submitting Change):即代码编写完成之后,开发者将其所开发或修改的模块提交到开发团队的版本库中,确认软件版本的更新。由于提交更改的动作影响到整个软件系统的开发和整个团队的工作进度,因此开发者倾向于尽量排除代码中的缺陷(Bug)并确认所提交的更改符合团队的约定后,再结束这一过程。定位缺陷最重要的方法是测试,而手工的测试方法不仅复杂繁琐,且效率低下。
(3)缺陷分派(Triaging Bugs):交付使用的软件系统仍旧不可避免地包含很多缺陷,因此绝大多数软件系统都有收集和发布缺陷报告(Bug Report)的机制和功能。缺陷报告通常是一个文本,内容为用户对缺陷爆发状态的描述。软件开发团队需要由专人(通常是团队的负责人或经验丰富的程序员)对缺陷报告进行分析,推测缺陷所处的模块,并将缺陷报告分派给相应的开发者处理。由于这些报告通常由对软件本身了解甚少的用户撰写而成,它们通常表达模糊、不专业、信息不全,难于理解和分派。
(4)错误重现(Reproducing the Failure):开发者收到缺陷报告后,对缺陷产生的原因做各种估计,根据这种估计对可能包含相应缺陷的代码进行调试,不断改变它的输入数据,直到程序的行为和输出呈现出与缺陷报告的描述相近的状态,以理解缺陷的性质,并定位这个缺陷。由于缺陷报告经常是模糊和不完整的,而程序的复杂结构又使其行为难于预测,因此通过手工方法重现缺陷是一种非常耗费精力,且又非常依赖经验、技术。也许还有运气成分的工作。
(5)理解行为(Understanding Behavior):简单地说,理解程序的过程就是试图发现“这段代码会做什么”。任何一个开发者除了设计和编写、修改自己设计的代码之外,还必须理解其他开发者编写的代码,特别是在代码重用和团队作业的时候。因此,对程序行为的理解是开发者所必需的。由于缺乏通用的描述程序行为的方法,而软件的文档和注释又经常不够详细和准确,故而开发者很难准确地理解程序行为。
(6)设计推究(Reasoning aboutDesign):在开发者接手别人编写的代码、或准备对软件设计进行完善时,必须彻底理解总体设计才能展开工作。由于软件系统规模庞大、结构复杂、细节众多,软件的总体设计理念很容易淹没在大量的细节里,同时单个开发者也不可能通过手工方法对整个系统的所有代码和文档进行浏览和理解。
4.结论
综上所述,可以从不同的角度,对软件工程数据挖掘的研究工作进行划分:从数据类型分,软件工程数据可以分为源代码和文档两大类;相应的,这两类数据上的数据挖掘支持着软件开发和软件维护两个大阶段的软件工程过程。进一步分别从微观和宏观的角度考察这两个阶段开发者所需信息可以发现,在软件开发阶段,从微观上说开发者需要确认编程工作每一个细节——包括每段程序的语法、每个标识符命名的正确性等;从宏观上说,开发者需要对源代码建立抽象模型,以从整体上理解软件的结构和功能。在软件维护阶段,微观上说开发者需要知道每个缺陷报告含义、由何人处理、表达是否明确等;宏观上说,开发者需要掌握软件缺陷的整体状况,了解缺陷爆发的时间和空间(缺陷位置)信息。
软件工程数据挖掘是在海量的软件工程数据中应用各种数据挖掘方法,发现对软件开发者有用的信息的过程。软件工程数据挖掘对理解软件和软件工程过程的内在机制、提高软件开发的生产效率、提高软件的质量等具有非常重要的意义。
参考文献:
[1]Ivar Jacobson.Object-Oriented Software Engineering:A Use Case Driven Approach.Addison Wesley Longman Publishing Co.,Inc.,Redwood City,CA,USA,2004.ISBN 0201403471.
[2] John Anvik,Lyndon Hiew,and Gail C.Murphy.Who should fix this bug? In Proceedings.of the 28th international conference on Software engineering, ICSE ’06,pages 361—370,New York,NY, USA,2006.ACM.ISBN 1—59593—375—1.