Innere Aspekte von Software-Qualität

Innere Aspekte der Software-Qualität

Im vorherigen Teil des Blogs ging es um die von aussen wahrnehmbaren Aspekte von Software-Qualität. In diesem Teil es Blogs geht es um die von aussen nicht unmittelbar sichtbaren oder wahrnehmbaren Aspekte von Software-Qualität, nämlich um den Software-Code.

Code-Qualität

Die Qualität des Programmcodes wirkt sich in hohem Mass auf die Qualität und den Lebenszyklus der Software aus. Mit der Code-Qualität wird das Fundament für geringe Fehleranzahl, Testbarkeit und Wartbarkeit gelegt.

Der typische Lebenszyklus einer Software sieht folgendermassen aus: Sie wird einmalig in der Implementierungsphase erstellt oder entworfen und dann über viele Jahre kontinuierlich gewartet, weiterentwickelt, mit neuen Features versehen, mit Daten befüllt, bis sie schliesslich ausser Betrieb genommen oder durch eine andere Software ersetzt wird.

In der gesamten Lebensspanne der Software wird demzufolge viel mehr Aufwand in Wartung und Weiterentwicklung gesteckt als in die erstmalige Erstellung.

Software-Hersteller tun also gut daran, darauf zu achten, dass diese Weiterentwicklung unter guten Voraussetzungen und risikoarm erfolgen kann.

Regressionsfehler und Software-Qualität

Wenn durch die Weiterentwicklung von Software Fehler in bereits existierendem Code produziert werden, sprechen wir von „Regressionsfehlern“. Regressionsfehler sind Fehler, die nach einer Änderung des Codes auftreten, obwohl sie zuvor nicht aufgetreten sind. Sie treten typischerweise an Stellen auf, die von der Anpassung des Codes nicht direkt betroffen sind.

Ein fiktives Beispiel: In einer Software wird ein neues Feld in einen Dialog eingefügt. Dafür werden die zugrunde liegenden Datenstrukturen angepasst. Andere Teile der Software können jedoch nicht mit den angepassten Datenstrukturen umgehen und verhalten sich nun plötzlich unerwartet.

Um solche Fehler zu vermeiden, ist es wichtig, Regressionstests durchzuführen. Dadurch kann sichergestellt werden, dass die bestehenden Funktionen des Systems auch nach der Weiterentwicklung wie erwartet funktionieren.

Streng genommen muss bei jeder Weiterentwicklung oder Änderung auch nur einer Code-Zeile die gesamte Software immer wieder getestet werden. Nur so kann sichergestellt werden, dass sich keine Regressionsfehler eingeschlichen haben.

In der Praxis wird dies oft vernachlässigt. Denn es ist viel zu aufwändig und teuer, bei jeder kleinen Änderung die gesamte Software manuell zu testen. In der Regel werden nur Stellen getestet, die von der Anpassung direkt betroffen sind, im günstigsten Fall auch benachbarte Bereiche.

Automatisierte Tests und Software-Qualität

Der Aufwand, um Regressionsfehler zu vermeiden, steigt exponentiell mit der Anzahl der Features und Funktionen der Software. Der Testaufwand für Software, die über lange Zeit weiterentwickelt wird, steigt daher immens an.

Mittel- und langfristig kann dieser Testaufwand nur mit automatisierten Softwaretests reduziert werden. Menschliches Testen muss auf ein Minimum reduziert werden.

Damit Software überhaupt automatisiert getestet werden kann, müssen die Komponenten weitestgehend entkoppelt und isoliert sein. Es muss festgelegt sein, wie die Komponenten miteinander kommunizieren, und durch regelmässiges Refactoring sollte der Code aktuell gehalten werden.

Entkopplung und Kapselung und Software-Qualität

Software besteht im Inneren aus vielen einzelnen Komponenten, die unabhängig voneinander arbeitsfähig sein sollten. Sie sollten voneinander entkoppelt und in sich gekapselt sein.

Ist das nicht der Fall, so wird der Einfluss der Komponenten aufeinander um so grösser, je stärker die Komponenten vernetzt und verzahnt sind. Damit steigt die Wahrscheinlichkeit, dass bei einer Änderung einer Komponente eine andere Komponente in Mitleidenschaft gezogen wird.

Hier gilt: Code, der für die Ausführung im Auftrag von mehreren Akteuren geschrieben wird, verletzt das Prinzip für eindeutige Verantwortlichkeit. Wird dieses Prinzip verletzt, dann wird der Code über die Zeit degenerieren und zu einer grossen Matschkugel werden.

Was zunächst spassig klingt, hat einen ernsten Hintergrund. Code wie dieser ist nicht mehr wartbar. Jegliche Weiterentwicklung, wie z.B. das Hinzufügen von neuen Features, wird fast immer unerwünschte Nebeneffekte haben. Damit entstehen mit jedem neuen Feature auch Defekte. Meist entstehen diese an Stellen, die keine direkten Nachbarn des angepassten Codes sind.

Hat man keine oder lediglich manuelle Softwaretests, bleiben diese Defekte unentdeckt, die Software wird fehlerhaft ausgeliefert und die Defekte werden erst durch die Kunden entdeckt. Die Software wird somit zur Bananensoftware – sie reift beim Kunden.

Softwarehersteller tun also gut daran, kontinuierlich und penibel darauf zu achten, die Innereien der Software sauber voneinander zu trennen und durchgängig automatisiert zu testen.

Anders ausgedrückt: Einzelne Komponenten sollten ihr Verhalten beibehalten, auch wenn sie in einem grösseren Kontext eingesetzt werden. Sie sollten ihr Verhalten nicht unerwartet verändern.

Ralf Trapp

Über den Autor

Ralf Trapp – CEO, Unternehmer & Evangelist

1992 hat Ralf während des Studiums seine erste Softwarefirma gegründet. Seitdem lässt ihn die Verbesserung der Software-Entwicklung nicht mehr los.

Wer einmal erlebt hat, wie gute Softwarequalität:

  • Zur Stressreduktion beiträgt
  • Deine Mitarbeiter und Kunden zufriedener macht
  • Den Umsatz und Rohgewinn nachhaltig verbessert

… der möchte nie wieder zurück zum „Altbewährten“.

Mehr über procelo