Kürzlich habe ich „A Philosophy of Software Design“ zu Ende gelesen und im zweiten Kapitel geht es um das Thema Softwarekomplexität.
Das Buch „A Philosophy of Software Design“ definiert Komplexität praktisch:
„Komplexität ist alles, was mit der Struktur eines Softwaresystems zusammenhängt und es schwierig macht, es zu verstehen und zu ändern.“
Mit anderen Worten, Komplexität kann viele Formen annehmen und muss nicht unbedingt etwas mit der Leistung zu tun haben. Ihr Code kann performant und dennoch komplex sein
Ich möchte in diesem Artikel einige wichtige Definitionen und Erkenntnisse aus dem Buch teilen. Aber stellen wir uns zunächst eine alltägliche Situation vor, in der Sie wahrscheinlich schon einmal waren …
Lassen Sie uns in eine Horrorgeschichte eintauchen, die viele von Ihnen wahrscheinlich schon erlebt haben oder noch erleben werden.
Es begann mit einer einfachen CRUD-Aufgabenverwaltungs-App. Der Code war sauber, modular und leicht zu warten. Das Entwicklungsteam war zufrieden und das System funktionierte bei den ersten Kunden perfekt.
Die Probleme begannen, als das Vertriebsteam das System an ein großes Unternehmen verkaufte und behauptete, es verfüge über eine Kalenderintegration, E-Mail-Benachrichtigungen und einen erstaunlichen Berichtsgenerator. Nachdem der Verkauf abgeschlossen war, mussten diese Funktionen schnell implementiert werden.
Kalenderintegration: Das Team musste Google Kalender und Outlook integrieren. Verschiedene Entwickler implementierten die Lösungen, was zu inkonsistenten Ansätzen führte.
E-Mail-Benachrichtigungen: Als nächstes wurden E-Mail-Benachrichtigungen hinzugefügt. Ein Entwickler verwendete eine bestimmte Bibliothek, während ein anderer eine benutzerdefinierte Lösung erstellte. Die gemischten Ansätze machten den Code verwirrend.
Berichtsgenerator: Für den Berichtsgenerator verwendeten Entwickler verschiedene Technologien: PDFs, Excel-Exporte und interaktive Dashboards. Das Fehlen eines einheitlichen Ansatzes machte die Wartung zu einem Albtraum.
Wachsende Komplexität: Jedes Feature wurde isoliert und schnell entwickelt, was zu Abhängigkeiten zwischen Features führte. Entwickler begannen, „schnelle Lösungen“ zu entwickeln, damit alles funktionierte, was die Komplexität und Kopplung des Systems erhöhte.
Softwareentwicklung findet nicht im luftleeren Raum statt; Verschiedene interne und externe Faktoren beeinflussen es. Wir alle waren oder werden in einer solchen Situation sein.
Dann begannen die Probleme:
Es ist klar, dass wir jetzt ein komplexes System haben.
Lassen Sie uns nun diese Komplexität „zerlegen“, um es einfacher zu machen, sie zu erkennen und zu entschärfen.
Nun, „mildern“ bedeutet:
„Um das Schwere, die Schwere oder den Schmerz zu lindern; um es zu lindern.“
Ich glaube, dass Komplexität oft dem Code innewohnt. Manche Dinge sind von Natur aus komplex. Ihre Rolle als Entwickler besteht nicht nur darin, Code zu erstellen, den der Computer effizient ausführen kann, sondern auch darin, Code zu erstellen, mit dem zukünftige Entwickler (einschließlich Ihres zukünftigen Selbst) arbeiten können.
„Die Beherrschung der Komplexität ist die Essenz der Computerprogrammierung.“
— Brian Kernighan
Der Autor des genannten Buches gibt an, dass sich Komplexität typischerweise auf drei Arten manifestiert, die wir hier untersuchen werden.
Änderungsverstärkung tritt auf, wenn eine scheinbar einfache Änderung Änderungen an vielen verschiedenen Stellen erfordert.
Wenn der Product Owner beispielsweise ein Feld „Priorität“ oder „Abschlussdatum“ anfordert und Ihre Entitäten eng miteinander verbunden sind, wie viele Änderungen müssten Sie dann vornehmen?
Die kognitive Belastung bezieht sich auf die Menge an Wissen und Zeit, die ein Entwickler benötigt, um eine Aufgabe zu erledigen.
Stellen Sie sich dieses Szenario vor: Ein neuer Entwickler trat dem Team bei und wurde damit beauftragt, einen Fehler im Berichtsgenerator zu beheben. Um diese Aufgabe abzuschließen, musste der Entwickler Folgendes tun:
Es handelt sich um das klassische „Unmöglich einzuschätzen“-Szenario, bei dem die Aufgabe einen oder acht Punkte kosten könnte – würfeln Sie besser einen W20 und reagieren Sie entsprechend.
Unbekannte Unbekannte sind, wenn Sie nicht wissen, was Sie nicht wissen.
Dies ist die schlimmste Manifestation von Komplexität, denn Sie könnten Dinge ändern, die Sie nicht sollten, und so alles kaputt machen.
Beispiel: Ein Entwickler hat den E-Mail-Versandcode geändert, um eine neue Benachrichtigung hinzuzufügen, ohne zu wissen, dass sich dies auf den Berichtsgenerator auswirken würde, der von dieser Funktion abhängt. Dies führte zu erheblichen Problemen für die Kunden und war ein Beispiel für die schlimmste Form entstehender Komplexität.
Nachdem wir die Horrorgeschichte und die drei Hauptsymptome gesehen haben, schauen wir uns an, was Komplexität verursacht.
Abhängigkeiten sind in der Software essentiell und können nicht vollständig beseitigt werden. Sie ermöglichen die Interaktion und Zusammenarbeit verschiedener Teile des Systems. Allerdings können Abhängigkeiten, wenn sie nicht richtig verwaltet werden, die Komplexität erheblich erhöhen.
Eine Abhängigkeit besteht, wenn Code nicht isoliert verstanden oder geändert werden kann und eine Berücksichtigung oder Änderung des zugehörigen Codes erforderlich ist.
Unklarheit entsteht, wenn wichtige Informationen nicht offensichtlich sind. Dies kann die Codebasis schwer verständlich machen, was zu einer erhöhten kognitiven Belastung und dem Risiko unbekannter Unbekannter führt.
Unklarheit entsteht, wenn wichtige Informationen nicht offensichtlich sind.
Da es inkrementell ist, kann man leicht denken: „Nur dieses eine Mal spielt es keine Rolle.“ Aber zusammengenommen macht die Behebung einer oder zweier Abhängigkeiten allein keinen großen Unterschied.
„In der Softwareentwicklung ist alles ein Kompromiss.“
— Ich erinnere mich nicht an den Autor
Ich könnte viele Regeln, Strategien und Frameworks schreiben, die Sie wahrscheinlich schon im Internet gesehen haben, um Komplexität zu vermeiden: SOLID, Design Patterns, YAGNI, KISS usw.
Sie können sie jedoch alle in einem Leitprinzip vereinen (wie in „Der pragmatische Programmierer“ erwähnt): „Ist das, was ich umsetze, leicht zu ändern?“ Wenn die Antwort „Nein“ lautet, dann Sie erhöhen wahrscheinlich die Komplexität.
Die Sicherstellung, dass Ihr Code leicht zu ändern ist, vereinfacht die Wartung, reduziert die kognitive Belastung der Entwickler und macht das System anpassungsfähiger und weniger fehleranfällig.
Vielen Dank!
Das obige ist der detaillierte Inhalt vonDer nie endende Kampf gegen die Softwarekomplexität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!