There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.
Design er en pågående jobb som programmerer. Det handler om å ta stilling til hvilke undersystemer som kan skilles ut som selvstendige komponenter, hvordan disse skal kommunisere, og på et lavere nivå, hvilke datastrukturer og abstraksjoner vi trenger. Målet med ethvert design er å finne en robust løsning som slår en god balanse mellom fleksibilitet, og kost i form av hvor lang tid det tar å komme i mål.
Et godt design tåler å få nye, uventede krav stilt mot seg uten å kollapse; altså at man må skrive om hele eller store deler av løsningen for å komme i mål. Et godt design tar også hensyn til at systemet skal driftes og leve videre etter at det første utviklingsprosjektet er over.
Mange Kodemakere har hatt rollen arkitekt i prosjekter, og i denne rollen har man det formelle ansvaret for det overordnede designet i systemet. Også de av oss som ikke har hatt den formelle rollen arkitekt har mange tanker og meninger om programvaredesign, noe som både kommuniseres til våre omgivelser i det daglige såvel som gjennom foredrag på konferanser og andre fagsamlinger.