Wie in den meisten Projekten gilt auch bei Software das Gesetz des Magischen Dreiecks mit den Faktoren Geld, Zeit, Qualität. Alle drei lassen sich nie gleichzeitig ansteuern: Wo Kosten eingespart werden, geht es zu Lasten der Qualität. Wenn die Zeit drängt, kann man mit Geld kompensieren, aber auch dann leidet die Qualität. Wer wiederum höchste Qualität fordert, dem kann die Wirtschaftlichkeit und die Timeline eines Projekts entgleiten. Es kommt also darauf an, alle drei Faktoren in Balance zu bringen.
In einer typischen Softwareentwicklung macht die Qualitätssicherung (QS) etwa 15 Prozent der Kosten aus. Gemessen am Stellenwert der QS erscheint das nicht viel, denn unzureichende Tests können viele Millionen Euro Schaden anrichten: Sei es durch eine lahmgelegte Plattform für Abiklausuren, eine abgestürzte Mars-Sonde oder einen um drei Jahre verzögerten Start eines Lkw-Mautsystems.
Die Kosten für Qualität skalieren dabei erfahrungsgemäß von Phase zu Phase:
- Prävention,
- Fehler-Ermittlung (durch Software-Testing),
- interne Kosten zur Fehlerbehebung vor Auslieferung,
- externe Kosten zur Fehlerbehebung nach Auslieferung.
Das bedeutet, dass während der Präventionsphase jeder Euro am besten angelegt ist.
Schauen wir uns nun den Prozess der Softwareentwicklung etwas genauer an: Bereits im Vorfeld kann man durch die Wahl der eingesetzten Entwicklungsmethodik Kosten einsparen. Im Software-Development gemäß Wasserfallmethode setzt das Software-Testing spät an, erst nach Requirements, Design, Implementation. Vorteilhaft ist daher der Einsatz von agilen Methoden, die bereits im Review von kurz zuvor implementierten Features die Zwischenergebnisse testen und bewerten ‑ idealerweise mit dem Kunden. Auf diese Weise können bereits in frühen Phasen eines Projektes Fehlentwicklungen vermieden und Kosten allein über die Methodik vermieden werden.
Schaut man sich die reine Entwicklung an, dann kann man feststellen, dass etwa 85 Prozent aller Fehler in der Coding-Phase entstehen. Gefunden werden diese Fehler aber mehrheitlich erst in den später durchgeführten Tests, also beim Prüfen einzelner Module, des Zusammenspiels und des Gesamtsystems. Entsprechend multiplizieren sich die Kosten einer Fehlerkorrektur, je näher ein Projekt der Release-Phase kommt. Denn wer Qualität unter Zeitdruck sicherstellen will, muss ungeplante Ressourcen ins Rennen schicken und das kostet eben.
Lernen durch Scheitern
Eine Verschiebung der Tests nach links auf der Zeitachse („shift left“) direkt zu Projektbeginn spart Zeit, Frust und Kosten. Diese Erkenntnis gewinnen viele Unternehmen aber erst nach einem (fast) gescheiterten Projekt. Ähnlich sieht es bei der Entscheidung aus, die Software-Qualitätssicherung in die Produktentwicklung zu integrieren. Erst durch massive Qualitätsprobleme oder nach hohem manuellen Testaufwand wird klar, dass Qualitätssicherung verbunden mit einem hohen Automationsgrad ein integrativer, kontinuierlicher Bestandteil der Entwicklung sein muss.
Die nachträgliche Einführung einer Teststrategie stößt aber auf strukturelle oder technische Hindernisse. Und selbst wenn von Projektbeginn an automatisierte Tests entwickelt wurden, scheitern diese bei komplexen Projekten an (System-)Grenzen oder werden schrittweise vernachlässigt, weil sich der Kosten- und Zeitdruck mit der Projektlaufzeit erhöht.
So integrieren Sie Software-Qualitätssicherung in die Entwicklung
Tipp 1. Etablieren Sie ein Test-Mindset in Ihrem Team: Üblicherweise kümmern sich Entwickler lieber um Features als um Tests, daher sollte explizit ein Tester im Team mitarbeiten und vom Product Owner unterstützt werden. Dabei kann er durch Pairing mit den Entwicklern, also im gemeinsamen Arbeiten an einem Bildschirm, die Lösungsquote und -geschwindigkeit sowie die Testabdeckung bereits bei Unit-Tests erfahrungsgemäß eklatant erhöhen (Vier-Augen-Prinzip). Ergänzt wird das Ganze durch exploratives Testen, einem strukturierten Vorgehen, das sich einen bestimmten Bereich der Anwendung herausgreift und diesen entsprechend einer zuvor erstellten Test-Charter auf mögliches Fehlverhalten prüft. Das klassische, manuelle Testen nach vorab erstellten Testplänen kann daher durch die Zusammenarbeit von Entwicklern und Testern zum größten Teil entfallen.
Tipp 2. Prüfen und erhöhen Sie die Qualität der Zusammenarbeit im Team: Dafür eignen sich besonders zwei Modelle: die Teamphasen nach Tuckman und das Lencioni-Modell, das Dysfunktionen bei der Zusammenarbeit offenlegt.
Tipp 3. Nutzen Sie Test Driven Development (TDD): Ein konsequenter Shift-Left-Ansatz macht das Testen zum Treiber Ihrer Entwicklung. Zyklisch werden im TDD immer zuerst Tests geschrieben, der zugehörige Quellcode verfasst und anschließend Refaktorings vorgenommen. Auf diese Weise erreichen Sie eine hohe Testabdeckung. Eine gleichzeitige No-Bug-Strategie kann aufwendig sein, führt aber dazu, dass nur noch wenige Fehler nach Abschluss einer Phase unentdeckt bleiben.
Tipp 4. Setzen Sie auf Testautomatisierung: Idealerweise automatisieren Sie alle Tests, die regelmäßig wiederholt werden sollen. Unit-Tests sind dabei in der Regel kostengünstig umzusetzen, dann folgen Integrations-, System- sowie UI-Tests.
Tipp 5. Führen Sie Monitoring ein und definieren Sie Metriken für die Messung des Zustands ihres Produktes. Die Observability ihres Systems ist dabei die Fähigkeit, aus den gesammelten Werten auch mögliche, zukünftige Fehler zu analysieren und aktuelle zu erkennen. Dafür müssen Sie sich im Vorfeld überlegen, welche Parameter Sie messen müssen, um bekannte und im Vorfeld noch unbekannte Fehler zu diagnostizieren.
Tipp 6. Etablieren Sie einen effizienten Defekt-Management-Prozess: Welche Informationen müssen bei Fehlermeldungen idealerweise erhoben und gespeichert werden, damit Ihre Entwickler später anhand dieser Daten Fehler effektiv analysieren und beheben? Wie lassen sich die Schritte Fehlermeldung – Diagnose – Korrektur beschleunigen?