大规模、高效率地生产高质量的软件产品和提供软件服务的能力已成为社会经济升级发展的新动能,也是软件工程的主要研究内容。近年来,软件开发和服务广泛使用版本控制系统、缺陷追踪系统、邮件列表等支撑工具。这些工具积累了海量的软件生命周期活动日志。如何组织、分析和应用这些数据,以帮助软件实践者提高效率和质量,是极具挑战性的问题。数据驱动的软件工程以海量软件生命期数据为基础,综合大数据挖掘、人工智能和管理学科等方法,为软件工程的发展带来了新的机遇和挑战。
由北京大学周明辉教授牵头承担,中国科学院软件研究所王青研究员和南京大学周毓明教授等共同参与的国家自然科学基金重点项目“软件生命期数据组织、分析及应用”,旨在深入研究数据驱动的软件工程方法学,以建立一个软件工程大数据池为基础,解决海量多源的软件数据的组织问题,提出一套针对软件生命期数据特质的分析方法,并从大数据方法的角度研究软件工程中的过程改进和质量保障这两个最关键问题。北京大学及参研单位整合了包括数据组织、数据分析、软件过程改进和质量保障等领域的50余人的项目团队。项目团队研究了软件生命期数据的收集与组织、软件生命期数据的分析方法、面向群体协同的微过程度量模型和改进方法、基于信息融合的软件质量保障方法,取得多项创新成果,持续发表在顶级会议和顶级期刊上,形成了良好的国际影响力。以此为基础,团队与国际同行合作建立了开源软件大数据的收集、存储和分析平台WorldOfCode,并开发了一个基于数据总线、打通了软件全生命周期数据链条、支持智能化开发服务的软件开发管理平台SmartDev。━━━━大数据池:海量多源的软件仓库数据组织定制针对已有软件数据收集方法可用性不足的缺点,并综合软件数据海量、多源的特点,项目团队提出了语义一致的数据元模型,用数据总线的方式构建了软件制品间交互数据的格式和通用词表,解决了不同工具间语法、语义异构的问题,并基于语义相似度实现了交互数据的匹配、传输和共享,从而使数据在工具间真正流动起来,建立各制品数据关联关系;提出了按需高效的数据定制方法,基于微服务的工具服务封装了各待集成的工具,将希望交互操作的功能按REST架构风格封装成统一格式的应用程序接口(API),注册到数据总线上,并通过调用封装的RESTFULAPI执行指定工具中对应的服务,从而获取所需数据。进一步地,项目团队提出了一种层次化、多版本的共享与复用软件活动数据集的方法,建立数据的可追溯性与捕获数据的动态性。首先,该方法提出根据数据处理的不同程度划分不同的数据层次,使数据集包含原始、中间和最终多个层次的数据,从而建立数据的可追踪性并兼顾数据的普适性。该方法综合考虑了不同数据源之间的关联关系,并提出使用不同的方式在不同的时间段进行多次数据收集,形成数据集的多个版本,以尽可能地将数据变化纳入其中,为数据质量及分析结果有效性的验证和提高创造了条件。目前,该方法已经被应用于多项数据集的构建。━━━━数据分析:特定于软件生命期数据的分析方法软件生命期数据产生于软件开发的不同阶段,来自不同的开发环境和开发人员,且不同类型的数据以不同的频率被不断删除、修改和更新,使得软件生命期数据中产生了大量的缺失、噪声和不确定性以及在分布、类型和维度上具有自身的独特性质。这些特征使得分析软件生命期数据不能照搬经典的数据分析和挖掘方法。针对软件生命期数据的质量问题,项目团队提出了数据缺失和数据泄露的检测、修复方法。该方法综合考虑规则和统计分析、数据源特性、用户行为模式等维度,在相关软件活动数据集上修复率最高可达99%,为软件生命期数据的质量提供了坚实的保障。软件生命周期中多源数据的关联关系常有缺失,项目团队提出了适应多场景和多类软件制品的缺失关联关系的自动修复方法。需求文档贯穿整个软件开发周期,对于软件维护和演化起着重要作用,项目团队综合运用信息检索、语义建模、知识挖掘等技术建立了需求和设计文档、代码、测试用例之间的追踪关系,赋能软件质量保障活动。缺陷报告的挖掘和学习是软件质量保障的基础,缺陷报告和代码的关联关系经常缺失,影响了质量保障活动的性能,项目团队提出考虑非源代码文件和过滤无关特征的关联关系恢复方法,能够达到80%的准确率和86%的召回率。━━━━
过程改进:面向群体协同的微过程度量和改进鉴于软件开发是知识密集型活动,获得细粒度可复制最佳实践非常困难。项目团队提出微过程的概念,定义为软件项目在完成各项特定任务时的方式方法或活动流程,从数据出发建立分析框架和度量指标,形成了过程改进量化方法,相关研究结果可以有效辅助软件的高效开发。具体来说,项目团队面向软件开发全生命周期,建立了协作开发、代码提交、代码审查以及缺陷解决等关键微过程的度量框架,并推荐可度量的最佳实践。针对协作开发,定义了代码文件贡献组成的概念,并基于代码所有权,从贡献组成的集中度、复杂度和稳定性3个维度建立度量指标。以此为基础综合分析大型项目的文件类型与贡献组成,可认知软件项目常见的贡献组成模式及其相应的风险等级。针对代码提交,项目团队基于对社区文档、被接收的补丁和被拒绝的补丁的描述信息分析,归纳出该过程所涉及的沟通元素和上下文因素,并总结出最佳实践用于帮助开发者高效沟通。针对代码审查,项目团队采用主题模型和异构网络对审查活动进行建模,为缺陷报告推荐合适的修复人,提高缺陷检测效率。针对缺陷解决,项目团队利用工作流数据对贡献者初始行为建立意愿、能力和环境三维模型,建立预测长期贡献者的广义线性模型,揭示影响贡献者主动性和协同开发能力的多项重要机理。研究结果支持对开发者成长轨迹的精确分析,以及复杂大项目中新人的培训/学习等。━━━━质量保障:基于信息融合的软件开发决策支持软件仓库中蕴含了海量的多场景、多层次和多类别的软件开发信息,单一地利用某个场景、某个过程或者某个类别的数据进行软件质量保证都可能是不充分的。项目团队提出基于信息融合的方法发现隐藏的模式和趋势,充分利用软件生命期数据可以提供的微观视角,分析和寻找最佳实践,为开发者的综合决策提供有效的支持。为此,项目团队从缺陷预防、预测和修复等多个维度出发,在信息融合的基础上形成了具有理论支持并实际可操作的软件质量保障方法。针对缺陷预防,项目团队融合历史变更、编码上下文和代码依赖等信息提出可根据开发者编程行为在线调整的API推荐和能提高遵循软件设计原则程度的代码重构等多种缺陷预防方法。针对缺陷预测,项目团队融合代码内部的静态依赖关系、外部的使用上下文和历史版本等信息提出包级、函数级和变更级等多种粒度的缺陷预测方法,一方面利用代码变更趋势来提升有监督缺陷预测模型的有效性,另一方面提出面向目标数据集的无监督缺陷预测方法,能在保持预测有效性的前提下显著降低缺陷预测的成本,使其更易于在实际开发环境中使用。针对缺陷修复,项目团队融合软件仓库中的开发者、开发过程和软件产品等信息提出缺陷报告的自动分类、重复报告的检测、缺陷报告的智能分配、缺陷代码的准确定位和细粒度回归测试用例选择方法,能有效提高缺陷修复的效率和质量。━━━━
平台应用:大数据驱动的智能化软件协同开发项目团队协同国际同行构建了一个包含互联网上所有可获得的开源软件仓库的数据收集、存储和分析平台WorldOfCode。考虑到软件开发是一个动态的、长期的过程,该平台有效支持数据的更新和扩充,并通过构建适合大规模数据分析的分析工具,提供个性化的数据查询服务。目前,该平台部署在中美两地,为多项研究工作提供数据支撑。此外,项目团队设计开发了一个基于数据总线集成、打通软件全生命周期数据链条,并在数据驱动下实现智能化开发服务的软件开发管理平台SmartDev。该平台具有开发过程灵活配置和按需组合、过程数据与过程资源共享、支持多工具协同的过程管理、开放的智能服务框架等特点,已经成功在人规模的软件开发组织运行2年。总之,数据驱动的软件工程以海量的软件生命期数据为基础,从更细粒度的视角将软件开发映射到了众多相互连接的微过程中,支持从点到面、深入而广泛地探索跨项目的软件产品、开发过程和开发者的度量机理及模型,建立可验证、可复制、可重现的软件最佳实践,改进互联网时代的软件开发过程和软件质量保障方法,进而支持有效的软件工程推荐和预测应用。
致谢:感谢国家自然科学基金重点项目“软件生命期数据组织、分析及应用研究”(项目编号:)的支持。本文刊登于IEEESpectrum中文版《科技纵览》年3月刊。
专家简介周明辉:教授,北京大学。
王青:研究员,中国科学院软件研究所。
周毓明:教授,南京大学。
王俊杰:副研究员,中国科学院软件研究所。
谭鑫:博士研究生,北京大学。
IEEESpectrum
《科技纵览》
官方