Als Softwareentwickler gibt es nichts Schöneres als mit einem neuen Projekt auf der grünen Wiese zu beginnen. Tatsächlich ist dies aber nur selten der Fall. Umso erstaunlicher ist es, dass die besonderen Umstände in einem lang laufenden Projekt und die Strukturen innerhalb von Bestandsanwendungen, eher selten im Fokus strukturierter Betrachtung stehen. Zumindest scheint es so, denn tatsächlich gibt es unter dem Begriff „Softwareevolution“ ein Themengebiet, das genau dies adressiert.
Wie in Abbildung 1 gezeigt, unterteilt sich der Lebenszyklus eines komplexen Softwaresystems in mehrere Phasen. Häufig wird dabei der Zeitbereich der Evolution ausgelassen und nach einer initialen Entwicklungsphase davon ausgegangen, dass nur noch werterhaltende Dienste zu leisten sind. Zu diesen gehören beispielsweise die Fehlersuche und Behebung.
In der Praxis ergibt sich jedoch bereits mit dem ersten Nutzerkontakt eine Vielzahl neuer Anforderungen, deren Umsetzung mit den Aufgaben des täglichen Produktivbetriebs synchronisiert werden müssen. Statt also einen Entwicklungsstand zu erreichen, der dann nur noch am Leben gehalten werden muss, entwickelt sich Software evolutionär auf Basis ihrer Benutzung. Dies wird vor allem offensichtlich, wenn man die Aufgaben während des Betriebs auf einen Zeitbereich von vielen Jahren betrachtet.
Abbildung 2 zeigt die Hauptaufgabenbereiche die sich während des Betriebs einer Software für Softwareentwickler ergeben. So startet alles natürlich mit der Entwicklung. Nach einiger Zeit nehmen jedoch stabilisierende Maßnahmen, wie Fehlerbehebungen zu. Mit zunehmenden Nutzerzahlen steigt auch der Bedarf Optimierungspotentiale zu nutzen, während zeitgleich noch immer neue Features implementiert werden. Spätestens nach einigen Jahren kommt es dann zur Sanierung von Teilbereichen oder der gesamten Software. Dies ist beispielsweise notwendig weil sich die grundlegenden Technologien stark geändert haben oder das Aussehen und die Benutzerführung verbessert werden sollen.
Kommt es zur Sanierung des Systems, muss ebenfalls zwischen mehreren Möglichkeiten unterschieden werden. Die offensichtlichste Lösung, mit einem großen Knall eine völlig neue Software auf Basis der Erkenntnisse aus dem Bestandssystem zu entwickeln, ist mit den größten Aufwänden verbunden und sollte daher nur in absoluten Ausnahmefällen gewählt werden. Viel sinnvoller erscheint es daher einzelne Teile neu zu gestalten, was nicht bedeutet dass nur Module oder Komponenten des Systems erneuert werden. Es kann auch bedeuten, dass Features oder Funktionsgruppen in ein neues, schlankeres Softwaresystem übertragen und dann als Parallelsystem angeboten werden. Egal wie sich nun aber entschieden wird, in jedem Fall muss auch während der Sanierung noch immer der korrekte Betrieb des Bestandssystems sicher gestellt sein.
Bereits bei der Stabilisierung, spätestens jedoch bei der Optimierung des Systems fallen notwendige Änderungen auf, die nicht zwangsläufig einen direkten Mehrwert für den Endnutzer darstellen. Aus diesem Grund ist die kontinuierliche Analyse des Systems und Bewertung von möglichen Aufgaben essentiell für eine zielgerichtete Evolution. Andernfalls drohen unnötige Anpassungen und damit auch unnötige Kosten.