原文为GeeksforGeeks网站Link
分类
Cocomo(Constructive Cost Model)是基于代码行的回归模型。它是软件项目的程序成本估算模型,通常用作可靠地预测与项目相关的各种参数的过程,例如大小、工作量、成本、时间和质量。它由Barry Boehm在1981年提出,该研究基于63个工程,使他成为了记录最好的模型之一。
模型的关键参数有两个,工作量和进度。
- 工作量: 完成单个任务所需要的人工,通常用人月来表示。
- 进度: 完成整个工程所需要的时间,和工作量成比例。通常用时间单位表示,如周,月等。
已经提出了不同的 Cocomo 模型来根据所需的准确性和正确性来预测不同级别的成本估算。所有这些模型都可以应用于各种项目,其特性决定了在后续计算中使用的常数值。下面提到了与不同系统类型有关的这些特性。
Boehm定义了三种不同的项目类型:
-
成熟的(Organic,本来应该翻译成有机的,但我觉得成熟的更加合适):如果所需的团队规模足够小,问题得到很好的理解并且过去已经解决,并且团队成员对问题有一定经验。
-
半成熟的(Semi detached,翻译原因同上):如果团队规模、经验、各种编程环境的知识等重要特征介于成熟与陌生之间,则软件项目被称为半成熟类型。与成熟项目相比,被归类为半成熟的项目相对来说不太熟悉和难以开发,需要更多的经验和更好的指导和创造力。例如:不同芯片类型的嵌入式系统。
-
陌生的(Embedded,翻译原因同上):需要最高级别的复杂性、创造力和经验要求的软件项目属于这一类。此类软件需要比其他两个模型更大的团队规模,并且开发人员需要有足够的经验和创造力来开发此类复杂的模型。
Cocomo模型按照细致程度分成三个等级:
- 基础模型(Basic COCOMO Model)
- 中级模型(Intermediate COCOMO Model)
- 细致模型(Detailed COCOMO Model)
基础模型可用于快速且稍微粗略地计算软件成本。由于缺乏足够的因素考虑,其准确性受到一定限制。中级模型考虑了成本驱动,细致模型额外考虑了各个项目阶段的影响,如每个阶段的成本驱动因素,并分阶段进行计算,从而产生更精确的结果。
工作量估计的计算
- 基本模型
项目类型 | a | b | c | d |
---|---|---|---|---|
成熟的 | 2.4 | 1.05 | 2.5 | 0.38 |
半成熟的 | 3.0 | 1.12 | 2.5 | 0.35 |
陌生的 | 3.6 | 1.2 | 2.5 | 0.32 |
上边的公式对于COCOMO的基础模型和后边的模型都适用。
基础模型的计算代码
// C++ program to implement basic COCOMO
#include<bits/stdc++.h>
using namespace std;
// Function for rounding off float to int
int fround(float x)
{
int a;
x=x+0.5;
a=x;
return(a);
}
// Function to calculate parameters of Basic COCOMO
void calculate(float table[][4], int n,char mode[][15], int size)
{
float effort,time,staff;
int model;
// Check the mode according to size
if(size>=2 && size<=50)
model=0; //organic
else if(size>50 && size<=300)
model=1; //semi-detached
else if(size>300)
model=2; //embedded
cout<<"The mode is "<<mode[model];
// Calculate Effort
effort = table[model][0]*pow(size,table[model][1]);
// Calculate Time
time = table[model][2]*pow(effort,table[model][3]);
//Calculate Persons Required
staff = effort/time;
// Output the values calculated
cout<<"\nEffort = "<<effort<<" Person-Month";
cout<<"\nDevelopment Time = "<<time<<" Months";
cout<<"\nAverage Staff Required = "<<fround(staff)<<" Persons";
}
int main()
{
float table[3][4]={2.4,1.05,2.5,0.38,3.0,1.12,2.5,0.35,3.6,1.20,2.5,0.32};
char mode[][15]={"Organic","Semi-Detached","Embedded"};
int size = 4;
calculate(table,3,mode,size);
return 0;
}
Output:
The mode is Organic
Effort = 10.289 Person-Month
Development Time = 6.06237 Months
Average Staff Required = 2 Persons
中间模型
基本的 Cocomo 模型假设工作量只是代码行数和根据不同软件系统评估的一些常数的函数。然而,实际上,任何系统的工作量和进度都不能仅根据代码行来计算。为此,各种其他因素,如可靠性、经验、能力。这些因素被称为成本驱动因素,中间模型利用 15 个这样的驱动因素进行成本估算。
成本动因的分类及其属性:
- 产品属性:
所需的软件可靠性范围 应用程序数据库的大小 产品的复杂性
- 硬件属性
运行时性能约束 内存限制 虚拟机环境的波动 所需周转时间
- 人员属性
分析师能力 软件工程能力 应用经验 虚拟机体验 编程语言经验
- 项目属性
软件工具的使用 软件工程方法的应用 所需的开发时间表
所涉及的因素参数如下表所示:
成本驱动因素 | 非常低 | 低 | 中等 | 高 | 非常高 |
---|---|---|---|---|---|
产品因素: | |||||
软件可靠性需求 | 0.75 | 0.88 | 1.00 | 1.15 | 1.40 |
应用数据库的规模 | 0.94 | 1.00 | 1.08 | 1.16 | |
产品的复杂度 | 0.75 | 0.85 | 1.00 | 1.15 | 1.30 |
硬件属性: | |||||
运行时性能参数 | 1.00 | 1.11 | 1.30 | ||
内存参数 | 1.00 | 1.06 | 1.21 | ||
虚拟环境的波动 | 0.87 | 1.00 | 1.15 | 1.30 | |
周转时间需求 | 0.94 | 1.00 | 1.07 | 1.15 | |
个人属性 | |||||
分析能力 | 1.46 | 1.19 | 1.00 | 0.86 | 0.71 |
项目经验 | 1.29 | 1.13 | 1.00 | 0.91 | 0.82 |
软件工程师能力 | 1.42 | 1.17 | 1.00 | 0.86 | 0.70 |
虚拟机经验 | 1.21 | 1.10 | 1.00 | 0.90 | |
编程语言经验 | 1.14 | 1.07 | 1.00 | 0.95 | |
项目属性 | |||||
软件工程方法应用 | 1.24 | 1.10 | 1.00 | 0.91 | 0.82 |
软件工具的使用 | 1.24 | 1.10 | 1.00 | 0.91 | 0.83 |
开发进度需求 | 1.23 | 1.08 | 1.00 | 1.04 | 1.10 |
项目经理分别针对上面的因子进行评分,并将其相乘,所取得的结果被称为努力因子(EAF)。中级COCOMO的计算公式如下:
\[Effort = (a(KLOC)^b)\times EAF\]该公式涉及的参数值如下表:
软件项目 | a | b |
---|---|---|
成熟的 | 3.2 | 1.05 |
半成熟的 | 3.0 | 1.12 |
陌生的 | 2.8 | 1.20 |
细致模型
细致模型将中间版本的所有特征与成本驱动因素对软件工程过程每个步骤的影响的评估相结合。细致模型对每个成本动因属性使用不同的工作量乘数。在细致模型cocomo中,将整个软件分为不同的模块,然后我们在不同的模块中应用 COCOMO 来估算工作量,然后对工作量求和。
细致模型COCOMO的六个阶段是:
- 规划和要求
- 系统设计
- 详细设计
- 模块代码和测试
- 集成和测试
- 成本建设模型
工作量是作为程序规模的函数来计算的,并且根据软件生命周期的每个阶段给出了一组成本驱动因素。