Nützliche Strategien gegen technische Schulden

Technische Schulden verhindern und effizient managen
Kommentare

„You gotta pay your dues, but you also gotta pay your debts.“ Softwareentwicklung ohne technische Schulden ist schon wegen der branchenüblichen Innovationsgeschwindigkeit ein Ding der Unmöglichkeit: ständig müssen Features implementiert werden, ständig müssen Bugs gefixet werden. Das ist unvermeidbar, muss aber nicht notwendigerweise in einer Katastrophe enden – vorausgesetzt, es wird versucht, die Schulden möglichst gering zu halten und sie kontinuierlich abzutragen. Wir stellen einige nützliche Strategien vor.

Bei technischen Schulden verhält es sich ähnlich wie beim Putzen der Wohnung: Je länger man es nicht macht, desto größer wird die Arbeit später. Wer also nicht als hoffnungsloser Fall in einer emotional ausbeuterischen Fernsehsendung landen will, der wird sich nach dem Auszug bei Mutti ein regelmäßiges Putzverhalten angewöhnen müssen. Ähnlich verhält es sich bei den technischen Schulden einer Software. Diese können nur durch beständige Wartung verhindert bzw. minimiert werden.

Was sind technische Schulden und wie entstehen sie?

Der Begriff Technische Schulden wurde ursprünglich vom US-Entwickler Ward Cunningham geprägt und bezeichnet kleinere, vernachlässigbare Bugs, schnelle, aber ungelenke Reparaturen sowie unelegante Abkürzungen und Implementierungen, die sich erst im Laufe der Zeit schädlich auswirken können. Sie betreffen bspw. die Architektur, die Performance oder die Security-Standards einer Software. Häufig werden sie von zu hoher Komplexität verursacht und resultieren in Instabilität und Fehlfunktionen, deren Ursache nicht mehr aufzufinden ist.

Je mehr technische Schulden akkumuliert werden, desto größer wird der Aufwand, sie irgendwann abzutragen. Im schlimmsten Fall sind Entwickler nur noch damit beschäftigt, Altlasten des Codes zu reparieren, weshalb sie bei der Integration neuer Features ins Hintertreffen geraten. Meist fehlen schlicht die Zeit und das Geld, um das eigentlich dringend notwendige Maßnahmen (etwa ein Refactoring) durchzuführen. Mal ganz abgesehen davon ist es tödlich für die Motivation, ständig Schulden aus der Vergangenheit abstottern zu müssen.

Technischen Schulden vorbeugen

Übersichtliche Architektur

In Ausgabe 12.2015 des JavaMagazins und im unten eingebundenen Interview erläutert Dr. Carola Lilienthal auf Grundlage von Erkenntnissen der kognitiven Psychologie, wie wichtig eine übersichtliche Architektur für die Prävention von technischen Schulden ist. Menschen können sich Dinge besonders gut anhand von Schemata merken, weshalb es sinnvoll ist, bei der Konstruktion der Softwarearchitektur nach konsistenten, wiedererkennbaren Mustern zu verfahren. Ähnliches gilt bei Hierarchien, deren positive Auswirkungen auf das menschliche Lernverhalten vielfach belegt ist. Auch sie sollten, gerade wenn es um Benutzt- und Vererbungsbeziehungen geht, äußerst behutsam und nachvollziehbar aufgesetzt werden.

Java-Magazin-12-15Technische Schulden –
Das Titelthema im Java Magazin 2.2015

Lesen Sie, wie man technische Schulden in Architekturen mithilfe kognitiver Psychologie abbaut.

Alle Infos zur Ausgabe

Da Menschen Informationen in einzelnen Stücken (Chunks) aufnehmen, sollten Architekturen aus sinnvoll zusammenhängenden, klug aufeinander abgestimmten und daher einfach nachvollziehbaren Einheiten (Klassen, Komponenten, Modelle, etc.) bestehen. Das betrifft sowohl die Namensgebung als auch die Bedeutung der Einheit innerhalb des Ganzen, d.h. ihre Zuständigkeiten, ihre Größe und ihren Kopplungsgrad. Alle genannten Aspekte helfen dabei, ausuferndes Chaos bei der Implementierung neuer Funktionen zu verhindern. Dadurch erübrigen sich aufwendige Korrekturen in der Zukunft.

Klarheit, Kommunikation, Kollaboration

Hierzu hat Ilmari Kontulainen zwei wichtige Aspekte aufgeführt. Einerseits rät er dazu, mit verständlichen Spezifikationen zu arbeiten, vor allem bei größeren Teams mit verteilten Aufgaben. Unklarheiten, die zu fehlerhaften Integrationen führen könnten, werden so von vornherein verringert. Andererseits empfiehlt er, durch Recherche klarere Vorstellungen von Funktionalitäten zu gewinnen, noch bevor sie implementiert werden. So vergrößert man die Chance, bereits von Anfang an eine langfristig nutzbare Lösung liefern, somit auf lästige Nachbesserungen verzichten zu können.

Es mag als Binsenweisheit erscheinen, dennoch sei nachdrücklich auf das Potential der Kommunikation hingewiesen. Softwaredesign ist eine kollaborative Praxis, diesem Fakt sollte man beginnend beim grundlegenden Design gerecht werden. Zwecks gegenseitiger Hilfe bei der Vorbeugung von technischen Schulden lohnt es sich, den beständigen Austausch innerhalb des Teams zu fördern, sowohl, um die kollektive Erfahrung und das Wissen des Teams fruchtbar zu machen, als auch, um durch bessere Abstimmung einheitlichere Softwarestrukturen zu erhalten.

Frühe und kontinuierliche Integration

Anschließend an den vorherigen Punkt kommt aus der agilen Softwareentwicklung der Hinweis, sich im Team darüber zu verständigen, ab wann ein Produkt als „fertig“ gelten kann. Statt nach der traditionellen Definition – fertig ist gleich fertig für die Qualitätssicherung, die dann erst unzählige Bugs herausfiltert – wird hier „fertig“ als für den Kunden releasefertig, ergo: fehlerfrei definiert.

Dazu sollte man parallele Entwicklung möglichst auf ein Minimum reduzieren und stattdessen früh und kontinuierlich integrieren. Nicht nur erhält man dadurch schnellere Releasezeiten, sondern vermeidet gleichzeitig potentielle Konflikte. Dan Radigan empfiehlt in diesem Kontext, den Hauptzweig des Projekts möglichst fehlerfrei zu halten. Neue Features werden nur nach ausgiebigen Tests (siehe unten) integriert.

Zeitdruck mildern

Generell gilt, dass Zeitdruck und technische Schulden Hand in Hand gehen. Da Zeitdruck häufig Resultat ökonomischen Drucks ist, sind technische Schulden manchmal unvermeidbar und haben daher sogar einen produktiven Nutzen. Falls möglich, sollte man jedoch versuchen, die (ökonomischen) Nachteile von technischen Schulden gegenüber Kunden und/oder Vorgesetzten, die knappe Deadlines setzen wollen, zu kommunizieren.

Technische Schulden managen

Testing

Gerade bei kontinuierlicher Integration muss das Testing Schritt halten. Ohne ausgiebige Tests keine Integration in den Mainbranch der Software. Am besten und effizientesten gelingt dies durch automatisierte Tests. Sobald ein Bug aufgefallen ist, wird ein automatischer Test geschrieben, der bestätigen kann, ob die nachfolgende Reparatur gelungen ist. Außerdem wird dadurch der Bug im Falle eines Wiederauftauchens direkt vom Test eingefangen.

Bug Days

Ganz ohne Bugs wird es nie abgehen, insbesondere nach Abschluss der eigentlichen Entwicklung, wenn nur noch neue Features hinzugefügt und das Programm ansonsten bloß gewartet wird. Es macht Sinn, feste Zeiten für die Abtragung von technischen Schulden einzuplanen. Beispielsweise könnte man einen bestimmten Tag im Monat festlegen oder sogar periodische Bug Weeks einführen, die für komplexere Bugfixes und kleinere Verbesserungen reserviert sind.

Prokrastination

Die gilt es natürlich zu vermeiden, auch wenn gerade minimale Schäden dazu einladen, sie vor sich herzuschieben. Solange das Programm noch funktioniert, ist doch alles gut, oder? Wie gesehen, besteht die Natur der technischen Schulden aber gerade darin, sich aufzusummieren oder gar zu potenzieren und darüber zum Problem zu werden. Deswegen: dranbleiben und die Dinge sofort in Angriff nehmen!

Backlogs

Für den Fall, dass aus gerechtfertigten Gründen technische Schulden aufgenommen werden, ist eine Dokumentation der bekannten Posten unabdingbar. Ein Schulden-Backlog umfasst nach Möglichkeit nicht nur die einzelnen Schadpunkte und ihre Rechtfertigung, sondern auch die zur Behebung notwendigen Aufgaben bzw. Arbeitsschritte sowie eine Schätzung über Zeitpunkt und Dauer der Behebung.

Fazit

Der Teufel liegt bekanntlich im Detail. Und auf dieses achtzugeben, fällt im hektischen Programmieralltag nicht immer leicht. Umso schneller kann sich eine gewisse Nachlässigkeit im gesamten Team ausbreiten. Die hier aufgeführten Punkte können darum manchmal nur unter der Voraussetzung eines Wandels in der Betriebskultur ihr Potential entfalten. Ein solcher Schritt ist nicht immer einfach, aber bedenkt man die Kosten in Form der technischen Schulden, wird schnell klar, wie unumgänglich er ist.

 

Aufmacherbild: Young woman carrying heavy box via Shutterstock / Urheberrecht: pathdoc

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -