© Enkel/Shutterstock.com
Zielgerichtete Evolution mit Fitness Functions

Software-DNA entschlüsselt


Wie kommen Sie zu einer dauerhaft guten Softwarelösung? Fitness Functions machen die Zielerreichung automatisch und kontinuierlich messbar, auch wenn das Team von eingeschlagenen Wegen abweicht und Experimente wagt. Dieser Beitrag zeigt, wie die Idee auch in Ihr Vorhaben Eingang finden kann.

Software automatisiert zu testen, etwa mit Unit- und Integrationstests im Rahmen des Builds, ist ein alter Hut. Fehler, die sich in der Weiterentwicklung eingeschlichen haben, lassen sich so effizient und zugleich risikoarm aufspüren – Entwickler erhalten früh Feedback. Auch eine Softwarelösung mit Monitoringwerkzeugen kontinuierlich zu überwachen, ist gängig. Ausfälle zeigen sich früh, und über Alarme und geeignete Maßnahmen lässt sich gegensteuern, bevor es knallt. Ziel beider Ansätze ist „gute“ Software durch Rückmeldungen. Gut heißt hier konkret: korrektes Verhalten, etwa bei der Verarbeitung der Daten (abgesichert durch Tests) bzw. zuverlässiger Betrieb (abgesichert durch Monitoring). Schlussendlich sind das nur zwei Aspekte für Qualität, und in Ihrem Fall vielleicht nicht einmal die entscheidenden für Ihren Erfolg. Wann ist Ihre Software gut genug? Wie können Sie sicherstellen, dass sie es im weiteren Verlauf bleibt – insbesondere, wenn die Entwicklung kleinteilig, organisatorisch dezentral und technologisch polyglott erfolgt? Wie auch der Beitrag von Stefan Toth in diesem Heft (S. 10) zeigt, sind Feedback und Transparenz wichtige Aspekte, um eine evolutionäre Architektur zu etablieren, und Fitness Functions ein Schlüssel dazu.

Evolutionäre Architektur und Fitness Functions

Neal Ford und seine Mitautoren fordern für eine evolutionäre Architektur, dass sie „geleitete, inkrementelle Veränderungen über mehrere Dimensionen hinweg unterstützt“ [1]. Das klingt abstrakt und sperrig, ist aber schnell aufgelöst, wenn wir die einzelnen Punkte mit verschiedenen Aspekten evolutionärer Softwareentwicklung verknüpfen, oder konkreter mit charakteristischen Eigenschaften von Microservices als einem möglichen Architekturstil.

  • Inkrementell bedeutet, dass sich Ergänzungen und Änderungen schrittweise einführen oder etablieren lassen. Kleinteiligkeit, eine möglichst lose Kopplung zwischen Teilen und technologische Freiheiten für die Teams, die sie bauen, begünstigt das. Experimente sind erwünscht, neue Technologien etwa leicht lokal ausprobiert, erfolgversprechende Ansätze setzen sich durch.

  • Über mehrere Dimensionen hinweg heißt, diesen Erfolg an mehreren Faktoren festzumachen. Sie deklarieren verschiedene Ziele als entscheidend für Ihr Vorhaben. Oftmals beeinflussen diese sich wechselseitig; Sie müssen sie ausbalancieren. So ist eine leichte Portierbarkeit auf beliebigen Zielumgebungen nicht leicht mit hoher Performance unter einen Hut zu bringen. Es gilt, Kompromisse zu finden.

  • Geleitet schließlich fordert ein, dass das Erreichen, Einhalten und Ausbalancieren der Ziele nicht im Dunkeln erfolgt, sondern überprüfbar ist. Hier kommen die Fitness Functions ins Spiel.

Was ist eine Fitness Function?

Eine Fitness Function misst objektiv, wie gut eine Lösung die gesetzten Ziele erreicht [1]. Bringt man das mit der Idee von evolutionären Architekturen in Verbindung, lässt sich aus dem gemessenen Wert ableiten, ob sich eine Lösung oder auch ein Algorithmus im Lauf der Zeit verbessert – oder eben nicht. Eine Fitness Function gibt über die Qualität einer Softwarelösung zuverlässig Auskunft. Bei klassischen Unit- und Integrationstests steht vor allem die Funktionalität auf dem Prüfstand. Fitness Functions messen hingegen vorrangig die qualitativen, früher auch meist nichtfunktional genannten Eigenschaften eines Softwaresystems.

weiss_zoerner_evoarc_2_1.tif_fmt1.jpgAbb. 1: Qualitative Eigenschaften von Software nach ISO 25010

Abbildung 1 zeigt grobe Qualitätsmerkmale von Software nach ISO 25010. Die Norm bricht die Kategorien noch weiter herunter. Erlernbarkeit ist beispielsweise ein Unterpunkt von Benutzbarkeit, Antwortzeiten und Durchsatz fallen unter Effizienz. Wie sieht eine Funktion aus, die zuverlässig Auskunft über die Qualität gibt? Hier zwei konkrete Beispiele dazu:

  • Testüberdeckung 0.9 (Wartbarkeit): Viele Teams betrachten diese Metrik schon lange, auch ohne den modernen Begriff. Verschiedene klassische Ansätze lassen sich unter Fitness Function fassen. Dieser Test ist gut in einer CI/CD Pipeline aufgehoben, ist also insbesondere automatisierbar.

  • Netzwerklatenz für einen Service A, der Service B aufruft, auf 100 ms setzen; Fehlerrate bei Integrationstests == 0.0 (Zuverlässigkeit): Diese zweite Funktion definiert eine Form der Ausfallsicherheit, indem sie eine Netzwerklatenz zwischen zwei Microservices auf 100 ms setzt und beim Durchlaufen der Integrationstests keine Fehler erwartet. Dieser Test benötigt zur Ausführung zumindest eine realistische Testumgebung.

Fitness Functions kategorisieren

Wie sehen Fitness Functions generell aus? Die folgenden Kategorien fächern die Möglichkeiten auf:

  • Art der Ausführung: angestoßen vs. kontinuierlich

  • Breite der Überprüfung: atomar vs. holistisch

  • Ort und Zeitpunkt der Ausführung: CI/CD vs. Testsystem vs. Produktion

  • Qualitätsmerkmal: Einteilung z. B. nach Abbildung 1

  • Art der Ergebniskontrolle: absoluter Wert („Good or no good“) vs. Beobachtung über Zeitreihe vs. beides

  • Gültigkeit: temporär vs. permanent im Einsatz

Die ersten beiden Kategorien entsprechen den Quadranten der Werkzeugabbildung in oben genanntem Artikel. Die dort gelisteten Tools unterstützen Sie dabei, entsprechende Fitness Functions zu implementieren. Werkzeuge ersetzen allerdings nicht die Arbeit, sie für Ihr Vorhaben passgenau zu definieren.

Der Ort und Zeitpunkt der Ausführung als weitere Einteilung von Fitness Functions sind bei der Definition besonders hilfreich. Läuft die Überprüfung innerhalb einer Continuous Integration/Continuous Delivery Pipeline, wird eine Funktion in einem Testsystem ausgewertet (z. B. Performance- oder Lasttests) oder sogar direkt aus dem Produktionssystem abgeleitet. Die Einteilung ist nicht immer überschneidungsfrei möglich, wie z. B. bei einem Lasttest in einer Testumgebung, der innerhalb einer CI/CD Pipeline angestoßen wird, ermöglicht aber trotzdem einen besseren Überblick.

Ein Zugang über die Qualitätsmerkmale ist ebenfalls denkbar und hilft uns in weiterer Folge bei der gezielten Auswahl und dem Design der richtigen Fitness Function. Schließlich lassen sich Fitness Functions bzw. deren Ergebnisse auch nach der Art der Ergebniskontrolle unte...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang