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