Ein Ent­wick­ler­team, das bei der Software-Ent­wick­lung oder beim Aufbau einer IT-In­fra­struk­tur kos­ten­güns­tig und schnell vorgeht, erkauft sich diese Ersparnis durch tech­ni­sche Schulden. Tech­ni­sche Schulden be­zeich­nen die Folgen, die ab­sicht­li­che oder un­ab­sicht­li­che Nach­läs­sig­kei­ten, Fehler und Schwächen im Code nach sich ziehen. Spätere Kor­rek­tu­ren und Wartungen bremsen die Pro­duk­ti­vi­tät und sorgen für kost­spie­li­gen Mehr­auf­wand. Worauf müssen Sie achten, wenn Sie tech­ni­sche Schulden bei der Software-Ent­wick­lung vermeiden wollen?

Warum spricht man von tech­ni­schen Schulden?

1992 führte der Pro­gram­mie­rer und Mitautor des Manifests für agile Software-Ent­wick­lung Ward Cun­ning­ham die Metapher der tech­ni­schen Schulden ein. Cun­ning­ham wollte mit seinem Sinnbild ver­deut­li­chen, wie wichtig Re­fac­to­ring, also die re­gel­mä­ßi­ge Korrektur am Code, für eine Software ist. Nur so lässt sich vermeiden, dass sich eine Software durch an­wach­sen­de Funk­ti­ons­män­gel und Struk­tur­schwä­chen immer mehr ver­schul­det.

Der Begriff Schulden im­pli­ziert auch Zinsen, denn tech­ni­sche Schulden sind für auf­trag­ge­ben­de Un­ter­neh­men vor allem aus fi­nan­zi­el­ler Sicht bedeutsam. Nicht nur ziehen tech­ni­sche Schulden mehr Aufwand und ver­min­der­te Pro­duk­ti­vi­tät durch nach­träg­li­che Wartungen nach sich, sondern auch mehr Kosten. Je mehr eine Team­lei­tung die Wartung einer man­gel­haf­ten IT-In­fra­struk­tur oder Anwendung ver­nach­läs­sigt, umso mehr Zinsen erzeugen die Schulden und umso teurer sind die Code-Kor­rek­tu­ren.

De­fi­ni­ti­on: Tech­ni­sche Schulden

Tech­ni­sche Schulden be­zeich­nen bewusste oder ver­se­hent­li­che Fehler, Mängel und Schwächen im Code, die durch mangelnde Kom­mu­ni­ka­ti­on, Team­lei­tung, Qua­li­fi­ka­ti­on oder übereilte Ver­öf­fent­li­chung von Produkten entstehen und bei aus­blei­ben­dem Re­fac­to­ring konstant anwachsen.

Der Tech­ni­sche-Schulden-Quadrant: Vier Typen von Schulden

Nach Ward Cun­ning­ham entstehen tech­ni­sche Schulden durch Nach­läs­sig­kei­ten im Code, die aus Zeit- oder Bud­get­grün­den zu einer schnel­le­ren, jedoch feh­ler­haf­ten Pro­blem­lö­sung führen. Ein gründ­li­cher, lü­cken­lo­ser Code ist aufwendig und lang­wie­rig. Daher ent­schei­den sich Ent­wick­ler unter Umständen für einen un­sau­be­ren Code, um Zeit und Aufwand zu sparen. Diese Ersparnis erkaufen sie sich durch Schulden.

Für Cun­ning­ham ist dieser öko­no­mi­sche Aspekt des Pro­gram­mie­rens nicht un­ge­wöhn­lich oder un­na­tür­lich. Werden tech­ni­schen Schulden aber nicht durch Re­fac­to­ring aus­ge­gli­chen und der Code nicht re­gel­mä­ßig optimiert, kommt die Ent­wick­lung durch me­ta­pho­ri­sche Zinsen ins Stocken oder zum Still­stand.

Martin Fowler, Autor von Re­fac­to­ring: Improving the Design of Existing Code, kon­kre­ti­sier­te Cun­ning­hams Metapher und un­ter­teil­te tech­ni­sche Schulden in vier Typen, die er im Tech­ni­sche-Schulden-Qua­dran­ten ver­an­schau­lich­te:

  Rück­sichts­lo­se Schulden Um­sich­ti­ge Schulden
Bewusste Schulden
  • Zeit-/Bud­get­man­gel
  • Ver­nach­läs­sig­tes Re­fac­to­ring
  • Prio­ri­sie­rung von schneller Lieferung der Software und Ver­pflich­tung zum Re­fac­to­ring
Ver­se­hent­li­che Schulden
  • Mangelnde Qua­li­fi­ka­tio­nen
  • Un­ge­nü­gen­de Do­ku­men­ta­ti­on
  • Over­en­gi­nee­ring
  • Anti-Patterns
  • Code-Erosion
  • Kon­stan­tes Re­fac­to­ring behebt his­to­risch ge­wach­se­ne Pro­gram­mier­feh­ler und -mängel und hilft, aus Fehlern zu lernen

Tech­ni­sche Schulden nach Cun­ning­ham und Fowler können somit sowohl bewusst als auch ver­se­hent­lich entstehen. Da Tech­no­lo­gie und Pro­gram­mie­rung kon­ti­nu­ier­li­che Re­vi­sio­nen und Ver­bes­se­run­gen erhalten, lassen sich Code-Smell und Code-Erosion kaum vermeiden. Auch Software altert und baut ohne Updates und Re­fac­to­ring Schulden auf. In den meisten Fällen sind tech­ni­sche Schulden jedoch durch öko­no­mi­sche Ent­schei­dun­gen oder ab­sicht­li­che bzw. un­ab­sicht­li­che Pro­gram­mier­feh­ler zu erklären.

Welche Ursachen haben tech­ni­sche Schulden?

Tech­ni­sche Schulden haben meist ähnliche Aus­wir­kun­gen auf die Software-Ent­wick­lung, ihre Ursachen können jedoch sehr un­ter­schied­lich sein.

  • Man­geln­des Qua­li­täts­ma­nage­ment: Projekte laufen ohne qua­li­täts­si­chern­de Kontroll-, Mess- und Test­me­cha­nis­men und bauen fort­lau­fen­de Schulden auf.
     
  • Öko­no­mi­scher Druck: Öko­no­mi­sche Faktoren und eine schnelle Ent­wick­lung werden auf Drängen von Auf­trag­ge­bern hin oder aufgrund von Kon­kur­renz­druck prio­ri­siert und ein sauberer Code ver­nach­läs­sigt.
     
  • Mangelnde Qua­li­fi­ka­ti­on: Das fachliche Wissen des Ent­wick­ler­teams ent­spricht nicht den An­for­de­run­gen eines eleganten und sauberen Codes. Die Folge ist Code-Smell oder Spaghetti-Code.
     
  • Un­ge­nü­gen­de Do­ku­men­ta­ti­on/Kom­mu­ni­ka­ti­on: Der Ent­wick­lungs­pro­zess verläuft ohne parallele Do­ku­men­ta­ti­on der Code­er­wei­te­run­gen und -än­de­run­gen. Zudem werden Än­de­run­gen im Code nicht für spätere Pro­gram­mie­rer erfasst und kom­mu­ni­ziert. Die Mög­lich­kei­ten für Re­fac­to­ring sind begrenzt oder nicht vorhanden.
     
  • Auf­ge­scho­be­nes Re­fac­to­ring: Bewusst in Kauf genommene tech­ni­sche Schulden werden nicht zeitnah behoben, weil Re­fac­to­ring ver­nach­läs­sigt oder auf­ge­scho­ben wird.
     
  • Parallele An­wen­dungs­ent­wick­lung: Parallele Ent­wick­lungs­schrit­te, die zu­sam­men­ge­führt und nicht auf­ein­an­der ab­ge­stimmt werden, führen zur Anhäufung von Schulden.
     
  • Zu komplexer Code: Code-Ab­schnit­te sind zu kom­pli­ziert und unlogisch. Kleine Än­de­run­gen können zu weiteren Fehlern führen und Schulden vermehren. Im schlimms­ten Fall entsteht auch hier Spaghetti-Code.
     
  • Un­struk­tu­rier­te Ent­wick­lungs­ab­läu­fe: Die An­wen­dungs­ent­wick­lung beginnt, bevor ein konkretes Design oder konkrete Abläufe definiert und be­schlos­sen wurden.
     
  • Code-Out­sour­cing: Ent­wick­lungs­schrit­te werden aus­ge­la­gert und führen beim späteren Zu­sam­men­fü­gen der Ab­schnit­te zu Fehlern im Code, die von der Team­lei­tung in Kauf genommen oder übersehen werden.
     
  • Kurz­fris­ti­ge Än­de­run­gen im Ablauf: Kurz­fris­ti­ge Än­de­run­gen im Code werden aufgrund von Zeitdruck nicht getestet.

Tech­ni­sche Schulden und agile Software-Ent­wick­lung

Ward Cun­ning­ham de­fi­nier­te nicht nur die Metapher der tech­ni­schen Schulden, sondern ist auch Mitautor und Erst­un­ter­zeich­ner des Manifests für agile Software-Ent­wick­lung. Diese Phi­lo­so­phie in der Software-Ent­wick­lung will durch Leitsätze und Prin­zi­pi­en eine pro­duk­ti­ve­re und fle­xi­ble­re An­wen­dungs­ent­wick­lung und Ver­öf­fent­li­chung fördern.

Statt über lange Zeiträume an große Projekte gebunden zu sein, sollen sich kleinere und un­ab­hän­gi­ge­re Teams um kürzere Ar­beits­pha­sen und schnel­le­re Ver­öf­fent­li­chun­gen von kleineren Projekten wie An­wen­dun­gen, Pro­gramm­tei­len und Updates bemühen.

Agile Software-Ent­wick­lung hat zur Folge, dass Teams in kleinen Schritten Code schreiben und ändern und Ar­beits­schrit­te schneller zum Abschluss kommen. Durch den Fokus auf Schnel­lig­keit und Pro­duk­ti­vi­tät erhöht sich die Gefahr, un­sau­be­ren Code und damit tech­ni­sche Schulden an­zu­häu­fen. Vor allem wenn agile Software-Ent­wick­lung nicht mit Re­fac­to­ring Hand in Hand geht, wachsen Schulden un­wei­ger­lich an.

Welche Aus­wir­kun­gen haben tech­ni­sche Schulden auf Software-Ent­wick­lung?

Die Aus­wir­kun­gen von tech­ni­schen Schulden ent­spre­chen den Folgen von Krediten im Fi­nanz­we­sen. Werden die Schulden nicht recht­zei­tig und re­gel­mä­ßig abgebaut, entstehen Zinsen, die sich in ge­brems­ter Ent­wick­lung, sinkender Pro­duk­ti­vi­tät und höherem Kos­ten­auf­wand zeigen.

Es ist daher im Interesse von Auf­trag­ge­bern, die Ent­wick­lung lang­fris­tig durch um­fas­sen­des Qua­li­täts­ma­nage­ment zu begleiten und zu über­wa­chen, um die schnel­le­re und kos­ten­spa­ren­de Fer­tig­stel­lung und Ver­öf­fent­li­chung von Produkten nicht mit späteren, kost­spie­li­gen Feh­ler­kor­rek­tu­ren oder einem Still­stand der Ent­wick­lung zu bezahlen.

Wie lassen sich tech­ni­sche Schulden vermeiden?

Tech­ni­sche Schulden lassen sich aufgrund neuer Tech­no­lo­gien und sich ändernder Ansätze in der Software-Ent­wick­lung nicht gänzlich aus­schlie­ßen. Um Programme und An­wen­dun­gen re­gel­mä­ßig und schnell zu ver­öf­fent­li­chen und Teams nicht lang­fris­tig an Projekte zu binden, werden sie sogar in Kauf genommen. Es gibt jedoch vor­beu­gen­de Maßnahmen, um das Entstehen oder Anwachsen von Schulden zu vermeiden oder zu re­du­zie­ren:

  • Stan­dar­di­sier­te Abläufe für Re­fac­to­ring und Qua­li­täts­ma­nage­ment
  • Stetig aktuelle Tools zur Feh­ler­mes­sung und -analyse
  • Fach­li­ches Wissen durch Fort­bil­dun­gen dem Stand der IT anpassen bzw. die Team­zu­sam­men­set­zung nach Qua­li­fi­ka­ti­on festlegen
  • Codes durch Un­ter­tei­lung in Klassen und ver­ständ­li­che Methoden über­sicht­lich gestalten und für neu hin­zu­kom­men­de oder au­ßen­ste­hen­de Pro­gram­mie­rer lesbar schreiben
  • Klare Zu­stän­dig­kei­ten und Auf­ga­ben­ver­tei­lun­gen in Teams, um Dop­pe­lun­gen, Red­un­dan­zen und kon­tra­pro­duk­ti­ve Ar­beits­schrit­te zu vermeiden
  • IT-Ar­chi­tek­tur durch stetige Über­wa­chung, Messung und Qua­li­täts­si­che­rung auf aktuellem Stand halten
Zum Hauptmenü