Showing posts with label quality. Show all posts
Showing posts with label quality. Show all posts

06 October 2016

Bauen versus Basteln

Vorsicht: Nestbeschmutzung

Tut mir ja wirklich leid, aber ich möchte an dieser Stelle mal ein wenig IT-Bashing betreiben - und mich über die teilweise grotesken Zustände der Softwareentwicklung beklagen.

TL;DR (aka Zusammenfassung)

Wir basteln oft, statt (systematisch) zu bauen. Das liegt manchmal weniger an uns Techies (Entwicklern, Architekten etc), sondern an negativen Wechselwirkungen vieler Parameter, die häufig miserabel gemanaged werden - und auf Dauer dann zu unwartbaren, unflexiblen und unverhältnismäßig teuren IT-Landschaften führen. Ziemlich drastisch hat das renommierte "Handelsblatt" es zuletzt unter dem Titel "Ramponierte IT" auf den Punkt gebracht:
"Die schlechten Computersysteme werden für viele Effizienzprobleme verantwortlich gemacht" (Handelsblatt)

Software "entwickeln" klingt systematisch...

Wir sagen fast alle "Softwareentwicklung" zu unseren Jobs - das klingt systematisch, fast so wie "Engineering". Wir erfreuen uns an Entwurfsprinzipien, verwenden etablierte Architekturmuster und arbeiten iterativ-agil. Stets streben wir nach Innovation und Verbesserung, und dauernd kommunizieren uns Blogs, Zeitschriften und Konferenzredner coole "Success Stories": Systeme in denen (scheinbar) alles richtig entschieden und ordentlich implementiert wurde.

"basteln" trifft es oft besser

In Wirklichkeit hat das so genannte "Entwickeln" von Software meiner Erfahrung nach in vielen Fällen deutlich mehr mit "Basteln" als mit systematischem Vorgehen zu tun. Die oben genannten "Erfolgsgeschichten" passieren oftmals "woanders", in ganz speziellen Situationen oder halten einer näheren Überprüfung nicht stand. Viele unserer mittleren bis großen Systeme sind "hysterisch gewachsen", man könnte auch "gewuchert" dazu sagen. Viele meiner aktuellen und ehemaligen KollegInnen können in ihren eigenen Systemen mehr Antipatterns aufzeigen, als Stellen, auf die Teams auch nach längerer Zeit noch stolz sind. Diese Probleme treten völlig unabhängig von (oder sogar trotz der...) so genannten Vorgehens- oder Reifegradmodellen auf.

Same Stupid Mistakes

Dabei wissen wir (SoftwerkerInnen) doch ziemlich genau, welche typischen Fehler auf lange Sicht zu übermässig komplexen Systemen führen - die wir im Team nicht mehr effizient weiter bearbeiten können... Aus meiner Sicht sind dabei folgende Themen besonders schlimm:
  • Mangelhafte Anforderungen: Garbage in, garbage out. Wenn uns Product-Owner oder Fachbereiche unscharfe oder schwammige Anforderungen geben, werden wir möglicherweise stark konfigurierbare Systeme liefern, damit alle möglichen Interpretationen dieser Anforderungen noch erfüllbar sind. Uns allen ist aber klar, dass Konfigurierbarkeit mit hoher Komplexität einhergeht - und zu mehr Code führt, als wenn wir stärker abgrenzen und uns in Systemen stärker fokussieren.
  • Unklare Qualitätsanforderungen:Teams haben immer "implizite" Vorstellungen, welche Qualitätsanforderungen ein System denn erfüllen müsste. Leider unterscheiden sich diese impliziten Annahmen manchmal gravierend von denen der Fachabteilungen, Auftraggeber oder sonstigen Systemverantwortlichen.
  • Arbeit unter Zeitdruck: Es gibt im Durchschnitt immer mehr Arbeit als Zeit dafür. Daher gehen wir während der Arbeit an Systemen lauter kleine Kompromisse ein, die einzeln kaum auffallen, in ihrer Summe dann aber zu fatalen Mängeln der inneren Qualität führen - ein anderer Begriff dafür sind "technische Schulden".
  • Kein Abbau technischer Schulden: Zu viele Abhängigkeiten, schlechte Modularisierung, geringe Konsistenz, übertriebene Inhomogenität, Nutzung veralteter Frameworks oder Technologie, unzureichende automatische Tests (um nur einige aufzuzählen) - das könnten wir ja alles bereinigen oder zumindest drastisch verbessern - sofern wir dafür etwas Zeit zugestanden bekämen. Aber: Der Abbau dieser technischen Schulden hat für unser Management kaum Priorität, ist mancherorts sogar als "nutzlose Zeitverschwendung" verschrien, die, so wörtlich, "ja keine neuen Features liefere".
  • Mangelhafte Entwicklungsprozesse: Auch heute, im Jahre 2016, weigern sich Organisationen noch beharrlich, auf flexiblere und schnellere Entwicklungsprozesse zu setzen. DevOps und Continous-Integration werden als "funktioniert hier sowieso nicht" abgetan. Klar, das funktioniert ja wirklich nur, wenn Organisationen bereit sind, an ihren Prozessen als Ganzes zu arbeiten - also auch Anforderungen, Test, Deployment/Release und Betrieb zu optimieren. Einer meiner Kunden aus der Finanzbranche hat das letztens mal prägnant formuliert: "Da müsste mal von ganz oben jemand durchregieren - um den Silo-Fürsten die Macht über ihre Teilprozesse zu beschneiden."
  • Lokale statt globale Optimierung: Entwickler besitzen einen fast unbändigen Drang zur Verbesserung, den sie gerne in Form von Refactorings oder kleinen lokalen Veränderungen ausleben. Solange umfassende und komplett automatisierte Tests diese Veränderungen auf mögliche Nebenwirkungen überprüfen, ist das gut. Manchmal verlieren Entwicklern jedoch den Überblick über die negativen Konsequenzen ihrer lokalen Änderungen auf andere Teile des Systems... Wir sollten Verbesserungen stets in etwas größerem Kontext betrachten - also über den Tellerrand einzelner Personen hinweg schauen. Das ist meiner Ansicht nach eine klassische Aufgabe für die Rolle "Softwarearchitektur".
  • Wenig Verständnis für Zusammenhänge im Großen: Ich bekomme in realen Projekten oftmals zu hören: "Wir können ja die Wechselwirkungen auf andere Systemteile gar nicht mehr genau beurteilen".... Solange Projekte das Thema "Übersichtsdokumentation" weiter vernachlässigen, wird mangelnde Übersicht auch ein Problem bleiben.

Bin ich zu pessimistisch?

Klar, wir können auch "gut": Homogene Teams, ohne Fluktuation, über viele Sprints hinweg mit ausreichend Zeit und Budget ausgestattet, denen verständige und kundige Managerinnen den Rücken freihalten, und denen exzellente Product-Owner ordentliche und konsistente Anforderungen geben. Ich arbeite seit fast 30 Jahren in der Softwareentwicklung, habe praktisch alle Branchen von innen erlebt. Meine Teams reichten von 3 bis zu mehr als 200 Personen, Informationssysteme, Embedded-Systeme, Business-Intelligence, moderne und ziemlich alte Technologie, große und kleine, arme und reiche Auftraggeber... und die stets wiederkehrende Konstante all dieser Situationen ist die massive Unordnung. Nein - ich selbst glaube nicht, dass ich hier zu pessimistisch schreibe.

Abhilfe: Systematische Verbesserung

Unsere Grundthese bei der Verbesserung lautet:
"Reduktion technischer Schulden führt zu Kostensenkung in der Entwicklung neuer Features."
Sie müssen mit Ihrem Management über systematische Verbesserung sprechen, über zielgerichtete und gesteuerte Modernisierung und Evolution. Dabei müssen Sie zwischen "Features-liefern" und "Schulden abbauen" abwägen, denn Sie können einerseits niemals für längere Zeit auf neue Fachlichkeit verzichten, und müssen andererseits garantiert mit beschränktem Budget zurecht kommen. Als zentral erweisen sich dabei zwei Parameter:
  • Innere Qualität der Systeme, die sich in Themen wir niedriger Kopplung, hoher fachlicher Kohäsion, hoher Codequalität, Konsistenz (Homogenität) der Implementierung und Verständlichkeit äussern.
  • Äußere Qualität der Systeme. Anders ausgedrückt: Business-Wert, die Menge fachlicher Features, fachliche Leistung, Performance, Benutzerfreundlichkeit, Skalierbarkeit, Menge der erfüllten Kundenwünsche.
Argumentieren Sie gegenüber Ihrem Management, dass bei systematischer Verbesserung (d.h. Steigerung der inneren Qualität) die fachlichen Features wirtschaftlich günstiger ("preiswerter") werden - und wir zukünftig damit bessere time-to-market erreichen! Ihr Management kennt sicherlich den traurigen Normalfall: Über die Zeit werden bei (vielen) Systemen Features immer teurer, bzw. die Entwicklung immer langsamer (in der folgenden Abbildung die rote Linie). Ihr Management benötigt einen Überblick, welche Probleme es bei Systemen gibt- und wie "schlimm" diese wirklich sind, am besten in Geldeinheiten ausgedrückt. Damit werden verschiedene Probleme miteinander vergleichbar. Wenn Sie unsicher sind, geben Sie diese Problemkosten in Intervallen an, oder beschränken Sie sich auf die Angabe von Größenordnungen. Dazu stellen Sie Ihrem Management vor, welche Abhilfen es für welche Probleme gibt - am besten jeweils mehrere Alternativen. Hüten Sie sich davor, von der "einzigen Möglichkeit" zu sprechen, die angeblich ein Problem löst: Normalerweise gibt es zu jedem (!!) Problem nämlich eine Vielzahl möglicher Abhilfen. Velocity mit/ohne Verbesserung Erklären Sie, dass systematische Verbesserung längerfristig angelegt ist, und durchschnittlich sowohl den "business value" der Systeme verbessert (also für die Anforderungs-/Fachseite den Wert der Systeme steigert), gleichzeitig (!) aber auch die technischen Schulden reduziert. Das (Open-Source) Projekt aim42 (architecture improvememt method) stellt für die systematische Verbesserung fast 100 "good practices" zusammen, etablierte und bewährte Vorgehensmuster.

Fazit: Das klappt wirklich!

Vorsicht - Eigenwerbung: Sie können systematische Verbesserung lernen - wir bieten dazu den dreitägigen Workshop "IMPROVE" an.
An dieser Stelle möchte ich Ihnen Mut zusprechen: Hartnäckigkeit und Systematik lohnt sich: Ich habe in unterschiedlichen Branchen IT-Systeme verschiedener Größe und Komplexität "systematisch verbessert". Mit Teams zusammen habe ich time-to-market deutlich verkürzt, Test- und Entwicklungsaufwände gesenkt, Performance verbessert und in praktisch allen Fällen die Zufriedenheit der Teams signifikant erhöht. Ich habe (skeptische) Manager überzeugen können, dass Verbesserung sich wirtschaftlich lohnt. In diesem Sinne - bleiben Sie "am Ball". Erklären Sie, wie schlimm ihre Probleme sind, und welche direkten und indirekten Kosten sie verursachen. Update 9. Oktober 2016: Fixed typos.

06 November 2015

Langlebigkeit und Wartbarkeit

 

In diesem Post möchte ich das alte Dilemma der steigenden Wartungskosten von Software ansprechen - und auf ein dazu passendes Buch (von Carola Lilienthal) hinweisen. Ich habe ihn für dieses Buch als Geleitwort geschrieben (bin damit sozusagen parteiisch).

Eigentlich...

... wissen Softwareentwickler(innen) und –architekt(innen) ganz genau, worauf sie bei Entwicklung und Änderung von Software achten sollten: Einsatz etablierter Architektur- und Entwurfsmuster, saubere Modularisierung, lose Kopplung, hohe Kohäsion und Durchgängigkeit (Konsistenz und innere Ordnung), dazu eine große Portion sinnvoller weiterer Entwurfsprinzipien. Haben wir alle gelernt, geübt und erfolgreich genutzt.

 

Dennoch...

... geht in den Tücken der Praxis so einiges schief: Viele Softwaresysteme erkranken über kurz oder lang an der IT-Seuche Nr. 1 – der „generellen Verrottung“: Folgen dieser Malaise: 

  • Wartungs- und Änderungskosten steigen unaufhaltsam auf ein schier unerträgliches Maß an. 
  • Intransparenz wohin man nur schaut. Kaum jemand überblickt noch die Konsequenzen von Änderungen. Selbst kleine Erweiterungen werden zum technischen Vabanquespiel.
  • Arbeit an solchen Systemen wird zur Qual – obwohl Softwareentwicklung an sich zu den interessantesten Tätigkeiten überhaupt gehört. ☹

Der folgenden Abbildung liegt kein reales System zugrunde, spiegelt aber meine Erfahrung in Dutzenden mittlerer und großer Systeme aus unterschiedlichen Branchen und Technologien wider:

 

rotting software

 

Endlich...

... bricht Carola Lilienthal mal explizit die Lanze für die beiden (in der Praxis allzu oft vergessenen) Qualitätsmerkmale Langlebigkeit und Wartbarkeit. Diese beiden bilden eine wesentliche Grundlage der inneren Qualität von Software. Niemand kann sie einer Software von außen ansehen – aber alle Stakeholder von Systemen möchten sie haben:

  • Auftraggeber von Systemen freuen sich, weil sich die hohen Investitionen in Erstellung und Wartung lohnen und weitere Änderungen kostengünstig sind.
  • Anwender und Fachabteilungen freuen sich, weil Änderungen am System schnell und mit hoher Zuverlässigkeit erfolgen können. 
  • Entwickler und Softwarearchitekten freuen sich, weil Arbeit an sauberen Systemen viel produktiver ist. Niemand braucht mehr Angst vor bösen Nebenwirkungen einer kleinen Änderung zu haben.

 

Prima

... dass Carola dieses Buch geschrieben hat: Ihre langjährigen Erfahrungen auf dem Gebiet der Architekturanalyse von Systemen unterschiedlicher Technologien sind einzigartig. Dadurch stellt sie in jedem Winkel dieses Buches den nötigen Praxisbezug her.Ich durfte als einer der Ersten das Manuskript lesen – und habe sehr davon profitiert!

 

Mehr dazu im Buch selbst (die Website zum Buch ist noch in Arbeit…)

 

History:

Nov.07: fixed typos (thx, @stilkov)

18 March 2015

IT-Systeme systematisch verbessern...

Software neu erstellen - das lernen wir alle in Ausbildung und Studium.

Die Evolution, Weiterentwicklung oder Verbesserung von Softwaresystemen systematisch zu betreiben, müssen wir uns mühevoll in "Training on the Job" selbst beibringen - bisher zumindest...

Neuer Lehrplan zum Thema


Seit kurzem hat der iSAQB e.V. einen entsprechenden Lehrplan namens IMPRVOVE aufgenommen (Disclaimer: Ich habe den entworfen und eingereicht).

Dessen Name ist Programm: Sie können ab sofort lernen, wie Verbesserung, Evolution oder Weiterentwicklung systematisch funktioniert, mit balancierten betriebswirtschaftlichen, fachlichen und technischen Zielen.

IMPROVE hilft Ihnen, kurzfristige Budgetvorgaben und langfristige Architektur- und Produktqualität in Einklang zu bringen. Sie vermeiden Verletzungen der konzeptionellen Integrität und kurzfristige Behelfslösungen. Es zeigt systematische Auswege aus inkonsistenter Implementierung und riskanter Technologiediversifizierung.


Was Sie zum systematischen Verbessern brauchen

aim42 verrät Ihnen schon ziemlich viel, aber ganz praktisch sollten Sie folgende Fähigkeiten mitbringen, wenn Sie Systeme verbessern möchten:

  • Systematische Problemanalyse betreiben, sowohl auf Makro- (z.B. bei Querschnittsthemen, externen Schnittstellen, Entwicklungsprozessen) wie auch auf Mikroebene (z.B. im Code)
  • systematisch Verbesserungsvorschläge für die gefundenen Probleme entwerfen.
  • sowohl Probleme wie auch Lösungsoptionen aus betriebswirtschaftlicher Sicht bewerten (d.h. in Geldeinheiten!). Dieser Punkt fällt Softwareentwicklern erfahrungsgemäß besonders schwer.
  • Langfristiges Vorgehen bei Verbesserung planen, ihre "Evolutionsstrategie" festlegen.
  • Kurzfristige Verbesserungen planen und durchführen, beispielsweise Refactorings, Einführung interner Schnittstellen, Verbesserung von Modularisierung, Kohäsion und/oder Kopplung.
  • Sich durch betriebswirtschaftlich fundierte Argumentation gegen kurzfristige Widerstände durchsetzen.


In diesem Sinne - viel Spaß beim Verbessern Ihrer Systeme.

28 November 2012

Beispiele für Qualitätsanforderungen

Ich habe begonnen, beispielhafte Qualitätsanforderungen an Software zu sammeln - und eine erste Version davon (als docx-Dokument) online gestellt.

Eingeteilt habe ich nach den Qualitätsmerkmalen:


  • Änderbarkeit

  • Benutzbarkeit

  • Effizienz (Performance)

  • Sicherheit

  • Skalierbarkeit

  • Zuverlässigkeit

  • Betreibbarkeit

  • Sonstige



Die Liste ist momentan ein Draft - enthält aber immerhin mal > 30 typische Szenarien. Mehr sind unterwegs...

Sie wird in naher Zukunft Bestandteil von arc42.