一般来说,选择一种软件开发方法,更像是加入一个邪教组织,而不像是做出了一个技术决策。许多公司甚至从未试图去评估这些方法,而仅仅是盲目采用最流行的方法,这就造成了如今五花八门的各种敏捷方法。因此本文将使用包括功能点、缺陷移除率(DRE)、质量成本(COQ)以及总拥有成本(TCO)在内的一些标准的度量指标,对现代软件开发方法的样本进行比较。
目前有约55种已命名的软件开发方法正在使用,还有更大数量的混合方法。这些开发方法中包括传统的瀑布方法、各种花样的敏捷、Rational统一过程(RUP)、团队软件过程(TSP)、V-模型开发、微软解决方案框架、结构化分析和设计技术(SADT)、持续演进开发(EVO)、极限编程(XP)、PRINCE2、Merise和基于模型的开发,以及更多的其它开发方法。
数据本身是来自于对一定数量的客户的研究成果,这些客户集体使用了各式各样的开发方法。预测部分使用了作者的专有工具SoftwareRiskMaster?,这个工具可以创造所有55种软件开发方法的理论模型。
引言目前有超过55种的软件开发方法存在,而且每一种都有其忠实的追随者,这个事实表达了一个强烈的信息:在这55种软件开发方法中,没有任何一种有能力处理所有规模和种类的软件应用。
其中一些方法最适用于小型应用程序和小型团队;而其它一些方法适用于大型系统和大型团队;一些适用于复杂的嵌入式应用;一些适用于高速的Web开发;一些适用于高安全性的军事应用。是否有可能选择出一种最佳方法来适用于各种具体项目呢?一种方法足够吗?或者企业是否应该基于他们需要开发的项目的种类,使用数种方法?
不幸的是,由于缺乏量化的数据和方法之间的比较,选择一种软件开发方法更像是加入一个邪教组织,而不是一个技术决策。许多公司甚至从未试图去评估那些替代方法,而仅仅是采用当时最流行的方法,无论此方法是否适用于他们所构建的软件的类型。
当这些软件方法被评估后,其结果使我想起了古代的佛教寓言:盲人摸象。不同的开发方法分别有着最快的速度、最高的质量和最低的总拥有成本。
(在原来的寓言中,摸到大象鼻子的盲人认为大象像一条蛇。摸到大象侧面的盲人认为大象像一堵墙。摸到象牙的盲人认为大象像一只长矛。摸到尾巴的盲人认为大象像一根绳子。)
影响软件项目的因素组合理想的解决方案应是遍历各种规模和类型的软件来评价各式各样的方法。然而由于组合的复杂性,这是很困难的。所以我们只考虑那些众所周知的会对软件项目结果产生影响的主要因素:
因素
可能性数量
软件开发方法
55
编程语言
50
应用程序的性质、分类和类型
15
软件能力成熟度模型等级
5
团队经验(低,中,高)
3
应用的规模水平(小型,中型,大型)
3
应用复杂程度(低,中,高)
3
因素组合
5,,
由于对每一个因素都进行考量会导致组合数量过于庞大,所以本文将做出一些简化的假设,从而让我们主要专注于软件开发方法因素,而不是所有其它因素。
在这篇文章中的基本假设是:
应用规模
个功能点
编程语言
C和C++
逻辑代码语句
75,行
需求蔓延
省略
延期的功能特性
省略
可重用的功能特性
省略
团队经验
中等
复杂度
中等
每个员工的月成本
$7,
通过将规模、语言、复杂性以及团队的经验保持在恒定的水平,让检查开发方法本身所产生的影响变得更加容易。不幸的是,如果要考虑所有的方法,数量实在过于庞大,因此将会展示的是一个拥有10个方法的子集,所有这10个方法都在美国有着相当广泛的应用。
(请注意,对于用于进行比较的实际应用,其功能点数量从大约个的规模到个不等。作者使用一个专有的数学方法将应用程序的规模调整为固定大小,以便在同等条件下进行比较。)
按字母排序的10个方法(译者注:该顺序根据的英文原文单词的字母顺序)
Scrum式敏捷
瀑布式CMMI1
迭代式CMMI3
螺旋式CMMI5
极限编程(XP)
面向对象开发
迭代式结对编程
瀑布式正确性证明
Rational统一过程(RUP)
团队软件过程(TSP)
因为并不是每个读者都可能熟悉每一个方法,以下是本文对这些方法的简述:
Scrum式敏捷:术语“敏捷”有着多义性,我们有着很多种不同特性的敏捷开发方法。在这篇文章中所使用的术语“敏捷”,用于特指满足以下条件的项目:或多或少地遵循了年的敏捷宣言,由内部用户提供需求、使用用户故事、将项目划分成进行单独开发的独立Sprint,并且使用了Scrum的概念以及有每日状态会议。最大限度地减少文书工作以及加快开发速度,这是敏捷的首要目标。
瀑布式CMMI1:软件工程研究所的软件能力成熟度模型集成?(CMMI)是一个众所周知的用于评估软件开发的先进程度的方法。CMMI1是5个CMMI等级中位于最底部的初始等级,这意味着相当混乱的开发。术语“瀑布”是指传统软件实践中的顺序式开发,它从需求分析开始顺序进行,在完成当前步骤之前,都不会进行下一个步骤。
迭代式CMMI3:CMMI的第三级被称为“定义级”,指的是有一整套的合理顺畅、易于理解的开发步骤。术语“迭代”比“敏捷”出现的更早,也有将应用程序划分成可以单独构建的独立部分的类似含义。
螺旋式CMMI5:CMMI的第五级是五级中的顶级,被称为“优化级”。达到这种水平的组织相当先进和熟练,很少犯严重错误。软件开发的螺旋式模型是由BarryBoehm博士首创的,它所强调的思想也出现在敏捷中,比如可以单独进行开发的独立分段。螺旋式模型中的分段通常大于敏捷中的分段,并且会先有原型。
极限编程(XP):这种方法也在敏捷开发的范畴之内,但有一些独特的特性。最显著的特征是,在测试用例被首先开发完成之前,会一直推迟编码。XP方法也使用代码评审或代码审查。有时XP也使用结对编程,但并非总是如此,所以那是一个特殊情况。最终软件的质量是XP方法的主要目标。
面向对象开发(OO):OO方法是这篇文章中历史最悠久的开发方法之一,并已经获得过多次成功。这也导致了一些特殊语言的创立,比如ObjectiveC。在这篇文章中使用的是用例式的OO分析和设计。C++语言也是一种面向对象的语言。OO分析和设计与传统方法是有所不同的,因此需要有一个学习曲线。
结对编程:结对编程的概念通常是敏捷方法的一部分,但并不限于敏捷方法。在本文中,结对编程和迭代式开发一起使用。结对编程的基本思想是两个人轮流编码。当一个人在编码时,另一个观察并提出建议。有时这两个人共同使用一台计算机或工作站。
正确性证明:正确性证明隐含的观点是,在软件应用程序中将会包含对算法实施正规的数学性证明的部分。很明显算法需要用一个正规的方式来表达,它才可以被证明。同样明显的是,进行正确性证明的人需要有足够的数学技巧来处理相当复杂的公式和算法。
Rational统一过程(RUP):RUP方法源自于Rational公司,该公司在年被IBM收购,所以现在这是IBM的一个方法。RUP方法包括迭代和面向对象开发这两个方面。自从RUP归IBM所有至今,已经有了很多支持这种方法的工具。对于使用RUP的应用程序,用例和可视化建模是标准用法,但是笔者的客户通常也会引入其他方法,比如决策表。
团队软件过程(TSP):TSP方法是由已故的WattsHumphrey发明的,他曾是IBM的程序设计总监,后来他还创立了软件工程研究所(SEI)能力成熟度模型所使用的评估方法。TSP非常注重软件的质量。所有的bug都要被记录下来并使用代码审查,鉴于正是bug减慢了开发,因此高质量是主要的目标。TSP方法有着一些与众不同的方面,比如自管理工具和担负经理职责的教练。目前TSP受到SEI的拥护和支持。
三种方法评估类型和10个度量指标即使将方法数目限制到了10种,仍有很多需要进行评估的结果。然而根据来自和数以百计的客户打交道的经验,对于开发经理和高级主管来说最为重要的是以下这些问题:
速度相关的指标
开发进度
开发人员配备
开发工作量
开发成本
质量相关的指标
潜在缺陷总数
缺陷移除率(DRE)
已交付缺陷数量
高严重性缺陷数量
效益相关的指标
总拥有成本(TCO)
质量成本(COQ)
即使只展示10种方法和10个问题,其信息总量仍然是相当显著的。
本文将试图从三个方面去比较这些方法:
速度:开发进度、开发工作量和开发成本
质量:根据已交付缺陷数量得出的软件质量
效益:总拥有成本(TCO)和质量成本(COQ)
需要注意的是本文中所使用的技术将保持应用程序的规模恒定在个功能点,这意味着对于有0个功能点的大型系统或者00个功能点的巨型系统而言,使用本文得出的数据去判定最佳方法是不太稳妥的。尽管如此,个功能点数量级的应用程序是非常普遍的,而且这个数量级也足够大到能够以一种非常有用的方式来表达比较结果。
本文中的一些数据是使用作者的软件风险大师?(SRM)工具准备完成的,这个工具被设计为可以对任何开发方法、任何CMMI级别、任何复杂程度以及任何团队经验水平进行对比测试。文中的一些数据表是基于SRM输出数据得到的,虽然这些数据源自于早期被测应用。
速度:针对开发进度和成本进行方法比较针对方法的首个比较北京治疗白癜风到什么医院好北京中科医院