プログラミングは通常「機能設計」→「構造設計」→「詳細設計」→「コード化」→「テスト」というプロセスを経ます。
このプロセスのことをライフサイクル(Lifecycle)と呼んでいます。
プログラムが大きくなると複数のモジュールに分けますが、モジュール間の結びつきの強さ(結合度)とプログラムの要求変化の速さの観点から開発方法を決めます。要求変化の速さとは、機能追加や変更が要求される速さのことです。
開発方法には、ライフサイクルを1つにするか複数にするかで3つのタイプがあります。
- Waterfall(ウォーターフォール)
- Agile(アジャイル)
- Incremental(インクリメンタル)
Waterfallの場合、プログラム開発は、1つの長いライフサイクルで進めます。
Agile では、同時並行の複数の短いライフサイクルで開発作業を進めます。
Incrementalでは中核部の開発を最初のライフサイクルとし、その成果を土台とした次のライフサイクルの開発を、そして同様にして前の成果を土台としたライフサイクルを繰返して完成させます。
モジュール間の結合度が強く、要求変化の遅いプログラムの開発にはWaterfallが適しています。
モジュール間の結合度が弱く、要求変化の速いプログラムの開発にはAgileが適しています。
Waterfallでは、ライフサイクルの後ろの工程で、機能設計や構造設計時のミスが発見されると、その修正に要するコストが非常に大きくなることがあります。これは納期遅れなど致命的な結果を招くことにつながります。
このようなWaterfallの欠点をできるだけ回避するための方法がIncrementalです。