Qgelm

The Art of Software Reviews: Probleme und Risiken zielsicher identifizieren

Originalartikel

Backup

<html> <header class=„article-header“><h1 class=„articleheading“>The Art of Software Reviews: Probleme und Risiken zielsicher identifizieren</h1><div class=„publish-info“> Gernot Starke</div></header><figure class=„aufmacherbild“><img src=„https://heise.cloudimg.io/width/700/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/0/2/0/2/5/6/artofreview-55c53aeff2a3441d.jpeg“ srcset=„https://heise.cloudimg.io/width/700/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/0/2/0/2/5/6/artofreview-55c53aeff2a3441d.jpeg 700w, https://heise.cloudimg.io/width/1050/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/0/2/0/2/5/6/artofreview-55c53aeff2a3441d.jpeg 1050w, https://heise.cloudimg.io/width/1497/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/3/0/2/0/2/5/6/artofreview-55c53aeff2a3441d.jpeg 1497w“ alt=„“ class=„img-responsive“ referrerpolicy=„no-referrer“ /></figure><p><strong>Auch in erfolgreichen Softwaresystemen lauern praktisch immer Probleme. Durch systematische Reviews k&#246;nnen Teams diese Probleme zielgerichtet identifizieren.</strong></p><p>Getreu dem Bonmot „Besser geht immer“ leidet praktisch jede Software an Problemen kleiner oder gro&#223;er Natur: Vielleicht l&#228;uft sie zu langsam, st&#252;rzt manchmal ab oder sieht weniger sch&#246;n aus als das System der Konkurrenz. H&#228;ufig beschwert sich das Business lautstark dar&#252;ber, dass neue Features viel zu lange dauern &#8211; neudeutsch: die Time-to-Market ist zu schlecht. Abgesehen von hello-world l&#228;sst sich &#252;berall noch so manches verbessern.</p><p>Wer dieses Verbesserungspotenzial seines Systems heben m&#246;chte, sollte auf jeden Fall zuerst ein explizites, konkretes und spezifisches Verst&#228;ndnis der vorhandenen Probleme erarbeiten. Dabei l&#228;sst sich aus der Medizin lernen: Dort steht vor den Therapievorschl&#228;gen zuerst eine gr&#252;ndliche Diagnose (Untersuchung). Ohne ein solches Review, wie die Untersuchung in der IT-Branche hei&#223;t, droht Verschlimmbesserung.</p><p>Der Artikel stellt die Breitensuche als den zentralen Ansatz methodischer Software-Reviews vor und beleuchtet einige der wesentlichen Untersuchungsans&#228;tze.</p><h3 class=„subheading“ id=„nav_f&#252;nf_phasen_0“>F&#252;nf Phasen</h3><p>Schematisch sollten Reviews immer in f&#252;nf Phasen stattfinden:</p><ol class=„rtelist rtelist–ordered“><li>Vor Beginn sollten Teams mit den Auftraggebern oder Systemverantwortlichen die Zielsetzung sowie den Scope kl&#228;ren. Dazu legen sie gemeinsam fest, welchen zeitlichen Umfang das Review haben sollte. Mit diesen Personen definiert man auch das konkrete Vorgehen: Welche Interviews und Analysen braucht es zu welchem Zeitpunkt und mit welcher Beteiligung?</li><li>In einem Kick-off erl&#228;utern die Verantwortlichen dieses Vorgehen allen beteiligten Personen. Gleichzeitig k&#246;nnen sie dieses Treffen f&#252;r erste Gespr&#228;che &#252;ber das System und dessen St&#228;rken und Schw&#228;chen nutzen.</li><li>Nun folgen gezielte Interviews mit Beteiligten aus verschiedenen Bereichen.</li><li>Nach diesen Gespr&#228;chen bieten sich nach Bedarf weitere Analyseschritte an, in denen man gezielt auf die Suche nach Problemen und Risiken bestimmter Kategorien geht. Analysen und die Interviews von Schritt 3 k&#246;nnen sich abwechseln: Die Ergebnisse von Interviews k&#246;nnen bestimmte Analysen notwendig machen und umgekehrt.</li><li>Schlie&#223;lich arbeitet man die Ergebnisse, Schlussfolgerungen und Empfehlungen auf und stellt diese den Beteiligten vor.</li></ol><figure class=„a-inline-image a-u-inline“><div><figcaption class=„a-caption“>Review-Ablauf (Abb. 1)</figcaption></div></figure><h3 class=„subheading“ id=„nav_wer_f&#252;hrt1“>Wer f&#252;hrt Reviews durch?</h3><p>Vor dem Review sollte &#252;berdacht werden, welche Personen &#252;berhaupt f&#252;r ein Review in Frage kommen. Grunds&#228;tzlich k&#246;nnen das die Beteiligten an der Entwicklung sein, alternativ auch Au&#223;enstehende („Externe“). Abbildung 2 stellt einige Vor- und Nachteile der beiden Varianten gegen&#252;ber &#8211; mit dem Fazit, f&#252;r Reviews interne und externe Beteiligte zu mischen &#8211; so bekommt man ein „best of both worlds“: Sie schlie&#223;en Befangenheit und Betriebsblindheit aus und kommen zeiteffektiv und inhaltlich fundiert zu konkreten Resultaten.</p><figure class=„a-inline-image a-u-inline“><div><figcaption class=„a-caption“>Interne versus externe Reviewer (Abb. 2)</figcaption></div></figure><p>Erfolgreiche Reviews beginnen mit einer klaren Formulierung von Zielen, die das Review erreichen soll. Solche Ziele sollten Projektverantwortliche mit den Auftraggebern des Reviews gemeinsam erarbeiten. Sie sollten fragen, was jemanden &#252;berhaupt zu einem Review motiviert oder welche Probleme es ausgel&#246;st hat. Diese Ziele sollte man schriftlich festhalten &#8211; sonst geraten sie allzu schnell in Vergessenheit.</p><p>Neben den Zielen m&#252;ssen die Beteiligten den Betrachtungsgegenstand des Reviews kl&#228;ren. Was genau sollen sie untersuchen? Eine Formulierung wie &#8222;das System X&#8220; k&#246;nnten verschiedene Personen unterschiedlich auslegen, daher legen sie gemeinsam mit den Auftraggebern fest, was genau sie untersuchen sollen. Typische Punkte dabei k&#246;nnten sein:</p><ol class=„rtelist rtelist–ordered“><li>die Architektur, der strukturelle Aufbau des Systems aus Komponenten und deren Schnittstellen</li><li>eingesetzte Technologien sowie technische Konzepte des Systems</li><li>die Implementierung, also den Quellcode</li><li>der Betrieb des Systems in dessen Infrastruktur oder Zielumgebung</li><li>die Entwicklung beziehungsweise die Entwicklungsprozesse, beispielsweise Anforderungskl&#228;rung, Koordination von Entwicklungsaufgaben, Test und Qualit&#228;tssicherung, Konfigurations- und Versionsmanagement, Deployment, Rollout sowie &#196;nderungsmanagement und Bugfixing</li></ol><header class=„a-boxheader“ data-collapse-trigger=„“>iX Developer &#8211; Moderne Softwarearchitektur</header><div class=„a-boxtarget a-boxcontent a-inline-textboxcontent“ data-collapse-target=„“><figure class=„a-inline-textboximage-container“><img alt=„“ src=„https://heise.cloudimg.io/width/421/q50.png-lossy-50.webp-lossy-50.foil1/_www-heise-de_/imgs/18/3/0/2/0/2/5/6/cover-sonderheft-69f98c34a829eedf.jpg“ srcset=„https://heise.cloudimg.io/width/842/q30.png-lossy-30.webp-lossy-30.foil1/_www-heise-de_/imgs/18/3/0/2/0/2/5/6/cover-sonderheft-69f98c34a829eedf.jpg 2x“ class=„c1“ referrerpolicy=„no-referrer“ /></figure><div class=„a-inline-textboxcontent-container“><p>Dieser Artikel stammt aus dem Sonderheft „iX Developer &#8211; Moderne Softwarearchitektur“. Es bildet auf 148 Seiten einen Querschnitt zu wichtigen Themen zeitgem&#228;&#223;er Softwarearchitektur. <a href=„https://shop.heise.de/ix-developer-moderne-softwarearchitektur-2020/Print“ rel=„external noopener“ target=„_blank“><strong>Einen &#220;berblick bekommen Interessierte hier [1]</strong></a>. Die gedruckte Ausgabe kosten 14,90 Euro, die PDF-Ausgabe 12,99 Euro.</p></div></div><p>Die Beteiligten sollten in diesem Vorgespr&#228;ch daf&#252;r sorgen, dass Scope und Ziele zusammenpassen. Ebenso kl&#228;ren sie, welche Personen mitarbeiten. Das gilt auch f&#252;r die Mitwirkung der Auftraggeber sowie Termine.</p><h3 class=„subheading“ id=„nav_wie_lange2“>Wie lange?</h3><p>Aufwand oder Dauer eines Reviews h&#228;ngen prim&#228;r von den Zielen, dem Scope und der Gr&#246;&#223;e des betrachteten Systems ab. Der Autor hat Reviews zwischen zwei und 60 Personentagen (kurz: PT) durchgef&#252;hrt. In zwei bis vier PT k&#246;nnen Teams einen &#220;berblick gewinnen und eine Art „Bericht zur Lage der Nation“ abgeben, ohne dabei viel Code zu sehen. F&#252;r gro&#223;e Systeme inklusive Betrachtung von Quellcode sowie organisatorischen Aspekten steigt der Aufwand f&#252;r Reviews entsprechend an. Im Rahmen von 10 bis15 PT lassen sich schon recht viele Aspekte beleuchten und eine Menge Interviews f&#252;hren. Falls sich das nach viel Aufwand anh&#246;rt: F&#252;r Systeme mit 10 Personenjahren Entwicklungsaufwand (also ca. 2300 PT) bedeuten 10 PT ja gerade mal 0,4 Prozent des Gesamtaufwandes. Im Vergleich: Inspektionskosten beim PKW liegen bei knapp einem Prozent des Kaufpreises pro Jahr.</p><p>Teams sollten von ihrem Zeitbudget mindestens 20 Prozent f&#252;r die Vorbereitung und Kommunikation ihrer Ergebnisse kalkulieren. Oftmals kommen nach einer Abschlusspr&#228;sentation noch eine Menge Fragen und &#196;nderungsw&#252;nsche auf das Review-Team zu.</p><h3 class=„subheading“ id=„nav_kick_off_3“>Kick-off</h3><p>Es empfiehlt sich, alle Beteiligten zu einem kurzen Kick-off-Workshop einzuladen, auf dem die Ziele und der Scope des Reviews sowie die Vorgehensweise kommuniziert werden, zusammen mit Meilensteinen und dem Zieltermin. Das spart bei den eigentlichen Interviews viel Zeit und beugt einer unproduktiven Ger&#252;chtek&#252;che vor. Das schlie&#223;t die Fach-/Produktseite, das Entwicklungsteam, Test/QS, Betrieb sowie gegebenenfalls Nutzer ein. Jedes Kick-off verdient eine individuelle Agenda, aber ein paar Themen geh&#246;ren in jedem Fall dazu:</p><ul class=„rtelist rtelist–unordered“><li>Fachlich/organisatorisch verantwortliche Personen sollten den wirtschaftlichen oder fachlichen Zweck des Systems in Kurzform darstellen.</li><li>Technisch versierte Personen (etwa: Architekten, Entwicklungsleitung) sollten die Architektur des Systems beziehungsweise wesentliche Subsysteme und fundamentale technische Entscheidungen aufzeigen.</li><li>Jemand sollte das Entwicklungsvorgehen skizzieren, von Anforderungen &#252;ber Implementierung/Test, Build, Deployment und Release.</li></ul><p>In dieser Runde l&#228;sst sich eine erste qualitative Analyse des Systems durchf&#252;hren, also Probleme bez&#252;glich konkreter Qualit&#228;tsanforderungen suchen.</p><h3 class=„subheading“ id=„nav_kern_der_sache_4“>Kern der Sache</h3><p>Zentrale Aufgabe &#252;blicher Reviews ist die Suche nach Problemen, und die finden sich an ganz unterschiedlichen Stellen &#8211; auch jenseits vom reinen Quellcode. Tabelle 1 zeigt einige typische Bereiche, in denen man bei der Suche f&#252;ndig wird.</p><section class=„a-inline-table“><table class=„a-inline-tabletable“><tbody><tr><td class=„heise-table-subtitle c2“>Bereich</td><td class=„heise-table-subtitle c2“>Was zu untersuchen ist</td></tr><tr><td class=„c3“>Architektur</td><td class=„c3“>interne Struktur &amp; Modularisierung (Komponenten, Subsysteme), interne Schnittstellen &amp; Abh&#228;ngigkeiten, Kopplung, Koh&#228;sion, Konsistenz (&#8222;Homogenit&#228;t&#8220;)</td></tr><tr><td class=„c3“>Code</td><td class=„c3“>Strukturierung, Komplexit&#228;t, &#196;nderungsh&#228;ufigkeit, Verst&#228;ndlichkeit, Kopplung, Einheitlichkeit</td></tr><tr><td class=„c3“>Technologie</td><td class=„c3“>Eingesetzte Basistechnologie, 3rd-Party-Produkte/-Frameworks</td></tr><tr><td class=„c3“>Qualit&#228;t</td><td class=„c3“>Erreichung von Qualit&#228;tsanforderungen, etwa bez&#252;glich Performance, &#196;nderbarkeit, Robustheit, Benutzbarkeit, Betreibbarkeit</td></tr><tr><td class=„c3“>Kontext</td><td class=„c3“>Externe Schnittstellen, externe Datenquellen und -senken, Benutzerrollen</td></tr><tr><td class=„c3“>Infrastruktur</td><td class=„c3“>Verwendete Hardware/Infrastruktur, Prozessoren, Netzwerke, Speichermedien, Topologie</td></tr><tr><td class=„c3“>Daten</td><td class=„c3“>Datenstrukturen, Datenbanken, Datenbanksysteme, Korrektheit und Volatilit&#228;t von Daten, Verteilung/Replikation, Backup</td></tr><tr><td class=„c3“>Laufzeitverhalten</td><td class=„c3“>Laufzeit- und Speicherverhalten, allgemeine Ressourcennutzung, Bottlenecks</td></tr><tr><td class=„c3“>Entwicklungsprozess</td><td class=„c3“>Der Weg von Anforderungen zur laufenden Umsetzung, Requirements- und Change-Management, Entwicklung, Test, Build, Deployment, Versionsmanagement</td></tr><tr><td class=„c3“>Dokumentation</td><td class=„c3“>Das ungeliebte Thema vieler Entwicklungsteams. Zu viel oder zu wenig Dokumentation, Aktualit&#228;t/Korrektheit und Akzeptanz, Auffindbarkeit, Konsistenz</td></tr><tr><td class=„c3“>Management</td><td class=„c3“>Umgang mit Zeit und Budget, Ressourcenplanung, Organisation der gesamten Entwicklung</td></tr></tbody></table></section><p>Die Beteiligten sollten bei Reviews stets in der Breite suchen. Das hei&#223;t, sie stellen m&#246;glichst zu allen der in Tabelle 1 aufgef&#252;hrten Themen Fragen. Die Erfahrung aus Dutzenden von Reviews zeigt, dass gravierende Probleme in Systemen definitiv nicht auf Code und Kopplung beschr&#228;nkt sind, sondern dass manchmal die wirklich schlimmen Dinge an ganz anderen Stellen lauern. St&#228;ndig wechselnde Priorit&#228;ten bei Anforderungen sowie den Zwang zur Nutzung veralteter Datenstrukturen oder Datenbanken seien hier als Beispiele aufgef&#252;hrt.</p><p>Es gibt neben dem Entwicklungsteam noch eine Reihe weiterer Personen oder Organisationen, die Ausk&#252;nfte &#252;ber das System und seine Eigenschaften respektive Probleme geben k&#246;nnen. Diese kennen St&#228;rken und Schw&#228;chen aus erster Hand, erleben Probleme und profitieren von St&#228;rken &#8211; das sind f&#252;r einen Review wertvolle Informationen.</p><p>Da das Review als Breitensuche durchgef&#252;hrt wird, sollte auch die Auswahl der Interviewpartner in die Breite gehen. Hier sollte man beispielsweise mit folgenden Gruppen sprechen:</p><ul class=„rtelist rtelist–unordered“><li>Nutzer</li><li>fachlich Verantwortliche (etwa: Vertreter der Fachbereiche)</li><li>technisch Verantwortliche (etwa: Architekten)</li><li>Auftraggeber, Management</li><li>Beteiligte aus dem Entwicklungsteam. Bei gr&#246;&#223;eren Systemen mit mehreren gro&#223;en Subsystemen oder Komponenten eine Mischung aus mehreren Teams</li><li>Test/Qualit&#228;tssicherung, falls nicht Teil des Entwicklungsteams</li><li>Personen aus Infrastruktur und/oder Betrieb</li><li>Projekt- und Produkt-Manager</li><li>in agilen Organisationen: Product Owner, Scrum Master oder Agile Coach</li></ul><p>Es empfiehlt sich, in Interviews offene Fragen zu stellen, die ganze S&#228;tze als Antworten erfordern, und Ja- beziehungsweise Nein-Fragen zu vermeiden. Ratsam ist auch, nach Problemen, Schwierigkeiten und besonders aufwendigen oder langwierigen Aktivit&#228;ten im Zusammenhang mit dem System zu fragen, genauso wie nach Dingen oder Aspekten, die Personen unbedingt beibehalten m&#246;chten.</p><p>Schlie&#223;lich empfiehlt der Autor, auch nach denkbaren Abhilfen der genannten Probleme zu fragen, um die Kreativit&#228;t der Interviewpartner herauszufordern:</p><ul class=„rtelist rtelist–unordered“><li>Was w&#252;rden diese tun, wenn sie eine Woche lang die gesamte Entwicklung beliebig steuern d&#252;rften?</li><li>Was w&#228;ren die Top-3-&#196;nderungen am System, dem Entwicklungsprozess oder der Organisation, wenn sie das bestimmen d&#252;rften?</li></ul><p>Zum Abschluss eines Interviews ist hilfreich, sich zu erkundigen, welche Fragen vermisst wurden. Das gibt den interviewten Personen die Gelegenheit, noch ganz andere Themen anzusprechen.</p><p>Interviews sollte man am besten zu zweit f&#252;hren. Wenn ein Duo im Wechsel fragt und mitschreibt, dann kann sich die fragende Person besser auf Gestik, Mimik und Verhalten der anderen konzentrieren und ist nicht st&#228;ndig durch Mitschreiben abgelenkt. Man sollte Bemerkungen markieren, die weitere Analysen oder Nachpr&#252;fungen erfordern, und sich bei Bedarf weitere Ansprechpersonen nennen lassen, die mehr Informationen zu bestimmten Themen haben. Die Interviews sollten auf 60 bis 90 Minuten begrenzt sein, und bei Bedarf sollte man lieber Folgetermine vereinbaren. Zwischen zwei solcher Interviews sollten Interviewer f&#252;r sich selbst 15 Minuten Pause einplanen, damit sie kurz reflektieren, ihre Notizen kennzeichnen und sich f&#252;r das nachfolgende Interview mental sammeln k&#246;nnen.</p><h3 class=„subheading“ id=„nav_externe5“>Externe Schnittstellen</h3><p>Reviewer sollten die Au&#223;enwelt des Systems analysieren, also dessen externe Schnittstellen. Dazu ist erst mal sicherzustellen, dass sie &#252;berhaupt s&#228;mtliche Au&#223;enschnittstellen kennen &#8211; gerade in Business-Informationssystemen k&#246;nnen das oft mehrere Dutzende sein. <a href=„https://docs.arc42.org/section-3/“ rel=„external noopener“ target=„_blank“><strong>Ein Kontextdiagramm mag hier helfen [2]</strong></a> &#8211; und falls es keines gibt, gibt es schon einen hilfreichen Verbesserungsvorschlag.</p><p>Welche dieser externen Schnittstellen verursachen im laufenden Betrieb Probleme? Hier sind m&#246;glicherweise die Verantwortlichen der Nachbarsysteme zu befragen, weil das System ja eventuell bei anderen Probleme verursacht. Wie schaut es mit eventuellen Service-Level Agreements dieser Schnittstellen bez&#252;glich Verletzungen aus? Externen Schnittstellen im laufenden Betrieb „auf die Finger“ zu schauen, funktioniert &#252;ber die Untersuchung von Logfiles oder Monitoring nach Auff&#228;lligkeiten. Letztlich gilt es, die Implementierung externer Schnittstellen durch gezielte Code-Reviews zu &#252;berpr&#252;fen.</p><p>Besonderes Augenmerk ben&#246;tigen solche externen Schnittstellen, deren Nutzung direkte Kosten verursacht (etwa: Aufrufe kostenpflichtiger Dienste) oder deren Definition oder Spezifikation sich h&#228;ufig &#228;ndert.</p><h3 class=„subheading“ id=„nav_qualit&#228;t_im6“>Qualit&#228;t im Griff?</h3><p>Reviewer sollten untersuchen, inwieweit das System seine Qualit&#228;tsanforderungen erf&#252;llt oder welche Qualit&#228;tseigenschaften nicht angemessen erreicht werden. Offensichtlich m&#252;ssen sie dazu erst mal die Qualit&#228;tsanforderungen genau kennen: In vielen Jahren Review-Praxis hat der Autor nur wenige Systeme erlebt, bei denen es eine halbwegs aktuelle &#220;bersicht davon gab. Meist war die spezifischen Qualit&#228;tsanforderungen im Rahmen des Reviews erst aufzuarbeiten.</p><p>Zum Gl&#252;ck gibt es daf&#252;r im Software- und Requirements Engineering etablierte Methoden, beispielsweise <a href=„https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=5177“ rel=„external noopener“ target=„_blank“><strong>ATAM [3]</strong></a>, die sich in Reviews in vereinfachter Form anwenden lassen. Zur Beschreibung von Qualit&#228;tsanforderungen verwendet der Autor sogenannte Szenarien (s. Abb. 3). Sie beschreiben in Umgangssprache, wie das System sich bei bestimmten Ereignissen verhalten soll. Falls das zu abstrakt klingt &#8211; in Tabelle 2 finden sich einige Beispiele.</p><figure class=„a-inline-image a-u-inline“><div><figcaption class=„a-caption“>Szenarien erkl&#228;ren Qualit&#228;tsanforderungen (Abb. 3)</figcaption></div></figure><section class=„a-inline-table“><table class=„a-inline-tabletable“><tbody><tr><td class=„heise-table-subtitle c2“>Eigenschaft</td><td class=„heise-table-subtitle c2“>Ausl&#246;ser</td><td class=„heise-table-subtitle c2“>Reaktion</td></tr><tr><td class=„c3“>Performance</td><td class=„c3“>Nutzer fordert den Monatsreport der Kostenstelle xyz an.</td><td class=„c3“>Das System erzeugt den Report innerhalb von 3 Sekunden.<br />&#160;</td></tr><tr><td class=„c3“>Performance</td><td class=„c3“>Produktsuche mit Standardkriterien (Artikelbezeichnung/-nummer)<br />&#160;</td><td class=„c3“>Dauert maximal 500 ms bis zur Anzeige der ersten 5 Treffer<br />&#160;</td></tr><tr><td class=„c3“>Robustheit, Fehlertoleranz</td><td class=„c3“>Das externe System xyz antwortet mehr als 3 Sekunden lang nicht mehr.<br />&#160;</td><td class=„c3“>Das System meldet diesen Fehler innerhalb von 30 Sekunden an den &#8222;Administrator vom Dienst&#8220;.<br />&#160;</td></tr><tr><td class=„c3“>Flexibilit&#228;t, &#196;nderbarkeit</td><td class=„c3“>Der Fachbereich fordert eine &#196;nderung des xyz-Tarifs im System.</td><td class=„c3“>Diese &#196;nderung l&#228;sst sich innerhalb von 4 Stunden im System umsetzen.</td></tr></tbody></table></section><p>Mit solchen konkreten Qualit&#228;tsanforderungen gestaltet sich die Analyse relativ einfach: Gemeinsam mit Architekten oder dem Entwicklungsteam untersuchen Reviewer, ob das System oder dessen Architektur die definierten Szenarien (= Qualit&#228;tsanforderungen) erf&#252;llen kann. Hierzu sollte man sich die zugeh&#246;rigen Architekturentscheidungen und -ans&#228;tze erl&#228;utern lassen. Hier hilft, gemeinsam mit den Beteiligten aus dem Entwicklungsteam diese Szenarien in Form von Walkthroughs durchzuspielen, m&#246;glichst detailliert und feingranular. Und es ist herauszufinden, wie die Bausteine des Systems zum Erreichen dieses Szenarios zusammenspielen und welche Entwurfsentscheidungen das jeweilige Szenario unterst&#252;tzen. Dabei kann man sich einen Eindruck verschaffen, wie sicher sich die jeweiligen Qualit&#228;tsanforderungen erreichen lassen.</p><p>Aus Erfahrung bekommen Reviewer bereits in den Interviews viele Hinweise, welche Qualit&#228;tseigenschaften im System die meisten Probleme bereiten, sodass die detaillierte Analyse im Grunde die Best&#228;tigung (oder Widerlegung) der ge&#228;u&#223;erten Defizite darstellt.</p><h3 class=„subheading“ id=„nav_architektur7“>Architektur pr&#252;fen</h3><p>Bevor der Artikel auf Details zu diesem wichtigen Aspekt von Reviews eingeht, eine kurze Zusammenfassung, was unter dem Begriff „Softwarearchitektur“ zu verstehen und was demzufolge unter der Rubrik Architektur zu untersuchen ist. Es geht um folgende Aspekte:</p><ul class=„rtelist rtelist–unordered“><li>interne Struktur des Systems: die Modularisierung, den Schnitt des Systems, die Zerlegung in Subsysteme oder Komponenten. Idealerweise entspricht dieser Schnitt der fachlichen Struktur, neudeutsch der Dom&#228;nenstruktur. Hierzu z&#228;hlt auch das gro&#223;e Thema der internen Schnittstellen.</li><li><a href=„https://docs.arc42.org/section-8/“ rel=„external noopener“ target=„_blank“><strong>querschnittliche Konzepte [4]</strong></a>: Vorgaben zu Themen, die &#252;bergreifenden Charakter besitzen und sicherstellen, dass die Implementierung des Systems passenden Regeln folgt. Beispiele sind Aufbau und Gestaltung von Benutzungsschnittstellen (UI), Mechanismen zur Persistenz, Monitoring/Logging, Integration von Fremdsystemen.</li></ul><p>&#220;ber die Pr&#252;fung der internen Struktur gibt es ganze B&#252;cher [1] &#8211; kurz gefasst m&#252;ssen Architekten dazu intensiv in den Code schauen (oder f&#252;r ganz Mutige: Der hoffentlich vorhandenen Dokumentation glauben &#8211; wovon dringend abzuraten ist). Vermutlich ist der Code eines Systems jedoch so umfangreich, dass man f&#252;r das Review lieber ein Analysewerkzeug (wie Sonargraph, Structure-101, ReSharper, Sotograph oder Lattix), einsetzt, dass aus dem Code eine &#220;bersicht von Komponenten und deren Abh&#228;ngigkeiten erzeugen kann. Die Abbildungen 4 und 5 zeigen zwei Beispiele solcher Analysen. Architekten bleibt die anspruchsvolle Aufgabe, diese grafischen Darstellungen zu interpretieren: Sind diese Komponentenstruktur respektive diese Abh&#228;ngigkeiten angemessen f&#252;r das System? Wo besteht zu enge Kopplung, und stellt die wirklich ein Problem dar?</p><figure class=„a-inline-image a-u-inline“><div><figcaption class=„a-caption“>SotoArc-Analyse von Paketstrukturen (Abb. 4)</figcaption></div><p class=„a-captionsource“>(Bild:&#160;Hello2Morrow)</p></figure><figure class=„a-inline-image a-u-inline“><div><figcaption class=„a-caption“>Sotograph-Analyse von infoglue (Abb. 5)</figcaption></div><p class=„a-captionsource“>(Bild:&#160;Carola Lilienthal)</p></figure><h3 class=„subheading“ id=„nav_code_reviews_8“>Code-Reviews</h3><p>Mit der Analyse der Softwarearchitektur rein auf Grundlage des vorhandenen Quellcodes ist es leider nicht getan. Es ist ein Irrglaube, dass alle Informationen im Code stehen. Das klingt zun&#228;chst kontraintuitiv. Was sollte wichtiger sein als Quellcode? Nachfolgend finden sich ein paar (m&#246;gliche) Gr&#252;nde, warum andere Dinge noch wichtiger sein k&#246;nnten:</p><ul class=„rtelist rtelist–unordered“><li>M&#246;glicherweise hat man eine hervorragend strukturierte, nach allen Regeln der Kunst durchgef&#252;hrte Implementierung einer &#228;u&#223;erst schlechten Idee vor sich, zum Beispiel weil es f&#252;r den gleichen Einsatzzweck bessere, fertige Komponenten gibt.</li><li>Vielleicht w&#252;rde der ein oder andere problematische oder vielleicht sogar besonders elegante Teil der Software gar nicht ben&#246;tigt, wenn man eine technische Anforderung hinterfragen w&#252;rde.</li><li>Manchmal befindet sich ein gro&#223;er Teil der wichtigen Information nicht in „klassischem“ Quellcode, sondern in Konfigurationsdateien oder „Glue-Code“, der auf den ersten Blick gar nicht ins Auge f&#228;llt.</li><li>Vielleicht ist die Laufzeitarchitektur des Systems &#228;u&#223;erst elegant, f&#252;hrt aber zu enormen Herausforderungen im Entwicklungsprozess &#8211; oder andersherum.</li><li>Unter Umst&#228;nden spielt die Aufteilung in verschiedene Teilkomponenten in einem verteilten System eine viel gr&#246;&#223;ere Rolle als die Implementierung der einzelnen Systeme.</li><li>Vielleicht entstehen Probleme durch eine suboptimale Aufteilung zwischen Hardware- und Softwarekomponenten (besonders bei Embedded-Systemen) oder durch eine verbesserungsw&#252;rdige Verwendung von Standardsoftware.</li></ul><p>Die genannten F&#228;lle unterscheiden sich sehr, und das ist ein spannender Aspekt von Reviews: Man muss sich in das System hineindenken und es aus unterschiedlichen Perspektiven hinterfragen. Es gibt leider kein Standardrezept, und auch die m&#228;chtigen Analysewerkzeuge k&#246;nnen nur einen Teil der m&#246;glichen Probleme aufdecken.</p><p>Dennoch sollte Reviewer Code analysieren, weil sie damit eine Reihe gravierender Probleme finden k&#246;nnen: schwer verst&#228;ndliche Teile, verursacht durch &#252;berm&#228;&#223;ige Gr&#246;&#223;e oder komplizierte Implementierung, Abweichungen von Code-Konventionen oder schlicht handwerklich schlecht implementierte Teile. Es gibt Code, der verschwenderisch mit CPU oder Speicher umgeht, Stellen ohne automatisierte Tests oder Passagen, die von den vereinbarten Architekturkonzepten abweichen.</p><p>Viele solcher Probleme lassen sich mit statischer Codeanalyse herausfinden. SonarQube, TeamScale, ReSharper oder Checkstyle seien hier als Beispiele f&#252;r Tools genannt. Zu achten ist bei solchen statischen Analysen besonders auf negative Ausrei&#223;er bei Codekomplexit&#228;t (etwa: zyklomatische Komplexit&#228;t) oder Kopplung. Ganz wesentlich bleibt bei Code-Reviews allerdings die menschliche Expertise und Einsch&#228;tzung.</p><h3 class=„subheading“ id=„nav_hotspot_analyse_9“>Hotspot-Analyse</h3><p>Eine besonders hilfreiche Art der Code-Analyse sollten Reviewer auf jeden Fall durchf&#252;hren &#8211; die Hotspot-Analyse: Ein Hotspot ist ein Baustein, der h&#228;ufig ge&#228;ndert wird und gleichzeitig eine hohe innere Komplexit&#228;t besitzt. Die &#196;nderungsh&#228;ufigkeit l&#228;sst sich aus der Versionsverwaltung, Git, Subversion und Co. abfragen, die Komplexit&#228;t von Code relativ einfach &#252;ber statische Analysen messen. Adam Tornhill hat in seinem Buch [2] entsprechende Analysewerkzeuge als Open Source ver&#246;ffentlicht. Ein Beispiel solcher Hotspot-Analysen zeigt Abbildung 6.</p><p>Hotspot-Analysen finden hochgradig riskante Teile eines Systems: Komplexe Stellen besitzen ein sehr hohes Fehler- und &#196;nderungsrisiko, und sind tendenziell auch viel aufw&#228;ndiger in der Wartung. Das kombiniert mit hoher &#196;nderungsfrequenz ist fast schon eine Garantie, dass bei diesen Bausteinen gravierende Probleme auftreten werden!</p><figure class=„a-inline-image a-u-inline“><div><figcaption class=„a-caption“>Beispiel f&#252;r eine Hotspot-Analyse (Abb. 6)</figcaption></div></figure><h3 class=„subheading“ id=„nav_anwendungsdaten_10“>Anwendungsdaten</h3><p>Die zuverl&#228;ssige Speicherung und Bereitstellung von Daten geh&#246;ren f&#252;r die meisten Anwendungen zu den Kernaufgaben. Die Daten einer Anwendung leben oft l&#228;nger als der Quellcode. Quellcode l&#228;sst sich vergleichsweise einfach erweitern, refaktorieren oder auf eine neue Framework-Version anpassen, Bugfixes lassen sich meist relativ einfach deployen, fehlerhafte oder verlorene Daten dagegen nur schwer und aufwendig reparieren. &#196;nderungen an den Strukturen eines produktiven Datenbestands sind oftmals zeitintensiv und erfordern sorgf&#228;ltige Planung. Fehler in der Datenmodellierung werden Teams entsprechend l&#228;nger verfolgen. Auch der Wechsel einer Datenbank ist teuer und zeitintensiv. Ein Wechsel von MySQL zu PostgreSQL ist aufwendig, weil alle datenbankspezifischen Funktionen zu finden und zu ersetzen sind. Ein Wechsel von MongoDB auf MySQL noch aufwendiger, weil er einen kompletten Wechsel des Datenmodells und des Schemamanagements erfordert. Im Rahmen des Reviews ist es die Aufgabe herauszufinden, ob die Auswahl der datenspeichernden Systeme, die Modellierung der Daten und ihre &#220;bermittlung, Transformation und Qualit&#228;t den Erfordernissen der jeweiligen Anwendung entspricht.</p><p>Deswegen sollte man sich zuerst einen &#220;berblick &#252;ber alle datenspeichernden Komponenten sowie der dazu eingesetzten Software verschaffen. Passen die verwendeten Datenmodelle und -strukturen noch zur aktuellen Dom&#228;ne? Oder werden die aktuellen Business-Daten in irgendwelche historischen Strukturen „gequetscht“? Werden Daten redundant gehalten oder h&#228;ufig synchronisiert? Gibt es Integrationsdatenbanken &#8211; die heute eher als Anti-Pattern gelten? Gibt es Problemen mit Antwortzeiten bei Abfragen? Laufen manche Anfragen extrem lange oder extrem h&#228;ufig?</p><h3 class=„subheading“ id=„nav_garbage_in11“>Garbage-in …</h3><p>Danach gilt es, den Blick vom Code respektive der Technik hin zu den Entwicklungsprozessen, und dabei konkret auf die Anforderungen zu werfen: Gibt es f&#252;r das System ein vern&#252;nftiges, angemessenes Requirements Engineering &#8211; oder purzeln Change-Requests rein zuf&#228;llig auf das Entwicklungsteam? Gibt es einen ordentlich gepflegten Backlog, der den Namen auch verdient?</p><p>Auf Basis mangelhafter Anforderungen mit st&#228;ndig wechselnden Priorit&#228;ten k&#246;nnen auch hervorragende Entwicklungsteams keine gute Software produzieren &#8211; eben „garbage in, garbage out“. Typische Schwierigkeiten mit Anforderungsprozessen sind etwa folgende:</p><ul class=„rtelist rtelist–unordered“><li>Unklarheit &#252;ber das Gewollte: Anforderungen bleiben vage, unpr&#228;zise, grob. Das Resultat: Entwicklungsteams implementieren stark konfigurierbare Systeme und verschieben damit die Entscheidungen &#252;ber die konkrete Bedeutung von Anforderungen auf die Laufzeit.</li><li>Die Involvierten wollen dauernd etwas anderes: Hohe Volatilit&#228;t in Anforderungen, sodass Entwicklungsteams h&#228;ufig umbauen m&#252;ssen.Verschiedene Stakeholder fordern widerspr&#252;chliche Dinge: Das k&#246;nnen verschiedene Anforderungen an Daten, Validierungs- oder Gesch&#228;ftsregeln bis hin zu unterschiedlichen Algorithmen sein.</li><li>Anforderungen ben&#246;tigen innerhalb der gesamten Organisation zu lange, bis sie beim Entwicklungsteam landen. Es gibt zu viele beteiligte Personen, zu viele Gremien oder zu viele Abstimmungsprozesse.</li></ul><h3 class=„subheading“ id=„nav_layer_8_probleme_12“>Layer-8-Probleme</h3><p>Sicherlich hat jedes Team schon mal Abstimmungs- oder Kommunikationsprobleme durchlitten &#8211; und solche k&#246;nnen gravierende Auswirkungen auf die betroffenen Systeme haben. Im Rahmen der Reviews sollte man auch die betroffenen Arbeitsprozesse und die (Team-)Kommunikation untersuchen: Wo gibt es Know-how-Flaschenh&#228;lse? Ist die Entscheidungskompetenz angemessen verteilt? Gibt es ausreichend Feedback zwischen den Beteiligten? Gibt es gen&#252;gend Freiraum und gen&#252;gend Festlegungen? Reviewer sollten innerhalb von Entwicklungsprozessen nach Aufgaben suchen, an denen ungeb&#252;hrlich viele Personen beteiligt sind, die unangemessen lange dauern oder mit denen Stakeholder sonstige Probleme berichten.</p><p>Alle arbeiten unter Zeit- und/oder Budgetdruck &#8211; das allein kann erst mal nicht als „Ursache aller Probleme“ gelten. Allerdings k&#246;nnen Organisationen beziehungsweise Entwicklungsteams diesen Druck leicht &#252;bertreiben. Deswegen ist der Blick auf Entwurfs- und Testprozesse, Build/Release und Deployment, aber auch organisatorische und betriebliche Themen wichtig. Sind Agilit&#228;t und DevOps wirklich umgesetzt, oder bleibt es beim Lippenbekenntnis? Gibt es automatisierte Tests, und finden diese &#252;berhaupt relevante Fehler?</p><p>Bis hierhin wurde schon in vielen Ecken des Systems nach Problemen gesucht &#8211; aber Probleme sind ungeheuer erfinderisch und verstecken sich auch an anderen Stellen: Bisher hat der Artikel zum Beispiel die technische Infrastruktur respektive Hardware ausgeklammert, das Monitoring/Logging oder auch das leidige Thema Dokumentation. Zu Beginn hatte der Autor die Breitensuche ins Spiel gebracht &#8211; nun ist zu entscheiden, ob man bereits in ausreichender Breite gesucht hat oder ob es f&#252;r das konkrete System noch weitere Analysen geben sollte. <a href=„https://leanpub.com/software-reviews“ rel=„external noopener“ target=„_blank“><strong>Im Buch des Autors und einigen seiner Kollegen [5]</strong></a> finden sich noch ein paar Vorschl&#228;ge.</p><h3 class=„subheading“ id=„nav_resultate13“>Resultate kommunizieren</h3><p>Am Ende eines Reviews steht normalerweise ein Abschlussbericht, der in einer Pr&#228;sentation den beteiligten Personen vorgestellt wird. Das m&#246;glicherweise wichtigste Resultat des gesamten Reviews ist dabei eine kompakte Zusammenfassung („Management Summary“). Sie sollte maximal drei Handlungsempfehlungen mitsamt Herleitungen darlegen und erst zum Schluss verfasst werden, wenn die Resultate feststehen.</p><p>Neben der Zusammenfassung sollte die Pr&#228;sentation Erkl&#228;rungen enthalten, wie die Ergebnisse zustande gekommen sind und wie sie sich belegen lassen. Es empfiehlt sich, die gefundenen Probleme in drei Kategorien einzuteilen: schlimm (hohe Mehrkosten oder starke Verz&#246;gerungen), mittel (Kosten oder Verz&#246;gerungen) und st&#246;rend. Entsprechend dieser Priorit&#228;ten sollte man Verbesserungs- oder Abhilfema&#223;nahmen vorschlagen. Vergessen sollten Reviewer auch nicht, das Gute ausdr&#252;cklich zu benennen, das sie vorgefunden haben: gute Entscheidungen, gute Strukturen, gute Prozesse &#8211; dar&#252;ber freuen sich Auftraggeber und das Entwicklungsteam.</p><header class=„a-boxheader“ data-collapse-trigger=„“>Rezept f&#252;r die Abschlusspr&#228;sentation</header><div class=„a-boxtarget a-boxcontent a-inline-textboxcontent a-inline-textboxcontent-container“ data-collapse-target=„“><p>Gem&#228;&#223; dem nachfolgenden Vorschlag k&#246;nnen Reviewer ihre Abschlusspr&#228;sentation oder ihren Abschlussbericht aufbauen.</p><ol class=„boxtitel“><li>Eine kurze, sehr pr&#228;gnante Management-Summary (Hinweise dazu im Text).</li><li>Zusammenfassung organisatorischer Aspekte des Reviews:<ul><li>Was genau waren die Ziele und Scope des Reviews?</li><li>Welche Beschr&#228;nkungen gibt es?</li><li>Wie wurde vorgegangen? Wie viel Zeit wurde (circa) worin investiert?</li><li>Mit wem hat wer wor&#252;ber gesprochen, inklusive Daten und Dauer?</li><li>Welche Aktivit&#228;ten waren neben Gespr&#228;chen und Interviews Bestandteil des Reviews?</li></ul></li><li>Welche Aspekte am System und dessen Entwicklung waren positiv zu bewerten (keep, don't change)?</li><li>Eine Zusammenfassung der Probleme und Risiken, Top-down beschreiben<ul><li>In welchen Kategorien waren Probleme und Risiken zu finden?</li><li>Welche Probleme gab es, beginnend mit den h&#246;chsten Priorit&#228;ten (also die schlimmsten, gravierendsten Probleme zuerst)?</li><li>Wo drohen Risiken?</li><li>Welche Auswirkungen sind zu erwarten oder sind bereits akut?</li></ul></li><li>Zusammenfassung der vorgeschlagenen Ma&#223;nahmen (optional)<ul><li>In welchen strategischen, technischen oder organisatorischen Bereichen sind Ma&#223;nahmen zu empfehlen?</li><li>Welche unterschiedlichen Optionen gibt es?</li></ul></li></ol></div><h3 class=„subheading“ id=„nav_fazit_14“>Fazit</h3><p>Mit Reviews lassen sich Probleme im System und dessen Umfeld systematisch und zuverl&#228;ssig identifizieren. Das ben&#246;tigt zwar etwas Zeit, birgt aber sehr hohes Nutzenpotenzial. Die gute Nachricht: Die meisten Analysen lassen sich ohne den Einsatz teurer oder komplizierter Werkzeuge durchf&#252;hren &#8211; mit Hirn, Erfahrung und Motivation. Hauptsache, man sucht in der Breite.</p><p><em>Gernot Starke</em></p><p><em>ist INNOQ Fellow. Er verbessert und entwickelt Softwarearchitekturen. Au&#223;erdem ist er Mitgr&#252;nder und Betreiber der <a href=„http://aim42.github.io/“ rel=„external noopener“ target=„_blank“><strong>„Architecture Improvement Method“ aim42 [6]</strong></a>, des Architekturportals arc42, sowie aktives Mitglied im iSAQB e.V. Teile dieses Artikels basieren auf dem Buch „<a href=„https://leanpub.com/software-reviews“ rel=„external noopener“ target=„_blank“><strong>Software-Reviews [7]</strong></a>“, das Starke zusammen mit Markus Harrer, Christine Koppelt und Benjamin Wolf verfasst hat.</em></p><h5 id=„nav_literatur_15“>Literatur</h5><ol class=„rtelist rtelist–ordered“><li>Carola Lilienthal; Langlebige Softwarearchitekturen; dpunkt.verlag 2020 (3. Aufl.)</li><li>Adam Tornhill; Your Code as a Crime Scene: Use Forensic Techniques to Arrest Defects, Bottlenecks, and Bad Design in Your Programs; Pragmatic Bookshelf 2015</li></ol><p>() </p><hr /><p><strong>URL dieses Artikels:</strong><br /><small><code>https://www.heise.de/-4990332</code></small></p><p><strong>Links in diesem Artikel:</strong><br /><small><code><strong>[1]</strong>&#160;https://shop.heise.de/ix-developer-moderne-softwarearchitektur-2020/Print</code></small><br /><small><code><strong>[2]</strong>&#160;https://docs.arc42.org/section-3/</code></small><br /><small><code><strong>[3]</strong>&#160;https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=5177</code></small><br /><small><code><strong>[4]</strong>&#160;https://docs.arc42.org/section-8/</code></small><br /><small><code><strong>[5]</strong>&#160;https://leanpub.com/software-reviews</code></small><br /><small><code><strong>[6]</strong>&#160;http://aim42.github.io/</code></small><br /><small><code><strong>[7]</strong>&#160;https://leanpub.com/software-reviews</code></small><br /><small><code><strong>[8]</strong>&#160;mailto:ane@heise.de</code></small><br /></p><p class=„printversioncopyright“><em>Copyright &#169; 2020 Heise Medien</em></p> </html>

Cookies helfen bei der Bereitstellung von Inhalten. Diese Website verwendet Cookies. Mit der Nutzung der Website erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Computer gespeichert werden. Außerdem bestätigen Sie, dass Sie unsere Datenschutzerklärung gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information