Heim > Web-Frontend > js-Tutorial > Hauptteil

Der nie endende Kampf gegen die Softwarekomplexität

王林
Freigeben: 2024-07-27 07:48:52
Original
894 Leute haben es durchsucht

The Never Ending Battle Against Software Complexity

Was ist Komplexität?

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 …


Eine kurze Horrorgeschichte

Lassen Sie uns in eine Horrorgeschichte eintauchen, die viele von Ihnen wahrscheinlich schon erlebt haben oder noch erleben werden.

  1. 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.

  2. 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.

  3. Kalenderintegration: Das Team musste Google Kalender und Outlook integrieren. Verschiedene Entwickler implementierten die Lösungen, was zu inkonsistenten Ansätzen führte.

  4. 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.

  5. 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.

  6. 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.


Der Anfang vom Ende

Dann begannen die Probleme:

  1. Änderungen in einem Teil des Systems wirkten sich unerwartet auf andere Teile aus.
  2. Kleine Änderungen erforderten Modifikationen in vielen anderen Dateien, was Schätzungen schwierig machte.
  3. Monat für Monat wurde der Code schwerer zu verstehen und oft durch Versuch und Irrtum behoben.
  4. Die Produktivität ging zurück und alle fürchteten sich vor Wartungsarbeiten.
  5. Der unvermeidliche Ruf nach „Wir müssen umgestalten.“
  6. Bestimmte Aufgaben konnten nur von bestimmten Entwicklern erledigt werden (klassisch)
  7. Mit der Zeit wurde die einst so schön geschriebene und gut dokumentierte Software zu einem Zugunglück.

Benennen der Symptome

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.

Verstärkung ändern

Ä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?

Kognitive Belastung

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:

  • Verstehen Sie die verschiedenen Kalenderintegrationen (Google und Outlook).
  • Machen Sie sich mit den unterschiedlichen Ansätzen für E-Mail-Benachrichtigungen vertraut.
  • Navigieren Sie durch den fragmentierten Code des Berichtsgenerators und verarbeiten Sie PDFs, Excel und Dashboards.
  • Integrieren Sie diese verschiedenen Technologien und Stile, um den Fehler zu finden und zu beheben.

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

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.

Ursachen der Komplexität

Nachdem wir die Horrorgeschichte und die drei Hauptsymptome gesehen haben, schauen wir uns an, was Komplexität verursacht.

1. Abhängigkeiten

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.

Definition:

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.

Arten von Abhängigkeiten:

  • Direkt:Modul A baut direkt auf Modul B auf.
  • Transitiv:Modul A basiert auf Modul B, das wiederum auf Modul C basiert.
  • Zyklisch: Die Module A, B und C sind zirkulär voneinander abhängig.

2. Dunkelheit

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.

Definition:

Unklarheit entsteht, wenn wichtige Informationen nicht offensichtlich sind.

Beispiele für Dunkelheit:

  • Schlechte Benennung:Variablen und Funktionen mit unklaren Namen.
  • Versteckte Nebenwirkungen:Methoden, die unerwartete Aktionen ausführen.
  • Globaler Zustand:Übermäßiger Gebrauch globaler Variablen.
  • Tiefe Vererbung:Verhalten verteilt sich über viele Ebenen in Klassenhierarchien.

Denken Sie daran: Komplexität ist inkrementell

  • Komplexität wird selten durch einen einzelnen „Fehler“ oder eine schlechte Entscheidung verursacht.
  • Komplexität baut sich „langsam“ durch Fehlentscheidungen und Abhängigkeiten im Laufe der Zeit auf.

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

Abschluss

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!