20世纪末以来,开源软件取得了令人瞩目的成就。无论是开发质量,还是开发效率,成功的开源软件都可以与商业软件相媲美;很多开源软件在市场上的占有率已经远超同类商业软件,对全球软件产业的格局产生了重大影响。与传统商业软件相比,开源软件在开发模式上呈现出充分共享、自由协同、无偿贡献、用户创新等特征。分布在全球的开源软件开发者在基于互联网的虚拟社区中交互与协同,颠覆了经典软件工程的许多基本假设和理论。开源软件的巨大成功及其颠覆传统的开发模式对软件研究领域产生了巨大的冲击,吸引了一大批研究者对其展开研究。基于数据的开源软件量化分析是全面揭示开源开发新机理的重要研究途径,也是近年来非常活跃的一个研究方向。
1. 从定性到定量
基于经验理解软件开发活动,进而制定相应的开发原则和方法,是软件工程领域采用的基本研究方法。例如,模块化是软件工程的一个重要原则,而这一原则正是帕纳斯(Parnas)从开发经验中提炼产生的。基于经验的软件工程需要解决两个核心问题:一是如何从经验中提取出抽象的原则;二是如何将抽象的原则应用到新的软件开发活动中。从目前来看,能否将定性的抽象原则有效地应用到实践中,取决于实施者的经验和软件项目的具体环境(例如,针对一个具体的软件如何实现模块化,这个问题并不存在兼具一般性和易操作性的答案)也就是说,将一个项目的成功经验复制到另一个项目中,是一件非常困难的事情。
导致出现这种问题的根本原因是,不同项目的具体环境(如规模、应用领域、实现技术、开发团队等)会在开发实践中产生差异,而我们目前仍然无法对其差异进行准确的刻画。软件开发实践对项目环境具有敏感性,其主要原因是软件开发具有智力密集的特征,人的因素始终是软件工程无法回避的一个关键因素。传统的定性研究对人的因素给出了很多具有深刻洞察力的结论国。但是,由于缺少量化方法,这些结论很难在软件开发实践中定量实施,进而难以得到有效传播和普及。
目前,互联网上积累了海量开放的软件开发和应用数据,为软件开发活动的量化分析提供了良好条件。软件开发支持工具(如版本控制系统和问题追踪系统等)的广泛应用积累了大量数据,记录了软件代码的演变、开发任务的流程等。截至2015年4月,GitHub中的软件仓库数量超过1600万。近些年兴起的软件知识分享社区(如StackOverFlow)记录了大量的软件问答和软件评价等数据。截至2014年9月,StackOverflow的问答数量超过1300万。
这些数据从不同阶段、不同侧面反映了软件开发和应用的历史和动态,并提供了庞大的项目样本,为软件工程研究和实践带来了新的思维模式,提出了新的研究问题,例如,如何有效地收集、组织和运用这些数据来重新审视软件工程的本质复杂性问题?如何在新的开发模式下探寻新的软件过程规律,建立可复制的软件开发最佳实践?大数据的存在使得人们可以突破传统宏观层次的软件过程,在微观层次上对不同具体环境下的开发活动进行观察和分析(我们将这种从微观层次度量到的开发活动模式称为微过程)这些挑战和机遇对于软件工程乃至整个信息技术领域的发展都具有重要的理论价值和现实意义,但相关的研究工作尚处于起步阶段。
2. 数据的处理和量化分析方法
近些年来研究人员研发了各种技术和工具来获取和处理开源数据并加以利用。例如,CVSAnaly实现了版本控制系统数据的处理;SoftChange能够从源代码中推断各种隐含的事实;GHTorrent将GitHub站点上项目的相关数据存储在一个数据库中,供研究人员离线使用等。同时,许多研究者尝试引入经典的统计分析和机器学习方法来利用软件开发活动数据。例如,将传统的集成学习方法应用于软件工作量估算,将迁移学习方法应用到缺陷预测问题等。也有一些工作尝试建立软件开发数据的量化分析方法,例如莫卡斯(Mockus)提出一个量化研究的经典步骤包括:获取原始数据并进行清洁和处理,针对特定的研究问题建立相应的量度,然后围绕量度展开分析,最后验证结果并审查检查研究假设以确定是否对上述步骤进行迭代。特别值得一提的是,数据质量对软件数据分析至关重要,正逐步成为一个重要研究方向。例如,我们提出了一种利用数值分布来定位和修正错误数据的方法。
领取专属 10元无门槛券
私享最新 技术干货