ソフトウェアに関する今まで発生している多くの問題は、SW工学の二つの構造的な問題から始まっています。
一つ目の問題は、あるプログラムの内部を構成する必須要素ですが、完全に異なる性格を持っている「ロジック」と「機能」を混合し実装してきた事です。
「ロジック(Logic)」とは、ある仕事の処理方法、手順、特定の事実(Facts)を込めているデータ、情報、あるいは知識で、静的な性格を持っています。現在のプログラムは世界の全てに対応して作られることを考えると、「ロジック」はその範囲がごく広くて、多様な種類が必要です。
反面、「機能(Function)」とは、利用者の操作に反応して装置が実際に実行される動作で、動的な性格を持っています。ロジックと比べると、機能の種類は少なく、定型化したいくつのタイプで定義できます。