
Bevor es an das Praktische geht, machen wir einen Abstecher in die Theorie, genauer gesagt, zum Autor von "A Philosophy of Software Design", John Ousterhout. Ihm nach bezieht sich Komplexität auf alle Aspekte, die mit der Struktur eines Software-Systems zusammenhängen und es schwierig machen, das System zu verstehen und zu modifizieren.
Stell dir vor, du hast ein umfangreiches Softwareprojekt mit vielen Modulen und Komponenten vorliegen. Diese Module sind alle miteinander verbunden und erfüllen bestimmte Aufgaben. Wenn die Verbindungen zwischen den Modulen äußerst komplex sind, wird es schwierig, Änderungen vorzunehmen, ohne versehentlich andere Teile des Systems zu beeinträchtigen.
Für unsere Entwickler:innen bedeutet dies, dass wir Zeit investieren müssen, um die Software-Architektur sorgfältig zu planen und zu überprüfen. Dadurch können wir unnötige Komplexität vermeiden und die Auswirkungen von Änderungen verstehen. Damit stellen wir sicher, dass bei Veränderungen im Projekt nichts auf dem Weg kaputt geht.
Es ist also wichtig, die Komplexität in der Softwareentwicklung zu reduzieren, um das Verständnis und die Flexibilität zu verbessern. Dies kann erreicht werden, indem die Software klar strukturiert wird, Abhängigkeiten minimiert werden und bewährte Designprinzipien zum Einsatz kommen.
Aber wieso begegnet uns Komplexität immer wieder?
Komplexität lässt sich nicht wirklich vermeiden, denn wir arbeiten in der Softwareentwicklung mit verschiedenen Modulen. Diese Module übernehmen einzelne Aufgaben und müssen teilweise miteinander verknüpft werden (oder im Hintergrund laufen), sodass das Programm geschmeidig läuft. Die entstehende Komplexität lässt sich überwiegend auf Dependencies & Obscurities zurückführen:

Dependencies 🕸️
Dependencies (deutsch: Abhängigkeiten) sind eine der Hauptursachen für Komplexität in der Softwareentwicklung. Vereinfacht gesagt sind sie die Verbindungen zwischen verschiedenen Modulen. Komplexe Verflechtungen treten auf, wenn Module stark miteinander verbunden sind und dann auch noch stark voneinander abhängen. Wenn die Verbindungen zwischen den Modulen komplex und undurchsichtig sind, wird es schwierig, die Auswirkungen von Änderungen vorherzusagen oder zu verstehen. Dies erschwert das Debugging und die Fehlerbehebung erheblich.

Obscurities 🔎
Eine weitere Ursache für Komplexität in der Softwareentwicklung liegt in der Obskurität, die aufkommt, wenn nicht klar ist, dass Verbindung zwischen Modulen besteht. Die Entwickler:innen wissen bei Obskuritäten nicht unbedingt, dass eine Veränderung innerhalb eines Moduls durch eine unbekannte Verbindung zu einer Veränderung in der Funktion eines anderen Moduls führen kann. Hier besteht die Gefahr von Fehlinterpretationen und unerwartetem Verhalten des Systems.
Welche Nebenwirkungen kann Komplexität haben?
Change Amplification 🚧
Komplexe Software neigt dazu, Änderungen zu verstärken. Das Hinzufügen oder Ändern einer Funktion kann Auswirkungen auf viele andere Teile des Systems haben. Dadurch steigt der Aufwand und man ist in der Entwicklung nicht mehr agil.
Cognitive Load 🤯
Komplexer Code erfordert von Entwickler:innen eine höhere kognitive Belastung. Je höher die Komplexität, desto höher die kognitive Belastung.
Unknown Unknowns 🙈
In komplexen Systemen ist es schwierig, alle möglichen Szenarien und Auswirkungen im Voraus zu kennen. Es gibt "Unbekannte Unbekannte", also Probleme zwischen den Modulen, die eben unbekannt sind und erst später auffallen. Diese unvorhergesehenen Probleme erschweren die Entwicklung und Wartung der Software.
Wie können wir Komplexität reduzieren?
Die Lösung ist einfacher gesagt als getan: Man muss eine null Toleranz-Philosophie bei Komplexität haben und nutzen. Dazu gibt es taktische und strategische Ansätze.
Taktische Herangehensweise ⚙️
Die taktische Herangehensweise zielt darauf ab, schnell voranzukommen und schnelle Ergebnisse zu erzielen. Dieser Ansatz kann in agilen Entwicklungsmethoden wie Scrum gesehen werden, bei denen das Hinzufügen von Features oft im Vordergrund steht. Dieser Ansatz kann jedoch langfristig zu einer erhöhten Komplexität führen.
Strategische Herangehensweise 🧑💻
Der strategische Ansatz betont die Bedeutung von gutem Design und einer langfristigen Vision. Er zielt darauf ab, kontinuierlich in eine gute Softwarearchitektur und Codequalität zu investieren. Dieser Ansatz erfordert eine proaktive Herangehensweise an die Reduzierung von Komplexität und die Vermeidung von technischen Schulden.

Prinzipien zur Reduzierung von Komplexität
Die Reduzierung von Komplexität klappt, indem man in der Planung und Umsetzung des Codes auf Loose Coupling und High Cohesion achtet. High Cohesion bedeutet, dass alles, was inhaltlich zusammengehört, gruppiert werden soll. Dies stellt im unteren Bild die blauen Verbindungen dar. Und Loose Coupling bezieht sich auf die Minimierung von Abhängigkeiten zwischen Modulen (die grüne Verbindung). Dies ermöglicht, dass ein Modul so unabhängig wie möglich von anderen Modulen funktionieren kann und erleichtert die Wartung, Erweiterung und Austauschbarkeit von Modulen.
Hinzu kommt die hierarchische Strukturierung von Modulen und Submodulen. Durch die Bildung einer Baumstruktur, bei der abstrakte, domänenspezifische Module oben stehen und detaillierte, generische Module unten stehen, wird eine klare Struktur geschaffen. Dadurch können Änderungen in einer Domäne vorgenommen werden, ohne die Implementierungsdetails zu beeinflussen.
Also, was lernen wir daraus? Immer schön planen und dokumentieren, bevor man mit einem Projekt loslegt. Das kann nämlich viel Zeit und Nerven sparen. Und denkt dran, oftmals wachsen Projekte nach dem Go-live weiter und wenn ihr da das Thema Komplexität nicht mitgedacht habt, wird es im Nachhinein schwerer, sie zu erweitern.
Du bist ein Unternehmen und möchtest mehr erfahren? Melde Dich gerne!
Du bist ein:e krasse:r Digital-Expert:in und möchtest ein Homie werden? Hier entlang!
Über die appmotion GmbH
Digitale Produkte für eine einzigartige Customer Experience: Mit einem starken Fokus auf smarte Kundenerlebnisse unterstützt appmotion moderne Unternehmen aus zahlreichen Branchen bei der Entwicklung von digitalen Geschäftsmodellen. Das Remote-first Unternehmen versteht sich dabei ganzheitlich als strategischer Berater, Umsetzer und Integrator bei digitalen Transformationsprozessen – und wurde dafür vielfach ausgezeichnet und zertifiziert. Seit 2022 ist appmotion ein Teil der deutsch-schweizerischen MYTY Gruppe.