Moderne Softwareentwicklung
Transcription
Moderne Softwareentwicklung
Moderne Softwareentwicklung Zusammenfassung Ingo Grebe Juni 2014 Quelle: MVA – Moderne Softwareentwicklung Link: http://www.microsoftvirtualacademy.com/training- courses/moderne-softwareentwicklung Autor: Thomas Schissler Moderne Softwareentwicklung Das Dokument ist eine Zusammenfassung des MVA Kurses „Moderne Softwareentwicklung“. Autor des Kurses ist Thomas Schissler. Der Kurs kann unter folgenden Link absolviert werden: http://www.microsoftvirtualacademy.com/training-courses/moderne-softwareentwicklung Inhalt 1 Überblick ......................................................................................................................................... 4 1.1 Waste – Verschwendung ......................................................................................................... 4 1.1.1 2 1.2 Qualität .................................................................................................................................... 6 1.3 Effektive Team-Arbeit.............................................................................................................. 6 Projektmanagement ........................................................................................................................ 7 2.1 Scrum ....................................................................................................................................... 7 2.1.1 3 Bedarfsgerechte Lösungen .............................................................................................. 4 Product Owner ................................................................................................................ 8 2.2 Agiles Projektmanagement mit TFS ........................................................................................ 9 2.3 Agiles Anforderungsmanagement ......................................................................................... 10 2.4 Mehrere Teams / Mehrere Projekte ..................................................................................... 11 2.5 Release-Monitoring ............................................................................................................... 11 2.5.1 BPMN-Prozess ............................................................................................................... 11 2.5.2 Schätzung der Szenarien ............................................................................................... 12 2.5.3 Schätzen des Fertigstellungsgrades............................................................................... 12 Testmanagement........................................................................................................................... 14 3.1 Test-Management mit dem TFS ............................................................................................ 14 3.2 Wie entsteht Qualität? .......................................................................................................... 14 3.3 Team Organisation ................................................................................................................ 15 3.4 Automatisiertes Testen ......................................................................................................... 15 3.4.1 Unit-Testing ................................................................................................................... 15 3.4.2 Load & Performance Tests ............................................................................................ 16 3.5 Exploratives Testen ............................................................................................................... 16 Seite 2 / 28 Moderne Softwareentwicklung 4 5 Projektkommunikation .................................................................................................................. 16 4.1 Anforderungen verstehen – Bedarfsgerechte Lösungen ...................................................... 16 4.2 Stakeholder einbeziehen ....................................................................................................... 17 4.3 Kommunikation im Projekt.................................................................................................... 18 4.3.1 Feedback Client ............................................................................................................. 18 4.3.2 Storyboarding Tool ........................................................................................................ 18 4.3.3 Kommunikation zwischen Deveoplment Team und Product Owner ............................ 18 4.4 Kommunikation und Wissensverteilung im Team ................................................................ 18 4.5 Team Rooms .......................................................................................................................... 19 Erweiterbare Architektur............................................................................................................... 19 5.1 Testbare Architektur ............................................................................................................. 20 5.1.1 Software-Architektur ..................................................................................................... 20 5.1.2 Komponentenorientierte Architektur ........................................................................... 21 5.1.3 Legacy-Code .................................................................................................................. 22 5.2 Modelle im Agilen Kontext .................................................................................................... 22 5.3 Agile Architektur .................................................................................................................... 23 5.3.1 6 Continous Delivery & Dev Ops ...................................................................................................... 23 6.1 8 Build-Measure-Learn ............................................................................................................. 24 6.1.1 Release Management 2013 ........................................................................................... 24 6.1.2 Measure – Feedback und Telemetry ............................................................................. 25 6.2 7 Architektur-Tools in Visual Studio ................................................................................. 23 Fehler in der Produktivumgebung finden ............................................................................. 26 Entwickler-Produktivität................................................................................................................ 26 7.1 Versionskontrollsystem ......................................................................................................... 26 7.2 Visual Studio IDE Features ..................................................................................................... 27 7.3 Performance Tools ................................................................................................................ 27 Team Power................................................................................................................................... 27 Seite 3 / 28 Moderne Softwareentwicklung 1 Überblick Moderne Softwareentwicklung besteht aus: Anforderungsmanagement Qualitätssicherung Stakeholder (Kunden) einbeziehen App-Telemetrie: Verstehen, wie die Software verwendet wird. Verstehen, womit die Kunden Probleme haben. Continous Delivery: Interne Prozesse, um kurze Zyklen zu ermöglichen durch hohen Automatisierungsgrad. Erweiterbare Architektur: Schlüsselelement, um gewachsene Produkte effizient weiter zu entwickeln. Entwickler-Produktivität: Steigerung der Produktivität durch besseres Verstehen der Entwicklertools. Developer Operations: Grenze zwischen operativen Betrieb von Software und der Entwicklung. Es geht z.B. um das Deployment (Software zur Produktion bringen) und das effiziente Zurückleiten von Problemfällen. Moderne Softwareentwicklung benötigt einen guten Mix aus Tools: TFS (für Test-Automatisierung) Prozesse: SCRUM Praktiken: Clean Code, Unit-Testing, TDD 1.1 Waste – Verschwendung Alles was das Projekt oder das Team nicht weiterbringt, aber trotzdem getan wird ist Waste. Waste kann durch drei Aspekte identifiziert, reduziert oder sogar vermieden werden: Bedarfsgerechte Lösungen: Kundenorientiert Software entwickeln: Nur das entwickeln, was Kunde braucht. Man muss sich auf die Aspekte konzentrieren, die mehr Kundennutzen generieren. Qualität optimieren: Die Software macht was sie soll ohne Fehler. Effiziente Teamarbeit 1.2 Bedarfsgerechte Lösungen In der klassischen Softwareentwicklung wird mit einem ausgereiften Plan entwickelt. Dies funktioniert nicht wirklich, weil nicht das Produkt entsteht, welches sich der Anwender tatsächlich vorgestellt hat. Daher wurde Build-Measure-Learn eingeführt, um bedarfsgerechte Lösungen zu entwickeln. Seite 4 / 28 Moderne Softwareentwicklung Dabei wird möglichst schnell eine Funktionalität umgesetzt, dem Kunden präsentiert und „gemessen“, ob das Ergebnis dem Kundenwunsch entspricht bzw. ob der Kundennutzen möglichst hoch ist. Es wird nicht durch langes Nachdenken fertige Software entworfen. Vielmehr werden durch kleine Experimente in Zusammenarbeit mit dem Kunden Funktionalitäten erstellt, die im Gesamten die fertige Software ergeben. Anders gesagt: Früher hat man sich ein Feature überlegt und dieses mit all seinen Möglichkeiten implementiert und anschließend dem Kunden präsentiert. Heute wird das Feature mit so wenig Möglichkeiten wie nötig implementiert und dem Kunden präsentiert. Anschließend wird mit dem Kunden gemeinsam besprochen, welche zusätzlichen Möglichkeiten noch implementiert werden müssen. Sequentielle Entwicklung vs. Überlappende Entwicklung In der modernen Softwareentwicklung werden immer kürzere Release-Zyklen angestrebt. Früher wurde ein Produkt alle ein bis zwei Jahre veröffentlicht. Heut zu Tage gibt es Zyklen von vier oder sogar zwei Wochen. Dies ist möglich wenn man sich von der sequentiellen Entwicklung löst und eine parallele Entwicklung durchführt. Sequentielle Entwicklung (Wasserfall-Methode): Überlappende Entwicklung (Scrum): Die agile Entwicklung (oder inkrementelle Entwicklung) ermöglicht ab einem bestimmten Zeitpunkt die (qualitativ hochwertige) minimale Funktionalität der Software zu präsentieren. Bei der WasserfallMethode ist dies nicht möglich. Hier kann erst zum Entwicklungsende die komplette Funktionalität präsentiert werden. Dadurch ermöglicht die inkrementelle Entwicklung eine schnellere Markteinführung: Als erster mit einem neunen Produkt auf dem Markt sein Schnell reagieren können, wenn der Markt sich verändert Man könnte die minimale Funktionalität als Basis nehmen und dem Kunden zur Verfügung stellen. Der Kunde kann damit bereits arbeiten und erhält in kurzen Zyklen weitere Funktionen. Seite 5 / 28 Moderne Softwareentwicklung 1.3 Qualität Entscheidend für die Qualität ist die Effizienz. Je später ein Fehler gefunden wird, desto aufwendiger ist es diesen zu beheben. Man muss bereits beim Entwicklungsprozess eine hohe Qualität ins Produkt einbauen. Dies ist möglich nach dem Einchecken beim Buildprozess. Dort sollte man schon 70% bis 90% Qualität erreicht haben. Die restlichen 30% bis 10% ergeben sich durch ausgelagertes Testen. Bisher war es so, dass nach der Implementierung das Testing begonnen wurde und die Testabteilung für die Qualitätssicherung zuständig war. Davon muss man sich lösen. Die Entwickler müssen Verantwortung übernehmen und ins Testing mit aufgenommen werden. Im Idealfall gibt es keine Unterscheidung mehr zwischen Tester und Entwickler. 1.4 Effektive Team-Arbeit Viele Teams sind eher Arbeitsgruppen aber keine richtigen Teams. Jeder hat seinen Arbeitsbereich und kümmert sich nicht um die Arbeitsbereiche anderer Mitglieder. Das darf nicht sein. Jeder muss in (fast) allen Bereichen arbeiten können. Dadurch entsteht automatisch eine gegenseitige Kontrolle. Durch die gemeinsame Entwicklung der Features ergänzen sich die Talente/Fähigkeiten (z.B. einer entwickelt langsam aber achtet auf Qualität und der zweite entwickelt schnell achtet aber nicht auf Qualität) der Teammitglieder. Unterm Strich ergibt dies ein besseres Produkt. Seite 6 / 28 Moderne Softwareentwicklung 2 Projektmanagement 2.1 Scrum Scrum ist ein Prozessframework. Es definiert keinen Prozess. Es stellt Praktiken zur Verfügung, um einen Prozess zu definieren. Dwight D. Eisenhower: „Ein Plan ist nichts, Planung ist alles“ Es geht nicht darum einem festen Plan zu folgen. Es geht darum durch kontinuierliche Anpassung des Plans zu sehen, was aus heutiger Sicht möglich ist und wie auf bestimmte Situationen reagiert werden kann. Es kommt auf den Planungsprozess an sich an. In Scrum gibt es drei Rollen: Product Owner: Er sorgt dafür, dass das Development Team mit seinem Einsatz den maximalen Kundennutzen erzielt. Der Product Owner ist genau eine Person. o Er kennt alle PBIs. o Er sortiert die PBIs nach ihrer Wichtigkeit. Development Team: Das Team besteht aus allen Personen, die der Product Owner benötigt, um die Anforderungen umzusetzen. Dazu gehören z.B. Softwareentwickler, Architekten und Tester. Das Team ist selbstorganisiert. Es gibt keine Person außerhalb des Teams, die es leitet. Alle haben die gleichen Rechte und Pflichten. o Arbeitet das Product Backlog von oben nach unten ab. Scrum Master: Er ist ein Coach für den Product Owner und das Development Team. Er unterstützt beide Rollen darin ihre Aufgaben bestmöglich zu erledigen und sich weiter zu entwickeln. Er sorgt dafür, dass die Scrum Regeln eingehalten werden. Ein Release ist ein lauffähiger Softwarestand zu einem bestimmten Zeitpunkt. Es muss keine Auslieferungsversion sein. Es kann z.B. auch ein interner Meilenstein sein. In einem Release gibt es folgende Scrum Artefakte: Product Backlog: Enthält die Anforderungen, die in einem Release realisiert werden sollen. Product Backlog Item (PBI): Eine Anforderung im Backlog. Release Planning Meeting: Hier werden die PBIs besprochen. Dadurch kann es passieren, dass PBIs genauer beschrieben werden, oder aber auch verworfen werden. Backlog Refinement Meeting: Findet ca. alle zwei Wochen statt. Hier wird die Weiterentwicklung des Backlogs besprochen. Es werden neue PBIs vorgestellt und die Sortierung des Backlogs besprochen. Impediments: Dinge, die den Product Owner oder das Development Team davon abhalten, ihre Arbeit mit maximaler Performanz zu erledigen. Wenn beide Rollen die Impediments nicht abstellen können, dann wird der Scrum Master zur Hilfe hinzugezogen. Release Burndown (oder Burnup): Wird genutzt um den Stand des Releases zu dokumentieren. Sprints: Kurze Iterationen von ca. 30 Tagen. Fester Zeitabschnitt. Ein Sprint endet dann, wenn die Zeit abgelaufen ist und nicht wenn die gesetzten Anforderungen abgearbeitet sind. Sprint Planning 1: Product Owner und Development Team entscheiden, welche PBIs im Sprint 1 bearbeitet werden sollen. Hierbei fliest die Sortierung des Backlogs mit ein. Die Anzahl der zu bearbeiteten PBIs im Sprint 1 wird vom Development Team festgelegt. Sprint Planning 2: Das Development Team erstellt eine Realisierungsvision. Es bespricht, wie die PBIs umgesetzt werden können und erstellt dafür Tasks. Daily Scrum: Das Team arbeitet danach in einem täglichen Rhythmus. Der Tag beginnt mit einem Daily Scrum Meeting. Es werden die abgearbeiteten Tasks und PBIs, sowie die als nächstes abzuarbeiteten Tasks vorgestellt. Es wird geprüft, ob das Sprintziel erreicht werden Seite 7 / 28 Moderne Softwareentwicklung kann. Es wird besprochen, ob es Probleme im Team gibt, die sofort gelöst werden können oder ob ein Impediment angelegt werden muss. Sprint Burndown: Eine Kurve, die den weiteren Verlauf der Tasks im Verhältnis zur Zeit angibt. Sie lässt erkennen, ob die Tasks rechtzeitig abgearbeitet werden können. Definition of Done: Wird vom Development Team in Rücksprache mit dem Product Owner für jedes PBI erstellt. Es gibt an, wann ein PBI definitiv abgearbeitet ist (keine Restarbeiten mehr notwendig sind). Dazu gehören unter anderem Testläufe und Codereviews. Increment: Ergebnis des Softwareprodukts nach Ablauf des Sprints. Sprint Review: Das Development Team präsentiert dem Product Owner und den Stakeholdern das Ergebnis des Sprints. Darauf basierend besprechen Product Owner und Stakeholder, wie es mit dem Produkt im nächsten Sprint weitergeht. Daraus ergeben sich wichtige Informationen für das nächste Sprint Planning 1 und Sprint Planning 2. Sprint Retrospective: Hierbei treffen sich Product Owner, Development Team und Scrum Master und besprechen, wie der letzte Sprint verlaufen ist (positives, negatives, verbesserungswürdiges). 2.1.1 Product Owner Die Produktvision des Product Owners ist entscheidend dafür, ob der Nutzen, den das Development Team erzielen kann, hoch oder niedrig ist. Setzt er die falschen Schwerpunkte, dann hat er eine falsche oder schlechte Produktvision. Dies führt dazu, dass das Scrum Team mit dem Projekt scheitert oder zumindest nicht den maximal möglichen Erfolg erzielt. Er muss mit dem Development Team kommunizieren und die Sicht der Anwender vermitteln. Damit im Development Team klar ist, wie später mit der Software gearbeitet werden soll und wie sich die Kunden die Software vorstellen und welche Erwartungshaltung sie haben. Er muss die PBIs priorisieren und Entscheidungen auf Rückfragen vom Development fällen. Er muss mit den Stakeholdern kommunizieren, um den aktuellen Projekt-Status zu vermitteln und den Unternehmens-Nutzen zu maximieren. Er muss verstehen, worauf es den Stakeholdern ankommt. Er muss mit möglichst vielen potentiellen Anwendern kommunizieren, um zu verstehen wie die Anwender die Software einsetzen möchten und wodurch ein Kunden-Nutzen entsteht. Er muss die Neuerungen zu den Anwendern tragen und Feedback einholen. Seite 8 / 28 Moderne Softwareentwicklung 2.2 Agiles Projektmanagement mit TFS Das Agile Projektmanagement kann mit dem TFS 2012 durchgeführt werden. Backlog Management Es gibt zwei Elementarten für das Backlog o Product Backlog Item: Neue Anforderung o Bug: Korrektur bestehender Anforderung Schätzung und Forecasts (Vorhersagen) Für jedes Element gibt es einen Effort (Aufwandschätzung). Dieser wird z.B. in Storypoints gemessen. Es geht nicht darum Tage oder Stunden anzugeben. Es geht darum eine Möglichkeit zu haben, den Aufwand der verschiedenen Elemente im Backlog zu unterscheiden. o Planning Poker: Mittels Planning Poker werden im Development Team die Storypoints für ein PBI vergeben. Jedes Teammitglied schreibt eine Anzahl an Storypoints auf eine Karte. Alle decken ihre Karte zeitgleich auf. Der mit der höchste Zahl und der mit der niedrigsten Zahl müssen erklären, warum sie sich für diese Anzahl entschieden haben. Anschließend gibt es eine zweite Runde, in der alle ihre Karten erneut ausfüllen und aufdecken. Die am meisten vorhandene Zahl wird dann als Effort genommen. Man hat eine Ansicht, wie viele Storypoints in den vergangenen Iterationen abgearbeitet wurden. Man kann eine Vorhersage einschalten, um abzuschätzen welche PBIs in den nächsten Sprints abgeschlossen werden. Dafür kann man einen Velocity-Wert (Geschwindigkeit) einstellen, um zu sagen, wie viele Storypoints in Zukunft pro Iteration abgearbeitet werden. Seite 9 / 28 Moderne Softwareentwicklung Empirisches Projektmanagement Scrum basiert auf empirischen Betrachtungen. Es wird versucht aus der Vergangenheit eine Prognose für die Zukunft zu erstellen. Projektion der Vergangenheit zur Vorhersage der Zukunft Messung des Fortschritts um Prognosen den aktuellen Gegebenheiten anzupassen Sprintplanung Anhand der Vorhersagen können die PBIs den Sprints zugeordnet werden. Durch das Sprint Planning 2 ergeben sich Tasks zu den PBIs, die dann im Sprintbacklog zu den PBIs angelegt werden. Zu jedem Task kann Remaining Work (verbleibende Arbeit in Stunden) angegeben werden. Zu jedem Sprintbacklog gibt es eine Board-Ansicht. Hier werden die Tasks als Zettel repräsentiert und dem Status ToDo, In Progress oder Done zugeordnet. Die Board-Ansicht bietet zu jeder Zeit jedem im Development Team einen Überblick über die Tasks, die erledigt sind, die gerade bearbeitet werden und die noch zu erledigen sind. Damit ist das Board ein wichtiges Werkzeug für das Daily Scrum Meeting. Es kann ein Sprint-Burndown eingeblendet werden. Dieses zeigt eine Kurve, wie sich der Arbeitsaufwand im weiteren Sprintverlauf verändert (steigt oder fällt). Kapazitätsplanung Anhand der Angabe der verbleibenden Stunden in jedem Task zeigt der TFS an, ob die Arbeit noch im Sprint vollendet werden kann. Dies wird durch folgende Angaben berechnet: Dauer des Sprints (in Tagen) Kapazität (Capacity) der einzelnen Teammitglieder pro Tag. Es werden Stunden angegeben, die ein Teammitglied pro Tag effektiv am Projekt arbeiten kann. Zusätzlich können pro Mitglied Urlaubs-/Krankheitstage (Days Off) angegeben werden. Sowie Feiertage im Sprint fürs gesamte Team (Team Days Off). 2.3 Agiles Anforderungsmanagement Beim Agilen Anforderungsmanagement geht es darum, dass Anforderungen unterschiedlich detailliert beschrieben werden. Anforderungen werden zunächst sehr grob beschrieben. Je dichter sie an den Augenblick der Abarbeitung rücken, desto detaillierter werden sie beschrieben. Dies hat den Vorteil, dass das Backlog zunächst recht klein ist und sich erst im Laufe der Zeit ausdehnt bzw. erst dann, wenn es tatsächlich um die Umsetzung geht. Eine Anforderung wird als komplexes (grob geschriebenes) PBI erstellt [blaues Dreieck]. Wenn die Umsetzung näher rückt, dann kann dieses PBI in mehrere PBIs heruntergebrochen werden [orangenes Dreieck]. Kurz vor der Implementierung werden dann detailliertere PBIs angelegt [Kreis]. Seite 10 / 28 Moderne Softwareentwicklung 2.4 Mehrere Teams / Mehrere Projekte Um mit mehreren Teams im TFS zu arbeiten gibt es ein Master Backlog. Aus dem Master Backlog werden die Anforderungen auf die Team Backlogs verteilt. Dadurch ist ein Load Balancing möglich. Um Anforderungen aus mehreren Projekten abzuarbeiten, wird für jedes Produkt ein Backlog erstellt. Der Product Owner fasst die Anforderungen aus den einzelnen Produkt Backlogs in einem gemeinsamen Backlog (oder Team Backlog) zusammen. Dadurch kann die Wichtigkeit der Entwicklung der unterschiedlichen Produkte festgelegt werden. 2.5 Release-Monitoring 2.5.1 BPMN-Prozess In einem Softwareprodukt gibt es bestimmte Arbeitsabläufe. Diese können mittels BPMN (Business Process Modelling Notation) visuell relativ leicht dargestellt werden. In so einer Notation kann man darstellen, welche Teilfunktionen bereits umgesetzt wurden. Dadurch kann der Fortschritt der Implementierung eines Arbeitsablaufes dokumentiert werden. Seite 11 / 28 Moderne Softwareentwicklung 2.5.2 Schätzung der Szenarien Hat man mehrere Anwenderszenarien mittels BPMN dargestellt, dann kann man anhand der Komplexität der einzelnen Szenarien im Verhältnis zueinander sagen, wie sich die Entwicklungszeit über die Release-Dauer verteilt. Es geht an dieser Stelle nicht darum feste Zeiträume mittels Sprint Planning zu definieren, sondern Zeiträume anhand der Komplexität der einzelnen Szenarien im Verhältnis zueinander festzulegen. Daraus ergeben sich Fragen an den Product Owner und die Stakeholder über den Nutzen der einzelnen Szenarien: Wie groß ist der Nutzen der Szenarien im Verhältnis zueinander (Invest)? Ist der Nutzen von Szenario 1 genau so groß wie der Nutzen von Szenario 2, 3 und 4 zusammen? 2.5.3 Schätzen des Fertigstellungsgrades Aus diesen Schätzungen kann für jedes Szenario der Fertigstellungsgrad geschätzt werden. Anhand des Sprintbacklogs ist die erledigte Arbeit eines Szenarios bekannt. Anhand des Sprintbacklogs ist die geplante Arbeit (die PBIs) eines Szenarios bekannt. Da nicht nach Wasserfall-Methode gearbeitet wird und daher zu Beginn des Releases nicht jede Anforderung durchgeplant wird, bleibt etwas ungeplante Arbeit übrig. Diese kann geschätzt werden. Hat man für jedes Szenario die Fertigstellung geschätzt, dann kann man dies als Release Monitoring grafisch darstellen (Scenario Fulfillment). Anhand dieser Grafik sieht man pro Szenario wieviel bereits fertig ist, wieviel am Ende des Sprints abgeschlossen ist und wieviel Arbeit noch übrig ist. In Absprache mit dem Product Owner kann dann festgelegt werden, wie die restliche Arbeit auf die einzelnen Szenarios aufgeteilt wird. Seite 12 / 28 Moderne Softwareentwicklung Mittels Release Burndown (Scenarios Progress) Grafik kann diskutiert werden, wie die Releaseziele erreicht werden können. Die Lösung, dass die Entwickler schneller arbeiten oder Überstunden machen müssen darf nicht angestrebt werden. Seite 13 / 28 Moderne Softwareentwicklung 3 Testmanagement 3.1 Test-Management mit dem TFS Akzeptanztests Zu jedem Backlog Item werden Akzeptanzkriterien angegeben, die beschreiben unter welchen Voraussetzungen das Backlog Item als erfüllt gilt. Die Akzeptanzkriterien werden vom Product Owner aufgestellt. Ein Akzeptanztest stellt sicher, dass die Akzeptanzkriterien erfüllt sind. Akzeptanztests können schon vor Beginn der Implementierung definiert werden. Sie stehen dann dem Entwickler als Implementierungsgrundlage zur Verfügung. Dieses Vorgehen nennt sich ATDD (Aceptance Test Driven Development). Anhand der Beschreibung der Akzeptanztests weiß der Entwickler, wie der Arbeitsablauf sein soll, welche Steuerelemente in der Oberfläche existieren sollen, usw. 3.2 Wie entsteht Qualität? In der klassischen Softwareentwicklung entsteht Qualität durch testen. Tester führen Tests aus und stellen somit sicher, ob das Produkt wie gewünscht funktioniert. Problematisch bei diesem Ansatz ist jedoch, dass ein Tester im Normalfall keine Ahnung davon hat, wie die Software im Inneren aussieht. Es werden so genannte „Black Box“ Tests ausgeführt. Das bedeutet, dass der Tester nur Tests von Außen ausführen kann und das innere der Software nicht kennt. Bei der modernen Softwareentwicklung entsteht die Qualität bereits in der Implementierungsphase. Beim Entwickeln wird auf die Qualität geachtet und somit wird die Qualität fest ins Produkt eingebaut. Zur Qualität gehören: Korrektheit der Funktionalität Codequalität Berücksichtigung von Sonderfällen und Szenarien, die anhand der Codestruktur erkennbar sind und nicht direkt von Außen anhand der Benutzeroberfläche erkennbar sind. Erstellung von Unit-Tests während der Entwicklung (und nicht im Nachhinein). Durch die Beachtung der Qualität während der Entwicklung ergibt sich ein qualitativ hochwertiger Code. Dies führt zu einer fehlerarmen Software mit weniger Risiko, dass bestimmte Fehlerfälle übersehen werden. Um die Qualität während der Entwicklung zu erreichen sind drei Aspekte relevant: Team Organisation: Organisation des Entwicklerteams und festlegen wie Tests erfolgen Test Automatisierung: Besonders wichtig für Agiles Testen Mindset: Entwickler müssen umdenken, um sich stärker für die Qualität verantwortlich zu fühlen. Sie müssen sich mit neuen Werkzeugen vertraut machen, um die maximale Qualität während der Implementierungsphase zu erreichen. Seite 14 / 28 Moderne Softwareentwicklung 3.3 Team Organisation In klassischen Organisationen sind Entwickler Team und QS Team voneinander getrennt. Es ist ein hoher Kommunikationsaufwand nötig: Dev:Build -> Qs:Test -> Qs:Bug Report -> Dev: Bug Fix -> Dev:Build -> Qs:Test Zudem fehlt beim Entwickler Team meist die Verantwortung für die Qualität, da es noch jemanden gibt, der die Qualität sicherstellen soll. Daher konzentrieren sich die Entwickler darauf, möglichst schnell neue Funktionen bereit zu stellen. Vermischt man Entwickler Team und QS Team bzw. bringt sie in einen Raum, dann verringert sich der Kommunikationsaufwand erheblich, da sich ein Entwickler und ein Tester zusammensetzen können und einen gefunden Bug direkt beheben können: Dev:Build -> Qs:Test -> Qs&Dev: Bug Fix Im Idealfall erweitern Entwickler und Tester ihre Fähigkeiten. Dadurch werden Entwickler auch zu Testern und Tester werden auch zu Entwicklern. Somit ist es möglich, dass ein Entwickler seinen eigenen Code oder den eines Kollegen testet. Außerdem ist es möglich, dass ein Tester einen gefundenen Bug selbst behebt. 3.4 Automatisiertes Testen Unit-Tests können automatisch beim Build vom TFS durchgeführt werden. Dadurch wird der Entwickler umgehen auf Fehler hingewiesen. Ebenso ist es möglich Integrationstests, UI-Tests und Load & Performance Tests automatisch auszuführen. Unit-Test: Ein Unit-Test testet eine Methode Integrationstest: Ein Integrationstest testet mehrere Methoden im Zusammenspiel 3.4.1 Unit-Testing Unit-Tests bieten wesentliche Vorteile: Verändern das Qualitäts-bewusstsein der Entwickler: Entwickler machen sich mehr Gedanken über den Code. Gehören zur Implementierung Machen Entwickler effizienter: Durch das Schreiben von Unit-Tests ist es wesentlich einfacher die Korrektheit von Funktionen beim Entwickeln zu testen. Es ist nicht mehr nötig die gesamte Seite 15 / 28 Moderne Softwareentwicklung Anwendung zu starten und eine bestimmte Oberfläche aufzurufen, um eine Funktion daraus zu testen. Unit-Tests benötigen bestimmte Voraussetzungen: Architektur: Eine ungünstige Architektur erschwert die Erstellung von Unit-Tests. Mindset: Entwickler müssen sich überwinden die ersten Unit-Tests zu schreiben. Um diese Hürde einfacher zu gestalten, kann man ein Belohnungssystem einführen. Practices: Es gibt bestimmte Praktiken, die immer wieder angewendet werden müssen. Dies ist zum Beispiel der Fall, wenn Werte in eine Datenbank geschrieben werden müssen oder Werte von externen Maschinen eingelesen werden müssen. 3.4.2 Load & Performance Tests Durch die automatische Ausführung von Load & Performance Tests behält man die Übersicht, wie sich Codeänderungen (sowohl negativ als auch positiv) auf die Speicher- und CPU-Nutzung auswirken. Entscheidend ist, dass man tagesaktuell weiß, ob sich etwas verschlechtert hat und kann rechtzeitig eingreifen. Mit Hilfe von Load & Performance Tests können Funktionen beliebig oft wiederholt ausgeführt werden. Dadurch ist es möglich Memory Leaks zu finden. Memory Leaks sind in Produktionsumgebungen schwer zu finden, da sie nur sporadisch auftreten. 3.5 Exploratives Testen Beim Explorativen Testen wird die Anwendung geöffnet und beliebige Funktionalitäten getestet. Durch Verwendung des Microsoft Test Managers können die Aktivitäten in der Anwendung (Klicks, Eingaben, …) aufgezeichnet werden. Diese Zusatzinformationen ermöglichen es dem Entwickler den Fehler möglichst schnell nachzustellen. 4 Projektkommunikation 4.1 Anforderungen verstehen – Bedarfsgerechte Lösungen In der klassischen Projektkommunikation übermitteln die Stakeholder dem Product Owner ihre Anforderungen. Der Product Owner trägt diese ins Backlog ein. Die Entwickler bauen die Anforderungen in die Software ein. Seite 16 / 28 Moderne Softwareentwicklung Unter Berücksichtigung von Build-Measure-Lern wird eine Feedbackschleife eingebaut. Nach jedem Inkrement wird die Working Software den Stakeholdern und dem Product Owner vorgestellt. Nur durch die Kenntnis über den aktuellen Softwarestand ist es Stakeholdern und Product Owner tatsächlich möglich Entscheidungen bzgl. Wichtigkeit und Komplexität ihrer Anforderungen zu treffen. 4.2 Stakeholder einbeziehen Das Entwicklerteam sollte sich stets die Fragen stellen: Bauen wir wirklich Funktionen die unsere Anwender benötigen? Oder bauen wir Funktionen von denen wir glauben, dass sie benötigt werden? Daher darf es nicht sein, dass sich Entwickler vor der Verantwortung drücken und die Anforderungen einfach runter programmieren. Sie müssen sich bewusst Gedanken machen und bei Unklarheiten mit dem Product Owner oder den Stakeholdern Kontakt aufnehmen. Stakeholder Die Stakeholder sind alle Personen, die ein Interesse an dem Ergebnis haben, ohne direkt an der Umsetzung beteiligt zu sein: Management Marketing / Sales Kunden / Key-User Außendienst Operations (Leute, die die Software später Betreiben bzw. Betreuen müssen) Trainings (Leute, die für die Software Schulungen anbieten) Support Selbst wenn der Wille da ist mit den Stakeholdern zu kommunizieren gibt es oftmals Probleme, die das Einholen von Feedback erschweren: Priorität bei Stakeholdern: Stakeholder haben oftmals wichtigeres zu tun, als sich um unsere Software zu kümmern. Deployment-Aufwand: Stakeholdern muss es möglichst einfach gemacht werden eine neue Programmversion zu installieren bzw. zu starten. Je aufwendiger dieser Vorgang für einen Stakeholder ist, desto weniger wahrscheinlich ist es, dass er Zeit findet die neue Version zu begutachten. Seite 17 / 28 Moderne Softwareentwicklung Feedback verwalten: Je mehr Feedback die Stakeholder liefern, desto genauer können Entwickler die Anforderungen umsetzen. Gibt es kein Feedback, dann führt dies vermutlich zu einem Produkt, das nicht den Wünschen der Stakeholder entspricht. Unklare Anforderungen und Best Guess: Sind die Anforderungen für einen Entwickler unklar, dann setzt meistens das „Best Guess“ Prinzip ein. Der Entwickler beginnt dann zu erahnen, was die Stakeholder wünschen und setzt die Funktionen um, ohne mit den Stakeholdern Rücksprache zu halten. Sprach- und Domain-Barrieren: Oftmals kommt es auch zu Kommunikationsproblemen, weil Stakeholder, Anwender und Entwickler andere Landesprachen oder Fachsprachen verwenden. 4.3 Kommunikation im Projekt 4.3.1 Feedback Client Der TFS bietet im Webaccess die Aktivität „Request Feedback“ (Feedback einholen). Diese ist besonders für den Product Owner von Bedeutung. Es können mehrere Stakeholder ausgewählt werden. Anschließend gibt man die Applikation, für die man Feedback erhalten möchte, an und weitere Informationen wie z.B. Anmeldedaten. Abschließend beschreibt man noch, wofür man Feedback haben möchte und schickt das Feedback raus. Im Hintergrund wird ein Feedback Request Item angelegt. Die gewählten Stakeholder erhalten eine EMail. In der E-Mail gibt es einen Link, über den das Feedback Tool installiert werden kann und einen Link, über den eine Feedback Session gestartet werden kann. Der Stakeholder hat dann die Möglichkeit Texte, Audiokommentare, Screenrecordings und Screenshots als Feedback zu sammeln. Im TFS Webaccess taucht das Feedback des Stakeholders auf. Zu diesem Feedback Request Item kann dann ein Product Backlog Item generiert werden. 4.3.2 Storyboarding Tool Mit Power Point 2013 und Visual Studio gibt es in Power Point ein neues Menü „Storyboarding“. Mittels Storyboarding ist es relativ leicht möglich Vorstellungen über Funktionen auf der Programmoberfläche darzustellen. Es geht nicht darum die Oberfläche bis ins Detail darzustellen. Storyboards können mit PBIs verknüpft werden und so dem Product Owner zur Verfügung gestellt werden. Sie können auch als E-Mail an Stakeholder verschickt werden. 4.3.3 Kommunikation zwischen Deveoplment Team und Product Owner Immer wenn sich ein Entwickler die Frage stellt, wie er etwas implementieren soll, dann muss er Rücksprache mit dem Product Owner halten. Im Idealfall geschieht dies immer in einem kurzen Gespräch von Angesicht zu Angesicht. Wenn dies nicht möglich ist, dann muss die Kommunikation mittels E-Mail oder einem Issue Workflow Item im TFS gehen. Um Issue Workflow Items im TFS zu verwalten bedarf es etwas Konfigurationsaufwand. 4.4 Kommunikation und Wissensverteilung im Team Um die Zusammenarbeit im Team zu verbessern gibt es einige Praktiken, die angewendet werden können: Pair Programming: Zwei Entwickler sitzen vor dem Rechner und erarbeiten eine Lösung. Daily Scrum: Meeting, bei dem man Hilfe aufgedrängt bekommt, weil man ggf. das gesamte Team blockiert. Code Reviews: Sehr effektiv, weil entweder der Reviewer oder der Schreiber etwas dazu lernt. Seite 18 / 28 Moderne Softwareentwicklung Swarming: Alle Entwickler „schwärmen“ um ein PBI herum. Also alle Entwickler beschäftigen sich mit einem PBI. Dadurch sind alle gedanklich auf einer Ebene und die Kommunikation ist wesentlich besser. Wenn sich die Entwickler allerdings auf den Füßen stehen, weil ein PBI nicht genug Arbeit bzw. Tasks hergibt, dann werden einige Entwickler auf das nächste PBI gesetzt. Cross Functional Teams: Es gibt keine Spezialisten für bestimmte Funktionalitäten im Team. Jeder Entwickler ist in der Lage mit den verwendeten Programmiermethoden zu arbeiten. Shared Code Ownership: Es gibt keine Codebereiche, die einem Entwickler alleine gehören. Findet ein Entwickler einen Bug in einem Codebereich, den er nicht selbst geschrieben hat, dann sollte er diesen trotzdem lösen. Dadurch ergibt sich ein indirektes Code Review. Retrospektiven: Sehr effizient, weil sich das Team damit auseinandersetzt, was man im Team verbessern kann. Dabei muss es nicht nur um Arbeitsabläufe gehen, sondern es können auch soziale Probleme im Team zur Sprache kommen. Wissensvermittlung: Besonders wichtig, um Cross Functional Teams zu erhalten. Wissensvermittlung ist möglich z.B. durch Coding Dojos, Code Reviews im gesamten Team und Sessions zur Einführung von neuen Werkzeugen. 4.5 Team Rooms Team Rooms im TFS sollen verhindern, dass Entwickler von Kollegen häufig gestört werden. Damit ein Entwickler nicht alle Kollegen im Raum durch irgendwelche Neuigkeiten unterbricht, kann er diese Neuigkeiten im Team Room posten. Dort können die Entwickler, wenn sie kurz Zeit haben, reinschauen und sich einen Überblick verschaffen, was gerade im Team los ist. Team Rooms sollen aber auf keinen Fall die Fact-To-Face Kommunikation bei wichtigen Themen ersetzen. 5 Erweiterbare Architektur Beim klassischen Architektur Ansatz müssen alle Anforderungen an das Software System bekannt sein. Aus diesen Anforderungen entsteht dann die Architektur. Dies funktioniert in agilen Projekten nicht. Denn man beginnt mit einigen Anforderungen, die dann in jeder Iteration weiter ausgebaut werden. Somit arbeitet man in jeder Iteration PBIs ab, die sich über alle Schichten hinweg erstrecken können. Daraus ergibt sich das Vorurteil, das in agilen Projekten auf einem Fundament aufgesetzt wird, dass die gesamte Anwendung im späteren Verlauf nicht mehr tragen kann. Dies ist aber falsch, denn man ist jederzeit in der Lage das Fundament zu korrigieren oder sogar auszutauschen. Ziele moderner Architektur Wartbar Testbar: Der Code wird mittels automatisierter Tests getestet. Seite 19 / 28 Moderne Softwareentwicklung Erweiterbar: Der Aufwand neue Funktionen hinzuzufügen ist minimal. Ob eine Architektur wartbar und erweiterbar ist lässt sich oft erst nach einigen Monaten messen. Als Faustregel kann man aber sagen, dass eine gut testbare Architektur auch wartbar und erweiterbar ist. 5.1 Testbare Architektur Damit eine Architektur gut testbar ist gilt als oberstes Ziel Entkopplung. Dafür gibt es verschiedene Pattern und Praktiken: Single Responsibility: Eine Codestelle sollte immer nur eine Sache tun. Es sollte immer nur einen Grund geben diese Codestelle zu ändern. MVVM / MVC: Entkopplung der Business Logik von der Oberfläche. POCOs (Plain Old Clr Objects): Helfen Applikationsmodule zu entkoppeln und Abhängigkeiten zu vermeiden. Es soll verhindert werden, dass bestimmte Datentypen einer UI-Komponente (oder einer Datenzugriff-Komponente) über mehrere Schichten hinweg verwendet werden. Zwischen den Schichten sollte mit POCOs kommuniziert werden. Denn diese stehen auch dann noch zur Verfügung, wenn eine UI-Komponente (oder eine Datenzugriff-Komponente) gegen eine andere ausgetauscht wird. Sackgassen-Methoden: Methoden, die keine Aufrufe nach Außen haben und daher unabhängig sind. Trennung Daten, Orchestrierung, Logik: Es werden nur Klassen verwendet, die entweder Properties oder Methoden haben. Dies erleichtert die Entkopplung und die Testbarkeit. Komponentenorientierung IoC Interfaces 5.1.1 Software-Architektur Software-Architektur erstreckt sich über drei Ebenen: Code-Ebene: Jede Zeile Code kann die Architektur beeinflussen. Technologien: Bestimmte Technologien ermöglichen bestimmte Architekturen. Modelle: UML-Diagramme Code-Ebene Hier gibt es fünf bekannte Design Prinzipien, die angewendet werden sollen: Single Responsibility: Es sollte nie mehr als einen Grund geben, eine Klasse zu ändern. Somit sollte jede Klasse nur eine Verantwortung haben. Open/closed Principle: Eine Klasse sollte offen sein für Erweiterungen, aber verschlossen sein für Änderungen. Somit sollte jede Klasse erweitert werden können (z.B. durch Vererbung) aber ohne dabei ihr Verhalten zu ändern. Liskov Substitutability Principle: Eine Instanz einer abgeleiteten Klasse muss sich so verhalten, dass jemand, der meint, ein Objekt der Basisklasse vor sich zu haben, nicht durch unerwartetes Verhalten überrascht wird, wenn es sich dabei tatsächlich um ein Objekt eines Subtyps handelt. Interface Segregation Principle: Clients sollten nicht dazu gezwungen werden, von Interfaces abzuhängen, die sie nicht verwenden. Es geht darum große Interfaces in mehrere kleine Interfaces aufzuteilen, damit Clients nur mit Interfaces agieren müssen, die das können, was die Clients benötigen. Dependency Inversion Principle: A. Module hoher Ebenen sollten nicht von Modulen niedriger Ebenen abhängen. Beide sollten von Abstraktionen abhängen. B. Abstraktionen sollten nicht von Details abhängen. Details sollten von Abstraktionen abhängen. Abhängigkeiten sollten immer von konkreteren Modulen niedriger Ebenen zu abstrakten Modulen höherer Ebenen gerichtet sein. Seite 20 / 28 Moderne Softwareentwicklung 5.1.2 Komponentenorientierte Architektur Der Code setzt sich aus verschiedenen Komponenten zusammen, die Nachrichten untereinander austauschen. Die Form der Nachrichten wird mittels Data Contract beschrieben. Die Funktionen, die eine Komponente nach Außen zur Verfügung stellt wird mittels Operation Contract beschrieben. Ein Data Contract wird im Code mittels einer Klasse, die aus Properties besteht, beschrieben. Ein Operation Contract wird mittels Interface beschrieben. Spaghetti-Code Besonders ungünstig zu testen ist Spaghetti-Code. Hierbei gibt es eine große Methode, die die gesamte Funktionalität enthält. Spaghetti-Code ist nur durch aufwendige Integrations-Tests testbar. Wendet man das SOLID-Prinzip auf den Spaghetti-Code an, dann erhält man mehrere Funktionen. Allerdings sind diese voneinander abhängig und man kann auch wieder nur mit Integrations-Tests testen. Diese können aber einfacher gestaltet werden als beim Spaghetti-Code. Die ideale Struktur verwendet eine Orchestrierungsschicht, die sogenannte Sackgassen-Methoden aufruft. Sackgasse-Methoden verwenden intern keine andere Methode und sind somit nicht von Seite 21 / 28 Moderne Softwareentwicklung anderen Methoden abhängig. Daher lassen sich Sackgassen-Methoden sehr gut mit Unit-Tests testen. Die Orchestrierungsschicht muss mittels Integrations-Test getestet werden, da es darum geht, ob die Schicht die einzelnen Sackgassen-Methoden korrekt miteinander verknüpft. 5.1.3 Legacy-Code Oft ist es schwierig Design Pattern in bestehenden, gewachsenen Code (Legacy-Code) einzuführen. Entwickler tendieren dann dazu den Greenfield-Ansatz zu wählen. Es soll der bestehende Code verworfen werden und mit neuen Technologien und neuer Architektur aufgebaut werden. Es gibt mehrere Probleme beim Greenfield-Ansatz: Hoffnung: Entwickler haben die Hoffnung den neuen Code mit neuen Technologien, den richtigen Design Patterns und Unit-Tests zu schreiben. Oftmals endet der Greenfield-Ansatz aber wieder in Legacy-Code. Kunden-Feedback: Es ist schwierig Feedback von Anwendern zu erhalten, weil diese noch mit der bestehenden Software arbeiten. Die Anwender werden erst die neue Software verwenden, wenn diese Funktionalitäten zur Verfügung stellt, die in der alten Anwendung nicht vorhanden sind. Kapazität: Das bestehende Entwicklerteam war bisher für die Pflege und Erweiterung der bestehenden Software zuständig. Jetzt werden Entwickler abgezogen, um an der neuen Software zu arbeiten. Dies ist möglich, weil an der bestehenden Software weniger Neuentwicklungen durchgeführt werden. Dies ist aber ein Nachteil für Bestandskunden. Wenn dann doch schnell neue Funktionalität entwickelt werden muss, werden die Entwickler von der neuen Software kurzzeitig abgezogen. Es entsteht ein ständiger Wechsel zwischen alt und neu, was sich negativ auf die Produktivität der Entwickler auswirkt. Eine Alternative zum Greenfield-Ansatz ist das Refactoring. Refactoring Beim Refactoring werden die Codebereiche nach und nach überarbeitet und verbessert. 5.2 Modelle im Agilen Kontext Modelle im Agilen Kontext machen dann Sinn, wenn sie die Kommunikation vereinfachen. Es muss der Nutzen und der Aufwand eines Modells abgewogen werden, bevor man sich entscheidet ein Modell zu entwerfen. Es gibt verschiedene Möglichkeiten Modell zu erstellen bzw. darzustellen: UML .NET Classdesigner Workflow Foundation Seite 22 / 28 Moderne Softwareentwicklung Architecture Discovery 5.3 Agile Architektur Eine entkoppelte Architektur ist besonders geeignet für Unit-Tests. Nutzung von IoC für Mocking Durch Verwendung von IoC können im Konstruktor Mocks übergeben werden. Dies vereinfacht das Testen von Klassen. 5.3.1 Architektur-Tools in Visual Studio Layer-Diagramme Layer-Diagramme ermöglichen die Zuweisung von Komponenten zu Layern. Zudem kann man Abhängigkeiten zwischen Komponenten definieren. Beispielsweise kann man festlegen, dass UIKomponenten auf der Präsentationsschicht nur auf Interfaces aus der Businessschicht zugreifen dürfen. Ob dies von jedem Entwickler im Code eingehalten wird, kann man mittels Layer-Diagramm Validierung prüfen. Die Validierung kann automatisiert in einem Buildvorgang ausgeführt werden. Code Maps Nach dem Anhalten an einem Breakpoint im Code, kann man für diese Position eine Code Map einblenden. Die Code Map zeigt, durch welche Aufrufe man an diese Position gekommen ist. Die Code Map kann als Orientierungshilfe beim Debuggen verwendet werden. Man kann sie auch mit Kommentaren versehen und an Kollegen weitergeben. Code Clone Detection Visual Studio bietet eine Code Clone Detection, mit der redundanter Code gefunden werden kann. Es wird Code gefunden, der mittels Copy-Paste erstellt wurde und somit exakt übereinstimmt. Es kann aber auch Code gefunden werden, der teilweise übereinstimmt. Sequence Diagramms Zu einer beliebigen Codestelle kann ein Sequenzdiagramm erstellt werden. Dieses zeigt den Ablauf der Funktion und kann als Grundlage für Diskussionen mit Kollegen verwendet werden. 6 Continous Delivery & Dev Ops Eine wichtige Rolle in der modernen Softwareentwicklung ist es, kontinuierlich Nutzen für den Kunden zu generieren. Auf der einen Seite werden Anforderungen definiert, entwickelt und getestet. Im weiteren Kreislauf geht es um den Betrieb der Software (Operations). Hierbei sind Deployment, Monitoring und Verwaltung der Software von großer Bedeutung. Deployment: Veröffentlichen der Software in der Produktivumgebung. Einspielen von Updates. Monitoring: Aktuellen Betrieb monitoren. Aus den Ergebnissen können neue Ideen und Anforderungen generiert werden. Management: Verwaltung der Software Seite 23 / 28 Moderne Softwareentwicklung 6.1 Build-Measure-Learn Build-Measure-Learn wird auch bei Continous Delivery angewendet: 1. Es wird eine Hypothese aufgestellt und versucht als testbares Experiment umzusetzen. 2. Das Experiment wird als Minimum Viable Product (MVP), der kleinste vermarktbare Kundennutzen, definiert. 3. Das MVP wird implementiert und eine Messfunktionalität wird eingebaut. 4. Das Produkt wird in die Produktivumgebung gestellt und die Ergebnisse gemessen. Dabei geht es darum zu schauen, ob die neue Funktionalität von den Nutzern gut angenommen wird und ob es die Erwartungen erfüllt. 5. Aus diesen Informationen wird gelernt, wie das Produkt weiterentwickelt werden soll. 6. Im letzten Schritt wird entschieden, ob das MVP erweitert, überarbeitet oder verworfen wird. Je nachdem, ob es die Business Hypothese bestätigt hat oder nicht. Dieser Kreislauf soll in möglichst kurzen Zyklen durchlaufen werden. Dadurch ist es möglich, in möglichst kurzen Zeitabständen Anpassungen am Produkt vorzunehmen. Um in kurzen Zyklen vor ca. zwei bis vier Wochen eine Applikation zu veröffentlichen kann das Tool „Microsoft Release Management 2013“ verwendet werden. 6.1.1 Release Management 2013 Mit dem Release Management kann aus einem Build heraus die Anwendung auf einer bestimmten Umgebung veröffentlicht werden. Mögliche Umgebungen sind: DEV: Entwicklungsumgebung QA: Qualitätssicherungsumgebung Seite 24 / 28 Moderne Softwareentwicklung PROD: Produktivumgebung Dabei bietet das Release Management Automatisches Deployment Volle Traceability: Information welche Version auf welcher Umgebung installiert ist und ob die Version freigegeben wurde. Im Standardfall wird nach dem Einchecken ein Build erstellt und dieses auf der Entwicklungsumgebung veröffentlicht. Nachdem auf der Entwicklungsumgebung getestet wurde, kann im Release Management die Version von der Entwicklungsumgebung auf die Qualitätssicherungsumgebung freigegeben werden. Dies wird dokumentiert. 6.1.2 Measure – Feedback und Telemetry Um herauszufinden, ob die Business Hypothese bzw. das Experiment erfolgreich ist können Kundenumfragen generiert und Feedback von Stakeholdern eingeholt werden. Besser ist es aber Informationen mittels Anwendungs-Telemetry zu messen. Dafür gibt es das Tool Application Insights. Application Insights Mit Application Insights können im TFS Dashboards gebaut werden, die bestimmte Informationen über die Anwendung anzeigen. Mittels Application Insights ist es möglich Die Verfügbarkeit der Anwendung automatisch zu testen. Vordefinierte Tests automatisiert ausführen zu lassen. Anzeigen der Anzahl der Benutzer pro Tag. Anzeigen der Bewegungsprofile der Benutzer innerhalb der Anwendung. Anzeigen der langsamsten Zugriffe, um Performanzprobleme zu identifizieren. Application Insights ist für Webanwendung, Windows Phone Apps und Windows Store Apps verfügbar. Seite 25 / 28 Moderne Softwareentwicklung 6.2 Fehler in der Produktivumgebung finden Mean Time to Detect (MTTD): Die benötigte Zeit bis ein Defekt in der Produktivumgebung bemerkt wird. Mean Time to Repair (MTTD): Die benötigte Zeit bis ein Defekt in der Produktivumgebung repariert ist. IntelliTrace in Production Um Fehler in der Produktivumgebung zu finden, kann „IntelliTrace in Production“ verwendet werden. Dafür müssen lediglich einige Dateien auf die Produktivumgebung kopiert und ein PowerShell Script ausgeführt werden. Anschließend erhält man eine IntelliTrace Datei, die in Visual Studio geöffnet werden kann. Mit Hilfe dieser Datei kann zu der Codestelle gesprungen werden, die den Fehler verursacht hat. Darüber hinaus kann im Code navigiert und die Werte der Variablen abgefragt werden. So findet man z.B. relativ schnell die Ursache einer NullReference-Exception. 7 Entwickler-Produktivität Damit Entwickler produktiver werden und sich auf das Entwickeln konzentrieren können, müssen sie von Routineaufgaben entlastet werden. Dafür gibt es bestimmte Werkzeuge. 7.1 Versionskontrollsystem Der TFS 2012 bietet ein eigenes Versionskontrollsysteme und Git. Ein Versionskontrollsystem dient dazu Änderungen mehrere Entwickler zusammenzuführen und einen Verlauf der Änderungen zu protokollieren. Zusätzlich bietet es Branching und Continous Integration Build. Branching Mittels Branching können Änderungen voneinander Isoliert werden. Oftmals gibt es einen MainBranch, einen Dev-Branch und einen oder mehrere Release-Branches. Im Dev-Branch wird das Produkt stetig weiterentwickelt. In Release-Branches sind Auslieferungsversionen und Hotfix-Stände enthalten. Continous Integration Build Mittels CI Build wird nach jedem Eincheckvorgang ein Build erstellt und Unit-Tests automatisch ausgeführt. Dadurch erhält der Entwickler eine Rückmeldung, ob durch seine Codeänderung Probleme verursacht werden oder nicht. Seite 26 / 28 Moderne Softwareentwicklung 7.2 Visual Studio IDE Features Code Lense Mittels Code Lense werden folgende Informationen zu einer Methode eingeblendet: Referenzen Testergebnisse Letzter Eincheckvorgang Anzahl der Änderungen Statische Code-Analyse In den Solution-Einstellungen kann für jedes Projekt das Regelset für Statische Code Analyse eingestellt werden. Beim Bauen der Solution wird die Statische Code Analyse ausgeführt. Als Ergebnis erhält man eine Liste aller Codestellen, die gegen eine Regel aus dem Regelset verstoßen. Eine Statische Code Analyse kann auch automatisiert in einem Build durchgeführt werden. Test Driven Development (TDD) Bei TDD wird das erwartete Verhalten einer Methode mittels Tests beschrieben. Anschließend wird die Methode so implementiert, dass sie die Tests erfüllt. Dabei wird zunächst ein Test geschrieben. Wenn dieser erfüllt wird, dann wird der nächste Test geschrieben und die Methode weiter implementiert. Im Test-Explorer kann eingestellt werden, dass Tests automatisch nach einem erfolgreichen Build im Studio ausgeführt werden. Dabei werden zuerst die Tests ausgeführt, die neu sind oder die vorher fehlgeschlagen sind. 7.3 Performance Tools Profiler Der Profiler misst die benötigte CPU-Zeit und den benötigten Speicher. Anschließend erhält man eine Auswertung. Mittels HotPath sieht man, welche Funktionsaufrufe am meisten Performanz verbrauch haben. Energy Consumption Misst den Energieverbrauch von Windows Phone und Windows Store Apps. 8 Team Power Gute Teams sind selbstorganisiert und arbeiten als echte Teams. Es geht nicht darum am gleichen Projekt oder im gleichen Raum zu arbeiten. Entscheidend ist, dass alle im Team ein Ziel vor Augen haben und sich gegenseitig unterstützen. Es darf nicht sein, dass jeder im Team seine eigene Aufgabe hat und sich ausschließlich darum kümmert. In einem idealen Team übernimmt ein Entwickler auch Verantwortung für die Aufgaben der Kollegen. Bessere Entscheidungen In einem idealen Team trifft nicht jede Person Entscheidungen für sich selbst. Es werden Entscheidungen gemeinschaftlich getroffen. Dadurch bringt jedes Teammitglied sein Wissen mit ein. Dies führt zu besseren Entscheidungen. Bessere Entscheidungen führen zu weniger Irrwegen im Laufe der Entwicklung. Ideale Teams arbeiten schneller und effizienter als Einzelkämpfer. Seite 27 / 28 Moderne Softwareentwicklung Teamverantwortung Jeder im Team muss Verantwortung übernehmen. Selbst wenn jemand nicht an einem Fehler beteiligt war, kann er Verantwortung übernehmen und diesen beheben. Dadurch erfolgt automatisch ein Code Review. Zusätzlich stellt sich die Frage, warum der Fehler nicht durch Tests aufgedeckt wurde. Darüber hinaus überlegt das Team gemeinsam wie es sich verbessern kann, damit in Zukunft ein Fehler mit der gleichen Ursache nicht nochmal auftritt. Team-Motivation Die gemeinsame Verantwortung steigert die Motivation im Team. Denn es kommt nicht mehr vor, dass jemand für seine eigenen Entscheidungen den Kopf hinhalten muss. Die Entscheidung ist gemeinsam getroffen worden, somit ist das gesamte Team für die Auswirkung verantwortlich. Dies nimmt den Druck von jeden einzelnen. Risiken reduzieren Weil in einem idealen Team jeder Entwickler auch die Aufgaben seiner Kollegen übernehmen kann, sinkt das Risiko von einem Entwickler abhängig zu sein. Fällt beispielsweise ein Entwickler wegen Krankheit oder Urlaub aus, dann gibt es immer noch andere Entwickler, die kritische Probleme in Codestellen des Entwicklers beheben können. Wie entsteht ein großartiges Team? Der Schlüssel für ein großartiges Team ist Selbstorganisation. Es gibt niemanden im Team der wichtige Entscheidungen alleine trifft. Wie mit kritischen Probleme oder neuen Anforderungen umgegangen wird entscheidet das gesamte Team gemeinsam. Aus Management Sicht ändert sich dadurch die Rolle eines Teamleiters. Dieser gibt bei einem selbstorganisierten Team nicht mehr die Wege vor, sondern die Ziele. Das Team muss die Wege gemeinsam erarbeiten. Dadurch wird das Management entlastet. Ein selbstorganisiertes Team lässt sich nicht einfach umsetzen. Es ist ein Lernprozess nötig, bei dem der Scrum Master sehr viel Unterstützung bieten kann. Seite 28 / 28