L'obiettivo dell'attività di design è produrre l'architettura (o progetto) del software.
La progettazione richiede più passaggi: in genere, si procede da una visione ad alto livello (high-level design o progettazione in grande) verso il basso, fino a considerare le singole unità (low-level design o progettazione in piccolo).
In particolare, l'architettura di un sistema software riguarda l'high level design: essa definisce il sistema in termini di componenti computazionali (moduli) e interazioni tra di essi.
Componenti e interazioni possono essere definiti a due livelli di astrazione diversi:
Al livello dei meccanismi, si descrive quali sono i costituenti del sistema, e come essi sono aggregati e correlati. A tale scopo, bisogna rispondere alle seguenti domande:
Quest'aspetto della progettazione introduce alcune problematiche:
In architetture diverse, gli stessi componenti (ad esempio client, server, database, filtri, e livelli di un sistema gerarchico) possono avere forme diverse, e/o essere "messi insieme" in modi diversi (con interazioni semplici, quali chiamate di procedura/metodo e accesso a variabili condivise, oppure più complesse, come protocolli client-server, multicast asincrono di eventi, ecc..). Lo stile è quindi ciò che caratterizza una specifica architettura rispetto alle altre.
Come analogia, al livello dei meccanismi la carrozzeria di un'auto è vista come un sistema composto da portiere, cofano, ecc.. mentre lo stile riguarda la differenza tra una coupè, una station wagon, ecc..