Projektaudit – Softwareprojekte aus der Krise führen und kontinuierlich verbessern

„Die Suchfunktion ist zu langsam und funktioniert nicht richtig!“, sagt der Kunde. Und schon geht’s ran an die beauftragte technische Analyse und Fehlersuche. Nach kurzer Zeit ist klar, dass nichts klar ist. Was genau heißt „funktioniert nicht richtig“? Und wie schnell ist schnell genug?

Im Gespräch mit dem Kunden wird deutlich, dass das Projekt insgesamt in Verzug ist, die Anforderungen nicht dokumentiert sind und das agile Vorgehensmodell neu eingeführt wurde. Der verantwortliche Senior Projektmanager spricht nicht mehr mit dem technischen Projektleiter und umgekehrt. Ein typisches Beispiel aus der Praxis. Die Frage ist nun, was tun?

Bei der EXXETA AG wende ich mit meinem Team die intern standardisierte „Service Komponente“ Projektaudit an. Diese schafft den methodischen Rahmen, um Softwareprojekte ganzheitlich zu betrachten und zu bewerten. Ganzheitlich meint hier sowohl die Sicht auf technische Belange als auch auf die gelebten Projektprozesse. Ein Projektaudit ist dabei grundsätzlich sowohl für die direkte Krisenintervention als auch für einen kontinuierlichen Verbesserungsprozess (KVP) geeignet.

Zunächst eine grundsätzliche und wichtige Frage vorweg: Warum schlagen wir die ganzheitliche Betrachtung als Lösungsansatz vor? Auf Basis unserer Projekterfahrung sind für den Erfolg eines Projekts immer mehrere Faktoren relevant. Um ein Projekt zu optimieren oder aus der Krise zu führen, ist es nicht ausreichend, nur einen Aspekt zu betrachten. Wichtige Faktoren im Bereich der Projektprozesse sind zum Beispiel Kommunikationsstrukturen oder die Vorgehensweise bei der Anforderungsdefinition.

Die Service Komponente Projektaudit definiert ein stufenweises Vorgehen in mehreren Phasen. Der Phasenablauf kann ganz im Sinne eines kontinuierlichen Prozesses in weiteren Iterationen erneut durchlaufen werden. Zum einen kann das Ziel sein, die Detailtiefe bei den Untersuchungsgegenständen und der Ergebnisdokumentation pro Iteration zu erhöhen. Zum anderen können auch Themen, die im Review selbst identifiziert wurden, näher betrachtet werden. Kommt das Projektaudit in einer konkreten Krise zum Einsatz, wird der definierte Phasenablauf meist nur einmal komplett durchlaufen.

In unserem konkreten Fall änderten wir gemeinsam mit dem Kunden den Projektauftrag. Die Betrachtung des Projekts erfolgte nun ganzheitlich sowohl für die Softwarearchitektur als auch für die Entwicklungs- und Projektprozesse. Ziel war die Verifikation von Architektur- und Technologieentscheidungen sowie die Identifizierung von Optimierungspotential und das Erarbeiten einer konkreten Handlungsempfehlung.

Die bei der IST-Analyse durch Dokumentensichtung und Interviews gewonnenen Informationen wurden mit Blick auf die zu Beginn des Projektaudits definierten Schwerpunktthemen ausgewertet. Die Dokumentation von Befund und Zustand für die betrachteten Handlungsfelder erfolgte in tabellarischer Form. Entscheidend für die weitere Vorgehensweise ist dann der Zustand, er bewertet die Abweichung von einer „Best Practice“ [1].

Auf Basis der Befunde und ihrer Bewertung konnten wir präventive und korrektive Maßnahmen ableiten. Wichtig ist, das Ziel einer Maßnahme zu definieren um die spätere Erfolgskontrolle zu ermöglichen. Zum Abschluss brachte die Handlungsempfehlung unsere Maßnahmen in eine für die Situation passende Reihenfolge und bot dem Kunden eine Schritt-für-Schritt-Anleitung zur Problemlösung.

Bei Fragen, Anregungen oder Kritik sprechen Sie mich bitte einfach an. Ich freue mich über Rückmeldungen.

(Ursprünglich veröffentlicht am 08.07.2017)

Literatur

[1] List, Werner / Voight, Roger (2010): Kritische Projekte retten. Leitfaden für die Diagnose, Sanierung und Prävention. München: Hanser Verlag.

Das Kanban-Board ist mehr als ein Task-Board

„Wieso, was ist der Unterschied?“ Auf diese Frage stoße ich in Software-Projekten und bei agilen Teams immer wieder. Die Annahme ist, dass mit einem Task-Board das Thema Kanban erfolgreich umgesetzt wurde. Alle Tasks sind auf einem Board platziert und werden entsprechend abgearbeitet. Leider greift dies meist zu kurz – was also ist der Unterschied?

Ein Task-Board dient der Visualisierung und Verwaltung von Aufgaben. Der Status einer Aufgabe ist über Spalten wie „Offen“, „In Bearbeitung“ und „Abgeschlossen“ erkennbar. Wird ein vermeintliches Kanban-Board in diesem Sinne erstellt, ergeben sich mehrere in Spalten organisierte Aufgaben-Listen. Das Vorgehen in einem Team ist damit aufgabenorientiert.

Das primäre Ziel von Kanban – in der Softwareentwicklung – ist es dagegen, ein System kontinuierlich und evolutionär zu verbessern. In unserem Fall ist das System ein agiles Team, das Software-Features für einen Kunden entwickelt. Für die Umsetzung der Features sind eine Reihe von Aktivitäten notwendig, die mit dem Kanban-Board visualisiert werden. Eine Aktivität ist unverzichtbarer Bestandteil der Wertschöpfung und lediglich ein Schritt in Richtung des Endergebnisses. Auf dem Kanban-Board wird durch die Darstellung aller notwendigen Aktivitäten das Gesamtsystem sichtbar, das Nutzen und Mehrwert für den Kunden erzeugt. Probleme und Hindernisse im Ablauf lassen sich leicht erkennen und können analysiert werden. Im Fokus des Teams steht der Arbeitsfluss mit seinem Kundennutzen.

Fazit – Ein Kanban-Board dient dazu, den Arbeitsfluss der gesamten Wertschöpfungskette zu betrachten. Es ist im oben genannten Kontext nicht dazu gedacht, lediglich Aufgaben zu verwalten.

Tipp – Hilfreich ist aus meiner Sicht die gedankliche Unterscheidung von Aufgabe und Aktivität.

(Ursprünglich veröffentlicht am 15.11.2018)

Literatur und Quellen

[1] Anderson, David J.: Kanban. Evolutionäres Change Management für IT-Organisationen (German Edition). Heidelberg: dpunkt.verlag 2011.

[2] Leopold, Klaus: Kanban in der Praxis. Vom Teamfokus zur Wertschöpfung. München: Hanser 2017.

Von klassischen Enterprise Applikationen zu Cloud-Native Anwendungen

Mit meinem Team bei der EXXETA AG arbeite ich unter anderem an Enterprise Software-Lösungen für die Cloud. Moderne Web-Anwendungen und Cloud-Transformationen bilden unseren Tätigkeitsschwerpunkt. Dabei geht es nicht einfach darum, bestehende Applikationen in der Cloud auszuführen. Vielmehr sind maßgeschneiderte Software-Architekturen, die passende Organisation und eine entsprechende Kultur gefordert. Ein Cloud-Native Ansatz.

Was bedeutet Cloud-Native konkret? Die Cloud Native Computing Foundation (www.cncf.io) beantwortet diese Frage aus der technischen Perspektive folgendermaßen: Containerisierung, dynamische Orchestrierung, Microservices. Dies bedeutet zum einen, dass alle relevanten Komponenten in einem Container, z. B. Docker, gekapselt werden. Zum anderen werden die notwendige Verwaltung und das Management komplexer Container-Landschaften durch Orchestrierungs-Lösungen wie Kubernetes übernommen. Die Anwendung selbst setzt sich in diesem Szenario aus einer Vielzahl von Microservices zusammen.

Cloud-Native bedeutet darüber hinaus auch die Abkehr von hierarchischen Organisationen mit Projektmanager und Fachspezialisten. Projekte werden durch crossfunktionale Teams mit starkem Fokus auf ein Produkt und dessen Nutzen umgesetzt. Silos wie Software Entwicklung, System Administration, Qualitätssicherung, Betrieb, Releasemanagement oder Projektmanagement werden aufgelöst und durch neue Modelle der Zusammenarbeit wie z. B. DevOps ersetzt.

Die kontinuierliche Auslieferung neuer Funktionalität an Kunden und Nutzer ist ein weiterer Aspekt von Cloud-Native. Dabei sind auf einer technischen Ebene Prozesse und Werkzeuge für Continous Integration und Continous Delivery in den Entwicklungsteams bereits zum Standard geworden. Cloud-Native bedeutet allerdings mehr. Eine Organisation muss auch tatsächlich darauf ausgerichtet sein, neue Funktionalität direkt und auf Ebene von Business-Funktionen oder Microservices produktiv zu nehmen.

Grundsätzlich stellt sich die Frage, warum wir überhaupt einen Cloud-Native Ansatz verfolgen sollten. Was ist unsere Motivation?

Aktuell herrscht weitestgehend Konsens darüber, dass Unternehmen, die sehr schnell auf Kundenbedürfnisse reagieren können, erfolgreicher sein werden als andere. Geschwindigkeit ist entscheidend. Bei vielen Enterprise Applikationen wird ein Releasezyklus allerdings noch immer in Wochen oder Monaten geplant. Das Risiko für ein einzelnes Release ist sehr hoch, Änderungen der Funktionalität sind teuer und aufwendig. Bei einem Cloud-Native Ansatz können Deployments im Gegensatz dazu mehrmals täglich, stündlich oder minütlich durchgeführt werden. Änderungen lassen sich gewissermaßen direkt umsetzen. Das Risiko ein „Release“ zu veröffentlichen reduziert sich damit drastisch. Auch können bei einer Cloud-Native Anwendung auf Basis von Microservices einzelne Business-Funktionen schnell und unabhängig voneinander deployed werden.

Schnell zu sein alleine ist natürlich nicht ausreichend. Ebenso ist es erforderlich, dass das erstellte System die notwendige Zuverlässigkeit aufweist. Klassische Enterprise Applikationen werden oft in einer Designphase vor Entwicklungsstart entworfen, durch umfangreiche Architektur Reviews überprüft, detailliert dokumentiert und langlaufenden Regressionstests unterzogen. Ziel ist immer, die Zahl der Fehlerfälle in Produktion zu verringern. Leider oft wenig erfolgreich.  Durch die Verwendung von Microservices sind unter anderem beim Auftreten eines Fehlers in einer Cloud Native Applikation nur kleine Anwendungsbereiche betroffen. Im Idealfall eben nur der entsprechende Microservice. Um kaskadierende Fehler zu vermeiden, werden Microservices fehlertolerant ausgelegt und lose gekoppelt. Die transparente Überwachung der Anwendung ermöglicht meist auch eine automatisierte Wiederherstellung im Fehlerfall. Nicht zuletzt ist die Einführung neuer Technologien ohne größeres Risiko für das Gesamtsystem möglich, da nur einzelne Services betroffen sind.

Auch die Wirtschaftlichkeit und Effizienz eines Systems sind wichtige Faktoren. In Bezug auf die Skalierbarkeit wird bei klassischen Enterprise Applikationen in vielen Fällen der Worst Case betrachtet. Die dabei gestellte Frage lautet: Welche maximale Last kann unter Umständen auftreten. Entsprechend werden Server und Infrastruktur bemessen. Die meiste Zeit bleiben diese Ressourcen allerdings ungenutzt. Was wenig effizient und teuer ist. Cloud-Native Anwendungen hingegen skalieren horizontal und nutzen nur die aktuell notwendigen Ressourcen. Verwaltet und bereitgestellt durch den Cloud-Provider kann diese Auslagerung die Investitionskosten für Unternehmen erheblich reduzieren. Die horizontale Skalierung einer Cloud-Native Anwendung wird durch den auf Microservices basierenden Architekturansatz optimal unterstützt.

Nicht zuletzt lautet die Prämisse für eine Cloud-Native Anwendung Mobile-First. Enterprise Applikationen wurden noch vor wenigen Jahren für den typischen Fall eines Desktop-Benutzers entworfen. Dies hat sich grundlegend geändert. Es gibt heute eine Vielzahl von Endgeräten und Zielplattformen, der Desktop spielt eine immer geringere Rolle. Mobile Geräte wie Smartphones und Tablets bilden längst die große Mehrheit und sind für den Benutzer immer verfügbar. Dies macht sich im Nutzerverhalten deutlich bemerkbar und hat Einfluss auf die notwendige Systemarchitektur. Einzelne Business-Funktionen werden viel häufiger und zu jedem denkbaren Zeitpunkt genutzt. In diesem Zusammenhang bedeutet Mobile-First natürlich mehr als nur die optimierte Darstellung auf einem kleineren Bildschirm.

Neben den technischen Aspekten ist für die Entwicklung einer Cloud-Native Anwendung also ein ganzheitlicher Ansatz entscheidend. Sowohl Organisation als auch Kultur spielen eine große Rolle. Wie Eingangs erwähnt wird Software heute zwar mit Hilfe agiler Methoden entwickelt und durch Continous Delivery Prozesse automatisiert „ausgeliefert“. Häufig existiert dann allerdings ein organisatorischer Bruch in Form klassischer Test- oder Releaseprozesse. Den Fokus gilt es daher auf Kunden und Nutzer zu legen. Neue Funktionen und damit Mehrwert müssen kontinuierlich zur Verfügung gestellt werden. Dies erfordert die entsprechende Haltung bei allen Beteiligten an der es beständig zu arbeiten gilt. Ganz im Sinne der agilen Softwareentwicklung durch Inspect and Adapt.

 

Literatur und Quellen

[1] Stine, Matt (2015): Migrating to Cloud-Native Application Architectures. Sebastopol, CA 95472: O’Reilly Media.

[2] Cloud Native Computing Foundation: www.cncf.io