Wunsch und Wirklichkeit
In Entwicklung und Betrieb von Software wünschen wir uns über die gesamte Lebensdauer unserer Systeme möglichst niedrige Änderungs- und Betriebskosten, bei gleichzeitig hoher Änderbarkeit und Verständlichkeit (Abb. 1).
Bei mittleren bis großen Systemen tritt diese ideale Situation in der Realität nur selten ein. Zeitdruck, Konstruktionsund Managementfehler sowie kurzfristig orientierte Entwurfsentscheidungen sorgen dafür, dass ziemlich genau das Gegenteil geschieht: Obwohl anfänglich alles sauber entwickelt und entworfen war, degenerieren Systeme über die Zeit – das Phänomen der „verfaulenden Software“ schlägt zu. Änderungen werden schwieriger, riskanter und dauern immer länger. In Entwicklung und Betrieb treten vermehrt Probleme auf, deren Behebung mehr und mehr Zeit und Ressourcen in Anspruch nimmt. Damit einher steigen Änderungs- und Betriebskosten.
Ganz unterschiedliche Gründe verursachen diese missliche Situation – einige verbreitete Beispiele:
- Mangelnde konzeptionelle Integrität: identische Probleme werden innerhalb eines Systems unterschiedlich gelöst, es gibt mehrere unterschiedliche, teils widersprüchliche Lösungsansätze.
- Übermäßige strukturelle Komplexität, umständliche Konzepte oder Abläufe innerhalb des Systems.
- Schlechter Quellcode, der beispielsweise Grundlagen des Clean Code [1] verletzt, unter zu hoher Kopplung oder niedriger Kohäsion leidet, gegen Coding-Konventionen verstößt, Redundanzen enthält oder schlicht unverständlich ist.
- Zum fachlichen Problem unpassende Wahl von Technologien, Frameworks oder sonstiger Infrastruktur („mit Kanonen auf Spatzen schießen“). Diese Liste könnte ich nahezu beliebig weiter führen – und jeder neue Eintrag würde mich dabei an eine reale Situation meines bisherigen Berufslebens erinnern.
Wege in den Abgrund
Zu Beginn vieler Entwicklungsprojekte sieht Software doch recht ordentlich aus: Motivierte Teams erarbeiten stimmige Konzepte und setzen diese dann handwerklich sauber um. Konzepte und Technologien passen zum Problem, ebenso die Daten und Datenstrukturen.
Im Laufe der Zeit jedoch beginnt das Drama: Die ursprüngliche Ordnung weicht einem ständig steigenden Chaos. Ausnahmen werden zur Regel, Code wird immer schwerer verständlich, das Entwicklungsteam beginnt von „historisch gewachsen“ zu sprechen – weil kaum jemand nachvollziehen kann, wie es zu dieser kontinuierliche Verschlechterung kommen konnte.
Durch welche Gründe kommt es dazu? Verlernen Teams über die Zeit das vernünftige und saubere Arbeiten? Nein – vielmehr zwingen oftmals äußere Einflüsse zu Kompromissen, die dann langfristig zu den oben genannten Problemen führen. Neudeutsch nennen Manager dieses Phänomen „technische Schulden“ – Softwareentwickler bezeichnen diese als Quick-And-Dirty, Hot-Fix, oder Workaround – und wissen, dass sich dahinter meistens ein weiterer Schritt in Richtung „degenerierter Systeme“ (rotten-software) verbirgt.
Innere Werte werden vernachlässigt
Ursächlich resultieren diese Probleme in einem mangelnden Bewusstsein für die innere Qualität von Software. Auftraggeber interessieren sich primär für neue Features, Erweiterungen oder schnellstmögliche Fehlerbehebung, weniger für den Erhalt konzeptioneller Integrität, verständlichen Quellcode oder stimmige Anwendung von Konzepten oder Technologien. Aber gerade diese innere Qualität von Systemen stellt sicher, Ziele wie niedrige Änderungskosten, schnelle Fehlerbehebung, hohe Anpassbarkeit zu erreichen. Leider ignorieren immer noch zu viele IT-Manager diesen kausalen Zusammenhang.
Systematisch Verbessern
Der Weg zu besserer Software führt in der kommerziellen Realität immer über mehrere, meist kleine, Schritte zum Ziel. Praktisch niemals können wir den Lauf der Welt für einige Monate anhalten, um in dieser Zeit die Qualität unserer Software zu verbessern. Vielmehr müssen wir Verbesserungen in die regulären Wartungsarbeiten (etwa: Erweiterungen, Fehlerkorrekturen) integrieren.
Ich möchte Ihnen aim42 vorstellen – eine frei verfügbare Methode zur systematischen Verbesserung von Software. Basierend auf der langjährigen praktischen Erfahrung einiger Initiatoren wird sie mittlerweile als Open-Source Projekt durch ein engagiertes Team kollaborativ weiterentwickelt [2].
aim42 adressiert Business und Technik gleichermaßen.
Die zentralen Konzepte von aim42 kommen Ihnen garantiert bekannt vor: Probleme, (Lösungs-)Maßnahmen, Kosten und Risiken. Aim42 packt diese Aspekte in einen methodischen Rahmen und stellt sicher, dass wirklich relevante Probleme auch durch Maßnahmen abgedeckt werden – und nicht vorschnell an Themen optimiert wird, die nur geringen geschäftlichen Nutzen erbringen.
Grundkonzepte aim42
- Sammeln Sie in der Analyse alle Probleme, die Sie rund um das System und dessen Organisation finden können.
- Jedes Problem bewerten Sie hinsichtlich seiner einmaligen und/oder wiederholten Kosten. Hierbei werden Sie oft auf Schätzungen sowie Annahmen angewiesen sein – halten Sie diese Bewertungen fest. Auf Basis der Kosten können Sie hervorragend Prioritäten festlegen.
- Manche Probleme sind nur Symptome von tieferliegenden Ursachen – die „Root- Cause-Analysis“ hilft, denen systematisch auf die Spur zu kommen.
- Suchen Sie mit technisch kundigen Beteiligten nach Maßnahmen, die diese konkreten Probleme oder deren Ursachen lösen oder beheben. Zwischen Maßnahmen und Problemen respektive Ursachen besteht eine m:n Beziehung – eine einzige Maßnahme kann mehrere Probleme adressieren, ein Problem kann zur Lösung mehrere Maßnahmen benötigen.
- Auch Maßnahmen haben Kosten – die Sie systematisch ermitteln oder schätzen müssen.
- Maßnahmen können Nebenwirkungen besitzen – oder negative Seiteneffekte. Legen Sie diese offen.
- Die Gegenüberstellung von Kosten-von-Maßnahmen sowie den Kosten-des-Problems ergibt wertvolle Entscheidungshilfe für Budget- oder fachlich Verantwortliche. Damit müssen Softwarearchitekten endlich nicht mehr über die schwer vermittelbaren inneren Qualitäten, Kopplung, Kohäsion oder Implementierungsdetails argumentieren, sondern können in Business-Sprache argumentieren.
- aim42 arbeitet hochgradig iterativ: Bewertungen von Problemen und Maßnahmen können sich über die Zeit ändern, wie sich in modernen Entwicklungsprozessen auch die Prioritäten von beispielsweise Anforderungen oder Zielen über die Zeit ändern können. Regelmäßige (iterative) Überprüfung der problem list und des improvement backlog stellen deren Aktualität sicher.
Probleme verursachen Kosten
Um Verbesserungen effektiv an realen Bedürfnissen auszurichten, sollten Sie für alle erkannten Probleme innerhalb von Softwaresystemen oder beteiligten Prozessen explizit deren „Kosten“ ermitteln: Welche Kosten entstehen beispielsweise durch direkt zurechenbaren Mehraufwand bei Entwicklung oder Betrieb, wie viel Geld kostet zusätzlich benötigte Hardware, welcher Umsatzausfall oder Opportunitätskosten fallen durch enttäuschte Kunden oder entgangene Verkäufe an? Zu den Kosten ermitteln Sie, in welcher Frequenz sie anfallen – etwa bei jeder Änderung, bei jedem Release des Systems oder bei jedem Aufruf einer bestimmten Systemfunktion.
aim42 nennt das problem list, eine Liste oder Tabelle sämtlicher bisher erkannten Probleme samt ihrer geschätzten Kosten. Erst wenn Sie die Kosten von Problemen kennen, können Sie mit anderen Stakeholdern zielgerichtet über Prioritäten und mögliche Abhilfen diskutieren. aim42 unterstützt Sie durch pragmatische und einfache Ansätze in dieser Bewertung.
Kontinuität und Iteration
Aus der Vogelperspektive teilt aim42 die systematische Verbesserung in drei Phasen ein:
- Analyze: Aufdecken und sammeln von Problemen. Gleichzeitig sollten Sie in der Analyse auch Verständnis für die Organisation, Struktur und Lösungskonzepte des Systems gewinnen, weil das für die Erkennung von Problemen und Risiken fundamental ist.
- Evaluate: Schätzen oder ermitteln des (Geld-)Wertes von Problemen und Maßnahmen. Das ermöglicht zielgerichtete Priorisierung und Planung. Diese Bewertung reichert Probleme und Maßnahmen um relevante Steuerinformationen und KPI’s für das IT- und technische Management an.
- Improve: Durchführen von Verbesserungsmaßnahmen. Hier fasst aim42 bewährte Patterns und Praktiken von Evolution, Refactoring, Migration oder stufenweisem Umbau zusammen.
Kontinuität und Iteration
Verbesserung ist ein kontinuierlicher Prozess (siehe Abbildung 4). aim42 funktioniert für beliebige Entwicklungs- oder Wartungsprozesse und teilt relevante Aktivitäten (Praktiken, Vorgehensmuster) in Phasen ein. Diese Aktivitäten können Sie in Ihrem normalen Entwicklungsvorgehen nahtlos integrieren.
Eine gedankliche Schleife wiederholt sich in aim42 immer wieder: (1) Sie finden ein Problem oder dessen Ursachen, (2) bewerten dieses Problem hinsichtlich seiner Kosten und (3) identifizieren Lösungsmaßnahmen dafür. (4) Sie wenden die Lösungsmaßnahme an und (5) analysieren ob das ursprüngliche Problem damit behoben ist.
Diese Schleife läuft in ähnlicher Form in jeglicher Art von Konstruktions- oder Optimierungsprozessen ab. Nach meiner Erfahrung kranken viele Systeme in der Praxis daran, dass die technisch Verantwortlichen vor der Bewertung der Kosten von Problem und Maßnahmen zurückschrecken. Stattdessen argumentieren sie über „Prinzipien der Softwaretechnik“ oder „technische Konzepte“ – und scheitern damit bei Management oder Auftraggebern.
Praktiken und (Vorgehens-)Muster
aim42 katalogisiert zur Zeit fast 80 erprobte Praktiken und (Vorgehens-)Muster. Einige Beispiele finden Sie im Textkasten. Allerdings garantiert der Einsatz dieser Praktiken und Muster keinen Erfolg: Wie andere mächtige Werkzeuge auch gehört zur Anwendung dieser Praktiken Fingerspitzengefühl und etwas Erfahrung. Zwar finden Sie in der Methodenreferenz zu aim42 ([3]) eine Menge Hinweise über wenn, wann und wie, aber eine leistungsfähige Methode ist halt kein Algorithmus.
Auszug Praktiken und Patterns
An einigen Beispielen möchte ich Granularität und Scope von aim42 aufzeigen. Für eine ganzheitliche Übersicht über alle aktuellen aim42 Praktiken und Patterns verweise ich Sie auf das online-Methodenhandbuch [3].
Anticorruption-Layer: Isoliere Clients von internen Änderungen an Subsystemen.
ATAM: Architecture Tradeoff Analysis, findet Risiken in Architektur.
Assertions: Über Zusicherungen im Code fehlerhafte Annahmen aufdecken.
Branch-for-Improvement: Über unterschiedliche Branches in der Versionsverwaltung verschiedene Stände der Veränderung abbilden.
Capture-Quality-Requirements: Qualitätsziele verschiedener Beteiligter offenlegen.
Context Analysis: Systemkontext und externe Schnittstellen klären und dokumentieren.
Data Analysis: In Daten und Datenstrukturen nach Problemen oder Komplexität suchen.
Estimate Problem Cost: Kosten von Problemen ermitteln.
Extract Reusable Component: Aus bestehendem System wiederverwendbare Teile extrahieren.
Frontend-Switch: In der Benutzeroberfläche Anfragen entweder an alte oder veränderte Teile des Systems routen.
Hierarchical-Quality-Model: Qualitätsziele konkretisieren durch Qualitätsbaum mit Szenarien
Improvement-Backlog: Pflege eine Übersicht möglicher Verbesserungsmaßnahmen, inklusive ihrer Kosten und Risiken.
Introduce-Boy-Scout-Rule: Hinterlasse Code nach Änderungen immer sauberer als vorher.
Issue-Tracker-Analysis: Bug- oder Issue-Tracker bezüglich Cluster und Häufungen untersuchen.
Keep-Data, Toss-Code: Systeme durch massive Änderungen im Code, aber unter Beibehaltung der relevanten Daten verbessern.
Pre-Interview -Questionnaire: Interviews durch stakeholder- und situationsspezifische Fragebögen vorbereiten.
Profiling: Vermesse Speicher- und anderen Resourcenverbrauch zur Laufzeit.
Qualitative-Analysis: Risikobewertung der systemrelevanten Qualitätsanforderungen auf Basis der getroffenen Architekturentscheidungen.
Refactoring-Plan: Teamweite Koordination und Abstimmung von Refactoring- Maßnahmen – zur groß angelegten Codeverbesserung.
Root-Cause-Analysis: Finde die Ursache von Problemen – differenziere Ursache und Symptom.
Software-Archeology: Verstehe Software durch Analyse von Quellcode und seiner Versionshistorie.
Stakeholder-Interview: Finde Probleme durch Befragung relevanter Beteiligter.
Static-Code-Analysis: Analysiere Quellcode, um zusammengehörige Bausteine, Abhängigkeiten, Kohäsion und andere strukturelle Eigenschaften zu finden.
Analyse: Verständnis gewinnen und Probleme identifizieren
Gewinnen Sie einen Überblick über Zweck, Aufgaben und insbesondere Qualitätsanforderungen an das System. Klären Sie interne Strukturen, Konzepte und wesentliche Architekturansätze. Dabei suchen Sie nach Problemen, Symptomen, Risiken oder technischen Schulden innerhalb des Systems, seiner Betriebs- oder Ablaufumgebung und allen zugehörigen Prozessen. Notieren Sie Lösungsideen (Maßnahmenvorschläge, „remedies“).
Evaluate: Abbildung auf betriebswirtschaftliche Größen
Stellen Sie die Vergleichbarkeit von Problemen und Lösungsmaßnahmen sicher, indem Sie deren betriebswirtschaftliche Werte (etwa in Euro oder Aufwandsgrößen) schätzen oder ermitteln. Damit können Sie Probleme und mögliche Maßnahmen priorisieren.
Improve: Mehr als nur Refactoring
Planen und koordinieren Sie die auf konkrete Probleme bezogenen Verbesserungsmaßnahmen. Ändern Sie, je nach Situation, Quellcode, Konzepte oder beteiligte Entwicklungs- oder Betriebsprozesse. Reduzieren Sie technische Schulden. Optimieren Sie Qualitätseigenschaften, beispielsweise Wartbarkeit, Verständlichkeit, Sicherheit oder Performance. Sämtliche Verbesserungen beziehen sich dabei auf Probleme oder deren Ursachen, die Sie in der Analysephase erkannt und anschließend bewertet haben – so stellen Sie sicher, keine Veränderung um ihrer selbst Willen durchzuführen.
Improvement Backlog
Eine wesentliche Frage innerhalb der kontinuierlichen Verbesserung habe ich bisher offen gelassen: Woher kommen die konkreten Verbesserungsvorschläge und –maßnahmen? In der Bewertungsphase wollen wir diese Maßnahmen bezüglich ihrer Aufwände und Risiken bewerten, und in der Verbesserungsphase wollen wir sie umsetzen – aber wann definieren wir sie überhaupt? Die Antwort lautet „kontinuierlich“: Ideen, Maßnahmen, Taktiken oder Strategien zur Verbesserung finden Sie in jeder der aim42-Phasen. Ich empfehle Ihnen, im Rahmen der systematischen Verbesserung von Software dazu ein Improvement Backlog zu führen, d.h. sämtliche Ideen für Verbesserungen im Rahmen einer Aufgabenliste zu dokumentieren.
Auch hierfür gilt wieder das Prinzip der systematischen Sparsamkeit: Halten Sie diese Dokumentation kurz und knapp. Aktualität ist wichtiger als Vollständigkeit, Transparenz wichtiger als Ausführlichkeit.
Community: Mitmachen erwünscht
aim42 ist ein junges Open-Source Projekt, das noch tatkräftige Unterstützung benötigt. Die bisherigen Committer bringen ihre langjährige und reichhaltige Erfahrung ein – und die gesamte Community freut sich über weitere Anregungen und Input. Für Interessierte: Das Handbuch zur Methodik (der so genannte method-guide) wird im AsciiDoc Format [4] geschrieben und automatisch auf [3] publiziert. Der gesamte Text liegt unter einer liberalen Creative-Commons Lizenz auf einem öffentlichen Github-Repository [5]. Werfen Sie einen Blick auf unsere offenen Punkte [6], ergänzen Sie Kommentare oder machen Sie Verbesserungsvorschläge.
Fazit
aim42 fasst bekannte und bewährte Praktiken und Vorgehensmuster für die Evolution und systematische Verbesserung von Software in einem methodischen Rahmen zusammen. In vielen Real-Life Situationen haben diese Praktiken ihre Praxistauglichkeit unter Beweis gestellt – aim42 integriert sie in einem gemeinsamen Kontext.
Referenzen
-
Robert Martin: Clean Code – Handbook of Agile Software Craftmanship. Prentice Hall, 2008. ↩
-
http://aim42.org – Website mit weiteren Details zur Methode. ↩
-
aim42 Method–Guide, das „Handbuch“ zur Methode. Enthält einen umfangreichen Katalog von Patterns und Practices sowie ein Literaturverzeichnis. http://aim42.github.io ↩
-
Der Code: https://github.com/aim42 ↩
-
Offene Punkte und Verbesserungsvorschläge zu aim42: https://github.com/aim42/aim42/issues ↩