<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Softwareentwicklung &amp; Technik | BUDISANTOSO - Solutions, Compliance, Consulting</title>
	<atom:link href="https://budisantoso.de/category/software-entwicklung-technik/feed/" rel="self" type="application/rss+xml" />
	<link>https://budisantoso.de</link>
	<description>Fortschritt durch KI, Sicherheit in der Cloud – Digitale Zukunft entwickeln</description>
	<lastBuildDate>Tue, 19 Dec 2023 09:25:18 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://budisantoso.de/wp-content/uploads/2025/01/cropped-Budisantoso-Logo-2024-Square-Blue-NoBorder-512x512-2-1-32x32.png</url>
	<title>Softwareentwicklung &amp; Technik | BUDISANTOSO - Solutions, Compliance, Consulting</title>
	<link>https://budisantoso.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>User Stories vs. Job Stories: Zwei Wege, ein Ziel</title>
		<link>https://budisantoso.de/user-stories-vs-job-stories/</link>
		
		<dc:creator><![CDATA[Kresnadi Budisantoso]]></dc:creator>
		<pubDate>Tue, 19 Dec 2023 16:51:00 +0000</pubDate>
				<category><![CDATA[Softwareentwicklung & Technik]]></category>
		<category><![CDATA[Agile Entwicklung]]></category>
		<category><![CDATA[Agile Methoden]]></category>
		<category><![CDATA[Anforderungsanalyse]]></category>
		<category><![CDATA[Job Stories]]></category>
		<category><![CDATA[Nutzerverhalten]]></category>
		<category><![CDATA[Produktentwicklungsstrategie]]></category>
		<category><![CDATA[Produktmanagement]]></category>
		<category><![CDATA[Situationsanalyse]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[user stories]]></category>
		<guid isPermaLink="false">http://budisantoso.de/?p=730</guid>

					<description><![CDATA[Heute komme ich endlich dazu, diesen lange (seit 2017 😱) geplanten Artikel zu schreiben, um euch Job Stories vorzustellen. Nachdem mein letzter Beitrag von User Stories gehandelt hat, geht es heute um eine meiner Meinung nach wertvolle Ergänzung: Job Stories, basierend auf dem Konzept von Jobs To Be Done (JTBD), konzentrieren sich darauf eine gegenwärtige [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Heute komme ich endlich dazu, diesen lange (seit 2017 😱) geplanten Artikel zu schreiben, um euch Job Stories vorzustellen. Nachdem <a href="https://budisantoso.de/die-kunst-der-user-stories-in-der-agilen-softwareentwicklung/" data-type="post" data-id="1556">mein letzter Beitrag von User Stories</a> gehandelt hat, geht es heute um eine meiner Meinung nach wertvolle Ergänzung: <strong>Job Stories</strong>, basierend auf dem Konzept von Jobs To Be Done (JTBD), konzentrieren sich darauf eine gegenwärtige und eine erstrebenswerte zukünftige Situation zu betrachten, sowie die Schritte um den Übergang zwischen diesen beiden Zuständen zu erreichen.</p>



<h3 class="wp-block-heading">Einblick in Job Stories: Das Situative Anforderungsformat 💼</h3>



<p class="wp-block-paragraph">Job Stories sind ein Format für die Anforderungsdefinition in der Produktentwicklung, das sich darauf konzentriert, die spezifischen Situationen, in denen Benutzer handeln, zu verstehen. Im Gegensatz zu User Stories, die sich oft auf die Merkmale und Eigenschaften der Benutzer konzentrieren, richten sich Job Stories nach dem Prinzip: &#8222;Wenn [Situation], möchte ich [Motivation], damit ich [Ergebnis] erreiche&#8220;. Diese Formulierung zielt darauf ab, die zugrundeliegenden Motivationen und den Kontext des Benutzers zu erfassen.</p>



<h2 class="wp-block-heading">Kontrastierung: Job Stories und User Stories im Vergleich 🤲</h2>



<p class="wp-block-paragraph">Im Vergleich zu User Stories, die typischerweise im Format &#8222;Als [Nutzerrolle] möchte ich [Aktion], um [Ziel]&#8220; formuliert sind, fokussieren sich Job Stories mehr auf die situativen Aspekte. Während User Stories dazu neigen, eine Benutzerrolle in den Vordergrund zu stellen, betrachten Job Stories die spezifischen Bedingungen, unter denen eine Aufgabe erfüllt wird. Diese Unterscheidung führt zu einem tieferen Verständnis der Benutzeranforderungen, da der Kontext und die spezifischen Auslöser für Aktionen stärker berücksichtigt werden.</p>



<h3 class="wp-block-heading">Die Stärken von Job Stories: Vorteile im Fokus 🧘</h3>



<p class="wp-block-paragraph">Job Stories bieten mehrere Vorteile:</p>



<ul class="wp-block-list">
<li><strong>Kontextbezogenheit</strong>: Sie fokussieren auf die Umstände, unter denen eine Aufgabe ausgeführt wird, was zu präziseren Anforderungen führt.</li>



<li><strong>Flexibilität</strong>: Sie sind weniger an spezifische Nutzerrollen gebunden und ermöglichen so eine breitere Anwendbarkeit.</li>



<li><strong>Klarheit</strong>: Durch die Konzentration auf das &#8218;Warum&#8216; hinter einer Aktion ermöglichen sie ein tieferes Verständnis der Benutzerbedürfnisse.</li>
</ul>



<h3 class="wp-block-heading">Herausforderungen und Limitationen: Kritische Betrachtung von Job Stories ⚠️</h3>



<p class="wp-block-paragraph">Trotz ihrer Vorteile haben Job Stories auch Grenzen:</p>



<ul class="wp-block-list">
<li><strong>Weniger Nutzerfokus</strong>: Sie könnten weniger Informationen über die Benutzer selbst liefern.</li>



<li><strong>Komplexität in vielfältigen Szenarien</strong>: In komplexen Systemen mit vielen Benutzerrollen können Job Stories weniger effektiv sein.</li>
</ul>



<h2 class="wp-block-heading">Abschlussbewertung: Einsatzgebiete und Entscheidungshilfen 🧭</h2>



<p class="wp-block-paragraph">Es gibt kein universelles &#8222;Besser&#8220; oder &#8222;Schlechter&#8220; zwischen Job Stories und User Stories. Die Wahl hängt stark vom Kontext des Projekts ab:</p>



<ul class="wp-block-list">
<li><strong>Job Stories</strong> eignen sich hervorragend für Situationen, in denen der Kontext und die spezifischen Auslöser einer Aktion entscheidend sind.</li>



<li><strong>User Stories</strong>&nbsp;sind effektiver, wenn die Charakteristika und Bedürfnisse der Benutzer im Vordergrund stehen.</li>
</ul>



<h3 class="wp-block-heading">Deine Praxis-Tipps 🛠️</h3>



<p class="wp-block-paragraph">&#8211; Beziehe den spezifischen Kontext deines Projekts in die Entscheidung ein.<br>&#8211; Nutze eine Kombination beider Ansätze, um die Vorteile zu maximieren.<br>&#8211; Bleibe flexibel in deiner Anforderungsdefinition, um die besten Ergebnisse zu erzielen.</p>



<h3 class="wp-block-heading">Schlusswort 🎯</h3>



<p class="wp-block-paragraph">Die Wahl zwischen Job Stories und User Stories sollte immer im Kontext der spezifischen Anforderungen deines Projekts getroffen werden. Beide Ansätze bieten einzigartige Perspektiven und können, wenn geschickt eingesetzt, zu einer reicheren und umfassenderen Produktentwicklungsstrategie beitragen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Weiterführende Quellen 📚</p>



<ul class="wp-block-list">
<li>Christensen, Clayton M., Taddy Hall, Karen Dillon, and David S. Duncan. <em><a href="https://amzn.eu/d/281qWQS">Competing Against Luck: The Story of Innovation and Customer Choice</a></em>. New York: Harper Business, 2016.</li>



<li><a href="https://jtbd.info/replacing-the-user-story-with-the-job-story-af7cdee10c27">Replacing The User Story With The Job Story</a>, Alan Klement</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gute User Stories: Eine Kunst in der agilen Softwareentwicklung</title>
		<link>https://budisantoso.de/die-kunst-der-user-stories-in-der-agilen-softwareentwicklung/</link>
		
		<dc:creator><![CDATA[Kresnadi Budisantoso]]></dc:creator>
		<pubDate>Mon, 18 Dec 2023 16:08:00 +0000</pubDate>
				<category><![CDATA[Softwareentwicklung & Technik]]></category>
		<category><![CDATA[Agile Softwareentwicklung]]></category>
		<category><![CDATA[Anforderungsmanagement]]></category>
		<category><![CDATA[Effektive Kommunikation]]></category>
		<category><![CDATA[Iterative Entwicklung]]></category>
		<category><![CDATA[Produktentwicklung]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<category><![CDATA[Scrum Methodik]]></category>
		<category><![CDATA[Teamkollaboration]]></category>
		<category><![CDATA[user stories]]></category>
		<category><![CDATA[User-Centered Design]]></category>
		<guid isPermaLink="false">https://budisantoso.de/?p=1556</guid>

					<description><![CDATA[Heute gibt es Aufgewärmtes 🧑‍🍳😊 &#8230; Diese Überarbeitung meines Artikels von 2017 betrachtet erneut User Stories in der agilen Softwareentwicklung. Seit der Veröffentlichung meines Artikels ist einige Zeit verstrichen und noch immer sind User Stories ein wichtiges Werkzeuge, um Anforderungen im agilen Umfeld zu kommunizieren. Die Grundlagen: Was sind User Stories? 👨‍💻👩‍💻 User Stories beschreiben [&#8230;]]]></description>
										<content:encoded><![CDATA[


<p class="wp-block-paragraph">Heute gibt es Aufgewärmtes 🧑‍🍳😊 &#8230; Diese Überarbeitung meines <a href="https://budisantoso.de/anforderungen-in-der-agilen-softwareentwicklung/" data-type="post" data-id="714" target="_blank" rel="noreferrer noopener">Artikels von 2017</a> betrachtet erneut User Stories in der agilen Softwareentwicklung. Seit der Veröffentlichung meines Artikels ist einige Zeit verstrichen und noch immer sind User Stories ein wichtiges Werkzeuge, um Anforderungen im agilen Umfeld zu kommunizieren.</p>



<h2 class="wp-block-heading">Die Grundlagen: Was sind User Stories? 👨‍💻👩‍💻</h2>



<p class="wp-block-paragraph">User Stories beschreiben eine Funktion einer Applikation, die für den Anwender oder Käufer der Software wertvoll ist. Sie bestehen aus einer schriftlichen Beschreibung, Gesprächen über die Story und aus Akzeptanzkriterien. Diese dreigliedrige Struktur, bekannt als <a href="https://ronjeffries.com/xprog/articles/expcardconversationconfirmation/" data-type="link" data-id="https://ronjeffries.com/xprog/articles/expcardconversationconfirmation/">&#8222;Card, Conversation, and Confirmation&#8220;</a>, wurde von Ron Jeffries geprägt.</p>



<h2 class="wp-block-heading">Die Herausforderung: Balance im Umfang ⚖️</h2>



<p class="wp-block-paragraph">Der Umfang einer User Story ist immer ein strittiges Thema. Entwickler haben unterschiedliche Bedürfnisse und Vorstellungen, was den idealen Umfang einer Story betrifft. Manche bevorzugen detaillierte Beschreibungen, während andere minimale Ein-Wort-Beschreibungen wie &#8222;Login&#8220; oder &#8222;Sichtbarkeitsregeln&#8220; bevorzugen. Der ideale Umfangs ist letztlich Team-spezifisch und hängt von der Teamgröße und letztlich von deren Kommunikationstärke ab.</p>



<h2 class="wp-block-heading">Mündliche Kommunikation: Ein Schlüsselaspekt 💬</h2>



<p class="wp-block-paragraph">Ein wichtiger Aspekt einer User Story ist das Gespräch. Es ist entscheidend, dass die Erwartungen an den Entwickler klar definiert sind, oft in Form von Akzeptanzkriterien. Diese Gespräche sind ein integraler Bestandteil des Prozesses und tragen dazu bei, die Story zu verfeinern und zu klären.</p>



<h2 class="wp-block-heading">Praktische Umsetzung: Größe und Strukturierung 📐</h2>



<p class="wp-block-paragraph">User Stories sollten idealerweise in einem Umfang gehalten werden, der in einer Implementierungsiteration umsetzbar ist. Zu umfangreiche Stories, bekannt als Epics, können in kleinere, handhabbare Teile aufgeteilt werden.</p>



<h2 class="wp-block-heading">Schreiben von User Stories: Ein praktischer Ansatz ✍️</h2>



<p class="wp-block-paragraph">Eine gute User Story sollte klar, präzise und fokussiert sein. Sie sollte den Nutzer und den Wert der Funktion in den Vordergrund stellen. Ein bewährtes Format lautet: &#8222;Als [Nutzerrolle] möchte ich [Funktion], sodass [Vorteil/Zweck].&#8220; Wesentliche, im Gespräch erarbeitete Elemente sollten in die Details der User Story einfließen.</p>



<h3 class="wp-block-heading">Checkliste für effektive User Stories ✅</h3>



<ul class="wp-block-list">
<li><strong>Verständliche Sprache:</strong> Vermeide Fachjargon und bleibe klar und prägnant.</li>



<li><strong>Nutzerzentriert:</strong> Fokussiere auf den Nutzer und den Wert der Funktion.</li>



<li><strong>Klare Ziele:</strong> Definiere, was erreicht werden soll (Funktion) und auch warum (Zweck).</li>



<li><strong>Flexibilität:</strong> Sei offen für Anpassungen und Ergänzungen.</li>



<li><strong>Feedback einholen:</strong> Nutze die Stärke von Teamdiskussionen und Feedback und ergänze Erkenntnisse und Entscheidungen.</li>
</ul>



<h3 class="wp-block-heading">Diskussion und Austausch 🗣️</h3>



<p class="wp-block-paragraph">Wie gehst du mit User Stories um? Welche Herausforderungen und Lösungen hast du in der Praxis erlebt? Teile deine Erfahrungen und Gedanken in den Kommentaren. Und bleib dran für weitere Artikel mit agilen Methoden und praktischen Tipps zum Schreiben von guten User Stories!</p>



<h3 class="wp-block-heading">Zusätzliche Ressourcen 📚</h3>



<p class="wp-block-paragraph">Für weitere Vertiefung empfehle ich das Standardwerk zu User Stories von Mike Cohn. Es bietet wertvolle Tipps und Einblicke in die Praxis der agilen Softwareentwicklung.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>INVEST &#8211; Charakteristik einer guten Story</title>
		<link>https://budisantoso.de/invest-charakteristik-einer-guten-story/</link>
		
		<dc:creator><![CDATA[Kresnadi Budisantoso]]></dc:creator>
		<pubDate>Mon, 09 Jan 2017 22:59:31 +0000</pubDate>
				<category><![CDATA[Softwareentwicklung & Technik]]></category>
		<category><![CDATA[estimable]]></category>
		<category><![CDATA[independent]]></category>
		<category><![CDATA[negotiable]]></category>
		<category><![CDATA[small]]></category>
		<category><![CDATA[testable]]></category>
		<category><![CDATA[user stories]]></category>
		<category><![CDATA[valuable]]></category>
		<guid isPermaLink="false">http://budisantoso.de/?p=728</guid>

					<description><![CDATA[Im vorherigen Artikel habe ich User Stories als Mittel zur Anforderungserfassung vorgestellt. Wir haben gelernt, dass eine User Story eine geforderte Funktion in einem kurzen Satz beschreibt, so dass ein Wert für den User erkennbar ist. Der User kann dabei der Endanwender sein oder aber der Käufer der Software &#8211; oft handelt es sich dabei um [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Im vorherigen Artikel habe ich User Stories als Mittel zur Anforderungserfassung vorgestellt. Wir haben gelernt, dass eine User Story eine geforderte Funktion in einem kurzen Satz beschreibt, so dass ein Wert für den User erkennbar ist. Der User kann dabei der Endanwender sein oder aber der Käufer der Software &#8211; oft handelt es sich dabei um unterschiedliche Personen mit unterschiedlichen Interessen &#8211; ich gehe später noch einmal darauf ein. Neben dem Aspekt der Beschreibung hat eine User Story zwei weitere Aspekte, nämlich das Gespräch und die Akzeptanztests. Nur unter Berücksichtigung aller drei Aspekte lässt sich mit User Stories arbeiten. Doch was zeichnet eine gute User Story aus? Wann ist eine Story so &#8222;reif&#8220;, dass sich damit sinnvoll arbeiten lässt? Beschäftigen wir uns im Folgenden mit den Eigenschaften einer guten Story.</p>
<h3>Unabhängig</h3>
<p>Zunächst sollte beim &#8222;schneiden&#8220; der Anforderungen in User Stories darauf geachtet werden, dass es zwischen den Stories keine Abhängigkeiten gibt. Eine Story sollte in der Regel losgelöst von anderen Stories bearbeitet und umgesetzt werden können, andernfalls ergeben sich sehr schnell Probleme bei der Priorisierung. Oft findet sich ein passender Weg, die Stories geschickt aufzuteilen, so dass diese tatsächlich unabhängig voneinander sind. Manchmal lässt es sich nicht vermeiden und es bleiben zwei Möglichkeiten: Die voneinander abhängigen Stories werden zu einer größeren Story zusammengefasst oder &#8211; wenn man das nicht möchte &#8211; wird der Aufwand der abhängigen Story mit zwei unterschiedlichen Werten geschätzt &#8211; einmal unter der Annahme, dass die andere Story davor bearbeitet wurde und einmal danach. Diese Optionen sollten jedoch die Ausnahme sein, nicht die Regel.</p>
<h3>Verhandelbar</h3>
<p>Die Beschreibung einer Story dient der Erinnerung an die geforderte Funktionalität und enthält damit nicht alle relevanten Details. Diese werden im Gespräch mit dem Kunden oder dem diesen vertretenden Product Owner verhandelt. Sind bereits bei der Erfassung einer Story wichtige Details bekannt, dann sollten diese natürlich auch als Anmerkung notiert werden und dienen dann als Gedächtnisstütze für das Gespräch. In der agilen Softwareentwicklung sind das Backlog Grooming und bei Scrum der erste Teil des Sprint Planning Meetings der richtige Zeitpunkt, um Details auszuhandeln. Die Herausforderung beim Schreiben von User Stories ist, die richtige Menge an Details in die Beschreibung (und die Anmerkungen) aufzunehmen. Werden Details dann in der Besprechung beschlossen, werden diese zu Akzeptanztests.</p>
<p>Hier ein Beispiel für eine Story samt Anmerkungen und Akzeptanztests:</p>
<blockquote>
<p style="padding-left: 30px;"><strong>Im Onlineshop kann ein Kunde seinen Warenkorb mit Kreditkarte bezahlen.</strong></p>
<p style="padding-left: 30px;">Anmerkung: Werden Barclaycards akzeptiert?<br />
Anmerkung zur UI: Der Kartentyp kann anhand der Nummer abgeleitet werden, daher ist keine separate Auswahl notwendig.</p>
<p style="padding-left: 30px;"><span style="text-decoration: underline;">Akzeptanztests:</span></p>
<ul>
<li style="padding-left: 30px;">Teste, dass Bezahlung mit Visa, MasterCard und AmEx möglich ist</li>
<li style="padding-left: 30px;">Teste, dass die Bezahlung mit Diners Club abgewiesen wird</li>
<li style="padding-left: 30px;">Teste, dass mit korrektem Card Validation Code (CVC) bezahlt werden kann, nicht jedoch mit falschem oder fehlendem CVC</li>
<li style="padding-left: 30px;">Teste, dass abgelaufene Karten abgewiesen werden</li>
<li style="padding-left: 30px;">Teste, dass sowohl Beträge unter als auch über 100 EUR akzeptiert werden</li>
</ul>
</blockquote>
<h3>Werthaltig für Anwender oder Käufer</h3>
<p>Häufig spricht man beim Wert einer Story vom Business Value bzw. vom Geschäftswert. Dieser Wert spiegelt nicht immer den Wert einer Story für den Endanwender wieder. Oft ist es so, dass eine große Anzahl an Stories für den Endanwender nicht oder kaum von Bedeutung sind, wohl aber im Interesse des Käufers der Software sind. Eine verschlüsselte Dateiablage oder eine Mandantenfähigkeit sind für den Anwender der Software in der Regel unwichtig, ihn interessiert eher, dass er nach den gewünschten Daten suchen kann oder eine übersichtliche Darstellung von Informationen hat und diese ausdrucken kann. Der Käufer einer Software, zum Beispiel die Firma oder deren IT-Abteilung, könnte dagegen sehr großes Interesse daran haben, dass die Dateien vor Fremdzugriff geschützt sind. Um verschiedene Interessensgruppen zu berücksichtigen, diese Berücksichtigung sichtbar zu machen und auch um bei der Erfassung die verschiedenen Interessen abzudecken kann in den Stories mit &#8222;Personas&#8220; gearbeitet werden. Ich werde an dieser Stelle jedoch verzichten, detaillierter auf Personas einzugehen und verweise auf die Artikel von Alan Cooper [2] und Jared M. Spool [3].</p>
<p>Unbedingt zu Vermeiden sind dagegen Stories, die sich nur auf die Technik und die Belange des Entwicklers beschränken und damit nur von ihnen bewertet werden können. Auch wenn die Intention für diese Stories eine gute ist, dann sollten diese dennoch so formuliert werden, dass der Wert für den Kunden ersichtlich wird. Mike Cohen führt in seinem Buch [1] folgendes Beispiel an: </p>
<blockquote>
<p>Alle Verbindungen zur Datenbank erfolgen über einen Connection Pool.</p>
</blockquote>
<p>Diese offensichtlich rein technische Story kann aus Kundensicht nicht bewertet werden. Cohen schlägt als Alternative beispielsweise folgende Formulierung vor:</p>
<blockquote>
<p>Bis zu 50 User sollten die Anwendung mit einer Datenbanklizenz für fünf Plätze nutzen können.</p>
</blockquote>
<p>Mit dieser Formulierung kann der Kunde durchaus etwas anfangen &#8211; er ist dadurch in der Lage, die Story zu bewerten und zu priorisieren. Ebenso wie technische Annahmen (z.B. die Nutzung eines Connection Pools) aus den Stories herausgehalten werden sollten, sollte auch versucht werden, auf Angaben zur Benutzeroberfläche (möglichst lange) zu verzichten.</p>
<h3>Schätzbar</h3>
<p>Auch von Entwicklern wird gefordert, ihre Arbeit zu planen und zurückzumelden, bis wann bzw. mit welchem Aufwand die Umsetzung erfolgen kann. Dies erfolgt dann in einer Schätzung von Dauer oder Aufwand, z.B. in Form von Story Points. Ich selbst bin kein großer Freund von Zeitschätzungen, sondern präferiere die Schätzung des Aufwands in einer abstrakten, relativen Größe. Dem Einwand, dass dann nicht geplant werden kann, was bis wann umgesetzt wird, kann man mit der &#8222;Velocity&#8220; des Entwicklungsteams begegnen. Die Velocity eines Teams ist die Summe an Story Points, die von diesem in einer Entwicklungsiteration abgearbeitet werden kann. Somit lässt sich indirekt wieder eine zeitliche Abschätzung ableiten.</p>
<p>Aus Sicht eines Entwicklers kann es jedoch drei Gründe geben, weshalb eine Story nicht schätzbar ist:</p>
<ol>
<li>Dem Entwickler fehlt das Domänenwissen</li>
<li>Dem Entwickler fehlt das technische Wissen</li>
<li>Die Story ist zu groß/umfangreich</li>
</ol>
<p>
Dem fehlenden Domänenwissen kann mit einem Gespräch mit dem Kunden begegnet werden und wenn eine Story zu groß ist, dann bleibt sie so lange ungeschätzt, bis sie in kleinere Stories aufgeteilt wurde. Dem fehlenden technischen Wissen dagegen lässt sich nur begegnen, indem dieses Wissen zumindest soweit aufgebaut wird, dass man eine Idee davon erhält, mit welchem Aufwand sich die Story umsetzen lässt. Von einem oder mehreren Entwicklern wird dann in einem kleinen, zeitlich beschränkten (timeboxed) Experiment das notwendige Wissen aufgebaut &#8211; im Extreme Programming wird ein solches Experiment &#8222;Spike&#8220; genannt. Somit werden aus der nicht abschätzbaren Story zwei, da noch die Story für den Spike hinzukommt. Da der Spike durch eine maximale Zeitdauer limitiert ist, lässt sich die Spike-Story auch schätzen und somit einplanen.</p>
<h3>Klein</h3>
<p>Die Größe einer Story ist entscheidend, ob sie in eine Entwicklungsiteration eingeplant werden kann. Ist die Story zu groß, kann sie entweder nicht abgeschätzt werden oder sie passt womöglich nicht (sinnvoll) in eine Iteration. Eine große Story (bzw. ein Epic) ist entweder eine zusammengesetzte Story oder eine komplexe Story.</p>
<p>Eine zusammengesetzte Story besteht aus mehreren kürzeren Einzelstories und kann somit weiter aufgeteilt werden. Es kann durchaus passieren, dass man erst im Verlauf des Entwicklungsprojekts erkennt, dass es sich bei einer Story mit vermeintlich angemessenen Umfang, doch um eine große zusammengesetzte Story handelt. Bei der Aufteilung muss man jedoch wieder aufpassen, dass die Granularität angemessen bleibt und die Stories nicht zu klein werden. Sehr kleine Stories können dagegen in einer größeren zusammengefasst werden. Eine angemessene Größe ist erreicht, wenn die Story innerhalb von einem halben Tag bis zwei Wochen von ein bis zwei Entwicklern umgesetzt werden kann.</p>
<p>Komplexe Stories dagegen sind häufig anzutreffen, wenn es um die Entwicklung von neuen Algorithmen oder die Erweiterung bestehender geht. Hier hat es sich bewährt, diese Story mit einer Recherche in Form eines Spikes zu ergänzen. Mit Hilfe der Recherchestory lässt sich dann die Durchführbarkeit ermitteln, neue Erkenntnisse über eine mögliche Implementierung gewinnen und somit erfolgt eine Vorarbeit zur eigentlichen Story, die nach der Recherche (besser) abgeschätzt werden kann. Es liegt auf der Hand, dass die Recherche nicht in der selben Iteration durchgeführt werden soll, in der auch die Umsetzung der Story eingeplant ist &#8211; idealerweise liegt der Spike in einer vorherigen Story.</p>
<h3>Testbar</h3>
<p>Die Akzeptanztests einer User Story definieren die Erwartungen an die Umsetzung. Erst anhand der Tests kann somit nachvollzogen werden, ob eine Story vollständig und erfolgreich implementiert wurde. Diese Tests sollten auch möglichst automatisiert ausgeführt werden &#8211; ein Automatisierungsgrad von 99% ist erstrebenswert. Lediglich sehr wenige Tests lassen sich nicht oder nicht mit verhältnismäßigem Aufwand automatisieren. Bei Anforderungen an die intuitive Bedienbarkeit, zum Beispiel, sind automatisierte Tests nicht möglich &#8211; mittels repräsentativer User-Tests in Testlaboren wäre solch eine Story jedoch durchaus testbar. Solche Tests sind dann aber oft zeitintensiv und kostspielig, für manche Projekte und Produkte jedoch notwendig.</p>
<p>In der Praxis entstehen nicht testbare Stories häufig bei den nicht-funktionalen Anforderungen, bei denen Erwartungen nur vage formuliert werden. Ein Beispiel dafür wäre &#8222;Das System hat geringe Antwortzeiten&#8220;. So formuliert kann diese Story nie erfüllt werden. Deutlich besser und sogar automatisiert testbar wäre dagegen folgende Formulierung: &#8222;Die visuelle Rückmeldung für alle Interaktionen eines Users mit dem System sind in 98% der Fälle unter einer Sekunde.&#8220;</p>
<h4>Akronym</h4>
<p>Diese sechs Eigenschaften ins englische Übersetzt ergeben ein Akronym:</p>
<ul>
<li><strong>I</strong>ndependent</li>
<li><strong>N</strong>egotiable</li>
<li><strong>V</strong>alueable</li>
<li><strong>E</strong>stimable</li>
<li><strong>S</strong>mall</li>
<li><strong>T</strong>estable</li>
</ul>
<p>&#8230; INVEST.</p>
<hr />
<p><span style="text-decoration: underline;">Literatur:</span></p>
<p style="padding-left: 30px;">[1] Mike Cohen, „User Stories Applied: For Agile Software Development“, Addison-Wesley Professional; 1 edition (11. März 2004)</p>
<p style="padding-left: 30px;">[2] Alan Cooper, „The Origin Of Personas“, cooper.com Journal, <a href="https://perma.cc/KN9E-D4KV">http://www.cooper.com/journal/2008/05/the_origin_of_personas</a> (15. Mai 2008)</p>
<p style="padding-left: 30px;">[3] Jared M. Spool,„Three Important Benefits of Personas“, uie.com Articles, <a href="https://perma.cc/B28N-GAQR">https://articles.uie.com/benefits_of_personas/</a> (8. Mai 2007)</p>
<p><span style="text-decoration: underline;">Grafik:</span></p>
<ul>
<li>by kschneider2991, CC0, <a href="https://pixabay.com/de/geld-geldturm-m%C3%BCnzen-euro-2180330/">pixabay.com</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Anforderungen in der agilen Softwareentwicklung</title>
		<link>https://budisantoso.de/anforderungen-in-der-agilen-softwareentwicklung/</link>
		
		<dc:creator><![CDATA[Kresnadi Budisantoso]]></dc:creator>
		<pubDate>Fri, 06 Jan 2017 00:03:55 +0000</pubDate>
				<category><![CDATA[Softwareentwicklung & Technik]]></category>
		<category><![CDATA[akzetanzkriterien]]></category>
		<category><![CDATA[anforderungen]]></category>
		<category><![CDATA[requirements]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[user stories]]></category>
		<guid isPermaLink="false">http://budisantoso.de/?p=714</guid>

					<description><![CDATA[Entwickler wollen wissen, was sie machen sollen, nicht wie sie es machen sollen. Für letzteres sind sie in der Regel die Experten. Doch wie teilt man Entwicklern mit, was benötigt wird? Was soll als nächstes implementiert werden? Und wie geschieht das in einem agilen Umfeld? Eine geeignete Möglichkeit ist &#8222;User Stories&#8220; für die Formulierung von [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Entwickler wollen wissen, was sie machen sollen, nicht wie sie es machen sollen. Für letzteres sind sie in der Regel die Experten. Doch wie teilt man Entwicklern mit, was benötigt wird? Was soll als nächstes implementiert werden? Und wie geschieht das in einem agilen Umfeld? Eine geeignete Möglichkeit ist &#8222;User Stories&#8220; für die Formulierung von Entwicklungsaufgaben einzusetzen.</p>
<p>Ich werde im Folgenden beschreiben, was User Stories sind, wie man mit ihnen plant und warum man sie einsetzen sollte. Ich werde dabei jedoch nicht in die Tiefe gehen, denn damit ließen sich durchaus ein paar Kapitel eines Buch füllen. Statt dessen verweise ich bereits hier auf das Standardwerk zu User Stories von Mike Cohen (siehe Quellen, [1]). Mike Cohen gibt neben einer Abgrenzung zu alternativen &#8222;klassischen&#8220; Methoden der Anforderungserfassung in seinem Buch vor allem wertvolle Tipps für den Praxiseinsatz. Für einen ersten Eindruck soll dieser Artikel hier genügen.</p>
<h3>Was ist eine User Story?</h3>
<p>Grundsätzlich kann man sagen, dass eine User Story eine Funktion einer Applikation beschreibt, die &#8222;wertvoll&#8220; für einen Anwender oder für den Käufer der Software ist. Sie besteht aus einer schriftlichen <strong>Beschreibung</strong>, aus <strong>Gesprächen</strong> über die Story und aus <strong>Akzeptanztests</strong>. Die Beschreibung dient zur Planung und zur Erinnerung; sie ist letztlich eine Zusammenfassung der Anforderung in einem Satz und wird entweder handschriftlich auf Karteikarten verfasst oder in ein elektronisches System wie beispielsweise JIRA eingepflegt. In den Gesprächen werden dann die Einzelheiten der benötigten Funktion herausgearbeitet und schließlich in den Akzeptanztests dokumentiert. Letztere legen auch fest, wann eine Story vollständig implementiert ist. Nicht zu verwechseln ist dies mit einer &#8222;Definition Of Done&#8220; (DoD, [2]), in der festgehalten wird, wann eine Story als abgeschlossen gilt. Diese drei Aspekte einer User Story hat Ron Jeffries als &#8222;Card, Conversation, and Confirmation&#8220; bezeichnet [3].</p>
<p>Der Umfang einer Story ist immer ein strittiges Thema. Mir sind schon Entwickler begegnet, die sich beschwert haben, dass nicht alle Details in der Story beschrieben sind. Dann gab es wieder Entwickler, die eine &#8222;Story&#8220; bearbeitet haben, die die Bezeichnung als solche nicht verdient hat: Die Beschreibung bestand aus einem einzigen Wort und statt Akzeptanztests der Vermerk &#8222;wie besprochen&#8220; festgehalten wurde. Nun gab es auch Stories, an denen wurde entwickelt und entwickelt und entwickelt &#8230; und irgendwann endlich nach einigen Wochen oder Monaten wurde sie als abgeschlossen erklärt. Wie ihr es euch sicher denken könnt, waren das alles Symptome, die auf &#8211; sagen wir einmal &#8211; nicht optimale User Stories zurückzuführen sind, sei es in ihrer Vollständigkeit oder in ihrem Umfang.</p>
<h4>Beschreibung</h4>
<p>Fangen wir mit dem zweiten Beispiel an, der Ein-Wort-Story: Sie hätte zum Beispiel lauten können &#8222;Sichtbarkeitsregeln&#8220;, &#8222;Login&#8220; oder &#8222;Dokumentenähnlichkeit&#8220;. Ja, die Beschreibung einer Story soll nur eine Erinnerung sein an die Funktionalität, die implementiert werden soll. Allerdings ist in diesen Ein-Wort-Beispielen der Informationsgehalt doch sehr beschränkt. Wichtig an einer User Story ist, dass bereits in der Beschreibung grob erkennbar wird, was die Funktion ist und dass sie auch einen Wert für den User, also den Anwender und/oder den Käufer der Software hat. Deutlich bessere Formulierungen wäre daher zum Beispiel: &#8222;Ein User kann nur Inhalte sehen, die für ihn aufgrund von Regeln sichtbar sind&#8220; oder &#8222;Das System kann Sichtbarkeitsregeln verarbeiten um dem User nur die Inhalte anzuzeigen, für die er leseberechtigt ist&#8220;. In beiden Beispielen lässt sich jetzt bereits in der Beschreibung ablesen, dass es um die Verarbeitung von Regeln geht, die die Sichtbarkeit von Inhalten für den Anwender steuern und diese Steuerung der Sichtbarkeit scheint für den Anwender oder vermutlich eher den Käufer von Wert zu sein. An den beiden Varianten der Formulierung kann man auch schon sehen, das es eine Vielzahl an Möglichkeiten gibt, eine Funktion in einem Satz zusammenzufassen und längst sind damit noch lange nicht die Details geklärt. Manche Varianten sind besser, andere schlechter; jedoch sollte man sich nicht zu lange an der Beschreibung aufhalten und wieder und wieder an der Formulierung feilen &#8211; zu Beginn ein gern gemachter Fehler.  Solange eine Funktion beschrieben ist und der Wert für den User erkennbar wird, ist das meiner Meinung nach völlig in Ordnung &#8211; schließlich gibt es ja noch zwei weitere Aspekte einer User Story.</p>
<h4>Gespräch</h4>
<p>Kommen wir nun zum ersten Beispiel, dem Entwickler, dem die Story nicht ausführlich genug beschrieben ist. Hier vertrete ich die Meinung: &#8222;Mut zur Lücke&#8220;, denn alle Einzelheiten sind beim Erfassen einer Story oft nicht bekannt. Und statt alle Einzelheiten aufzuschreiben macht es viel mehr Sinn, wenn das Entwicklungsteam diese mit dem Kunden oder dem den Kunden vertretenden Product Owner bespricht. Dass dann aus diesem Gespräch wiederum Notizen entstehen, die der User Story hinzugefügt werden (entweder rückseitig auf Karteikarten oder in einem Notizfeld in einem elektronischen System), dagegen spricht überhaupt nichts &#8211; im Gegenteil: da sie der Erinnerung an die besprochenen Einzelheiten dienen, sind sie erstrebenswert &#8211; dokumentieren allerdings keine vertragliche Verpflichtung. Eine solche Vereinbarung wird mit dem dritten Aspekt der User Story abgedeckt.</p>
<h4>Akzeptanztests</h4>
<p>Wir sind nun wieder bei der Ein-Wort-Story, genauer gesagt bei deren Vermerk &#8222;wie besprochen&#8220;. Das Gespräch ist mitunter ein wichtiger, wenn nicht sogar dar wichtigste Aspekt einer User Story. Und doch gibt es berechtigten Zweifel an dem Mehrwert der angesprochenen Notiz. Viel schlimmer ist jedoch, dass nirgends definiert wurde, wann die umzusetzende Funktion als vollständig implementiert akzeptiert wird: die Erwartung an den Entwickler ist somit unklar und die Gefahr besteht, dass wir dadurch eine Story erhalten, die entweder unvollständig implementiert wird oder bei der vom Entwickler hier noch ein Schleifchen und dort noch ein Schleifchen und da auch noch ein bisschen Bling-Bling dazu implementiert wird. Um dem zu begegnen ist die Beschreibung der Erwartung an den Entwickler unbedingt notwendig. Oft wird an dieser Stelle auch von Akzeptanzkriterien gesprochen, die es zu definieren gilt. Da diese Kriterien schlussendlich auch überprüft werden müssen &#8211; in der Regel durch automatisierte Tests &#8211; spreche ich lieber von Akzeptanztests und auch in der Praxis hat es sich bewährt, die Erwartungen in Form von Aufforderung zu beschreiben, was in dieser Story getestet werden soll. Möglichst vor Beginn der Implementierung sollten diese Erwartungen beschrieben werden: sei es bereits beim Story schreiben, beim Refinement (also der Verfeinerung/Überarbeitung einer Story) oder im Gespräch mit dem Entwicklungsteam. Grundsätzlich können Akzeptanztests jederzeit ergänzt werden &#8211; doch sobald die Story von Entwicklern in Bearbeitung ist, dann ist es nur unter Rücksprache legitim und sollte nur erfolgen, solange sich dabei der Umfang einer Story nicht oder nur marginal erhöht. Ist dies nicht der Fall oder wird das durch die Entwickler (begründet) nicht akzeptiert, dann hat es sich bewährt, die neuen Akzeptanzkriterien in einer neuen, ergänzenden Story festzuhalten.</p>
<h4>Umfang</h4>
<p>Nachdem wir uns mit den drei Aspekten von User Stories beschäftigt haben, möchte ich noch den Umfang einer User Story betrachten. Das obige Beispiel der Story, deren Implementierung sich über Wochen oder Monate hinzieht könnte als Ursache fehlende Akzeptanzkriterien haben. Viel Wahrscheinlicher jedoch ist, dass die Story viel zu umfangreich war, um sie in einer Implementierungsiteration umzusetzen. Umfangreiche und vor allem zu umfangreiche Stories werden häufig als Epics bezeichnet.</p>
<p>Zu Beginn der Erfassung von User Stories sind die Anforderungen an das Gesamtsystem noch unscharf. Epics spiegeln genau diese Unschärfe und sind daher sinnvoll als Platzhalter einzusetzen. Damit können dann größere Teile des Systems solange ausgeblendet werden, bis man sich mit deren Einzelheiten beschäftigen möchte und bis das Verständnis über die Anforderung an diesen Teil klarer geworden sind.</p>
<p>Mit der Zeit können die Epics und andere umfangreich Stories in kleinere Stories aufgeteilt werden. Komplexe Anforderungen werden somit in beherrschbare Teile aufgegliedert. Jedoch sollte man auch darauf achten, Stories nicht zu klein aufzuteilen. Idealerweise sind User Stories für den Entwickler abschätz- und damit auch planbar, wenn deren Umfang in einem halben Tag bis zwei Wochen für Implementierung und Tests von ein bis zwei Entwicklern zu bewerkstelligen ist.</p>
<h4>Warum User Stories?</h4>
<p>Es gibt einige Gründe dafür, die Anforderungen in Form von User Stories zu erfassen. Wesentlich ist unter anderem der Fokus auf der mündlichen statt schriftlichen Kommunikation. Im Dialog werden in kürzerer Zeit wesentlich mehr Informationen weitergetragen als es mit Dokumenten möglich wäre. Zudem wird auch weniger unnütze Dokumentation erstellt &#8211; unnütz ist sie nämlich dann, wenn sie eh keiner liest. Ein weiterer Grund für die Verwendung von User Stories ist, dass sie sowohl vom Kunden, vom Produkt Owner und auch den Entwicklern verstanden werden. Als nächstes wäre da noch aufzuführen, dass sie den richtigen Umfang für eine Planung haben und sie eignen sich für die iterative Entwicklung. Last but not least: User Stories ermutigen zum Auslassen von Details &#8211; zumindest solange, bis klar ist, was der Kunde tatsächlich möchte und bis das bestmögliche Verständnis darüber erreicht wurde, was gefordert wird.</p>
<p>In der Softwareentwicklung nach Scrum sind User Stories die meiner Meinung nach geeignetste Form Backlog-Items mit einem Wert für den Kunden oder den Product Owner zu formulieren. In einem meiner nächsten Artikel werde ich noch eine alternative Form von Stories vorstellen, doch zuvor wird es hier noch einen Artikel geben, der sich mit den Eigenschaften einer guten Story beschäftigt und euch auch Tipps gibt, wie man eine gute Story schreibt.</p>
<hr />
<p><span style="text-decoration: underline;">Literatur:</span></p>
<p style="padding-left: 30px;">[1] Mike Cohen, &#8222;User Stories Applied: For Agile Software Development&#8220;, Addison-Wesley Professional; 1 edition (11. März 2004)</p>
<p style="padding-left: 30px;">[2] Ian Mitchell, &#8222;Definitions of Done in Practice&#8220;, DZone Agile, <a href="https://perma.cc/KE4W-23BA">https://dzone.com/articles/definitions-done-practice</a> (13. Mai 2015)</p>
<p style="padding-left: 30px;">[3] Ron Jeffries, &#8222;Essential XP: Card, Conversation, and Confirmation&#8220;, XP Magazin (30. August 2001)</p>
<p><span style="text-decoration: underline;">Grafik:</span></p>
<ul>
<li>&#8222;Fairy Tales&#8220; by Comfreak [<a href="https://creativecommons.org/publicdomain/zero/1.0/deed.de" target="_blank" rel="noopener">Creative Commons CC0</a>], via <a href="https://pixabay.com/photo-1489035/">Pixabay</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Verfügbarkeit erhöhen durch Minimierung der MTTR</title>
		<link>https://budisantoso.de/verfuegbarkeit-erhoehen-durch-minimierung-der-mttr/</link>
		
		<dc:creator><![CDATA[Kresnadi Budisantoso]]></dc:creator>
		<pubDate>Sat, 08 Aug 2015 08:28:13 +0000</pubDate>
				<category><![CDATA[Softwareentwicklung & Technik]]></category>
		<category><![CDATA[availability]]></category>
		<category><![CDATA[mtbf]]></category>
		<category><![CDATA[mttf]]></category>
		<category><![CDATA[mttr]]></category>
		<category><![CDATA[resilient software design]]></category>
		<category><![CDATA[verfügbarkeit]]></category>
		<guid isPermaLink="false">http://budisantoso.de/?p=648</guid>

					<description><![CDATA[In meinem letzten Artikel sprach ich davon, Fehler in Softwaresystemen zu akzeptieren. Dieser Meinung ist auch Michael T. Nygard, wenn er es mit dem folgenden Satz auf die Spitze treibt: Normal mode of operation is partial failure. Also verfolgen wir doch bei der Erstellung von Software doch diesen Ansatz und gehen davon aus, dass der normale [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In meinem letzten Artikel sprach ich davon, Fehler in Softwaresystemen zu akzeptieren. Dieser Meinung ist auch Michael T. Nygard, wenn er es mit dem folgenden Satz auf die Spitze treibt:</p>
<blockquote>
<p>Normal mode of operation is partial failure.</p>
</blockquote>
<p>Also verfolgen wir doch bei der Erstellung von Software doch diesen Ansatz und gehen davon aus, dass der normale Betriebsmodus ein teilweiser Ausfall des Gesamtsystems bedeutet. Doch wie kommen wir zu dieser Annahme?</p>
<h2>Verfügbarkeit</h2>
<p>Bei dem Betrieb von Softwaresystemen dreht sich doch alles um die Verfügbarkeit. Man spricht von Availability bzw. oft sogar von High Availability wenn Anforderungen an Softwaresysteme gestellt werden und bemisst sie in einer prozentualen Wertangabe. Gefordert werden dann oft Werte von 99% oder sogar mehr, denn schon eine Nicht-Verfügbarkeit von einem Prozent bedeutet bei Betrachtung eines Gesamtsystems einen totalen Ausfall von 3,65 Tagen. Und wie du dir sicher denken kannst, bedeutet jeder Ausfall letztendlich Kosten; für die einen mehr, für die anderen weniger.</p>
<p>Wie sieht es nun aber aus, wenn mehrere Einzelsysteme am Gesamtsystem beteiligt sind? Angenommen wir haben ein Gesamtsystem, dass sich aus 5 einzelnen Sub-Systemen zusammensetzt. Jedes der Sub-Systeme garantiert eine Verfügbarkeit von 99,9%. Das Gesamtsystem letztendlich kann diese Verfügbarkeit nicht mehr sicherstellen, sondern erreicht nur noch einen Wert von 99,9%^5 = 99,5%. Damit ergibt sich eine voraussichtliche Ausfallzeit von 1 Tag 19 Stunden und 48 Minuten für das Gesamtsystem.</p>
<p>Wie berechnet sich Verfügbarkeit? Hierzu betrachten wir zunächst die Gesamtzeit, die sich einerseits zusammensetzt aus der mittleren Zeit die vergeht, bis ein Fehler auftritt; man spricht dann von <em>Mean-Time-To-Failure (MTTF)</em> oder manchmal auch von <em>Mean-Time-Between-Failures (MTBF)</em>. Andererseits ergibt sich die Gesamtzeit aus dem Komplementär von MTTF, nämlich aus der Zeit die man benötigt, um den ordentlichen Betriebszustand wiederherzustellen. Diese Größe nennt sich dann <em>Mean-Time-To-Recovery (MTTR)</em> oder auch <em>Mean-Time-To-Repair</em>. Die Verfügbarkeit ist letztendlich der Quotient aus der Mean-Time-To-Failure und der Gesamtzeit:</p>
<p style="text-align: center;"><strong>Availability := MTTF / (MTTF + MTTR)</strong></p>
<h2>Der klassische Ansatz</h2>
<p>Angenommen ein System fällt einmal im Monat aus (MTTF ~26,42h) und man benötigt vom Fehlereintritt bis zur Wiederhestellung des Betriebszustands im Schnitt 4 Stunden, dann hätte das System eine Verfügbarkeit von knapp 87%. Um eine besonders hohe Verfügbarkeit zu erreichen hat man in der Vergangenheit stets versucht, die Zeit bis zum Fehlereintritt (MTTF) zu maximieren. Folglich hätte eine verbesserte Variante des Systems nur noch mit einem Ausfall in 3 Monaten zu kämpfen (MTTF=87,25h, MTTR=4h) und die Verfügbarkeit läge dann bereits bei knapp 96%. Um eine Verfügbarkeit von 99% zu erreichen, wäre bei diesem System nicht einmal ein Ausfall pro Jahr vertretbar. Über Redundanz und andere Ansätze lässt sich die MTTF für das Gesamtsystem und damit die Verfügbarkeit noch weiter erhöhen.</p>
<p>Weiter oben bereits erwähnt habe ich jedoch die Problematik, die entsteht, wenn mehr als nur eine Systemkomponente existiert, also wenn sich das Gesamtsystem zusammensetzt aus mehreren Einzelsystemen, bei denen jedes eine andere Teilaufgabe erledigt. Dies Komposition eines Gesamtsystems aus einzelnen, verteilten Sub-Systemen und die Abhängigkeiten der Systeme untereinander ist jedoch genau das, was uns heute immer mehr begegnet. Gerade bei einer Ausrichtung hin zu Microservice Architekturen wird man bezüglich der Verfügbarkeit mit klassischen Ansätzen schnell an seine Grenzen stoßen.</p>
<p>Natürlich erhöht sich in der Softwareentwicklung die MTTF in der Regel mit jedem Bugfix, jedoch erhöht sich im Gegenzug auch immer wieder die Wahrscheinlichkeit für einen Fehler mit jedem zusätzlichen Feature. Es ist auch (nahezu?) unmöglich bzw. extrem kostspielig geworden in den heutigen komplexen Systemen alle möglichen Fehlerquellen zu identifizieren und sämtliche Fehler zu vermeiden. Hinzu kommt, dass während heutige Systemlandschaften immer größer werden, immer weiter verteilt sind und immer komplexere Abhängigkeitsstrukturen haben, auch die Verfügbarkeitsanforderungen immer weiter steigen.</p>
<h2>Der Resilience-Ansatz</h2>
<p>Erinnern wir uns an meinen letzten Artikel &#8222;Shit happens &#8230;&#8220; und dem damit verbundenen Aufruf umzudenken und Fehler in Systemen zu akzeptieren. Wenn wir also davon ausgehen, dass es immer irgendwo einen Fehler geben wird und wir den Eintritt auch nicht verhinden können, dann sind wir auch nicht in der Lage, die Verfügbarkeit zu erhöhen indem wir die MTTF maximieren. Im Gegenzug müssen wir die MTTF als gegeben hinnehmen und demnach die MTTR minimieren, um eine hohe Verfügbarkeit zu erreichen. Beim Resilient Software Design geht es also darum, ein System zu erschaffen, das mit allen möglichen erwarteten und vor allem auch unerwarteten Fehlern umgehen kann. Im besten Fall gelingt dies so, dass der Endanwender letztendlich nichts von den Fehlern mitbekommt.</p>
<p>Ausblick: In den kommenden Artikeln möchte ich mich mit den Grundprinzipien von Resilient Software Design beschäftigen, Anti-Patterns beleuchten und einen Überblick über Stability-Patterns geben.</p>
<hr />
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">Literatur:</span></p>
<p><span id="js-reference-string-2" class="selectable">[1] U. Friedrichsen, &#8218;Damit es auch morgen noch Läuft &#8211; Eine kurze Einführung in Resilient Software Design&#8216;, <i>Javamagazin</i>, no. 5.2015, pp. 33-39, 2015.</span></p>
<p><span id="js-reference-string-3" class="selectable">[2] M. Nygard, <i>Release it!</i>. Raleigh, N.C.: Pragmatic Bookshelf, 2007.</span></p>
<p><span id="js-reference-string-3" class="selectable"><span id="js-reference-string-4" class="selectable">[3] Z. Taylor and S. Ranganathan, <i>Designing high availability systems</i>. Hoboken, New Jersey: John Wiley &amp; Sons Inc., 2014. </span> </span></p>
<p><span style="text-decoration: underline;">Grafik:</span></p>
<ul>
<li>„img_0001“ by <a href="https://www.flickr.com/photos/52336371@N07/" target="_blank">Jannis</a>, <a href="https://www.flickr.com/photos/52336371@N07/12296754993" target="_blank">https://www.flickr.com/photos/52336371@N07/12296754993</a>, <a href="https://creativecommons.org/licenses/by-sa/2.0/" target="_blank">Bestimmte Rechte vorbehalten</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Shit happens! Finde dich damit ab &#8230;</title>
		<link>https://budisantoso.de/shit-happens-finde-dich-damit-ab/</link>
		
		<dc:creator><![CDATA[Kresnadi Budisantoso]]></dc:creator>
		<pubDate>Tue, 04 Aug 2015 10:29:18 +0000</pubDate>
				<category><![CDATA[Softwareentwicklung & Technik]]></category>
		<category><![CDATA[fehler]]></category>
		<category><![CDATA[fehlertypen]]></category>
		<category><![CDATA[resilient software design]]></category>
		<category><![CDATA[stabilität]]></category>
		<guid isPermaLink="false">http://budisantoso.de/?p=640</guid>

					<description><![CDATA[re·sil·ience (rĭ-zĭl′yəns), noun The ability to recover quickly from illness, change, or misfortune; buoyancy. The property of a material that enables it to resume its original shape or position after being bent, stretched, or compressed; elasticity. http://www.thefreedictionary.com/resilience [1] Der erste Schritt in Richtung Resilient Software Design ist, zu akzeptieren, dass jede Software &#8222;fehlerhaft&#8220; ist.  Erst wenn [&#8230;]]]></description>
										<content:encoded><![CDATA[<blockquote><p><strong>re·sil·ience (rĭ-zĭl′yəns<span class="pron">), noun</span></strong></p>
<ol>
<li>The ability to recover quickly from illness, change, or misfortune; buoyancy.</li>
<li>The property of a material that enables it to resume i<span class="hvr">ts</span> <span class="hvr">original</span> <span class="hvr">shape</span> or <span class="hvr">position</span> <span class="hvr">after</span> <span class="hvr">being</span> <span class="hvr">bent,</span> <span class="hvr">stretched,</span> or <span class="hvr">compressed;</span> <span class="hvr">elasticity.</span></li>
</ol>
<p><em><a href="http://www.thefreedictionary.com/resilience" target="_blank">http://www.thefreedictionary.com/resilience</a> [1]</em></p></blockquote>
<p>Der erste Schritt in Richtung Resilient Software Design ist, zu akzeptieren, dass jede Software &#8222;fehlerhaft&#8220; ist.  Erst wenn man akzeptiert, dass Fehler auftreten werden, ist man in der Lage darüber nachzudenken, wie man dieser Tatsache begegnen kann, um stabile, robuste, verlässliche Softwaresysteme zu erschaffen. <span style="line-height: 1.5;">Frei übersetzt nach Micheal T. Nygard [4] benötigt Unternehmenssoftware die folgende Eigenschaft: </span><strong style="line-height: 1.5;">Software muss zynisch sein</strong><span style="line-height: 1.5;">. Zynische Software erwartet immer das Schlimmste und ist nicht überrascht, wenn der schlimmste Fall auch eintritt. Zynische Software vertraut nicht einmal sich selbst</span><span style="line-height: 1.5;">; sie erstellt interne Barrieren um sich selbst vor </span><span style="line-height: 1.5;">Fehlern zu schützen. Zynische Software lehnt es ab mit anderen Systemen eine zu intime </span><span style="line-height: 1.5;">Beziehung einzugehen</span><span style="line-height: 1.5;">, da sie verletzt werden könnte.</span></p>
<p>Wenn ich hier von Fehlern spreche, dann sind es nicht nur Bugs im Code die zu Systemabstürzen führen, sondern auch Fehler, die man bei der Erstellung der Softwarearchitektur und dem Design der Systemkommunikation gemacht hat, indem man eine Entscheidung getroffen hat, die zwar den funktionalen Anforderungen genügt, jedoch zu Systemausfällen führen kann und damit auch zwangsläufig zu Systemausfällen führt. Daher sollte man stets sowohl in der Softwarearchitektur und dem Design als auch bei der Implementierung immer einen Blick in Richtung Systemstabilität werfen.</p>
<p>Uwe Friedrichsen zitiert die folgenden Fehlertypen, die man bei Resilient Software Design berücksichtigen sollte und verweist darauf, dass man sich nicht nur auf die &#8222;einfachen&#8220; Absturzfehler beschränken darf [2, 3]:</p>
<ol>
<li><em>Crash Failure</em> (Absturzfehler)<br />
ein System antwortet permanent nicht mehr, hat bis zum Zeitpunkt des Ausfalls aber korrekt gearbeitet</li>
<li><em>Omission Failure</em> (Auslassungsfehler)<br />
ein System reagiert auf (einzelne) Anfragen nicht, sei es, dass es die Anfragen nicht erhält oder keine Antwort sendet</li>
<li><em>Timing Failure</em> (Antwortzeitfehler)<br />
die Antwortzeit eines Systems liegt außerhalb eines festgelegten Zeitintervalls</li>
<li><em>Response Failure</em> (Antwortfehler)<br />
die Antwort, die ein System gibt, ist falsch</li>
<li><em>Byzantine Failure</em> (Byzantinischer/zufälliger Fehler)<br />
ein System gibt zu zufälligen Zeiten zufällige Antworten („es läuft Amok“)</li>
</ol>
<p>&nbsp;</p>
<p>Wie gesagt, shit happens &#8230; und das ist auch der Grund, weshalb wir uns mit Resilient Software Design beschäftigen sollten. In einem meiner nächsten Artikel möchte ich das Thema vertiefen und mich dabei auf den Punkt &#8222;Verfügbarkeit&#8220; (Availability) konzentrieren.</p>
<hr />
<p><span style="text-decoration: underline;">Literatur:</span></p>
<p>[1] American Heritage® Dictionary of the English Language, Fifth Edition. Copyright © 2011 by Houghton Mifflin Harcourt Publishing Company. Published by Houghton Mifflin Harcourt Publishing Company. All rights reserved.</p>
<p><span id="js-reference-string-0" class="selectable">[2] U. Friedrichsen, &#8218;Unkaputtbar, Eine kurze Einführung in Resilient Software Design&#8216;, <i>Business Technology</i>, no. 414, 2014 [Online]. Available: <a href="https://www.codecentric.de/files/2015/02/Sonderdruck_Codecentric_BT4_14_27964_mon.pdf" target="_blank">https://www.codecentric.de/files/2015/02/Sonderdruck_Codecentric_BT4_14_27964_mon.pdf</a>. [Accessed: 04- Aug- 2015]</span></p>
<p><span id="js-reference-string-1" class="selectable">[3] U. Friedrichsen, &#8218;Eine kurze Einführung in Resilient Software Design&#8216;, <i>jaxenter.de</i>, 2015. [Online]. Available: <a href="https://jaxenter.de/unkaputtbar-einfuehrung-resilient-software-design-15119" target="_blank">https://jaxenter.de/unkaputtbar-einfuehrung-resilient-software-design-15119</a>. [Accessed: 04- Aug- 2015]</span></p>
<p><span id="js-reference-string-2" class="selectable">[4] M. Nygard, <i>Release it!</i>. Raleigh, N.C.: Pragmatic Bookshelf, 2007.</span></p>
<p><span style="text-decoration: underline;">Grafiken:</span></p>
<ul>
<li>&#8222;Tennis ball&#8220; by <a class="owner-name truncate" title="Geh zum Fotostream von Lemsipmatt" href="https://www.flickr.com/photos/lemsipmatt/" target="_blank" data-track="attributionNameClick" data-rapid_p="33">Lemsipmatt</a>, <a href="https://www.flickr.com/photos/lemsipmatt/2470490055" target="_blank">https://www.flickr.com/photos/lemsipmatt/2470490055</a>, <a href="https://creativecommons.org/licenses/by-sa/2.0/">Bestimmte Rechte vorbehalten</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
