비용 예측 기법 (Cost Estimation Techniques)
프로젝트 계획 작업에는 소프트웨어 개발을 위한 비용이 얼마인지 예측할 필요가 있다. 비용을 계산하기 위해 “노력(Effort)”, “자원(Source)”, “기간(Duration)”의 관계를 이해해야 한다.
- 노력(Effort): 프로젝트를 완성시키기 위해 필요한 작업의 양, 단위는 일(Work-Day), 주(Work-Week), 달(Work-Month)로 표현한다.
- 자원(Resource): 작업에 동원될 수 있는 인력의 양
- 기간(Duration): 작업이 수행될 기간
노력과 자원, 기간의 관계는 다음의 식으로 나타낼 수 있다. 이때, M(Manpower)은 투입되는 인력의 투입 비율의 총합이다.
$$ D = E/M $$
비용 예측 기법에는 크게 세 가지가 있다.
- `전문가 판단`: WBS를 기초로 경험 많은 전문가가 각 작업에 소요되는 비용을 추정한다.
- `PERT`: Program Evaluation and Review Technique의 이니셜을 딴 글자로, 기간을 결정하기 위해 기대치(가중 평균)를 계산하는 방법이다.
- `알고리즘식 방법`: 프로젝트에 소요되는 노력을 체계적으로 결정하는 방법으로, 프로젝트의 측정 가능한 특징을 찾아 함수를 정의한다. 대표적인 알고리즘식 방법으로는 COCOMO, 기능 점수가 있다.
COCOMO-81
COCOMO 초기 모델은 B.Boehm 원시 프로그램의 규모에 의한 방법으로, 완성될 시스템의 규모를 추정하고 준비된 식에 대입하여 소요 MM(Man-Month)를 파악한다. 규모 기반 모델은 규모를 기반으로 하는 다음과 같은 기본 수학적 공식 형식을 따른다.
$$노력 = A \times (Size)^B \times M$$
A는 개발 기관의 특징이나 개발 소프트웨어의 유형에 따라 좌우되는 상수, Size는 개발될 소프트웨어의 원시코드 라인 수나 기능 점수, B는 1에서 1.5 사이의 가변적인 값이다. M은 프로젝트에 영향을 주는 여러 가지 다른 요소들로 인해 달라지는 계수들로, 기본적으로 예측한 노력을 보정하는 값이다.
COCOMO-81 모델에서는 규모를 KDSI(Kilo Delivery Source Instruction)로 정하고 세 가지 프로젝트 유형에 따른 산출 공식을 다음과 같이 명시한다.
- `유기형(Organic)`: $PM = 2.4 \times (KDSI)^{1.05}$ 공식을 따르며, 소규모 팀이 개발하는 잘 알려진 응용 시스템에 해당한다.
- `반결합형(Semi-Detached)`: $PM = 3.0 \times (KDSI)^{1.12}$ 공식을 따르며, 트랜잭션 처리 시스템이나 운영체제, 데이터베이스 관리 시스템에 해당한다.
- `내장형(Embeded)`: $PM = 3.6 \times (KDSI)^{1.20}$ 공식을 따르며, 하드웨어가 포함된 실시간 시스템, 신호기 제어 시스템에 해당한다.
COCOMO-81의 문제점은 다음과 같다.
- 프로젝트 초기 단계에서 Size 값 예측의 어려움
- 기본 예측 모델에서 B와 M의 값에 영향을 주는 요소들의 주관성
- 모델과 속성값 보정의 어려움
COCOMO II
COCOMO II는 소프트웨어 개발 프로젝트의 진척도에 따라 세 가지 다른 모델로 분류한 것으로 COCOMO 초기 모델을 개선한 것이다. 단계 별 모델은 다음과 같다.
- 1단계: 응용 합성 단계로, 프로토타이핑을 진행한다. GUI, 3세대 언어 컴포넌트 개수를 세어 응용 점수를 계산하고 이를 바탕으로 노력을 추정한다.
- 2단계: 초기 설계 단계로, 기능 점수 방법을 채택하여 자세한 구조와 기능을 탐구하며 정확한 예측을 노린다.
- 3단계: 구조 설계 이후의 단계로, 시스템에 대한 자세한 이해를 바탕으로 COCOMO-81에서 제시된 LOC(Lines Of Code)에 의하여 소요되는 노력을 추정한다.
COCOMO II에 적용되는 기본 모델은 다음과 같다.
$$E = b\ S^c \ m(X)$$
이때 $b \ S^C$는 기초 소요 노력 예측값이고, $m(X)$는 비용승수의 벡터이다.
기능 점수(Function Points)
기능 점수는 소프트웨어 시스템이 가지는 기능을 정량화한 것으로, 일반적인 소프트웨어가 가지는 기능의 개수로 소프트웨어의 규모와 복잡도를 나타내고 소요 인력과 개발 기간을 계산하는 방법이다.
기능 점수는 총 기능 점수(GFP)와 처리 복잡도 보정계수(PCA)를 곱한 것으로, 기능 점수를 구하는 방법은 다음으로 구성된다.
- 다섯 가지 기능 분야(입력, 출력, 질의, 파일, 인터페이스)에 해당하는 개수를 파악하여 작업표에 채운다
- 각 다섯 기능에 대한 복잡도(단순, 중간, 복잡)를 결정하여 표시한다.
- 총 기능 점수(GFP)를 구한다. 구하는 식은 다음과 같다.
$$ GFP = \sum\limits_{i = 1}\limits^{5}{Count_i \times Complexity_i} $$ - 처리 복잡도 계산표의 14개의 질문을 활용하여 각 처리 복잡도의 정도에 따라 0~5의 점수를 할당한다.
- 처리 복잡도 보정계수(PCA)를 다음 식을 이용하여 구한다.
$$ PCA = 0.65 + 0.01 \sum\limits_{i = 1}\limits^{14}{PC_i} $$ - 최종 식에 넣어 기능 점수를 구한다.
$$ FP = GFP \times PCA $$
기능 점수는 구현되는 언어와 관련이 없다. 그러나 기능 점수 방법은 모든 항목에 일률적인 가중치가 적용되기에 문제가 있을 수 있다. 이러한 문제점은 각 항목의 가중치를 하나의 값이 아닌 범위를 정하여 가변적으로 만들어 적용하여 해결 가능하다.