经验软件工程的定性语为经验,这里的“经验”不单单是人在实践中的主观体验和认知,更强调从实践中获得的客观证据。经验软件工程定性叙述为:通过从实践中获得的客观证据,发现软件工程中的某些规则或规律,进而改进软件开发过程。Empirical 在英文中是“经验的”或“实证的”意思。因此,Empirical Software Engineering,被译为“经验软件工程”或“实证软件工程”。经验研究是一种为了发掘未知或检验假设的基于观察的研究,历来被用于社会科学和心理学研究。柯思林词典中,经验研究是对知识的经验搜索。在经验软件工程中,经验研究是以改进软件工程实践为目的,将理论上的概念运用于软件工程实践,将应用经验形成知识加入软件工程系统中,以改善过程、方法和工具,验证理论和模型。在软件工程中,我们需要对理论和“一般常识”进行经验验证,发现是否存在某种关系(如可维护性及其度量因子之间的关联)需要选择模型、技术或工具,并判断它们在实践中的效果。
经验软件工程的研究内容涉及如何获得经验数据、如何进行数据分析,从而提出假设并进行科学求证,最终指导实践活动。根据数据形式的不同,经验研究又可分为定性研究(Qualitative Research)和定量研究(Quantitative Research)。定性研究中处理的数据主要为文字、图像等难以量化的信息,其研究方法主要来自社会科学领域,如编码(Coding)、主题归纳(Thematic Synthesis)、持续比较(Constant Comparison)、扎根理论(Grounded Theory)等。定量研究中处理的是能够被量化的数据,会用到概率统计(如假设检验、回归建模)、仿真试验、机器学习等方法。通常根据数据获取的方式、研究对象、分析方法、证据强度等的不同等将其分为受控实验(Controlled Experiment)、案例研究(Case Study)、调研(Survey Research)和行动研究(Action Research)等方法,这些方法虽然各有特点,但并不排斥,也常常混合使用。比如通过案例研究,发现可能的因果关系,再通过更广泛的调研或通过设计受控实验进一步求证。在针对相似问题的大量第一手经验研究的基础上,还可以使用系统调研评价(Systematic Review)开展二级经验研究。
经验软件工程的主要研究策略:①调查法。它是一种通过收集来自人或者与人有关的信息,来描述、比较或者解释人们的知识、态度和行为的方法。②案例研究。它是一种经验性探究方法,通过多个证据源来调查在真实环境下当前软件工程现象的一个实例(或少量的实例),尤其用在当想象和环境的边界难以清楚界定的时候。③实验(或称受控实验)。它是一种经验性探究方法,操控研究情境中的一个因素或者变量。在保持其他变量不变得前提下,通过随机选择的主体实施不同的方案,或者由不同的主体来实施相同的方案,然后测量对输出变量的影响。在面向人的实验中,人们在对象上使用不同的方案;而在面向技术的实验中,则在不同的对象上使用不同的技术方案。④准实验。它是一种类似于实验的经验性探究方法。在准实验中,方案到主体的分配不是随机的,而是根据主体或者对象本身的特征来选择的。
经验软件工程的研究目标是实施更好的经验研究、注重因果机制并生成理论,实现迭代和改进。良好的经验能够更迅速地构建软件工程知识体系,快速删除低回报的想法,识别和评估高回报的想法,探究重要的实际想法。经验软件工程自提出以来,已经在软件工程中得到了广泛的研究和应用,几乎覆盖到软件过程的所有阶段和制品,比如代码、版本控制系统、缺陷报告、文档、沟通历史、设计文档、执行历史和配置文件等。
经验研究的优点:①其信息获取形式不拘一格,例如人员访谈、技术调研、文献综述等,都可以作为研究者获取信息的方式。②研究方法多样,比如实验性研究、案例分析、实地考察、调查问卷等;③提供的信息形式,可以是量化的数据信息,也可以是定性分析的评价。经验研究的这些特点,能够更加适应软件开发实践的多变与不确定的特点。
经验软件工程中可能存在的问题:①完全随机的实验在软件工程中难以实现,现今的软件工程实验往往是准实验。②经验研究中使用数据的可信性问题。③经验研究结果的可验证性,可比较性,可重现性和可应用性的问题。