O projeto de um software procura dividir o software em
componentes que executem funções específicas e levar a
interfaces que minimizem a complexidade de conexões entre
os módulos. No projeto preliminar, procura-se transformar
os requisitos em uma arquitetura de dados e software. No
projeto detalhado, os componentes individuais podem ser
refinados até o nível de interfaces, classes ou componentes
preexistentes.