What Makes Software Development Difficult?
Steven J Zeil
Abstract
Earlier, you were asked to discuss, in the Forum, what kinds of factors significantly complicate software development projects.
Not surprisingly, that’s a question of much interest to developers and their managers. There have been quite a few studies devoted to that subject.
One place where identifying complicating factors comes into play is in trying to estimate the cost of a project before it can begin.
- A number of different cost models have been proposed.
- We’ll look at one of them to get a sense of the community consensus on what the factors might be.
1 Lessons from a Cost Model
One of the best known software development cost models is
- COCOMO (COnstructive COst MOdel) by B. Boehm, 1981
The Intermediate Cocomo formula estimates effort ($E$) in person-months:
\[ E = a_{i} (\mbox{KLoC})^{b_i} \cdot \mbox{EAF} \]
-
KLoC stands for “Kilo (thousands) of Lines of Code”, and represents an estimate of how large a propsoed project is going to be.
- Coming up with that estimate is a separate and non-trivial task
- The rest of the effort formula is an attempt to figure out how hard it will be to develop that many lines of code.
-
The constants $a_{i}$ and $b_{i}$ describe the characteristics of the development team.
- These are obtained by fitting the model to the costs observed in past projects developed by the same team.
1.1 Example
Suppose that in previous projects of various sizes, our company’s performance had fitted to $a=3.0$, $b=1.12$.
If we are looking at doing a 10 KLOC project that is very similar to past projects, the estimated effort would be
\[ E = a_i (\mbox{KLoC})^{b_i} \cdot \mbox{EAF} \]
\[ \; = 3.0 \cdot 10^{1.12} \cdot 1.0 \]
\[ \; = 40 \mbox{person-months} \]
(The EAF will be 1.0 if this project is very similar to past ones.)
If we are looking at doing a 20 KLOC project that is very similar to past projects, the estimated effort would be
\[ E = a_i (\mbox{KLoC})^{b_i} \cdot \mbox{EAF} \]
\[ \; = 3.0 \cdot 20^{1.12} \cdot 1.0 \]
\[ \; = 86 \mbox{person-months} \]
1.2 EAF
The most interesting part of the COCOMO formula is the EAF
, a multiplier computed from a checklist of project attributes.
- Each attribute describes some characteristic that affects how hard it is to develop software.
- The team managers assign each attribute an estimated rating ranging from “Very Low” to “Extra High”
- This yields a multiplier value for that characteristic,
- 1.0 is “average”
- values > 1.0 mean that more effort is required
- values < 1.0 mean that less effort is required
- This yields a multiplier value for that characteristic,
1.2.1 Cost factors
Ratings | ||||||
---|---|---|---|---|---|---|
Cost Drivers | Very Low | Low | Nominal | High | Very High | Extra High |
Product attributes | ||||||
Required software reliability | 0.75 | 0.88 | 1.00 | 1.15 | 1.40 | |
Size of application database | 0.94 | 1.00 | 1.08 | 1.16 | ||
Complexity of the product | 0.70 | 0.85 | 1.00 | 1.15 | 1.30 | 1.65 |
Hardware attributes | ||||||
Run-time performance constraints | 1.00 | 1.11 | 1.30 | 1.66 | ||
Memory constraints | 1.00 | 1.06 | 1.21 | 1.56 | ||
Volatility of the target environment | 0.87 | 1.00 | 1.15 | 1.30 | ||
Required turnabout time | 0.87 | 1.00 | 1.07 | 1.15 | ||
Personnel attributes | ||||||
Analyst capability | 1.46 | 1.19 | 1.00 | 0.86 | 0.71 | |
Applications experience | 1.29 | 1.13 | 1.00 | 0.91 | 0.82 | |
Software engineer capability | 1.42 | 1.17 | 1.00 | 0.86 | 0.70 | |
Target environment experience | 1.21 | 1.10 | 1.00 | 0.90 | ||
Programming language experience | 1.14 | 1.07 | 1.00 | 0.95 | ||
Project attributes | ||||||
Application of software engineering methods | 1.24 | 1.10 | 1.00 | 0.91 | 0.82 | |
Use of software tools | 1.24 | 1.10 | 1.00 | 0.91 | 0.83 | |
Required development schedule | 1.23 | 1.08 | 1.00 | 1.04 | 1.10 |
1.3 Example
Suppose that in previous projects of various sizes, our company’s performance had fitted to $a=3.0$, $b=1.12$.
If we are looking at doing a 10 KLOC project that is very similar to past projects, the estimated effort would be
\[ E = a_i (\mbox{KLoC})^{b_i} \cdot \mbox{EAF} \]
\[ \; = 3.0 \cdot 10^{1.12} \cdot 1.0 \]
\[ \; = 40 \, \mbox{person-months} \]
But suppose that we have decided to write this project in a programming language that is new to our team, and for which our preferred debugging tools are unavailable.
The EAF table says
Ratings | ||||||
---|---|---|---|---|---|---|
Cost Drivers | Very Low | Low | Nominal | High | Very High | Extra High |
Programming language experience | 1.14 | 1.07 | 1.00 | 0.95 | ||
Use of software tools | 1.24 | 1.10 | 1.00 | 0.91 | 0.83 |
So we might guess that our EAF $= 1.14 * 1.10$ = 1.254, so those two factors add an additional 25% to the effort estimate:
\[ E = a_i (\mbox{KLoC})^{b_i} \cdot \mbox{EAF} \]
\[ \; = 3.0 \cdot 10^{1.12} \cdot 1.25 \]
\[ \; = 50 \, \mbox{person-months} \]
1.4 Trends
Ratings | ||||||
---|---|---|---|---|---|---|
Cost Drivers | Very Low | Low | Nominal | High | Very High | Extra High |
Product attributes | ||||||
Required software reliability | 0.75 | 0.88 | 1.00 | 1.15 | 1.40 | |
Size of application database | 0.94 | 1.00 | 1.08 | 1.16 | ||
Complexity of the product | 0.70 | 0.85 | 1.00 | 1.15 | 1.30 | 1.65 |
Hardware attributes | ||||||
Run-time performance constraints | 1.00 | 1.11 | 1.30 | 1.66 | ||
Memory constraints | 1.00 | 1.06 | 1.21 | 1.56 | ||
Volatility of the target environment | 0.87 | 1.00 | 1.15 | 1.30 | ||
Required turnabout time | 0.87 | 1.00 | 1.07 | 1.15 | ||
Personnel attributes | ||||||
Analyst capability | 1.46 | 1.19 | 1.00 | 0.86 | 0.71 | |
Applications experience | 1.29 | 1.13 | 1.00 | 0.91 | 0.82 | |
Software engineer capability | 1.42 | 1.17 | 1.00 | 0.86 | 0.70 | |
Target environment experience | 1.21 | 1.10 | 1.00 | 0.90 | ||
Programming language experience | 1.14 | 1.07 | 1.00 | 0.95 | ||
Project attributes | ||||||
Application of software engineering methods | 1.24 | 1.10 | 1.00 | 0.91 | 0.82 | |
Use of software tools | 1.24 | 1.10 | 1.00 | 0.91 | 0.83 | |
Required development schedule | 1.23 | 1.08 | 1.00 | 1.04 | 1.10 |
-
Some of the trends are obvious.
- As required reliability and product complexity increase, so does the effort required
- As the team’s level of experience with the application area, the target environment, and the programming language increase, the expected effort goes down.
-
Some of the trends are not monotonic.
- As the required development schedule becomes more rigorous, the effort initially decreases (concrete deadlines may motivate performance) and then increases (stress and the need for compromises to meet deadlines).
2 Things to think about
How do the cost factors from the COCOMO table match up against your and your classmates’ answers in the opening discussion?
Consider a project with the following characteristics:
- Large development teams with
- high turnover
- vastly different levels of experience / ability
- Minimal opportunity for face-to-face communication
What do you think the EAC would be for this project?