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 mit uns zusammenarbeiten? Dann kontaktiere uns gerne per Mail für eine unverbindliche Beratung.
Du bist ein:e Digital-Expert:in und möchtest ein Teil unseres Teams werden? Hier geht's zu unserer Karriere-Seite.
Über SHAPE
SHAPE steht für wegweisende Lösungen und strategische Beratung in der digitalen Transformation. Mit 12 Jahren Erfahrung und einem Team von 140 Talenten an sechs Standorten in Deutschland, der Schweiz und Kroatien bietet SHAPE umfassende Services in den Bereichen Innovationsstrategie, Produkt- und Service-Design sowie maßgeschneiderte Softwarelösungen. Das mehrfach ausgezeichnete und zertifizierte Unternehmen ist Teil der internationalen MYTY Gruppe.