Coming from both an aero-space and software background, I can tell you that both the risks and challenges in the development cycles are extremely similar.
No airplane is identical, and even within a given line (eg: F-16) there are many blocks which differ substantially in how the components integrate with each other. Their software analogy would be version upgrades.
Next up from that are variants (A 747-400 is substantially different than a 747-400ER), which is similar to the differences between say Visual Studio Standard and Enterprise editions. Each variant of a 747, while based on the same historical airframe and air-tunnel research, starts branching off and adding different features based on their unique target markets.
Hardly anything in aero-space engineering is repeating the same thing over and over. From the airframe designers to the line engineers, there’s always a new challenge they have to incorporate with their existing knowledge.
And funny enough, the high-risk, experimental airplanes are the staunchest adherents to the waterfall model.
- Research Historical Data and Conceptual Design
- Prototype
- Scale Component Testing
3a. (loop research again if planned/needed)
- Full scale prototype
- Testing
- System Integration
- Flight Testing.
Conversely, a move towards away from the pure waterfall model can be found in Multi-disciplinary Design Optimization (MDO), which appears in more mainstream engineering efforts. Here, they are attempting to iterate more frequently in order to achieve better use of materials and structures. The waterfall models do attempt some iterative loops, but they’re low in number and generally pre-determined.
So, why has the aero-space industry generally use the waterfall model and gantt is planning overall projects? Because the correct use of these require only two pieces of information:
- Historically, how long has similar tasks usually taken.
- What are the risks? How well do I know this problem space? Are we innovating substantially here?
That is all that an accurate (if not entirely precise) estimate requires. Any more information and it’s likely a biasing factor because of wishful thinking or political reasoning. Techniques such as MDO makes it harder to estimate a project with any reasonable accuracy because the dependencies added from the feedback loops cannot be enumerated. How can anyone before hand, say how many iterations will it take, before we get it right?
For the aero-space industry, the cost savings of MDO promises to make it cheaper in the long run for production to offset this uncertainty in development cost.
So, can software development learn anything from the aero-space industry? Quite a lot I must say. The same risk-analysis, and structured development methods can easily be applied to software development.
- Gather requirements up-front and prioritize. What are the primary goals of the design.
- To get an accurate global estimate, one must strive to reduce the number of dependencies between tasks.
- Recognize which tasks have historical correspondence, and use that data.
- Explicitly write down your risks. Give an estimate to them, and that PLUS your original estimate is the time required. (*1)
- Don’t change the requirements and then assume the costs will be the same. All the other engineering industies have already learnt this lesson. Ref Change Management.
- Make sure a design for testing is in your development plan. The earlier risk questions can be answered earlier, the better it is. It gets progressively more expensive to test later.
7 Where it makes sense from a long-term cost, use MDO. (*2)
Footnotes:
*1 - Ironically, despite the fact that most programmers should have studied network theory, the software industry is the only one where I frequently see people try to do a 60%-40% rule or some obscene optimistic fudging for schedule+risk estimates. Scheduling is a longest path problem – any fudging is called wishful thinking. If a value is too long for your liking, plan to answer the risks early enough so you can re-estimate, not arbitrarily change the value.
*2 - My personal opinion on #7 is that frameworks and language designs are probably the only application of this rule. And as every good developer should know, unless you’re in the frameworks business, you should not be building frameworks.