Die Hauptschwierigkeit bei der Erstellung von Software ist deren enorme Komplexität. Bei der Softwareentwicklung werden Daten (Variablen) durch Operationen (Funktionen, Methoden) modifiziert bzw. verarbeitet. Auch bei kleinen Applikationen ist die Zahl der notwendigen Funktionen und Variablen sehr groß. Diesem Komplexitätsproblem zu begegnen, wird in allen Phasen der Softwareentwicklung (Analyse, Entwurf/Design, Umsetzung, Test) versucht, das Problem im handhabbare Module/Komponenten zu zerlegen und diese zu bearbeiten. Demzufolge haben sich unterschiedliche Vorgehensmodelle, Programmiersprachen, Architekturen und Testverfahren ergeben. Alle dienen einzig dazu, die Komplexität von Softwareentwicklungen in den Griff zu bekommen.