Iterative Cost Estimation

Assume a proposed system has n initial requirements:

R = {r1, ..., rn}

Assume there will be k iterations:

I1, ..., Ik

During each iteration a subset of requirements will be implemented. Thus:

R = I1 + ... + Ik

where + denotes disjoint union. This subset is determined by the customer at the beginning of each iteration. Also, each iteration will have a fixed duration, usually two or three weeks.

Assume the development team consists of four members. Assume an iteration lasts three weeks, and assume each team member will work no more than 40 hours per week. Then:

M = 4 * 40 * 3 = 480 man-hours/iteration

Of course the value of M will vary depending on the length of an iteration and the size of the development team. Asking developers to work for more than 40 hours/week can lead to morale and quality problems.

For 1 <= j <= k, let:

ej: R -> int

where:

ej(r) = estimated # man-hours needed to implement requirement r

The idea of iterative cost estimation is that at the end of each iteration, in addition to a release, we also produce an improved cost estimation function.

Let:

t(r) = actual # man-hours needed to implement requirement r

Then:

ej+1(r) = t(r) for r in I1 + ... + Ij
ej+1(r) = ej(r) + deltar for r in Ij+1 + ... + Ik

where deltar is a correction (which can be positive or negative) to ej(r) based on the experience gained during the previous iterations.

There are two basic rules to iterative cost estimation.

Rule 1: Never promise more than you can deliver. Assume

Ij = {rj1, ..., rjm}

define

ej[Ij] = ej(rj1) + ... + ej(rjm) = estimated # man-hours to complete Ij

then:

ej[Ij] <= M

Rule 2: Let requirements slip, not deadlines, not M. In other words, if during Ij it appears that

ej[Ij] > M

then make the customer modify Ij:

Ij' = Ij - delta

Where delta = a subset of Ij that will be postponed to Ij+1 and such that

ej[Ij'] <= M