<?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>Carsten Czeczine, Author at Binaris Informatik</title>
	<atom:link href="https://stage-binaris-informatik.de/author/czeczine/feed/" rel="self" type="application/rss+xml" />
	<link>https://stage-binaris-informatik.de/author/czeczine/</link>
	<description>Software &#38; Agilität als Passion</description>
	<lastBuildDate>Tue, 27 May 2025 06:52:52 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>

<image>
	<url>https://stage-binaris-informatik.de/wp-content/uploads/2022/03/cropped-favicon-bianris-informatik-32x32.png</url>
	<title>Carsten Czeczine, Author at Binaris Informatik</title>
	<link>https://stage-binaris-informatik.de/author/czeczine/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Test Driven Development in sechs einfachen Schritten</title>
		<link>https://stage-binaris-informatik.de/2023/04/25/test-driven-development-in-sechs-einfachen-schritten/</link>
		
		<dc:creator><![CDATA[Carsten Czeczine]]></dc:creator>
		<pubDate>Tue, 25 Apr 2023 11:51:38 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Neuigkeiten]]></category>
		<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testen]]></category>
		<guid isPermaLink="false">http://webseite.binaris-informatik.de/?p=369</guid>

					<description><![CDATA[<p>Sie möchten eine neue Software entwickeln. Dabei haben Sie natürlich die Absicht ein tolles Produkt mit einer hervorragenden technischen Qualität zu erzeugen. Und diese hervorragende technische Qualität wollen Sie mit einer möglichst umfassenden Testabdeckung beweisen und absichern. Doch in erschreckend vielen Fällen werden die Punkte hervorragende technische Qualität und umfassende Testabdeckung deutlich verfehlt. Bei der [&#8230;]</p>
<p>The post <a href="https://stage-binaris-informatik.de/2023/04/25/test-driven-development-in-sechs-einfachen-schritten/">Test Driven Development in sechs einfachen Schritten</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="369" class="elementor elementor-369" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-7fa32fa1 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7fa32fa1" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-244d2cf9" data-id="244d2cf9" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-116e1cdc elementor-widget elementor-widget-text-editor" data-id="116e1cdc" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Sie möchten eine neue Software entwickeln. Dabei haben Sie natürlich die Absicht ein tolles Produkt mit einer hervorragenden technischen Qualität zu erzeugen. Und diese hervorragende technische Qualität wollen Sie mit einer möglichst umfassenden Testabdeckung beweisen und absichern. Doch in erschreckend vielen Fällen werden die Punkte hervorragende technische Qualität und umfassende Testabdeckung deutlich verfehlt.</p><p>Bei der Suche nach einem Weg, wie Sie das in Zukunft besser machen können wird dann oft ein Konzept in den Raum geworfen, dass die Lösung für all unsere Probleme sein soll:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-f0c8b20 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="f0c8b20" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-44b335a" data-id="44b335a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-9a6d285 elementor-widget elementor-widget-text-editor" data-id="9a6d285" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p style="text-align: center;">Test Driven Development</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-a09e694 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="a09e694" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c40b4c0" data-id="c40b4c0" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-97f2f7e elementor-widget elementor-widget-text-editor" data-id="97f2f7e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Wenn Sie dann fragen, wie Test Driven Development dieses Wunder denn vollbringen möchte, dann bekommen Sie oft zur Antwort, dass Sie einfach nur die Reihenfolge von Programmierung und Testen umdrehen müssen und der Rest regelt sich dann schon von ganz alleine.</p><p>In diesem Artikel wollen wir uns damit beschäftigen, ob dieses Versprechen zu schön ist, um wahr zu sein oder ob da doch etwas dran ist.</p><p>Um es hier gleich zum Anfang zu verraten: Ja, Test Driven Development kann tatsächlich dieses scheinbare Wunder wirken. Allerdings nur, wenn wir Test Driven Development, oft einfach auch nur TDD genannt, wirklich verstehen. Inklusive allem, was rund um das Grundkonzept mit zum Gesamtpaket TDD gehört.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-6dfde930 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6dfde930" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-59c01226" data-id="59c01226" data-element_type="column">
			<div class="elementor-widget-wrap">
							</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-3874760d" data-id="3874760d" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-5fd8eb4e elementor-widget elementor-widget-text-editor" data-id="5fd8eb4e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p><i>„Test Driven Development ist  nicht nur ‚erst Test, dann Programmierung‘, es ist ein Gesamtpaket“</i></p>								</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4d2904e0" data-id="4d2904e0" data-element_type="column">
			<div class="elementor-widget-wrap">
							</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-f4408f0 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="f4408f0" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-77cf2c4" data-id="77cf2c4" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-6401e9c elementor-widget elementor-widget-text-editor" data-id="6401e9c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Sehr oft beobachten wir, dass Unternehmen TDD einführen wollen und kurz danach wieder verwerfen, weil es bei ihnen scheinbar nicht funktioniert oder nicht passt. Unsere These ist dann in den meisten Fällen, dass sie nicht den vollen Umfang von TDD verstanden und nur den offensichtlichen Teil probiert haben. Deshalb schauen wir uns heute gemeinsam an, woraus das Gesamtpaket TDD besteht und welche Schritte notwendig sind, damit es auch bei Ihnen funktionieren kann.</p><p>Betrachten wir TDD genauer, dann stellen wir fest, dass bevor wir zum offensichtlichen Kernelement kommen, also die Reihenfolge Implementierung/Test umzudrehen, wir erst ein paar Hausaufgaben zu machen haben. Und dass wir nach der Umsetzung des Kernelements noch einen zusätzlichen Schritt weitergehen müssen, um wirklichen Erfolg haben zu können.</p><p>Aber keine Angst, in diesem einfachen 6-Schritte-Programm zeigen wir Ihnen, wie Sie Test Driven Development erfolgreich in Ihrem Unternehmen oder Projekt einführen und damit in Zukunft Ihre Erwartungen an technische Qualität und Testabdeckung erfüllen können.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-2f54faeb elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="2f54faeb" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-98f842" data-id="98f842" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-659c4215 elementor-widget elementor-widget-heading" data-id="659c4215" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Schritt Eins: Die Motivation zum Testen klären</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-59d6e810 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="59d6e810" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-631a2907" data-id="631a2907" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-56b60e10 elementor-widget elementor-widget-text-editor" data-id="56b60e10" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Der erste Schritt besteht darin, zu klären was Tests eigentlich sind oder besser, warum wir eigentlich testen wollen.</p>
<p>„Warum müssen wir denn über den Grund für das Testen reden, der ist doch klar. Ich will nur wissen, ob mein Programm auch funktioniert!“ mag sich da so mancher nun denken. So haben es viele von uns auch ursprünglich mal gelernt. Wir schreiben ein Stück Software und dann überprüfen wir, ob es auch funktioniert. Fertig!</p>
<p>Doch die Realität ist ein bisschen komplexer. In unserer Wahrnehmung gibt es vier Gründe zum Testen bzw. zum Schreiben von automatisierten Tests:</p>
<ol style="font-size: 16px; background-color: #ffffff;">
<li style="font-size: 16px;">Wir suchen die Ursache für einen Fehler und testen deshalb das Verhalten eines gegebenen Systems</li>
<li style="font-size: 16px;"><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Wir haben ein System oder einen Teil eines Systems erstellt und wollen nun die einwandfreie Funktionsweise unserer Schöpfung beweisen und auf Dauer sicherstellen</span></li>
<li style="font-size: 16px;">Wir haben vor, ein System oder einen Teil eines Systems zu erstellen und wollen über Tests bereits im Vorfeld unsere Erwartungshaltung definieren, damit wir genau das Richtige implementieren</li>
<li style="font-size: 16px;">Wir haben vor, ein System oder einen Teil eines Systems zu erstellen und wollen mit Tests dabei helfen, dass unser System wartbar und weiterentwickelbar ist bzw. bleibt</li>
</ol>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-971408d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="971408d" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c093b0c" data-id="c093b0c" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-c9ca2f3 elementor-widget elementor-widget-text-editor" data-id="c9ca2f3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Für jede dieser Intentionen gibt es verschiedene Arten von Test und Vorgehensweisen, die den angestrebten Zweck erreichen können. Abhängig davon, was wir eigentlich mit unserem Testen erreichen wollen, müssen oder können wir die dazu passenden Formen von Tests und Vorgehensweisen wählen.</p><p>Das klingt sehr trivial und ist es auch. Vielleicht ist es gerade deshalb so wichtig, diesen Schritt bewusst zu gehen. Wenn wir ein neues Produkt erstellen oder ein bereits bestehendes um neue Funktionalitäten erweitern wollen, dann sind vor allem der dritte und vierte Grund unsere Hauptmotivation in Verbindung mit dem zweiten.</p><p>Nur den zweiten Grund als Motivation zum Testen zu sehen ist eine sehr eingeschränkte Sichtweise, die das volle Potenzial des Testens außen vor lässt und unsere Möglichkeiten beschränkt, die bessere Software erstellen zu können. Erst hinterher durch Tests die korrekte Funktionsweise einer Software sicherstellen zu wollen ist der Grund, warum in vielen Unternehmen die Qualitätssicherung nichts mit der Produktentwicklung zu tun hat und warum Testen als ein separater, von der Programmierung getrennter Schritt verstanden wird. Das ist die Absicht, erst hinterher festzustellen, dass „es“ nicht funktioniert und dann noch zu versuchen, das Produkt zu retten. </p><p>Wir dahingehen wollen Qualitätssicherung oder Qualitätsmanagement als Bestandteil der Produktentwicklung sehen. Wir wollen direkt das funktionierende, wartbare und erweiterbare Produkt bauen.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-2cd1ebc4 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="2cd1ebc4" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-49ee3d78" data-id="49ee3d78" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-5fa31277 elementor-widget elementor-widget-heading" data-id="5fa31277" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Schritt Zwei: Die Eigenschaften guter Software erkennen</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-5f55993 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5f55993" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4bf1482" data-id="4bf1482" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-ffe1ffd elementor-widget elementor-widget-text-editor" data-id="ffe1ffd" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Das führt uns direkt zum zweiten Schritt in unserem Programm, die technischen Eigenschaften guter Software. Gute, robuste Softwarekomponenten zeichnen sich durch folgende vier Eigenschaften aus:</p><ul><li>Lauffähigkeit</li><li>Einfachheit</li><li>Relevanz</li><li>Redundanzfreiheit</li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-6956303 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6956303" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4d6c239" data-id="4d6c239" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-c0d41fc elementor-widget elementor-widget-text-editor" data-id="c0d41fc" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Was bedeutet das? In erster Linie wollen wir, dass unsere Software funktioniert. Und zwar fehlerfrei. Das ist schon mal klar verständlich.</p><p>Dann möchten wir aus Gründen der Wartbarkeit, dass sie möglichst einfach ist bzw. dass alle einzelnen Komponenten möglichst simple und leicht verständlich sind. Jeder Softwareentwickler, der schon mal in eher schwer verständlichen Sourcecode Änderungen einbauen musste, ist von diesem Punkt direkt ein großer Fan. Und ebenso jeder Projektverantwortliche, der für eine Weiterentwicklung schon mal astronomische Aufwandsschätzungen zu hören bekam mit der Begründung, der aktuelle Softwarestand wäre schwer zu verstehen und deshalb schwer zu erweitern.</p><p>Und natürlich ist es eine gute Idee, wenn jedes Stück Sourcecode auch wirklich einen relevanten Teil zur Lösung des Problems beiträgt. Unnützer oder toter Code reduziert nur die Wartbarkeit. </p><p>Das gleiche gilt auch für die Freiheit von Redundanzen, also doppeltem Code; auch diese erhöht die Wartbarkeit und reduziert das Fehlerrisiko.</p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Relevanz und Redundanzfreiheit sind in dieser Liste Begriffe, die in sich schon sehr gut erklären, wann sie tatsächlich gegeben sind. Wenn jedes Stück Sourcecode auch wirklich benutzt wird, dann ist alles relevant und wenn es nirgendwo identische Codestellen gibt, dann ist die Software auch redundanzfrei.</span></p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Spannender wird es schon bei der Lauffähigkeit und der Einfachheit, denn für beides ist eine genauere Definition nötig. Die Lauffähigkeit lässt sich gut durch Akzeptanzkriterien definieren oder auch eine sogenannte Definition of Done, in der die Beteiligten gemeinsam festhalten, was es bedeutet, dass eine Funktionalität oder ein Feature fertig ist.</span></p><p>Ähnliches gilt für Einfachheit, auch diese Worthülse darf mit einer gemeinsamen Definition mit echtem Leben gefüllt werden, z.B. mit Code Metriken, Style Guides oder gemeinsamen Architekturkonzepten.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-1b6e353a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="1b6e353a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4ea4920" data-id="4ea4920" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-11afc18 elementor-widget elementor-widget-heading" data-id="11afc18" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Schritt Drei: Das Schreiben echter Unit Tests lernen</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-fcfe775 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="fcfe775" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-287c41b" data-id="287c41b" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-28674df elementor-widget elementor-widget-text-editor" data-id="28674df" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Im nächsten Schritt dürfen wir lernen, was echte Unit Tests sind und wie sie geschrieben werden. </p><p>Wie wir jetzt auf Unit Tests kommen? Wie wir gleich sehen werden, sind Unit Tests die unterste und elementarste Ebene der technischen Tests und eine Grundlage beim Test Driven Development. Deshalb beschäftigen wir uns nun in diesem Schritt mit Unit Tests.</p><p>Bei dem Begriff Unit Test haben wir ähnliche Herausforderungen wie bei den Begriffen Lauffähigkeit und Einfachheit: Jeder hat den Begriff schon gehört und auch eine Vorstellung davon, was diese bedeuten. Nur bedeutet das noch lange nicht, dass wir auch alle das Gleiche darunter verstehen.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-35084eaa elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="35084eaa" data-element_type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5f18cbb2" data-id="5f18cbb2" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-6b6da82d elementor-widget elementor-widget-text-editor" data-id="6b6da82d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p><b>Die babylonische Sprachverwirrung</b></p><p>Modul-, Komponenten-, Integrations-, System-, Akzeptanz-, End-to-End- oder Abnahmetest, Namen für unterschiedlichen Testlevel oder -arten gibt es viele. Allerdings sind die Bedeutungen nicht wirklich standardisiert. Sie sind nur Vereinbarungen zwischen den betroffenen Personen. Stellen Sie also sicher, dass Sie wirklich alle das gleiche unter diesen Begriffen verstehen und gehen Sie nicht einfach blind davon aus. Den Begriffen oben ist gemeinsam, dass sie alle die Reichweite, den Scope, der Teststufe beschreiben und nicht das Verfahren. Im Gegensatz zu Begriffen wie Performance-, Last-, Langzeit-, Monkey- oder Smoketests. Und auch hier gilt: Klären Sie das gemeinsame Verständnis der Begriffe.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-6a91f658 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6a91f658" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-dfabf88" data-id="dfabf88" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8de6301 elementor-widget elementor-widget-text-editor" data-id="8de6301" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Definitionen zu Unit-Test, die wir schon oft von unseren Kunden zu gehört haben sind diese:</p><ul><li>„Unit Tests sind die Entwicklertests, also alles, was die Entwickler testen“</li><li>„Mit Unit Tests testen wir einzelne Einheiten“</li><li>„Unit Tests sind Klassentests“</li><li>„Unit Tests testen die Funktionen von Klassen“</li><li>„Unit Tests sind die automatisierten Tests“</li><li>„Unit Tests sind Tests, die mit JUnit geschrieben wurden“</li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-28f788f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="28f788f" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-71c8b96" data-id="71c8b96" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-aeb845e elementor-widget elementor-widget-text-editor" data-id="aeb845e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Jede dieser Definitionen ist durchaus nachvollziehbar und doch ist keine davon so richtig hilfreich. Gehen wir also in die genaue Klärung des Begriffs Unit Test.</p><p>In der Liste der Motivationen zum Testen sind Unit Tests ein geeignetes Mittel für die Punkte zwei, drei und vier. Um diese Behauptung überprüfen zu können, betrachten wir, was denn ein Unit Test eigentlich sein soll. Unser erster Versuch einer Definition lautet wie folgt:</p><p>Unit Tests sind ein Verfahren, um das Verhalten einer Komponente isoliert, d.h. ohne ihre Abhängigkeiten zu anderen Komponenten, zu überprüfen.</p><p>Das bedeutet, wir wollen ein bestimmtes Verhalten in einem klar definierten Kontext überprüfen und dabei jede Form von Seiteneffekten vermeiden. Deshalb klammern wir die Abhängigkeiten zu anderen Komponenten explizit aus. Jede weitere Komponente, von der unser zu testendes Verhalten abhängig ist, bedeutet einen weiteren Faktor, den wir kontrollieren müssen bzw. der das Ergebnis unseres Tests beeinflussen kann. </p><p>Wie können wir nun diesen Anspruch auf isoliertes Testen in unseren Tests umsetzen?</p><p>Sehen wir uns dazu ein Beispiel in Java an. In einem Baseballszenario wirft ein Pitcher einen Ball, den ein Spieler zu treffen versucht. Wir möchten einen Unit Test für die Methode hitBaseball() schreiben, bei der der Spieler einen durchschnittlich geworfenen Ball erfolgreich treffen soll. Spontan sähe unser Test so aus:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-41edb81 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="41edb81" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9424a07" data-id="9424a07" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8369eb0 elementor-widget elementor-widget-image" data-id="8369eb0" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img fetchpriority="high" decoding="async" width="800" height="184" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/01_Codebeispiel-simple-1024x235.png" class="attachment-large size-large wp-image-5322" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/01_Codebeispiel-simple-1024x235.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/01_Codebeispiel-simple-300x69.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/01_Codebeispiel-simple-768x176.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/01_Codebeispiel-simple-1536x353.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/01_Codebeispiel-simple-2048x470.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-65ae858b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="65ae858b" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2be29637" data-id="2be29637" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-6fd4131e elementor-widget elementor-widget-text-editor" data-id="6fd4131e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Der Pitcher erzeugt beim Werfen einen Ball, der alle Attribute eines Balles hat, der durchschnittlich geworfen wurden. Der Spieler versucht den Ball zu treffen und wir gehen eigentlich davon aus, dass er das müsste. Das ist unsere Erwartungshaltung.</p><p>Ist das nun ein Unit Test gemäß unserer Definition oben? Ganz klar nein! </p><p>Neben der Methode hitBaseball(x), dem Verhalten, dass wir eigentlich testen wollen, testen wir hier auch direkt noch throw(y) von Pitcher mit und die interne Implementierung von Baseball. Wenn dieser Test fehlschlägt, dann ist nicht deutlich ersichtlich, woran das liegen könnte, die Anzahl der Codestellen, die sich unerwartet verhalten ist einfach zu groß.</p><p>Probieren wir es mal anders:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-37fb445 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="37fb445" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-853b04e" data-id="853b04e" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-ea3e3ab elementor-widget elementor-widget-image" data-id="ea3e3ab" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img decoding="async" width="800" height="205" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/02_Codebeispiel-erweitert-1024x262.png" class="attachment-large size-large wp-image-5326" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/02_Codebeispiel-erweitert-1024x262.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/02_Codebeispiel-erweitert-300x77.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/02_Codebeispiel-erweitert-768x196.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/02_Codebeispiel-erweitert-1536x393.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/02_Codebeispiel-erweitert-2048x524.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-457ca1f5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="457ca1f5" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6ebba0c8" data-id="6ebba0c8" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-339e2193 elementor-widget elementor-widget-text-editor" data-id="339e2193" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Was ist jetzt anders? </p><p>Um die Methode hitBaseball testen zu können, benötigen wir einen Baseball. Nur lassen wir uns den diesmal nicht von einem Pitcher, den wir ja hier überhaupt nicht testen wollen, erzeugen. Stattdessen erzeugen wir uns mit Hilfe eines Mock Frameworks, hier Mockito, einen Mock, der so aussieht, wie ein Baseball.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-4c2bdf3 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4c2bdf3" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-68eafb6" data-id="68eafb6" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-605eb13 elementor-widget elementor-widget-image" data-id="605eb13" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img decoding="async" width="800" height="38" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/03_Codebeispiel-Mock-erzeugt-1024x48.png" class="attachment-large size-large wp-image-5327" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/03_Codebeispiel-Mock-erzeugt-1024x48.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/03_Codebeispiel-Mock-erzeugt-300x14.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/03_Codebeispiel-Mock-erzeugt-768x36.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/03_Codebeispiel-Mock-erzeugt-1536x72.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/03_Codebeispiel-Mock-erzeugt-2048x95.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-15cb991 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="15cb991" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f9befe5" data-id="f9befe5" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-603d4b1 elementor-widget elementor-widget-text-editor" data-id="603d4b1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Wir brauchen jetzt keinen Pitcher mehr und sind damit in unserem Test auch nicht mehr davon abhängig, dass der Pitcher sich wirklich wie erwartet verhält. Durch den Mock haben wir uns selber etwas erzeugt, dass wie ein Baseball aussieht. Allerdings müssen wir nun noch sicherstellen, dass sich dieser Mock auch wie ein durchschnittlich geworfener Baseball verhält.</p><p>In diesem Beispiel wissen wir aus der Implementierung vom BaseballPlayer, dass wir den Ball nach seiner Geschwindigkeit fragen werden. Also erklären wir dem Mock, dass er 90 (mph) zu antworten hat, wenn er nach seiner Geschwindigkeit gefragt wird.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-deb2b9b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="deb2b9b" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-edf4398" data-id="edf4398" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-dd4ce84 elementor-widget elementor-widget-image" data-id="dd4ce84" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="38" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/04_Codebeispiel-Mockverhalten-1024x48.png" class="attachment-large size-large wp-image-5331" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/04_Codebeispiel-Mockverhalten-1024x48.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/04_Codebeispiel-Mockverhalten-300x14.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/04_Codebeispiel-Mockverhalten-768x36.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/04_Codebeispiel-Mockverhalten-1536x71.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/04_Codebeispiel-Mockverhalten-2048x95.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-09747b6 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="09747b6" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f26c09a" data-id="f26c09a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-5a698cf elementor-widget elementor-widget-text-editor" data-id="5a698cf" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>So testen wir exakt nur noch das Verhalten von hitBaseball(x).</p><p>Wenn wir Tests auf diese Art und Weise schreiben, dann bekommen wir als Ergebnis eine ganze Menge an Tests, die jeweils nur ein ganz bestimmtes Verhalten einer Komponente testen. Wir sagen manchmal auch, ein Unit Test testet nur einen einzelnen Aspekt einer Komponente. Das verfeinert unsere Definition von Unit Test.</p><p>Aber warum tun wir uns das an? Es ist schon eine ganze Menge Arbeit, so viele so kleine Tests zu schreiben. Und es ist ja nicht nur die Menge der Tests, die nun zu schreiben sind. Auch die Implementierung selbst ist so zu halten, dass diese einzelnen Aspekte überhaupt isoliert testbar sind. </p><p>Wir könnten doch auch einfach eine kleinere Anzahl an großen Tests schreiben, die direkt mehrere, oder sogar alle Aspekte einer Komponente und das Zusammenspiel mit ihren abhängigen Komponenten testen, oder? Ja, könnten wir. Aber genau das wollen wir nicht mehr. </p><p>Lassen Sie uns drei Motivationen anführen, warum wir stattdessen echte Unit Tests verwenden möchten:</p><p style="padding-left: 40px;"><span style="background-color: transparent; color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight );">a. Wenn meine „großen“, komplexen Tests grün laufen, also kein Fehler auftritt, dann ist alles in Ordnung. Easy going. Aber wenn jetzt doch was nicht in Ordnung ist, was genau stimmt dann nicht. Mein „großer“ Test verrät es im schlimmsten Fall nicht, die einzige Aussage wäre: „Irgendetwas stimmt nicht!“ Und selbst bei einem besser strukturierten Test bleiben noch eine Reihe von potenziellen Fehlergründen offen, die wir nun manuell durchtesten müssten. Bis wir wüssten, was tatsächlich das Problem ist und es beheben könnten, müssten wir viel weitere Arbeit investieren. Haben wir viele einzelne Tests, die unabhängig voneinander einzelne Aspekte testen, zeigt uns der fehlschlagende Test direkt die Fehlerursache an. Fehlerfinden und -beheben wird damit zum Kinderspiel.</span></p><div style="padding-left: 40px;"><p><span style="background-color: transparent; color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight );">b. Ein größerer Testkontext besteht meistens aus einer größeren Anzahl an Parametern, Ausgangsbedingungen oder Ablaufmöglichkeiten, die unterschiedliche Ergebnisse erzielen können. Selbst wenn wir nur eine repräsentative Auswahl an realistischen Szenarien mit Tests abbilden möchten, wird durch die Komplexität der Abhängigkeiten die Anzahl der notwendigen Tests schnell groß, oft sogar sehr groß. Und wir reden hier von „größeren“ Tests, also höherem Aufwand pro Test. Haben Sie dadurch schon mal sehenden Auges eine geringere Testabdeckung in Kauf genommen, obwohl Sie ein schlechtes Gefühl dabei hatten? Seien Sie ehrlich! Die Reduzierung des Testkontextes auf den einzelnen Aspekt einer Komponente, reduziert damit auch die Komplexität der Tests. Weil diese Test unabhängig voneinander sind, entsteht für die Testabdeckung nun auch nicht mehr das Kreuzprodukt aller möglichen Kombinationen. Für die Auswahl der übergeordneten Tests, die das Zusammenspiel der Aspekte testen, können wir uns nun auf eine wirklich repräsentative Auswahl realistischer Szenarien beschränken. Wir werden später noch über diese Art von Tests reden.</span></p><p><span style="background-color: transparent; color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight );">c. Was schrieben wir oben? Für Unit Tests muss die Implementierung so geschrieben sein, dass die einzelnen Aspekte überhaupt einzeln testbar sind. Das bedeutet nichts anderes als ein wirklich modulares Design bis in den letzten Winkel und ein hohes Maß an loser Kopplung. Müssen wir hier noch über die Vorteile einer derartigen Architektur reden? Wohl kaum. Unit Tests zwingen uns also zum besseren technischen Design.</span></p></div>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-51a83d7e elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="51a83d7e" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4c6eddbd" data-id="4c6eddbd" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-42417e93 elementor-widget elementor-widget-heading" data-id="42417e93" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h5 class="elementor-heading-title elementor-size-default"><h4 class="elementor-heading-title elementor-size-default elementor-inline-editing pen" data-elementor-setting-key="title" data-pen-placeholder="Eingabe hier..." style="font-family: Poppins, sans-serif; font-weight: var( --e-global-typography-primary-font-weight ); line-height: var( --e-global-typography-primary-line-height );">AAA-Regel</h4></h5>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-aa20797 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="aa20797" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b6b95b6" data-id="b6b95b6" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-cb6b35a elementor-widget elementor-widget-text-editor" data-id="cb6b35a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Um jetzt gute Unit Tests zu schreiben, gibt es ein paar Faustformeln, wie ein Unit Test aussehen sollte. Eine davon ist die AAA-Regel. AAA steht dabei für</p><ul><li>Arrange</li><li>Act</li><li>Assert</li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-15b66c3 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="15b66c3" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f584917" data-id="f584917" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-94834ce elementor-widget elementor-widget-text-editor" data-id="94834ce" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>und beschreibt den Aufbau eines Unit Tests. </p><p>Im <b>Arrange </b>wird die Startsituation des Tests definiert. Die Komponente wird erzeugt und initialisiert, Mocks werden erzeugt, gesetzt und evtl. das Verhalten der Mocks definiert, Variablen werden gesetzt.</p><p>Im <b>Act</b> wird die eigentliche Aktion, die das zu verifizierende Ergebnis erzeugen soll, durchgeführt. In der Regel ist das der Aufruf der Methode, deren Verhalten getestet werden soll. Ein guter Unit-Test besteht hier nur aus einem Aufruf. Ist mehr als ein Aufruf notwendig, dann ist das ein Hinweis darauf, dass mehr als nur ein einfacher Aspekt getestet wird!</p><p>Und schlussendlich wird im <b>Assert </b>nun überprüft, ob auch das erwartete Ergebnis durch das Act erzielt wurde. Hier gilt, dass nur ein einzelnes fachliches Ergebnis geprüft werden soll. Und dabei liegt die Betonung auf fachliches Ergebnis, nicht technisches. Das bedeutet also nicht zwangsläufig, dass dafür nur ein einzelnes Assert-Statement verwendet werden darf. Wenn über mehrere Vergleiche verschiedene Teilaspekte des fachlichen Ergebnisses überprüft werden müssen, dann ist das schon in Ordnung. Wenn allerdings z.B. ein Unit-Test TestInsertKunde im Assert prüft, ob der Kunde wirklich in der die Datenbank geschrieben UND ein entsprechender Logeintrag im Logfile erzeugt wurde, dann ist das ein Hinweis darauf, dass hier mehr als nur ein einzelner Aspekt getestet wurde. </p><p>So simple und vielleicht auch nervig, wie die Einhaltung der AAA-Regel auch scheinen mag, sie hilft, echte Unit Tests zu identifizieren.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-c5f82d7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c5f82d7" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-31e6714" data-id="31e6714" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0831eca elementor-widget elementor-widget-image" data-id="0831eca" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="202" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/05_AAA-Regel-in-Codebeispiel-1024x259.png" class="attachment-large size-large wp-image-5344" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/05_AAA-Regel-in-Codebeispiel-1024x259.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/05_AAA-Regel-in-Codebeispiel-300x76.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/05_AAA-Regel-in-Codebeispiel-768x194.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/05_AAA-Regel-in-Codebeispiel-1536x388.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/05_AAA-Regel-in-Codebeispiel-2048x517.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-5d9f6d6 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5d9f6d6" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e080ce7" data-id="e080ce7" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-51343bd elementor-widget elementor-widget-text-editor" data-id="51343bd" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Wir sehen in dem Beispiel, dass hier Act und Assert in einer Zeile, quasi ineinander verschachtelt stehen. Hier kann man argumentieren, dass für die bessere Lesbarkeit dieses zu trennen ist, also den Schlag des Spielers in einer einzelnen Zeile und das Ergebnis daraus in einer lokalen Variable fangen und dann diese im Assert auswerten.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-a5ea2bf elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="a5ea2bf" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3485adf" data-id="3485adf" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-93cb268 elementor-widget elementor-widget-image" data-id="93cb268" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="243" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/06_AAA-Regel-in-ueberarbeitetem-Codebeispiel-1024x311.png" class="attachment-large size-large wp-image-5345" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/06_AAA-Regel-in-ueberarbeitetem-Codebeispiel-1024x311.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/06_AAA-Regel-in-ueberarbeitetem-Codebeispiel-300x91.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/06_AAA-Regel-in-ueberarbeitetem-Codebeispiel-768x234.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/06_AAA-Regel-in-ueberarbeitetem-Codebeispiel-1536x467.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/06_AAA-Regel-in-ueberarbeitetem-Codebeispiel-2048x623.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-fab3d76 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="fab3d76" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4b5762e" data-id="4b5762e" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-1e39fd5 elementor-widget elementor-widget-text-editor" data-id="1e39fd5" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Ob das nun der besseren Lesbarkeit und Wartbarkeit wegen wirklich notwendig ist, ist schwer objektiv zu beurteilen. Deshalb überlassen wir diese Entscheidung denen, die mit dem Code und den Tests arbeiten müssen.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-8f9003c elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="8f9003c" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3420548c" data-id="3420548c" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-7102df39 elementor-widget elementor-widget-heading" data-id="7102df39" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h5 class="elementor-heading-title elementor-size-default">FIRST</h5>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-90fafb1 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="90fafb1" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8c41f23" data-id="8c41f23" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-cc47a7a elementor-widget elementor-widget-text-editor" data-id="cc47a7a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Ein anderes Akronym zur Identifizierung von guten Unit Tests ist FIRST, auch als FIRST Properties von Unit Tests bekannt. FIRST steht dabei für:</p><ul><li>Fast</li><li>Isolated</li><li>Repeatable</li><li>Self-Validating</li><li>Timely</li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-8ef01ad elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="8ef01ad" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d40f910" data-id="d40f910" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-17e8129 elementor-widget elementor-widget-text-editor" data-id="17e8129" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p><b>Fast</b>: Ein Unit Test soll schnell in der Ausführung sein. Warum? Nun, so granular wie Unit Tests sind, reden wir bei der Durchführung der Tests nicht von einem oder zwei Unit Tests, sondern im Laufe der Zeit wird die Anzahl eher auf ein paar Hundert Unit Tests ansteigen, vielleicht auch ein paar Tausend. Und der große Vorteil einer guten Codeabdeckung durch automatisierte Tests ist, dass wir bei Änderungen quasi durch einen Mausklick überprüfen können, ob noch alles funktioniert. Wenn der Durchlauf aller Tests aber ein oder zwei Stunden dauert, oder vielleicht noch länger, dann wird die Motivation abnehmen, diese Testläufe in kurzen Intervallen durchzuführen. Das geht wieder auf Kosten der Qualität, weshalb jeder einzelne Unit Test schnell sein muss, zwei bis drei Sekunden maximal. Und noch schneller wäre noch besser.</p><p><b>Isolated</b>: Unit Tests sind unabhängig voneinander. Das bedeutet, die Durchführbarkeit eines Unit Tests hängt weder davon ab, dass ein anderer Test bereits gelaufen ist, noch dass ein anderer Test vorher ein bestimmtes Ergebnis erzielt hat. Jeder Unit Test erzeugt im Arrange selbst die für ihn notwendige Startkonstellation.</p><p><b>Repeatable</b>: Ein Test muss beliebig oft wiederholbar sein. Und zwar ohne, dass zwischen zwei Testläufen manuell oder auch durch einen anderen Prozess (z.B. ein anderer Test) die im ersten Testlauf erzeugten Zustände zurückgesetzt werden müssen. Oder anderes formuliert: Ein Unit Test hinterlässt keine persistenten Zustandsänderungen im System. Entweder erzeugt er erst keine Zustandsänderungen oder er räumt sie selber zum Abschluss des Tests wieder auf, indem er z.B. Werte aus der Datenbank wieder löscht oder zurücksetzt. Das steht in einem engen Zusammenhang mit den Punkt Isolated.</p><p><b>Self-Validating</b>: Ein Unit Test kann immer selber eineindeutig bestimmen, ob er erfolgreich war oder fehlgeschlagen ist. Für diese Beurteilung ist definitiv keine manuelle Bewertung durch einen Menschen erforderlich. Klingt blöd und eigentlich selbstverständlich. Doch finden wir immer mal wieder vor, dass erst einer der Entwickler oder Tester nochmal darauf schauen muss, um zu beurteilen, ob der Testlauf jetzt ok war oder eher nicht. Wenn das der Fall ist, dann stimmt etwas mit der Grundidee der entsprechenden Tests nicht.</p><p><b>Timely</b>: Unit Tests sind nicht besonders gut geeignet, um sie irgendwann mal später zu schreiben, vielleicht Tage, Wochen oder Monate nachdem der Sourcecode geschrieben wurde. Quasi nur, um nachträglich noch eine gute Testabdeckung zu erreichen. Wie wir oben schon gesehen haben, hat alleine das Schreiben der Unit Tests einen großen Einfluss darauf, wie der Sourcecode strukturiert wird. Deshalb gehören die Erstellung von Sourcecode und Unit Tests unmittelbar zusammen. Das werden wir uns gleich noch genauer ansehen, wenn wir über die testgetriebene Entwicklung reden.</p><p>Das sind eine Menge Faktoren, die für die Erstellung guter Unit Tests zu berücksichtigen sind. Und deshalb nochmal die Frage. Warum tun wir uns das an?</p><p>Nun, der konsequente Einsatz von Unit Tests hilft uns, Software zu schreiben, die die Kriterien guter, robuster Software erfüllen (siehe Schritt 2).</p><p>Also schreiben wir doch einfach konsequent Unit Tests. Doch jetzt gibt es beim klassischen Test-After Ansatz, das heißt ich schreibe erst meinen Sourcecode und erst danach die entsprechenden Tests, ein kleines Problem mit den Unit Tests. Wie wir oben gesehen haben, hat die Erstellung eines Unit Tests großen Einfluss auf die Struktur und das Design des eigentlichen Sourcecodes. Ich werde also vermutlich oft beim Schreiben eines Unit Tests feststellen, dass ich diesen Test so gar nicht schreiben kann, weil die Implementierung des Sourcecodes es nicht zulässt. Also zurück in den Sourcecode und diesen ändern. Beim nächsten Unit Test wieder und wieder und wieder. Das kann schnell nervig werden und die Motivation reduzieren, weitere Unit Tests zu schreiben.</p><p>Wenn jedoch meine Unit Tests mir sowieso schon vorgeben wollen, wie ich den Sourcecode zu schreiben habe, warum dann nicht direkt die ganze Idee einfach umdrehen? Also erst den Test schreiben und dann dazu passend implementieren? Und schon sind wir mitten in der testgetriebenen Entwicklung gelandet, auf Neudeutsch auch Test Driven Development oder TDD genannt.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-15d433cc elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="15d433cc" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3682cd09" data-id="3682cd09" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-677a6ea4 elementor-widget elementor-widget-heading" data-id="677a6ea4" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Schritt Vier: Test Driven Development Grundprinzip verstehen</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-91c7ae9 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="91c7ae9" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6b9b549" data-id="6b9b549" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-b602809 elementor-widget elementor-widget-text-editor" data-id="b602809" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Also ist TDD einfach nur zuerst den Test zu schreiben und dann den Sourcecode?</p><p>Ja … und nein. Tatsächlich ist die einfache Umkehrung der Reihenfolge die Grundidee des TDDs. Schon alleine das wäre oft eine große Verbesserung im Hinblick auf Testqualität und -abdeckung. Doch die TDD-Gurus sagen immer so schön: </p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7de3658f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7de3658f" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-3d047677" data-id="3d047677" data-element_type="column">
			<div class="elementor-widget-wrap">
							</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-51a4a708" data-id="51a4a708" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-4d7d657 elementor-widget elementor-widget-text-editor" data-id="4d7d657" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>„TDD is a design process, not a testing process“</p>								</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-2d3b7ae4" data-id="2d3b7ae4" data-element_type="column">
			<div class="elementor-widget-wrap">
							</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7b6294a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7b6294a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7861a93" data-id="7861a93" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-691246d elementor-widget elementor-widget-text-editor" data-id="691246d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Es geht, genau wie bei den Unit Tests nicht nur darum, eine gute Testqualität und -abdeckung zu erzielen, sondern wir wollen besseren Sourcecode schreiben. </p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Damit wir das erreichen können, gibt es da noch ein paar weiterführende Ideen im TDD, die wir uns jetzt ansehen wollen. Die erste grundlegende Idee ist, dass der TDD-Zyklus nicht aus zwei, sondern aus drei Phasen besteht:</span></p><ol><li><span style="background-color: transparent; color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight );">Schreibe einen Test</span></li><li>Implementiere gegen den Test</li><li>Räume auf</li></ol>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-be6a4dd elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="be6a4dd" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-59c654e" data-id="59c654e" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-23511f8 elementor-widget elementor-widget-text-editor" data-id="23511f8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Zum ersten Schritt müssen wir nicht mehr viel sagen. Obwohl … ja doch, ein paar Anmerkungen gibt es auch dazu. Die Betonung liegt auf einen Test. Wir schreiben also nur einen Test und nicht gleich alle Tests, die uns gerade einfallen. Dann starten wir den Test und dieser Test muss fehlschlagen! Das ist wichtig. Wenn dieser Test jetzt schon erfolgreich durchlaufen würde, dann hätten wir in Wirklichkeit einen Test für eine bereits bestehende Lösung geschrieben. Und das wäre wieder Test-After.</p><p>Jetzt implementieren wir gegen den Test, das heißt, wir schreiben genau den Sourcecode, der nötig ist, damit der Test erfolgreich durchläuft. Und zwar auch nur so viel, wie unbedingt nötig ist und keine Zeile mehr. Alles, was wir mehr programmieren würden, wäre nicht durch einen Test abgedeckt. In dieser Phase geht es ausschließlich darum, eine lauffähige Lösung zu finden. Und noch nicht um Schönheit.</p><p>Wenn der Test erfolgreich durchgelaufen ist, räumen wir auf, inzwischen auch in Deutschland gerne als Refactoring bezeichnet. Nachdem wir bewiesen haben, dass wir die eigentliche Lösung gefunden haben, dürfen wir das Ganze auch hübsch machen, das heißt, wir entfernen jetzt eventuell redundanten Code, machen Variablen oder Methodennamen sprechender, überprüfen, ob wir uns an alle Programmiervorgaben gehalten haben, ob alle Code Metriken erfüllt sind und was sonst noch so ansteht, damit das Ergebnis unserer Definition von gutem Sourcecode entspricht.</p><p>Einige erfahrene Entwickler behaupten hier gerne, sie können sofort richtig und sauber programmieren, der letzte Schritt wäre damit unnötig. Auf einige ganz wenige Profis trifft das auch zu. Doch die meisten von uns sind in Wirklichkeit doch noch nicht ganz so weit. Das ist keine Schande, auch wir halten uns an die Trennung von zuerst die Lösung finden und erst dann aufräumen. Wir stehen dazu!</p><p>Was hier auch noch einen besonderen Hinweis verdient ist, dass das Aufräumen sich nicht nur auf unsere Lösungsimplementierung bezieht, sondern natürlich auch auf unseren Test Code. Sie erinnern Sich an das F in FIRST? F wie Fast. Jeder einzelne Test verdient es, dass Sie ihn nochmal unter die Lupe nehmen. Kann der nicht noch schlanker und schnell werden? Und auch noch lesbarer und wartbarer? Bedenken Sie, im Laufe der Zeit wird die Anzahl der Tests auf eine drei- bis vierstellige Anzahl anwachsen. Dann müssen die alle zusammen immer noch performant und wartbar sein. Kümmern wir uns also doch einfach direkt darum, bevor es zu spät ist.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7aefb4d0 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7aefb4d0" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2ba322b" data-id="2ba322b" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-7e60c745 elementor-widget elementor-widget-heading" data-id="7e60c745" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Schritt Fünf: In kurze Zyklen zu arbeiten lernen</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-9c3839f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="9c3839f" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6eb81d9" data-id="6eb81d9" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-42aa3f6 elementor-widget elementor-widget-text-editor" data-id="42aa3f6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Wo wir gerade bei Geschwindigkeit sind, sehen wir uns doch mal die zweite grundlegende Idee an, der schnelle Durchlauf des kompletten TDD-Zyklus.</p><p>Eine sehr spannende Idee ist, dass ein vollständiger TDD-Zyklus (Testscheiben, Implementierung, Refactoring) innerhalb von 90 Sekunden durchlaufen werden soll.</p><p>90 Sekunden? Warum diese Eile?</p><p>Dies zwingt uns in kleinen Lösungsschritten zu arbeiten. Wenn ich in 90 Sekunden den ganzen Zyklus durchlaufen möchte, wie groß darf der Test dann maximal sein, dass ich in einem Teil der Zeit schreiben kann. Und wie groß darf das Problem maximal sein, dass ich dann in einem Teil der verbleibenden Zeit lösen muss. Diese selbstauferlegte Herausforderung erzwingt, dass wir wirklich in sehr kleinen Einheiten unser Softwareproblem lösen. Wir müssen große Probleme in kleinere und noch kleinere Probleme zerlegen, für die wir dann auch dementsprechend kleine Lösungen finden müssen. Das nimmt die Komplexität aus dem Thema und reduzierte Komplexität führt in den meisten Fällen zu besseren und zuverlässigeren Lösungen. Das erinnert stark an das, was wir oben über Unit-Tests besprochen haben.</p><p>Jetzt sind 90 Sekunden allerdings tatsächlich ziemlich knapp für die Vorstellung, in dieser Zeit aus dem Nichts einen vollständigen lauffähigen Unit Test und die dazu passende Implementierung zu schreiben und dann noch beides hübsch zu machen. Selbst dann, wenn wir uns nur ein sehr, sehr kleines Problem vornehmen wollen.</p><p>Deswegen dürfen wir verstehen, dass ein Durchlauf des Zyklus nicht bedeutet, dass danach schon alles fertig läuft. Ein Stück Software zu schreiben, auch wenn es nur ein sehr kleines Stück ist, erfordert viele Durchläufe des TDD-Zyklus. </p><p>Wie kann ich mir das jetzt vorstellen? Nun, das erste Testtool, das uns zur Verfügung steht, ist der Compiler. In den meisten modernen IDEs ist der bereits fest eingebunden und läuft im Hintergrund los, sobald wir Code eingeben. Und gibt uns umgehend Feedback darüber, ob wir zumindest aus Sicht des Compilers lauffähigen Sourcecode erzeugt haben oder nicht.</p><p>Nehmen wir an, wir wollen in Java z.B. mit Eclipse eine Klasse Rechner und in dieser eine Methode addieren erstellen.</p><p>Als erstes generieren wir z.B. eine JUnit Testklasse TestRechner und in dieser den Testfall TestAddierenEinfach. Und in diesem Testfall erzeugen wir uns eine Instanz von Rechner mit</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-068401d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="068401d" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a7f29c3" data-id="a7f29c3" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-1930a21 elementor-widget elementor-widget-image" data-id="1930a21" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="163" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/07_Codebeispiel-Compilerfeedback-1024x208.png" class="attachment-large size-large wp-image-5382" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/07_Codebeispiel-Compilerfeedback-1024x208.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/07_Codebeispiel-Compilerfeedback-300x61.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/07_Codebeispiel-Compilerfeedback-768x156.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/07_Codebeispiel-Compilerfeedback-1536x313.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/07_Codebeispiel-Compilerfeedback-2048x417.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-779d85b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="779d85b" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8e47e62" data-id="8e47e62" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-264175b elementor-widget elementor-widget-text-editor" data-id="264175b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Dumm nur, dass es die Klasse Rechner noch nicht gibt und der Compiler uns dementsprechend Feedback gibt. Das ist unser erster Testlauf und er schlägt fehl. Also implementieren wir jetzt so lange, bis der Test durchläuft, der Compiler zufrieden ist. Bedeutet in diesem Fall, wir implementieren eine leere Klasse Rechner. Das können wir bequem von der IDE erledigen lassen und bekommen dann zum Beispiel dieses hier als Ergebnis:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-c761bd7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c761bd7" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6e10ad7" data-id="6e10ad7" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-bc55d29 elementor-widget elementor-widget-image" data-id="bc55d29" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="79" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/08_Codebeispiel-Class-Rechner-leer-1024x101.png" class="attachment-large size-large wp-image-5386" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/08_Codebeispiel-Class-Rechner-leer-1024x101.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/08_Codebeispiel-Class-Rechner-leer-300x30.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/08_Codebeispiel-Class-Rechner-leer-768x76.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/08_Codebeispiel-Class-Rechner-leer-1536x152.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/08_Codebeispiel-Class-Rechner-leer-2048x202.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-8f97d89 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="8f97d89" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7df18b2" data-id="7df18b2" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-30ece58 elementor-widget elementor-widget-text-editor" data-id="30ece58" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Zu refakturieren gibt es hier noch nicht viel, also ist der erste Durchlauf durch den Zyklus erledigt. Problemlos innerhalb von 90 Sekunden. Zugegeben, viel bekommen haben wir noch nicht. Aber jetzt geht es ja weiter.</p><p>Nun wollen im Test die Methode addieren mit den ganzen Zahlen 3 und 5 aufrufen und das Ergebnis in einer Variablen aufnehmen.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-42a5c19 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="42a5c19" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6a12d48" data-id="6a12d48" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-34b9783 elementor-widget elementor-widget-image" data-id="34b9783" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="205" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/09_Codebeispiel-TestRechner-mit-Addieren-1024x262.png" class="attachment-large size-large wp-image-5387" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/09_Codebeispiel-TestRechner-mit-Addieren-1024x262.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/09_Codebeispiel-TestRechner-mit-Addieren-300x77.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/09_Codebeispiel-TestRechner-mit-Addieren-768x196.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/09_Codebeispiel-TestRechner-mit-Addieren-1536x393.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/09_Codebeispiel-TestRechner-mit-Addieren-2048x524.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-16412c0 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="16412c0" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8eb6777" data-id="8eb6777" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-3c20914 elementor-widget elementor-widget-text-editor" data-id="3c20914" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Auch hier bekommen wir unverzüglich Feedback vom Compiler, unserem ersten Testtool, er kennt die Methode addieren nicht. Also tun wir ihm den Gefallen und erzeugen sie, und am besten überlassen wir auch das wieder der IDE.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-086f5b9 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="086f5b9" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5afd6c5" data-id="5afd6c5" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-e284336 elementor-widget elementor-widget-image" data-id="e284336" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="121" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/10_Codebeispiel-Class-Rechner-retrun0-1024x155.png" class="attachment-large size-large wp-image-5391" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/10_Codebeispiel-Class-Rechner-retrun0-1024x155.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/10_Codebeispiel-Class-Rechner-retrun0-300x45.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/10_Codebeispiel-Class-Rechner-retrun0-768x116.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/10_Codebeispiel-Class-Rechner-retrun0-1536x232.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/10_Codebeispiel-Class-Rechner-retrun0-2048x310.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-86a3e0a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="86a3e0a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-12a8c4f" data-id="12a8c4f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0477a92 elementor-widget elementor-widget-text-editor" data-id="0477a92" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Der Compiler ist glücklich und der Testlauf damit bestanden, allerdings hätten wir diesmal durchaus ein paar Punkte, die wir bezüglich Lesbarkeit und Wartbarkeit verbessern können. Zum Beispiel ist die Benennung der Parameter in der Implementierung nicht so toll und wir verändern sie entsprechend:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-11433ca elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="11433ca" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8f65de1" data-id="8f65de1" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-bf7b1c5 elementor-widget elementor-widget-image" data-id="bf7b1c5" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="121" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/11_Codebeispiel-Class-Rechner-retrun0-refaktored-1024x155.png" class="attachment-large size-large wp-image-5395" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/11_Codebeispiel-Class-Rechner-retrun0-refaktored-1024x155.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/11_Codebeispiel-Class-Rechner-retrun0-refaktored-300x45.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/11_Codebeispiel-Class-Rechner-retrun0-refaktored-768x116.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/11_Codebeispiel-Class-Rechner-retrun0-refaktored-1536x232.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/11_Codebeispiel-Class-Rechner-retrun0-refaktored-2048x310.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-46b0b71 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="46b0b71" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1120d8d" data-id="1120d8d" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-05c98ea elementor-widget elementor-widget-text-editor" data-id="05c98ea" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Und auch im Testfall wollen wir vielleicht die konkrete Festlegung der Testwerte aus dem eigentlichen Aufruf herausziehen:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-bc8628d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="bc8628d" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-31a3b2b" data-id="31a3b2b" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-128da11 elementor-widget elementor-widget-image" data-id="128da11" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="267" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/12_Codebeispiel-TestRechner-mit-Addieren-refaktured-1024x342.png" class="attachment-large size-large wp-image-5396" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/12_Codebeispiel-TestRechner-mit-Addieren-refaktured-1024x342.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/12_Codebeispiel-TestRechner-mit-Addieren-refaktured-300x100.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/12_Codebeispiel-TestRechner-mit-Addieren-refaktured-768x257.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/12_Codebeispiel-TestRechner-mit-Addieren-refaktured-1536x513.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/12_Codebeispiel-TestRechner-mit-Addieren-refaktured-2048x684.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-3debc46 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3debc46" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ce2aa3f" data-id="ce2aa3f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-d4bc2a4 elementor-widget elementor-widget-text-editor" data-id="d4bc2a4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Schon sieht das Ganze deutlich zukunftsträchtiger aus. Wenn wir uns an die AAA-Regel erinnern, wir haben nun Arrange und Act, fehlt noch Assert:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7e9ea33 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7e9ea33" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fecfe5f" data-id="fecfe5f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8a30bdc elementor-widget elementor-widget-image" data-id="8a30bdc" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="309" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/13_Codebeispiel-TestRechner-mit-Assertion-1024x396.png" class="attachment-large size-large wp-image-5397" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/13_Codebeispiel-TestRechner-mit-Assertion-1024x396.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/13_Codebeispiel-TestRechner-mit-Assertion-300x116.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/13_Codebeispiel-TestRechner-mit-Assertion-768x297.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/13_Codebeispiel-TestRechner-mit-Assertion-1536x594.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/13_Codebeispiel-TestRechner-mit-Assertion-2048x792.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-de34457 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="de34457" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-37dfb60" data-id="37dfb60" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-923752f elementor-widget elementor-widget-text-editor" data-id="923752f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Da der Compiler in diesem Fall nichts zu bemängeln hat, besteht der Test ab jetzt auch darin, den JUnit Test laufen zu lassen. Und der schlägt nun natürlich fehl, weil unsere aktuelle Implementierung stur 0 zurückgibt. Also implementieren wir nun soweit, dass unser Test grün läuft. In diesem Beispiel ist das ziemlich einfach:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-010db6e elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="010db6e" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8728b31" data-id="8728b31" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-38684da elementor-widget elementor-widget-image" data-id="38684da" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="121" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/14_Codebeispiel-Class-Rechner-mit-Implementierung-1024x155.png" class="attachment-large size-large wp-image-5398" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/14_Codebeispiel-Class-Rechner-mit-Implementierung-1024x155.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/14_Codebeispiel-Class-Rechner-mit-Implementierung-300x45.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/14_Codebeispiel-Class-Rechner-mit-Implementierung-768x116.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/14_Codebeispiel-Class-Rechner-mit-Implementierung-1536x232.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/14_Codebeispiel-Class-Rechner-mit-Implementierung-2048x310.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-5437602 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5437602" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-91e773a" data-id="91e773a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-ebcce45 elementor-widget elementor-widget-text-editor" data-id="ebcce45" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Test neu laufen lassen und nun läuft er erfolgreich durch. Jetzt noch wieder den letzten Schritt des TDD-Zyklus, das Aufräumen. Die Implementierung sieht ok für uns aus, allerdings am Testfall ist noch was zu verbessern. Ähnlich wie bei den Summanden kann auch der Vergleichswert der Summe, der im Assert verwendet wird, in eine eigene Variable ausgelagert werden:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-d81cfef elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="d81cfef" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-72dca83" data-id="72dca83" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-33c3536 elementor-widget elementor-widget-image" data-id="33c3536" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="330" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/15_Codebeispiel-TestRechner-mit-Assertion-refaktored-1024x423.png" class="attachment-large size-large wp-image-5399" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/15_Codebeispiel-TestRechner-mit-Assertion-refaktored-1024x423.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/15_Codebeispiel-TestRechner-mit-Assertion-refaktored-300x124.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/15_Codebeispiel-TestRechner-mit-Assertion-refaktored-768x317.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/15_Codebeispiel-TestRechner-mit-Assertion-refaktored-1536x634.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/15_Codebeispiel-TestRechner-mit-Assertion-refaktored-2048x846.png 2048w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7ef265a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7ef265a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-db25dbc" data-id="db25dbc" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-5a3dcdf elementor-widget elementor-widget-text-editor" data-id="5a3dcdf" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Wir haben jetzt in kurzen Zyklen eine Methode geschrieben, bei der wir jederzeit wiederholbar beweisen können, dass sie korrekt 3 und 5 addieren kann. Jetzt können wir in weiteren Zyklen erst mal sicherstellen, dass andere gültige Konstellationen funktionieren. Oder prüfen, wie die aktuelle Methode mit extremen Eingabewerten umgeht und das Verhalten der Methode dann entsprechend erweitern. Was passiert zum Beispiel, wenn wir 2147483647 und 1 addieren wollen. Das übersteigt den Wertebereich von int und wird zu unerwünschten Ergebnissen führen. Was uns der Test schnell zeigt und uns die Möglichkeit gibt, dass zu lösen.</p><p>Das war jetzt kein besonders schwieriges Beispiel, es zeigt jedoch sehr gut, wie in sehr kurzen Zyklen testgetrieben eine Lösung entwickelt werden kann. Es wird deutlich, dass jeder dieser Schritte mit etwas Übung innerhalb von 90 Sekunden realisiert werden kann.</p><p>Jetzt könnten wir allerdings mit diesem Verfahren fast unbegrenzt lange fortfahren und erst nach Stunden den ersten wirklich lauffähigen Test vorweisen. Was aber auch nicht der Sinn der Sache ist, denn erst wenn wir erste wirklich lauffähige Tests haben, sehen wir, dass wir auch etwas mit Wert schaffen. Also ergänzen wir unsere 90 Sekundenregel noch um eine 10 Minutenregel. Ziel ist, innerhalb von maximal 10 Minuten einen ersten/weiteren lauffähigen Test zu haben. Oder anders formuliert, wir wollen innerhalb von 10 Minuten einen durch Tests abgesicherten Mehrwert schaffen.</p><p>Damit sind wir wieder beim Fokus auf kleine Einheiten mit simplen Lösungen.</p><p>Wir sind jetzt soweit, dass wir durch Unit Test getrieben unsere Software schreiben. Oder zumindest die vielen kleinen technischen Komponenten. Das ist schon super. Aber ein Softwareprodukt besteht aus mehr nur kleinen technischen Komponenten, es besteht auch aus mehr oder weniger großen Zusammenhängen. Und genauso besteht eine gute Testabdeckung aus mehr als nur Unit Tests.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-4bf5eb3a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4bf5eb3a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-68b078c5" data-id="68b078c5" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-164f5676 elementor-widget elementor-widget-heading" data-id="164f5676" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Schritt Sechs: Die Testpyramide aufbauen</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-db813e9 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="db813e9" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9af0111" data-id="9af0111" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-322e56e elementor-widget elementor-widget-text-editor" data-id="322e56e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Die drängende Frage lautet nun also: Kann ich mit Test Driven Development jetzt also nur Unit Tests schreiben? Das wäre ja nicht so günstig, denn wir wollen ja nicht nur die einzelnen, voneinander unabhängigen Aspekte unserer Komponenten testen, wir wollen auch sicherstellen, dass alles korrekt zusammen funktioniert. </p><p>Auch das kann ich testgetrieben machen. Nachdem ich z.B. durch Unit Tests getrieben zwei kleine Aspekte implementiert habe, schreibe ich einen Test, der das Zusammenspiel der beiden Aspekte testet. Anschließend implementiere ich dieses Zusammenspiel. Zu beachten ist dabei, dass ich in diesem ‚Integrationstest‘ jetzt nicht mehr die grundsätzliche Funktion der jeweiligen einzelnen Units testen muss, sondern wirklich nur noch das Zusammenspiel.</p><p>Auf diese Art und Weise können wir uns nun die Testpyramide hocharbeiten. Wie bei einer echten Pyramide legen wir immer erst unten Steine hin, bevor wir die Steine der nächsten Ebene setzen. Das Bedeutet im Bereich des Testens von Software: </p><ul><li>Erst ein paar Unit Tests</li><li>dann die Modultests, die die getesteten Units verbinden</li><li>dann die Komponententests, die z.B. die bereits getesteten Module verbinden</li><li>dann evtl. schon der Integrationstest, bei dem unser bereits erstelltes und bis dorthin getestetes Stück Software jetzt mit Drittsystemkomponenten zusammen getestet wird </li><li>und dann weiter bis hin zum End-to-End-Test oder Akzeptanztest.</li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-027336f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="027336f" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d45e2e1" data-id="d45e2e1" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-23541be elementor-widget elementor-widget-text-editor" data-id="23541be" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Dabei haben wir jetzt mit Ausnahme des Unit Tests die Begriffe der Teststufen nach unserem Ermessen gewählt.</p><p>Wie die jeweiligen Teststufen in Ihrem Unternehmen benannt werden, ist auch weiterhin Ihre Entscheidung.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-855baae elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="855baae" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-31a1752" data-id="31a1752" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-5170722 elementor-widget elementor-widget-image" data-id="5170722" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="709" height="166" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/16_Testebenen-und-deren-Scope.png" class="attachment-large size-large wp-image-5412" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/16_Testebenen-und-deren-Scope.png 709w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/16_Testebenen-und-deren-Scope-300x70.png 300w" sizes="(max-width: 709px) 100vw, 709px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-54c8a3b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="54c8a3b" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e852bc2" data-id="e852bc2" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-b337321 elementor-widget elementor-widget-text-editor" data-id="b337321" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Nur zur Wiederholung nochmal: Auch bei den Teststufen oberhalb der Unit Tests schreiben wir immer zuerst den Test und erst dann Implementieren wir den Sourcecode, der bereits getestete Einheiten zu einem größeren Ganzen zusammenfügt.</p><p>Ein einfaches Beispiel: Wir haben testgetrieben bereits eine sum Methode geschrieben, die zwei ganze Zahlen entgegennimmt und diese aufaddiert zurückgibt. Durch Unit Tests haben wir ausgiebig sichergestellt, dass das auch funktioniert. Auch haben wir bereits eine checksum Methode geschrieben, der wir eine ganze Zahl übergeben können und von dieser die Quersumme zurückbekommen. Auch das ist hinreichend durch Unit Tests sichergestellt. Nun wollen wir einen Handler schreiben, der zwei ganze Zahlen übergeben bekommt, sich diese durch die bereits vorhandenen Methode sum aufaddieren und das Ergebnis davon von checksum bearbeiten lässt.</p><p>Alles, was der Handler braucht, um sicherzustellen, dass er auch wirklich zwei ganze Zahlen bekommen hat, stellen wir durch Unit Tests sicher, denn das ist vermutlich eine neu zu erstellende Funktionalität. Wenn wir jetzt jedoch die Tests für den Ablauf „zwei ganze Zahlen durch sum aufaddieren und dann durch checksum bearbeiten lassen“ schreiben, dann müssen wir nun nicht mehr in diesem Test sicherstellen, dass sum oder checksum wirklich mit allen möglichen Eingaben klarkommen und die Ergebnisse wirklich stimmen. Das haben wir bereits in den entsprechenden Unit Tests sichergestellt.</p><p>Der Prozess des Test Driven Development führt uns auf diese Art von unten nach oben durch die verschiedenen Testebenen und wir wissen das wir mit dem Entwickeln fertig sind, wenn wir die Tests auf der obersten Ebene geschrieben haben und diese erfolgreich durchlaufen.</p><p>Warum nennen wir das Testpyramide, das sieht doch in der Abbildung oben gar nicht aus wie eine Pyramide? Dem können wir abhelfen.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-1dc1b6d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="1dc1b6d" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b800699" data-id="b800699" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-43df365 elementor-widget elementor-widget-image" data-id="43df365" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="709" height="148" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/17_Testfallverteilung-als-Testpyramide.png" class="attachment-large size-large wp-image-5416" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/17_Testfallverteilung-als-Testpyramide.png 709w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/17_Testfallverteilung-als-Testpyramide-300x63.png 300w" sizes="(max-width: 709px) 100vw, 709px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-60be244 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="60be244" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5678db8" data-id="5678db8" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-6414d0a elementor-widget elementor-widget-text-editor" data-id="6414d0a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>In der ersten Abbildung haben wir den Scope der einzelnen Tests auf den verschiedenen Testebenen abgebildet. In der zweiten Graphik zeigen wir die typische Verteilung der Menge an Tests, die bei einer sauber umgesetzten Teststruktur entsteht.</p><p>Was auffällt ist, dass die Menge an Tests/Testfällen von unten nach oben hin abnimmt. Das ist das Ergebnis daraus, dass wir schon auf der Ebene der Unit Tests einen Großteil der Funktionalität mit Tests abdecken und dann von Ebene zu Ebene quasi nur noch den Mehrwert testen, der aus der Kombination kleinerer Einheiten entsteht.</p><p>Das hat direkt mehrere Vorteile:</p><p style="padding-left: 40px;">a. Da jeder Test nur noch einen begrenzten Scope hat, den es an Funktionalität wirklich sicherzustellen hat, sind alles Tests relativ klein, leicht verständlich und gut wartbar</p><p style="padding-left: 40px;">b. Je weiter oben in der Testhierarchie ein Test steht, umso schwieriger und aufwändiger ist es, Funktionalität weiter unten im System zu testen. Das ist das typische Problem von Black Box Tests. Je weiter unten in der Testhierarchie wir einen Test schreiben, umso einfacher ist es eine bestimmte technische Funktionalität testen zu können. Wir bewegen uns im Bereich der White Box Tests. Durch den Aufbau einer sauberen Testpyramide reduzieren oder vermeiden wir es sogar komplett die Notwendigkeit, von höheren Testebenen aus technische Detailfunktionen testen zu müssen, Tests auf höheren Ebenen sind damit einfacher (siehe Punkt a.)</p><p style="padding-left: 40px;">c. Wenn zu einem späteren Zeitpunkt sich Verhalten im System unerwünscht ändert, also ein Fehler auftritt, dann zeigen uns die fehlschlagenden Tests in der Testpyramide konkret, an welcher Stelle das Verhalten des Systems nicht mehr stimmt. Bei der Fehleranalyse und Fehlerbehebung fangen wir dann immer mit den fehlschlagenden Tests auf der niedrigsten Ebene an. Die Fehleranalyse und Fehlerbehebung werden dadurch deutlich beschleunigt.</p><p>Diese Verteilung der Testfälle wird einige etwas überraschen, weil es sich nicht mit ihrer Erfahrung deckt. In vielen Unternehmen besteht die große Menge an Tests aus GUI-, Integrations- und Akzeptanztests. Und je weiter nach unten man in der Testhierarchie schaut, umso weniger Testfälle werden es. Wir reden hier auch von der sogenannten Eistüte.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-56a7046 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="56a7046" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a24a20b" data-id="a24a20b" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-7544741 elementor-widget elementor-widget-image" data-id="7544741" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="532" height="405" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/18_Testfallverteilung-als-Eistuete.png" class="attachment-large size-large wp-image-5420" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/18_Testfallverteilung-als-Eistuete.png 532w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/18_Testfallverteilung-als-Eistuete-300x228.png 300w" sizes="(max-width: 532px) 100vw, 532px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-46693bd elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="46693bd" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1bb00ff" data-id="1bb00ff" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-19aa008 elementor-widget elementor-widget-text-editor" data-id="19aa008" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Was in diesem Modell viele Projekte an die Grenzen oder sogar darüber hinausbringt ist, dass sehr viel auch der fundamentalsten technischen Basisfunktionalitäten über die oberste der Testebenen abgesichert werden muss. Wie wir gerade besprochen haben, ist genau das der ungünstigste, weil schwierigste und damit zeitaufwändigste Ort dafür. Die Konsequenz ist oft eine unzureichende Testabdeckung, weil das Schreiben dieser Tests in der notwendigen Menge zu aufwändig ist.</p><p>Nutzen Sie also lieber TDD und formen Sie Ihre Eistüte in eine Pyramide um.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-70de7c3b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="70de7c3b" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4fcc3d12" data-id="4fcc3d12" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-2685e4f0 elementor-widget elementor-widget-heading" data-id="2685e4f0" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Fazit</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-5325d40 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5325d40" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9cc2ce5" data-id="9cc2ce5" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0a052d8 elementor-widget elementor-widget-text-editor" data-id="0a052d8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Richtig verstanden und angewendet ist TDD ein sehr mächtiges Vorgehensmodell, um funktionierende Software auf einem sehr hohen Qualitätsniveau zu erstellen. Allerdings stellt TDD keine Abkürzung dar, mit der man mal so auf die Schnelle ein Stück Software aus dem Boden stanzen kann und dann läuft es schon. TDD setzt voraus, das von Anfang an kompromisslos auf Qualität gesetzt und damit die dafür notwendige Zeit investiert wird. Im Nachhinein kann auch TDD die Qualität einer Software nicht mehr retten.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7ed58fd9 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7ed58fd9" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-6a259056" data-id="6a259056" data-element_type="column">
			<div class="elementor-widget-wrap">
							</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-1cd4896f" data-id="1cd4896f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-4ec62b08 elementor-widget elementor-widget-text-editor" data-id="4ec62b08" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>„Qualität ist nicht verhandelbar“</p>								</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-23719dfc" data-id="23719dfc" data-element_type="column">
			<div class="elementor-widget-wrap">
							</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-10baf81 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="10baf81" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2a1e508" data-id="2a1e508" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-88af9b6 elementor-widget elementor-widget-text-editor" data-id="88af9b6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Den einen oder anderen Entscheider mag diese konsequente Investition in Qualität erst mal erschrecken, weil damit Quick-n-Dirty Schnellschüsse nicht mehr möglich sind. Aber sobald Sie TDD erst mal wirklich in Ihrem Unternehmen eingesetzt haben, werden Sie schnell merken, dass sich diese Investition doppelt und dreifach rechnet.</p><p>Was wir bekommen, ist eine Software, bei der von Anfang an die Funktionsfähigkeit bewiesen ist und die aufgrund des ständigen Refactorings während des Entwicklungsprozesses und der hohen Abdeckung durch automatisierte Tests jederzeit problemlos gewartet und weiterentwickelt werden kann.</p><p>Damit Sie allerdings das Beste aus TDD herausholen können, ist neben der guten Absicht auch eine gute Ausbildung Ihrer Softwareentwickler nicht nur im Umgang mit TDD, sondern auch in den Prinzipien guten Softwaredesigns sinnvoll.</p><p>Investieren Sie hier, um auch in Zukunft hervorragende Produkte zu bauen.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p>The post <a href="https://stage-binaris-informatik.de/2023/04/25/test-driven-development-in-sechs-einfachen-schritten/">Test Driven Development in sechs einfachen Schritten</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Schrödingers Katze im Projektmanagement</title>
		<link>https://stage-binaris-informatik.de/2023/04/24/schroedingers-katze-im-projektmanagement/</link>
		
		<dc:creator><![CDATA[Carsten Czeczine]]></dc:creator>
		<pubDate>Mon, 24 Apr 2023 09:46:49 +0000</pubDate>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Neuigkeiten]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Projektmanagement]]></category>
		<guid isPermaLink="false">http://stage-binaris-informatik.de/?p=5244</guid>

					<description><![CDATA[<p>… oder, wie geht es eigentlich meinem Projekt? Wenn wir ein großes Projekt durchführen wollen, dann wissen wir, dass es zu Abweichungen vom Projektplan kommen kann. Und niemand von uns mag es, erst am Ende des Projektes diese Abweichungen zu entdecken oder festzustellen, dass das Projekt ein Fehlschlag war. Deutlich angenehmer ist es für uns, [&#8230;]</p>
<p>The post <a href="https://stage-binaris-informatik.de/2023/04/24/schroedingers-katze-im-projektmanagement/">Schrödingers Katze im Projektmanagement</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="5244" class="elementor elementor-5244" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-c1b85ef elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c1b85ef" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-331f4a22" data-id="331f4a22" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-30a63388 elementor-widget elementor-widget-text-editor" data-id="30a63388" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>… oder, wie geht es eigentlich meinem Projekt?</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-922e95d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="922e95d" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bee0a89" data-id="bee0a89" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-138c6a7 elementor-widget elementor-widget-text-editor" data-id="138c6a7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Wenn wir ein großes Projekt durchführen wollen, dann wissen wir, dass es zu Abweichungen vom Projektplan kommen kann. Und niemand von uns mag es, erst am Ende des Projektes diese Abweichungen zu entdecken oder festzustellen, dass das Projekt ein Fehlschlag war. Deutlich angenehmer ist es für uns, von diesen Abweichungen früher zu erfahren, denn dann können wir darauf reagieren und das Projekt immer noch zum Erfolg führen. Diese Erkenntnis ist nun nicht neu im Projektmanagement und Generationen von Projektmanagern vor uns haben sich schon mit der Fortschrittskontrolle von Projekten beschäftig und dafür entsprechende Instrumente entwickelt. Und dennoch werden in vielen Projekten gravierende Probleme und Hindernisse erst in der Schlussphase entdeckt und führen dann oft zum Scheitern des Projektes oder zu unerwarteten Verzögerungen. Wie kann das sein?</p><p>1935 schlug der Physiker Erwin Schrödinger ein faszinierendes <a href="https://de.wikipedia.org/wiki/Schr%C3%B6dingers_Katze" target="_blank" rel="noopener">Gedankenexperiment</a> vor. In eine undurchsichtige Stahlkammer wird eine Katze zusammen mit einer winzigen Menge einer radioaktiven Substanz, einem Geiger‘schen Zählrohr und einem Kolben Blausäure eingesperrt. Bei der radioaktiven Substanz besteht eine 50 prozentige Chance, dass innerhalb einer Stunde eines der Atome zerfällt, was von dem Geiger‘schen Zählrohr gemessen werden kann. Und in diesem Falle würde das Zertrümmern des Kolbens mit der Blausäure durch einen Hammer auslösen werden mit dem Ergebnis, dass die Katze stirbt.</p><p>Dann wird eine Stunde gewartet und erst nach Ablauf dieser Stunde nachgesehen, ob die Katze noch lebt oder Tod ist.</p><p>Da nur eine 50 prozentige Chance besteht, dass eines der Atome zerfällt, existiert die Katze in der Wahrnehmung der Außenwelt  in dieser Stunde gleichzeitig in zwei sich wiedersprechenden Zuständen: </p><ul><li>Sie ist tot </li><li>und sie ist lebendig (und vermutlich ziemlich verärgert).</li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-fd819a3 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="fd819a3" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a5e270a" data-id="a5e270a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-1ae4b88 elementor-widget elementor-widget-text-editor" data-id="1ae4b88" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Erst wenn wir nach Ablauf der Stunde die Stahlkammer öffnen und nachsehen, wird einer der beiden Zustände real und der andere verliert seine Bedeutung. Die Quantenphysiker sagen wir auch, mit der Messung kollabiert das System der überlagernden Zustände.</p><p>Was hat das nun mit Projektmanagement zu tun?</p><p>Bei der Durchführung von Projekten werden wir sehr oft mit Faktoren konfrontiert, die im Vorfeld nicht bekannt oder nicht genau vorhersagbar waren. Um derartige Projekte dennoch erfolgreich durchführen zu können ist der Einsatz von sinnvollem Projektcontrolling und erfolgreicher Projektsteuerung notwendig. Beides lebt davon, den aktuellen Zustand eines Projektes korrekt ermitteln zu können. Und hier fängt nun oft das Problem an. Die Wurzel unseres Problems liegt oft in der Art, wie wir klassisch Projekte planen. </p><p><span style="background-color: transparent; color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight );">Bevor wir mit der Umsetzung anfangen: </span></p><ol><li>Sammeln wir alle Anforderungen an das zu erstellende Ergebnis</li><li>Erstellen wir daraus ein detailliertes fachliches Konzept</li><li>Erzeugen wir basierend auf dem fachlichen Konzept ein detailliertes und vollständiges technisches Konzept</li><li>Leiten wir aus dem technischen Konzept alle notwendigen Tätigkeiten ab</li><li>Erstellen wir den Projektplan, der genau festlegt, wer bis wann was tun wird</li></ol>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-f2267ab elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="f2267ab" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5741495" data-id="5741495" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-eed3ea9 elementor-widget elementor-widget-text-editor" data-id="eed3ea9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Das Ergebnis ist quasi die vollständige Beschreibung des Lösungswegs. Die Fortschrittskontrolle findet dann oft als Abgleich zwischen Tätigkeiten, die bis jetzt hätten fertig sein sollen und Tätigkeiten, die bis jetzt tatsächlich geleistet wurden statt. Wir messen den Projektfortschritt also auf der Basis geleisteter Arbeit verglichen mit geplanter Arbeit. Klingt erst mal logisch.</p>
<p>Der Irrtum dieses Verfahrens liegt in der Annahme, dass der Projektplan vollständig und seine Umsetzung fehlerfrei ist. Und wird damit daraus geschlussfolgert, dass das Befolgen des Projektplans automatisch zum gewünschten Projektergebnis führen muss.</p>
<p>Um herauszufinden, ob der Projektplan tatsächlich vollständig war und wir mit ihm damit auch das vollständige und Funktionierende Ergebnis erzeugt haben, dass gewünscht war, ist jedoch nur durch eine realistische Überprüfung genau dieser Ergebnisse möglich. In der klassischen Projektplanung findet dies zumeist erst zum Ende des Projektes statt und da kann das Erwachen dann sehr schmerzhaft sein. Wir finden dann erst in der Schlussphase des Projektes heraus, dass das Produkt eventuell nicht fertig ist oder nicht funktioniert. Und das, obwohl doch alle geplanten Tätigkeiten durchgeführt wurden. Jetzt noch das Projekt innerhalb von Time und Budget zu retten, ist schier unmöglich.</p>
<p>Der Grund für diese späte Erkenntnis ist, dass wir das Falsche messen. Wir messen die Menge an geleisteter Arbeit und vergleichen das mit der Menge an Arbeit, von der wir glauben, dass sie notwendig ist. Was wir nicht messen, ist das erzielte Ergebnis. Und mit Ergebnis meine ich das, was uns wirklich interessiert: Das fertige, funktionsfähige und benutzbare Produkt[JH9]. Dadurch, dass wir in diesem Szenario nur die Ausführung der Aufgaben, aber nicht den Zustand des Ergebnisses überprüfen, verbleibt unser Projekt während seiner Laufzeit trotz einer regelmäßigen scheinbaren Messung in einem überlagerten Zustand: Es ist gleichzeitig ein voller Erfolg (wir führen erfolgreich die geplanten Aufgaben durch) und ein totaler Misserfolg (wir wissen nicht, ob am Ende des gewünschte Ergebnis herauskommen wird). Im Bild von Schrödingers Katze wäre das so, als würden wir den Zustand der Katze rein durch das Verstreichen der Zeit bestimmen wollen, ohne dabei die Tür der Stahlkammer zu öffnen.</p>
<p>Wenn wir ein Projekt realistisch bewerten wollen, dann stellt sich zuerst die Frage nach dem erzielten Ergebnis, also was kann das erzeugte Produkt. Dicht gefolgt von der Frage nach den Kosten. Niemand wird uns aufrichtig für unseren unermüdlichen Arbeitseinsatz und die vielen geleisteten Stunden danken, wenn das Ergebnis nicht stimmt. Was unsere Kunden an erster Stelle interessiert ist, ob das Produkt fertig ist, wie gewünscht funktioniert und was es gekostet hat!</p>
<p>Wie können wir dieses Problem der falschen Fortschrittsmessung lösen? Nur indem wir in kurzen Abständen die Tür zur Stahlkammer öffnen und uns vom tatsächlichen Zustand der Katze überzeugen. Wir lassen das System der überlagernden Zustände durch die konkrete Messung kollabieren. Im Projektmanagement bedeutet das, dass wir uns in kurzen Abständen die tatsächlich erzielten Ergebnisse ansehen.</p>
<p>Das agile Framework Scrum zeigt, wie das funktionieren kann. In Scrum werden innerhalb kurzer Iterationen von maximal vier Wochen Länge sogenannte benutzbare Produktinkremente erzeugt. Das bedeutet, es werden immer vollständige Funktionalitäten erstellt, und zwar in finaler Marktqualität. Finale Marktqualität meint in diesem Kontext, dass innerhalb der Iteration alle notwendigen Tätigkeiten durchgeführt werden, um diese Funktionalität ausliefern zu können. Bei den meisten Softwareprodukten würde das z.B. das vollständige Testen, Vorbereitung von Build und Deployment und die Erstellung von Dokumentation mit einschließen. Das Ziel ist, dass eine Funktionalität am Ende einer Iteration wirklich fertig ist und keine versteckten Restaufwände mehr für diese Funktionalität existieren. Welche Ansprüche genau ein Produktinkrement erfüllen muss, damit es als benutzbar gilt, definieren wir in einer sogenannten Definition of Done.</p>
<p>Was sind jetzt versteckte Restaufwände? Versteckte Restaufwände sind alle die Tätigkeiten, die wir ungeplant zu einem späteren Zeitpunkt durchführen müssen, damit die Funktion wirklich produktiv funktioniert. Wir stellen zum Beispiel in der Test- oder Abnahmephase unseres Projektes fest, das eine Funktionalität nicht ordnungsgemäß funktioniert. Oder in unseren Entwicklungs- und Testumgebungen hat sie funktioniert, aber nach dem Deployment in der produktiven Endumgebung tut sie es nicht mehr. Und jetzt müssen wir das natürlich nachbessern. Für Nachbesserungen in der Test- oder Abnahmephase hatten wir initial vielleicht noch genügend Puffer eingeplant, sodass es noch passt. Vielleicht aber auch nicht. Bei Nachbesserungen in der produktiven Endumgebung liegen wir eindeutig außerhalb des Plans. Diese zusätzlichen Aufwände, die so nicht geplant waren sind es, was uns am Ende eines Projektes die Kopfschmerzen bereiten.</p>
<p>Wenn wir mit Scrum arbeiten. dann bewerten wir am Ende jeder Iteration, welche Funktionalitäten wirklich fertig sind und welche nicht. Wir bekommen damit einen realistischen Überblick über den Zustand unseres Projektes und eine realistische Information darüber, wie schnell wir tatsächlich sind.</p>
<p>Auf diese neue Art der Bewertung umzusteigen führt in vielen Projekten jedoch erst mal zur Ernüchterung. Plötzlich liegt Schwarz auf Weiß der Nachweis vor, dass die ursprünglichen Erwartungen mehr oder weniger zu optimistisch waren. Dieses Phänomen ist so normal, dass es sogar in der Psychologie Beachtung gefunden hat und dort als&nbsp;<a href="https://de.wikipedia.org/wiki/Planungsfehlschluss" target="_blank">planning fallacy</a>&nbsp;beschrieben wird. Gerne wird nun die überraschend geringe Entwicklungsgeschwindigkeit erst Mal dem Mehraufwand durch das direkte Testen zugeschrieben. Ich habe dann leider schon mehrmals erlebt, dass dann als Reaktion darauf das direkte Testen gestrichen und die Überprüfung wieder auf eine spätere Testphase verschoben wird. Denn gefühlt scheint es wichtiger zu sein, erst Mal möglichst viele Funktionalitäten zu erstellen und das gebündelte Testen und Korrigieren in dieser Phase wäre dann effizienter. Doch das ist purer Selbstbetrug. Den Aufwand zum Testen und Nachbessern müssen Sie so oder so betreiben. Je weiter Sie ihn aber nach hinten verschieben, desto mehr erhöhen Sie das Risiko eines Projektfehlschlages, da Sie nicht abschätzen können, wieviel Aufwand Testen und Korrigieren bedeuten wird und Ihnen damit möglicherweise am Ende die Zeit davonläuft, ein funktionierendes Produkt vorweisen zu können. Im schlimmsten Fall haben Sie am Ende ihres Budgets zwar viele Funktionalitäten erstellt, aber keine davon funktioniert wie gewünscht.</p>
<p>Wenn wir das Risiko in Projekten reduzieren wollen, dann müssen wir uns auftretenden Problemen stellen, sobald sie auftreten. Meine Lieblingsfrage, die ich Projekt- und Produktmanagern immer wieder gerne stelle, ist: „Wann möchten Sie wissen, dass Sie ein Problem in Ihrem Projekt haben?“ Und die für mich einzige sinnvolle Antwort darauf lautet: „So früh wie möglich!“&nbsp;</p>
<p>Je früher wir im Projekt wissen, dass wir ein Problem haben, umso mehr Optionen haben wir noch, dieses Problem zu lösen und das Projekt so erfolgreich zu Ende zu führen.</p>
<p>„Ja, aber bei uns ist es nicht möglich innerhalb von vier Wochen eine ganze Funktionalität zu realisieren“. Ist das wirklich so? In der Tat gibt es sehr vereinzelte Themenkomplexe, in denen Kernfunktionalitäten nicht so weit reduzierbar oder sinnvoll zerlegbar sind, dass sie innerhalb von vier Wochen umgesetzt werden können. Aber das ist bei weitem nicht so oft der Fall, wie es uns viele Projektmanager oder Produktverantwortliche glauben machen wollen. Denken Sie selbst mal darüber nach, könnte es genau diese Sichtweise von zu großen Funktionalitäten sein, die die Entwicklung Ihrer Produkte so komplex und herausfordernd macht?</p>
<p>Ein anderer gerne genommener Einwand ist: „Wir können nicht innerhalb von vier Wochen etwas entwickeln und vollständig testen. Unsere Tests sind dafür viel zu aufwendig.“&nbsp;</p>
<p>Hier müssen wir genau hinsehen, worin das Problem besteht. Ja, in einigen Kontexten sind die Tests und anderen Abnahmeverfahren aufgrund der Thematik ans sich tatsächlich, selbst bei bester Organisation, nicht in einem derart kurzen Zeitraum machbar. In den meisten Fällen liegt die Ursache für das Problem jedoch in der Struktur und Arbeitsweise der Organisation und nicht in der Thematik an sich. Vor allem in der Softwareentwicklung gibt es inzwischen eine Reihe von Ansätzen, über die das Testen deutlich leichtgewichtiger wird. Diese Ansätze setzen jedoch entsprechende Schulungen und oft auch Investitionen in Infrastruktur voraus und haben meistens auch Einfluss auf das Design der Lösungen, die in den Projekten entwickelt werden. In späteren Artikeln werden wir auf ein paar dieser Ansätze eingehen.</p>
<p>Es ist also in der Regel schon machbar, allerdings bedeutet es in vielen Fällen Investitionen in Knowhow und Infrastruktur und die Bereitschaft, alte Sichtweisen über Bord zu werfen.</p>
<p>Was wir also sehen ist, dass es für die Umstellung von Projekten auf ein realistischen Bewertungs- und Messverfahren in kurzen Intervallen nicht einfach mit dem Beschluss getan ist, sich alle vier Wochen die Ergebnisse ansehen zu wollen. Tatsächlich ist es dazu notwendig, den gesamten Prozess, wie Produkte und Projekte geplant, entwickelt und getestet werden unter die Lupe zu nehmen und auf das Ziel der stückweisen Abnahme in kleinen Inkrementen umzustellen. Eine Anstrengung, die sich jedoch immer lohnt, denn sie führt zu einem Unternehmen, das zukünftig in kürzerer Zeit die besseren Produkte in besserer Qualität entwickeln wird. Überlassen wir also Schrödingers Katze den Physikern und arbeiten lieber mit eindeutigen Zuständen.</p>
<p>In der Quantenphysik dient Schrödingers Katze als Parabel, um den quantenmechanischen Effekt der Zustandsüberlagerung zu veranschaulichen und führt dort zu neuen Erklärungsversuchen unserer Welt oder so faszinierenden Ideen, wie der Theorie unendlich vieler paralleler Universen. Im Projektmanagement dahingegen führt Schrödingers Katze zu Kopfschmerzen und zu manchmal scheinbar unendlicher Frustration.&nbsp;</p>
<p>Hier lässt sich Schrödingers Katze übrigens auch gut mit einer alten Weisheit der Dakota-Indianer kombinieren: Wenn dein Pferd tot ist, steig ab!</p>
<p>Diese Weisheit wird gerne im Kontext des Projektmanagements zitiert, um klarzumachen, dass gescheiterte Projekte losgelassen werden sollen. Aber wie wir oben schon gesehen haben, scheitern viele an der Frage, ob das Pferd denn wirklich schon tot ist.</p>
<p>So gesehen leiden viele Projekte sogar an Schrödingers Pferd!</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p>The post <a href="https://stage-binaris-informatik.de/2023/04/24/schroedingers-katze-im-projektmanagement/">Schrödingers Katze im Projektmanagement</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Das Kano-Modell der Kundenzufriedenheit</title>
		<link>https://stage-binaris-informatik.de/2023/04/13/das-kano-modell-der-kundenzufriedenheit/</link>
		
		<dc:creator><![CDATA[Carsten Czeczine]]></dc:creator>
		<pubDate>Thu, 13 Apr 2023 09:44:36 +0000</pubDate>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Neuigkeiten]]></category>
		<category><![CDATA[Anforderungsmanagement]]></category>
		<category><![CDATA[Kano Modell]]></category>
		<category><![CDATA[Product Backlog]]></category>
		<category><![CDATA[Produktmanagement]]></category>
		<category><![CDATA[Requirements]]></category>
		<guid isPermaLink="false">http://stage-binaris-informatik.de/?p=5194</guid>

					<description><![CDATA[<p>In dem Artikel&#160;Prioritäten von Anforderungen – Kategorie oder Reihenfolge&#160;hatte ich mehrfach Bezug auf das Kano-Modell der Kundenzufriedenheit genommen, ohne dieses dabei näher zu erklären. In diesem Artikel holen wir das nach. Die meisten von uns, die sich mit Produkt- oder Anforderungsmanagement auseinandersetzen, kennen das folgende Problem der Entscheidung: In welcher Reihenfolge sind Anforderungen umzusetzen bzw. [&#8230;]</p>
<p>The post <a href="https://stage-binaris-informatik.de/2023/04/13/das-kano-modell-der-kundenzufriedenheit/">Das Kano-Modell der Kundenzufriedenheit</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="5194" class="elementor elementor-5194" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-4134f468 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4134f468" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4cd4c377" data-id="4cd4c377" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-6f790f5d elementor-widget elementor-widget-text-editor" data-id="6f790f5d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>In dem Artikel <a href="https://stage-binaris-informatik.de/2023/04/05/prioritaeten-von-anforderungen-kategorie-oder-reihenfolge/" target="_blank" rel="noopener">Prioritäten von Anforderungen – Kategorie oder Reihenfolge</a> hatte ich mehrfach Bezug auf das Kano-Modell der Kundenzufriedenheit genommen, ohne dieses dabei näher zu erklären. In diesem Artikel holen wir das nach.</p><p>Die meisten von uns, die sich mit Produkt- oder Anforderungsmanagement auseinandersetzen, kennen das folgende Problem der Entscheidung: In welcher Reihenfolge sind Anforderungen umzusetzen bzw. welche sind überhaupt umzusetzen? <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-size: 1rem; font-weight: var( --e-global-typography-text-font-weight );">Selten mangelt es an Anforderungen an das, was ein zu erstellendes Produkt alles können soll. Unzählige Interessenvertreter haben ihre eigenen Vorstellungen davon, was absolut unverzichtbar ist und damit auf jeden Fall umgesetzt werden muss. Und zwar immer als allererstes! </span></p><p>Das Kano-Modell versucht hierbei Licht ins Dunkel zu bringen und dem Entscheider ein Werkzeug an die Hand zu geben, um in diesem Wirrwarr die Streu vom Weizen zu trennen. Dadurch wird eine nachvollziehbare Grundlage für die Entscheidungen geschaffen, was umgesetzt wird und was eher nicht und in welcher Reihenfolge.</p><p>Damit ist jedoch auch klar, was das Kano-Modell nicht macht: Es unterstützt nicht bei der Erhebung der Anforderungen. Um diesen Pool an Anforderungen zu generieren, müssen vorher andere Techniken verwendet werden, auf die wir in diesem Artikel jedoch nicht eingehen wollen. <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Zur Entstehung des Modells möchte ich mich an dieser Stelle darauf beschränken, dass das </span><a href="https://de.wikipedia.org/wiki/Kano-Modell" target="_blank" rel="noopener">Kano-Modell</a><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;"> auf Prof. Dr. Noriaki Kano von der Universität Tokio zurückgeht.</span></p><p>Bevor wir in die Details des Kano-Modells einsteigen, klären wir erst noch kurz drei Definitionen.</p><p>Als erstes müssen wir festhalten, dass im Kano-Modell nicht von Anforderungen, sondern von Produktmerkmalen gesprochen wird. Anforderungen sollten sich in der Regel auf Produktmerkmale beziehen, d.h. sie „fordern an“, dass das Produkt ein bestimmtes Merkmal aufweist bzw. nicht aufweist. <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Ein Produktmerkmal selbst ist eine für den Kunden spürbare Eigenschaft des Produkts, also z.B., dass er sich anmelden kann. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Und unter Kunden verstehen wir hier den Personenkreis, der mit unserem neuen Produkt umgehen muss bzw. es kaufen soll.</span></p><p>Kommen wir jetzt zum Kano-Modell. Dort werden Produktmerkmale in fünf Kategorien aufgeteilt:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-9afc16f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="9afc16f" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ad8e98f" data-id="ad8e98f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-7339c48 elementor-widget elementor-widget-text-editor" data-id="7339c48" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<ul><li><b>Basis-/Must-Have Merkmal:</b> Basismerkmale eines Produktes sind so grundlegend und selbstverständlich, dass sie dem Kunden erst bei Nichterfüllung bewusst werden. Werden sie aber nicht erfüllt, dann entsteht eine starke Unzufriedenheit. Umgekehrt entsteht aber bei Erfüllung nicht wirkliche Zufriedenheit. Ein Beispiel hierfür kann die Möglichkeit zur Anmeldung in einer Software sein. </li><li><b style="background-color: transparent; color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif;">Lineares-/Leistungsmerkmal: </b><span style="background-color: transparent; color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight );">Lineare Merkmale sind dem Kunden durchaus bewusst und sie beseitigen Unzufriedenheit oder schaffen Zufriedenheit abhängig vom Ausmaß der Erfüllung. Die Bereitstellung linearer Merkmale wird von Kunden also bewusst mit Zufriedenheit belohnt. Ein Beispiel hierfür ist die Reaktionsgeschwindigkeit eines Softwareprodukts.</span></li><li><b>Begeisterungsmerkmal: </b>Begeisterungsmerkmal sind Nutzen stiftende Merkmale, mit denen der Kunde nicht unbedingt rechnet, also Merkmale, die dem Kunden einen überraschenden Mehrwert liefern. Sie zeichnen das Produkt gegenüber der Konkurrenz aus und rufen damit oft Begeisterung hervor. Eine kleine Leistungssteigerung kann zu einer überproportionalen Nutzenstiftung führen. Die Differenzierungen gegenüber der Konkurrenz können gering sein, die Nutzenstiftung aber dennoch enorm.</li><li><b>Unerhebliches Merkmal: </b>Sind sowohl bei Vorhandensein wie auch beim Fehlen ohne Belang für den Kunden. Sie können daher keine Zufriedenheit stiften, führen aber auch beim Fehlen nicht zu Unzufriedenheit.</li><li><b>Rückweisungsmerkmal: </b>Rückweisungsmerkmale führen beim Vorhandensein zu Unzufriedenheit, beim Fehlen jedoch nicht zu Zufriedenheit. Rückweisungsmerkmale sind häufig Merkmale, die nicht dem Kunden, sondern dem Hersteller oder Produktanbieter nutzen. Ein Beispiel hierfür wäre ein Kopierschutz oder das Sammeln von Kundendaten für Marketingzwecke.</li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-9c55f99 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="9c55f99" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-225a381" data-id="225a381" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-656659b elementor-widget elementor-widget-text-editor" data-id="656659b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Soweit so gut, wir habe jetzt also auf der einen Seite 5 Kategorien und auf der anderen eine große Liste voll mit Anforderungen. Aber wie ordne ich jetzt meine Anforderungen in diese fünf Kategorien ein?</p>
<p>Eine Möglichkeit wäre, dass ich als der Produktverantwortliche dieses anhand der Beschreibungen oben jetzt selbst mache. Dafür muss ich aber die zukünftigen Kunden und deren Bedürfnisse schon ziemlich genau kennen. Und die Wahrscheinlichkeit, dass ich dabei des Öfteren mal danebenliege, dürfte recht hoch sein.</p>
<p>Besser also, ich frage die potenziellen Kunden selbst, und zwar möglichst viele davon. Allerdings stellt sich auch hier die Frage, nach welchen Kriterien eine Anforderung einer der fünf Kategorien zuzuordnen ist. Die Beschreibungen oben sind verhältnismäßig dürftig und könnten von jedem etwas anders verstanden werden. Dadurch wird die Aufgabe der Zuordnung schnell eine recht anspruchsvolle und komplexe Tätigkeit.&nbsp;</p>
<p>Deshalb geht das Kano-Modell einen anderen Weg, den einer bipolaren Befragung. Jede:r Proband:in wird zu jedem Merkmal jeweils mit einer funktionalen und einer dysfunktionalen Frage konfrontiert. Oder verständlicher ausgedrückt: Er:sie soll zu jedem Merkmal mitteilen, wie er:sie es fände, wenn:</p>
<ul>
<li>es vorhanden ist&nbsp;</li>
<li>wenn es fehlt</li>
</ul>
<p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;"><br></span></p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Als Antwortmöglichkeiten stehen ihr:m für beide Fragen&nbsp; zur Verfügung:&nbsp;</span><br></p>
<ul>
<li>Ich mag es genau so</li>
<li>Ich erwarte, dass es so ist</li>
<li>Mir egal</li>
<li>Ich kann damit leben</li>
<li>Das stört mich</li>
</ul>
<p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;"><br></span></p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Super, jetzt habe ich pro Merkmal sogar zwei Antworten von einem Probanden, wie soll ich denn daraus jetzt zu meiner Kategorie kommen? Hier kommt die Magie des Kano-Modells ins Spiel, und zwar in Form der Antworten-Kategorien-Matrix.</span><br></p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-1597269 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="1597269" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-34906f0" data-id="34906f0" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0ebb8b2 elementor-widget elementor-widget-image" data-id="0ebb8b2" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="509" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/KanoModellMatrix-1024x651.png" class="attachment-large size-large wp-image-5212" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/KanoModellMatrix-1024x651.png 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/KanoModellMatrix-300x191.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/KanoModellMatrix-768x488.png 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/KanoModellMatrix-1536x976.png 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/KanoModellMatrix.png 1802w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-da0c31a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="da0c31a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-992a8f1" data-id="992a8f1" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-cd6e5d1 elementor-widget elementor-widget-text-editor" data-id="cd6e5d1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Wir finden in dieser Matrix in den Schnittpunkten der möglichen Antworten auf die beiden Fragen alle unsere fünf Kategorien wieder plus zweimal eine unlogische Kombination. Bei den beiden unlogischen Antwortkonstellationen hat möglicherweise der:die Proband:in die  Fragestellungen nicht richtig verstanden. Entweder ignorieren wir das oder, wenn wir die Möglichkeit dazu haben, wir stellen die Frage nochmal und achten dabei auf das Verständnis der Fragestellungen.</p><p>Aus den Antworten auf die beiden Fragen einer:s Probanden:in kann nun die Kategorie einfach abgelesen werden. Jetzt befragen wir natürlich nicht nur einen Kunden, sondern pro Produktmerkmal fragen wir möglichst viele potenzielle Kunden und halten das Ergebnis in einer Tabelle fest. In der Tabelle unten habe ich ein Beispiel dafür erstellt.</p><p>Wir haben drei Merkmale befragt und die Verteilung der Zielkategorien der einzelnen Befragungen prozentual in einer Tabelle zusammengefasst.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7accaa5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7accaa5" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a0e41fe" data-id="a0e41fe" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-d4dcdf4 elementor-widget elementor-widget-image" data-id="d4dcdf4" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="765" height="161" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/auswertungsbeispielkanomodell.png" class="attachment-large size-large wp-image-5216" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/auswertungsbeispielkanomodell.png 765w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/auswertungsbeispielkanomodell-300x63.png 300w" sizes="(max-width: 765px) 100vw, 765px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-2c06d52 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="2c06d52" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b5026b3" data-id="b5026b3" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0ae6c46 elementor-widget elementor-widget-text-editor" data-id="0ae6c46" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Bei dem Produktmerkmal 1 haben wir mit 43,8% eine eindeutige Spitze für lineares Merkmal, bei dem Produktmerkmal 2 mit 54,3% eine eindeutige Spitze für Basismerkmal. Beim Produktmerkmal 3 jedoch haben wir zwei Spitzen, einmal 36,6% für Basismerkmal und dann nochmal 39,1% für Begeisterungsmerkmal. </p><p>Dies kann darauf hindeuten, dass wir vielleicht zwei unterschiedliche Arten von Kunden für unser Produkt haben, die unterschiedliche Erwartung an unser Produkt hegen. Sinnvollerweise analysieren wir in diesem Fall, welche unterschiedlichen Kundenarten das sind und legen anschließend fest, auf welche von beiden Kundenarten wir den Fokus legen wollen.</p><p>Kommen wir zurück zu unserer Ausgangssituation: Wir sind ein armer Produktverantwortlicher und alle Interessenvertreter haben uns mit Unmengen an Anforderungen zugeschüttet. Wir haben aus (fast) all diesen Anforderungen Produktmerkmale extrahiert und diese durch das Kano-Modell in Kategorien eingeordnet. </p><p>Ist damit jetzt klar, welche Anforderungen bzw. Produktmerkmale umzusetzen sind und in welcher Reihenfolge?</p><p>Leider nicht so ganz. Fangen wir mit den einfachen Fällen an: Die Rückweisungsmerkmale und die unerheblichen Merkmale. </p><p>Das Kano-Modell priorisiert Produktmerkmale aus Sicht des Kunden und aus dieser Sicht sollte auf Rückweisungsmerkmale auf jeden Fall verzichtet und unerhebliche Merkmale sollten nur am Schluss umgesetzt werden, wenn noch Zeit und Geld da ist. Obwohl sie aus dieser Sicht eigentlich nur Resourcenverschwendung sind. Also besser auch nicht umsetzen.</p><p>Allerdings bestimmen ja nicht immer nur die Kundenwünsche die Notwendigkeiten für bestimmte Produktmerkmalen. Bevor diese Merkmale also tatsächlich komplett gefeuert werden, müssen wir erst noch prüfen, was die Intention zu diesen Merkmalen war. Bei gesetzlichen Vorgaben oder technischen Notwendigkeiten kann die Welt schon ganz anders aussehen. Aber wenn nichts dergleichen zutrifft, dann raus damit und lieber ein schlankes Produkt gestalten.</p><p>Kommen wir zu unserem Dreigestirn: Basis-, lineare und Begeisterungsmerkmale.</p><p>Mit Basismerkmalen gewinnt man keinen Blumentopf, wenn sie aber fehlen, floppt wahrscheinlich das ganze Produkt. Also müssen sie wohl rein. </p><p>Wie dringend sie rein müssen, also mit welcher Priorität verglichen mit den Linearen und Begeisterungsmerkmalen, hängt davon ab, wie ich die Releases auf den Markt bringe. Wenn ich klassisch im Wasserfall arbeite und vielleicht nur alle 12 Monate ein neues Release rausbringe (oder sogar noch seltener), dann müssen alle Basismerkmale bereits im ersten Release drin sein, denn die Kunden werden das Produkt so lange nicht akzeptieren, wie die Basismerkmale nicht enthalten sind oder mit der baldigen Nachlieferung zu rechnen ist. </p><p>Wenn ich dahingegen in wesentlich kürzeren Zeitabständen meine Releases ausliefere, z.B. jeden Monat oder alle zwei und dieses auch entsprechend kommuniziere, dann sind Kunden schon eher geneigt, dass Fehlen von Basismerkmalen für kurze Zeit in Kauf zu nehmen.</p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Natürlich muss das, was ich ausliefere, immer in sich funktionsfähig sein, alles andere wäre ja völliger Unsinn. Aber anstatt für den gesamten geplanten Funktionsumfang des Produktes erst mal nur die Basismerkmale zu erstellen und auszuliefern und dem Kunden damit ein „ist ja ganz nett“ zu entlocken, fokussiert man nur einen bestimmten Funktionsbereich. Diesem realisieren wir mit seinen notwendigen Basismerkmalen plus weiteren linearen und Begeisterungsmerkmalen. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Der Kunden gewinnt damit einen guten Eindruck dessen, was ihn nach und nach bei unserem Produkt erwarten wird und er kann evtl. auch mit der Teilfunktionalität schon Mehrwerte für sich erzielen.</span></p><p>Damit wäre das mit den Basismerkmalen schon mal geklärt. Aber wie gewichten wir lineare Merkmale gegenüber Begeisterungsmerkmalen?</p><p>Begeisterungsmerkmale sprechen oft ein sehr subjektives Empfinden gegenüber einem Produkt an und gewinnen in der Regel eher durch den Überraschungseffekt oder das Alleinstellungsmerkmal („das hat halt kein anderer so, deshalb ist es cool“). Beide Effekte nutzen sich aber mehr oder weniger schnell ab. Der Überraschungseffekt ebbt ab oder die Konkurrenz zieht nach.</p><p>Lineare Merkmale stellen dahingegen meist tatsächliche Wehrwerte des Produktes für den Kunden dar, die meistens auch auf Dauer erhalten bleiben. <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Rein ökonomisch gesehen wären deshalb die linearen Merkmale den Begeisterungsmerkmalen vorzuziehen. Unsere Kunden sind jedoch alle auch nur Menschen und die Begeisterungsmerkmale sind es, die dann doch oft die Kaufentscheidung oder die Akzeptanzbereitschaft für unser Produkt stark beeinflussen. So gesehen ist die Entscheidung für Begeisterungsmerkmale irgendwie auch ökonomisch. Zumindest für den, der das Produkt verkauft.</span></p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Im Endeffekt macht es die gesunde Mischung aus. Ein Produkt nur mit linearen Merkmalen ist zwar wertvoll, aber unsexy. Ein Produkt nur mit Begeisterungsmerkmalen verleitet zwar zum schnellen Kauf, aber nicht zur Nutzung. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Ein guter Erfahrungswert ist, den Schwerpunkt auf lineare Merkmale zu setzen, damit der Kunden tatsächlich echten Mehrwert erhält und das mit einer Handvoll Begeisterungsmerkmale zu würzen, damit er sich auch für unser Produkt entscheidet bzw. die Nutzer das Produkt bereitwillig akzeptieren.</span></p><p>Ich hoffe, ich konnte ein bisschen Licht ins Dunkel bringen. Die Quintessenz ist, dass das Kano-Modell eine gute Unterstützung dabei anbietet, sich der Qualität von Anforderungen bewusst zu werden und sich aus der Vielzahl an Anforderungen auf die zu konzentrieren, die bei den Kunden gut ankommen werden. Es ist aber kein Mechanismus, in den ich oben einfach eine Liste an Anforderungen reinkippen kann und unten kommt dann die fertige Reihenfolge heraus. Der gesunde Menschenverstand der Produktverantwortlichen ist bei den Entscheidungen immer noch erforderlich. </p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7e47cef elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7e47cef" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a880d03" data-id="a880d03" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0a0db9b elementor-widget elementor-widget-text-editor" data-id="0a0db9b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Quellen:</p><ul><li>Agile Estimating and Planning, Mike Cohn, 2006</li><li>https://de.wikipedia.org/wiki/Kano-Modell</li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p>The post <a href="https://stage-binaris-informatik.de/2023/04/13/das-kano-modell-der-kundenzufriedenheit/">Das Kano-Modell der Kundenzufriedenheit</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Prioritäten von Anforderungen –Kategorie oder Reihenfolge?</title>
		<link>https://stage-binaris-informatik.de/2023/04/05/prioritaeten-von-anforderungen-kategorie-oder-reihenfolge/</link>
		
		<dc:creator><![CDATA[Carsten Czeczine]]></dc:creator>
		<pubDate>Wed, 05 Apr 2023 14:25:08 +0000</pubDate>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Anforderungsmanagement]]></category>
		<category><![CDATA[Product Backlog]]></category>
		<category><![CDATA[Produktmanagement]]></category>
		<guid isPermaLink="false">http://stage-binaris-informatik.de/?p=5078</guid>

					<description><![CDATA[<p>Ein typisches Problem in jedem Projekt (nicht nur in der Softwareentwicklung) ist die Frage der Prioritäten der Anforderungen. Was muss zuerst erledigt werden, was geht auch später, auf was kann ggfs. ganz verzichtet werden? Es gibt verschiedene Methoden und Verfahren, diese Wichtigkeiten der Anforderungen zu bestimmen, auf die ich heute nicht näher eingehen möchte. Heute möchten wir uns [&#8230;]</p>
<p>The post <a href="https://stage-binaris-informatik.de/2023/04/05/prioritaeten-von-anforderungen-kategorie-oder-reihenfolge/">Prioritäten von Anforderungen –Kategorie oder Reihenfolge?</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="5078" class="elementor elementor-5078" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-3d414eed elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3d414eed" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-58b8e8ad" data-id="58b8e8ad" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-952a347 elementor-widget elementor-widget-text-editor" data-id="952a347" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Ein typisches Problem in jedem Projekt (nicht nur in der Softwareentwicklung) ist die Frage der <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Prioritäten der Anforderungen. Was muss zuerst erledigt werden, was geht auch später, auf was </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">kann ggfs. ganz verzichtet werden?</span></p><p>Es gibt verschiedene Methoden und Verfahren, diese Wichtigkeiten der Anforderungen zu <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">bestimmen, auf die ich heute nicht näher eingehen möchte. Heute möchten wir uns jedoch mit der </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Frage beschäftigen, wie diese Prioritäten anschließend festgehalten werden.</span></p><p>Aktuell sind mir dazu zwei Modelle geläufig: </p><ul><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Einteilung in feste Kategorien und</span></li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">relative Priorität in Form einer Reihenfolge</span></li></ul>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-0f096eb elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="0f096eb" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8882838" data-id="8882838" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-3c4eca9 elementor-widget elementor-widget-image" data-id="3c4eca9" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="470" height="450" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/prioritaeten-entscheiden.png" class="attachment-large size-large wp-image-5084" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/prioritaeten-entscheiden.png 470w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/prioritaeten-entscheiden-300x287.png 300w" sizes="(max-width: 470px) 100vw, 470px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-47ac3541 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="47ac3541" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-416ff89d" data-id="416ff89d" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-4490d857 elementor-widget elementor-widget-text-editor" data-id="4490d857" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Betrachten wir im ersten Schritt beide Modelle mal getrennt voneinander:</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-e592701 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="e592701" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-76960fcb" data-id="76960fcb" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-179f82d3 elementor-widget elementor-widget-heading" data-id="179f82d3" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Das Modell der Kategorien</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-3df2f4e5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3df2f4e5" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-20da9984" data-id="20da9984" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-31cb64f8 elementor-widget elementor-widget-text-editor" data-id="31cb64f8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Zur Einteilung der Anforderungen wird eine Anzahl von n Kategorien definiert. Besonders beliebt sind <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">die Kategorien Priorität 1 bis Priorität 5. Wenn sich der Prozessverantwortliche noch besonders viel </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Mühe gibt, dann bekommen die Kategorien auch noch so sprechende Bezeichnungen/Beschreibung </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">wie z.B. „must have“, „nice to have“ oder auch „sehr wichtig“, „wichtig“ oder „normal“. </span></p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Dass sich mal jemand getraut hätte eine Kategorie ganz offen als „wird wohl niemals gemacht </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">werden“ zu deklarieren, habe ich leider noch nicht erlebt. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Aber richtig ehrlich wäre es. Und wenn Sie doch zu einem dieser Mutigen gehören, mailen Sie mich </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">an, ich werde Sie in späteren Artikel lobend erwähnen.</span></p><p>Mittels einer geeigneten Methode (z.B. dem <a href="https://de.wikipedia.org/wiki/Kano-Modell" target="_blank" rel="noopener">Kano Modell</a>) oder oft auch dem Bauchgefühl wird nun <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">jede Anforderung einer dieser Kategorien zugeordnet. </span></p><p>Der Vorteil dieses Modell ist, dass die meisten Methoden zur Priorisierung primär nur dieses Modell <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">unterstützen (wie z.B. das schon erwähnte Kano Modell) und dass neue Anforderung mit teilweise </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">wenig Aufwand einfach in eine der Kategorien gesteckt werden können. Die Entscheidung, welcher </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Kategorie eine Anforderung zugeordnet wird, kann für jede Anforderung isoliert gefällt werden.</span></p><p>Idealerweise sind für alle Kategorien klare Kriterien definiert, anhand der die Entscheidungen über <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">die Zuordnung gefällt werden. In vielen Organisationen ist dies aber oft nicht der Fall.</span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;"> </span></p><p>Nachteile ergeben sich oft in der Abarbeitung der Anforderung nach Priorität bzw. bei der Planung <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">von Iteration in agilen Vorgehensmodellen, da dieses Modell keine geeignete Unterstützung bei zu </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">knappen Kapazitäten zur Umsetzung der Anforderungen biete. Dazu aber gleich mehr.</span></p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-dfba5cd elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="dfba5cd" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-791680f" data-id="791680f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-a2e2c80 elementor-widget elementor-widget-heading" data-id="a2e2c80" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Das Modell der Reihenfolge</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-40e4a75 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="40e4a75" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3132b57" data-id="3132b57" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-b26a758 elementor-widget elementor-widget-text-editor" data-id="b26a758" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Hier werden die Anforderungen abhängig von ihrer Wichtigkeit/Dringlichkeit in eine lineare und <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">eindeutige Reihenfolge gebracht. Dadurch wissen alle Projektbeteiligte genau genommen immer nur, </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">die Anforderung A ist wichtiger als die Anforderung B und diese wiederum wichtiger als die </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderung C, ohne dass es dadurch schon eine qualitative Bewertung gibt. Es ist dadurch z.B. noch </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">nicht klar, ob A es überhaupt wert ist, umgesetzt zu werden.</span></p><p>Eine größere Menge an Anforderungen in eine sortierte Reihenfolge zu bringen, scheint auf den <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">ersten Blick eine komplexe Aufgabe zu sein. Das ist sie aber nicht mehr, wenn man die Aufgabe in </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">kleinere Schritte runterbricht. </span></p><p>Ich nehme mir wahlfrei zwei erste Anforderung und vergleiche in diesem Schritt nur, welche von <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">beiden mir wichtiger ist. Diese ordnen ich denn oberhalb der anderen Anforderung an. Dann nehme </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">ich mir eine weitere Anforderung und fange oben an und vergleiche diese neue Anforderung mit der </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">obersten Anforderung in meiner „Liste“. Ist die neue Anforderung wichtiger als die aktuell wichtigste </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderung, dann ordne ich sie oben in der Liste an. Ist sie weniger wichtig, dann gehe ich zum </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">nächsten Eintrag in der Liste und vergleiche die neue Anforderung mit diesem Eintrag, usw.</span></p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">In der Programmierung kennen wir diese Verfahren als </span><a style="font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); background-color: #ffffff; font-size: 1rem;" href="https://de.wikipedia.org/wiki/Bubblesort" target="_blank" rel="noopener">Bubblesort</a></p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-b3db3cd elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="b3db3cd" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-71cdd40" data-id="71cdd40" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-b9f1c66 elementor-widget elementor-widget-image" data-id="b9f1c66" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="498" height="529" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/Bubblesort.jpg" class="attachment-large size-large wp-image-5103" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/Bubblesort.jpg 498w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/Bubblesort-282x300.jpg 282w" sizes="(max-width: 498px) 100vw, 498px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-56a16e4 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="56a16e4" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3ce1649" data-id="3ce1649" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-4c61064 elementor-widget elementor-widget-text-editor" data-id="4c61064" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Der Nachteil ist, dass der Initiale Aufbau der Reihenfolge etwas aufwändig scheint, da man die <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">einzelnen Anforderungen bei der Frage nach ihrer Priorität nicht isoliert betrachten kann. Und auch </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">bei der Aufnahme weiterer Anforderungen ist ein Vergleich mit den anderen Anforderungen </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">notwendig. </span></p><p>Dabei muss man allerdings bei der Einsortierung nicht immer ganz oben oder unten anfangen; wenn <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">ich z.B. weiß, dass meine neue Anforderung H wichtiger ist als die bereits einsortierte Anforderung D, </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">dann ist sie auch automatisch wichtiger als alle Anforderungen unterhalb von D und ich muss mich </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">nur auf die Vergleiche oberhalb von D konzentrieren. </span></p><p>Wenn mir gerade kein direkter Vergleich präsent ist, dann kann ich alternativ auch auf ein Verfahren <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">zurückgreifen, dass in der Softwareentwicklung als </span><a href="https://de.wikipedia.org/wiki/Bin%C3%A4re_Suche" target="_blank" rel="noopener">Binäres Suchen</a><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;"> bekannt ist. </span></p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Bei diesem </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Verfahren fange ich mit dem Vergleich in der Mitte meiner Liste an. Ich nehme mir also als ersten </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Vergleichskandidaten eine Anforderung aus der Mitte meiner Anforderungsliste und beantworte mir </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">die Frage, ob meine neue Anforderung wichtiger ist, als diese Anforderung in der Mitte. Ist sie mir </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">wichtiger, dann nehme ich mir als nächsten Vergleichskandidaten eine Anforderung, die in der Mitte </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">zwischen meinem letzten Vergleichskandidaten und dem oberen Ende der Liste liegt und vergleiche </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">wieder. Abhängig von diesem Vergleich suche ich mir jetzt wieder die Mitte im oberen oder unteren </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Viertel meiner Liste für den Vergleich aus und mache das solange weiter, bis ich genau zwischen zwei </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen lande, die entsprechend etwas wichtiger bzw. unwichtiger als meine neue </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderung sind.</span></p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-6948136 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6948136" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-79ec5ea" data-id="79ec5ea" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-21bebaf elementor-widget elementor-widget-image" data-id="21bebaf" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="658" height="398" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/Binaeres-Suchen-1.jpg" class="attachment-medium_large size-medium_large wp-image-5120" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/04/Binaeres-Suchen-1.jpg 658w, https://stage-binaris-informatik.de/wp-content/uploads/2023/04/Binaeres-Suchen-1-300x181.jpg 300w" sizes="(max-width: 658px) 100vw, 658px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-18ccbc2 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="18ccbc2" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f8a64db" data-id="f8a64db" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-20a27d8 elementor-widget elementor-widget-text-editor" data-id="20a27d8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Die Mathematiker jetzt aber bitte nicht alle melden und darauf hinweisen, dass es optimalere <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Algorithmen für die Sortierung gibt. Ich kann mir nur schwer vorstellen, dass tatsächlich ein </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Produktverantwortlicher oder Anforderungsmanager einen mathematischen Sortieralgorithmus </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">verwenden wird, die Vergleiche dienen hier nur als anschauliche Beispiele.</span></p><p>Der Vorteil der relativen Prioritäten (wie ich das Modell mit der Reihenfolge ab hier nennen möchte) <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">ist, dass ich hier nun eine eindeutige Reihenfolge habe, in der die Anforderungen umzusetzen sind. </span></p><p>Was ist, wenn ich zwischen zwei Anforderungen nicht entscheiden kann, welche von beiden <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">wichtiger ist? Dafür kann es eigentlich nur einen von zwei Gründen geben:</span></p><ol><li>Der Unterschied in der Wichtigkeit ist so klein, dass ich deshalb keine eindeutige <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Entscheidung fällen kann oder es gibt sogar keinen. In diesem Fall treffen ich einfach eine </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Entscheidung. Durch Zufallsprinzip (Münzwurf) oder Bauchgefühl. Es spielt keine Rolle.</span></li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Mir fehlen bei beiden Anforderungen die notwendigen Informationen, um die Entscheidung </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">fällen zu können. Auch in diesem Fall kann ich einfach so eine Entscheidung fällen, es ist zu </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">diesem Zeitpunkt quasi nicht wichtig, welche von beiden wichtiger ist, da beide </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen in diesem Zustand nicht umsetzbar sind.  Meine Aufgabe nach der eher </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">zufälligen Entscheidung (ich muss mich entscheiden) ist jetzt, die notwendigen Informationen </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">zu erlangen, damit ich eine qualifizierte Entscheidung fällen kann. Idealerweise sollten beide </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen in diesem Zustand nicht zur sofortigen Umsetzung anstehen.</span></li></ol>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-11daf047 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="11daf047" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2e7891ec" data-id="2e7891ec" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-439d914c elementor-widget elementor-widget-text-editor" data-id="439d914c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Ist klar, dass eine der beiden Anforderungen aufgrund äußerer Umstände erst später umsetzbar sein <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-size: 1rem; font-weight: var( --e-global-typography-text-font-weight );">wird, dann kann sie auch direkt weiter nach unten wandern. Dies gehört aber zum Thema, wie </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-size: 1rem; font-weight: var( --e-global-typography-text-font-weight );">überhaupt bestimmt werden kann, welche Anforderungen wichtiger sind wie andere. Das werden </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-size: 1rem; font-weight: var( --e-global-typography-text-font-weight );">wir in späteren Artikeln behandeln.</span></p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-95caeda elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="95caeda" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3a1bd99" data-id="3a1bd99" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-bf802a2 elementor-widget elementor-widget-heading" data-id="bf802a2" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Der direkte Vergleich</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-65ff654 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="65ff654" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-cd6ac9b" data-id="cd6ac9b" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-c9e9fec elementor-widget elementor-widget-text-editor" data-id="c9e9fec" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Werfen wir beide Modell nun mal in den Ring und betrachten wir ihre Stärken und Schwächen im <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">direkten Vergleich. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Bei einer kleinen überschaubaren Anzahl an Anforderungen machen sich beide Kandidaten recht gut. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Die Vergabe der Prioritäten im auf Kategorien basierenden Ansatzes ist wie bereits besprochen ja eh </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">recht trivial: </span></p><ol><li>Priorisierungsmethode der Wahl anwenden</li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Ergebnis nehmen und auf Kategorien transformieren</span></li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Fertig</span></li></ol>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-111515b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="111515b" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-999afae" data-id="999afae" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-51f211b elementor-widget elementor-widget-text-editor" data-id="51f211b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Aber auch im relativen Modell ist der direkte Vergleich der Wichtigkeit der Anforderungen <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">untereinander schnell erledigt. Und auch bei der Abarbeitung der Anforderungen bzw. der </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Einplanung zeigen sich beide Modelle in diesem Szenario noch recht hilfreich.</span></p><p>Wie sieht es denn bei einer größeren Anzahl an Anforderungen aus, wie sie in durchschnittlichen <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Projekten schnell erreicht ist? Wir unterstellen mal eine initiale Anzahl von 100 Anforderungen zum </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Projektstart. Und hier wird es langsam interessant.</span></p><p>Betrachten wir als erstes wieder den Aufwand für die Initiale Priorisierung der Anforderungen. <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Im auf Kategorien basierenden Modell nehmen wir mal die typische Aufteilung in fünf Kategorien an, </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">die wir hier als P1 bis P5 bezeichnen wollen, wobei P1 für die wichtigsten Anforderungen stehen wird </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">und P5 für die unwichtigsten. </span></p><p>Die Verteilung der 100 Anforderungen auf die fünf Kategorien ist erneut mit wenig Aufwand <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">verbunden. Na gut, mit verhältnismäßig wenig Aufwand. Natürlich muss jede der 100 Anforderungen </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">bewertet werden, das ist schon Arbeit. Als Ergebnis bestimmen wir jetzt in unserem Beispiel, dass 30 </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen P1 sind, 40 P2, weitere 20 P3 und die restlichen 10 verteilen sich gleichmäßig auf P4 </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">und P5. </span></p><p>Es scheint nicht unüblich zu sein, dass der überwiegende Teil der initialen Anforderungen als ziemlich <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">wichtig bewertet wird. Zumindest begegnet mir das so laufend in Projekten.</span></p><p>Beim relativen Modell steigt der initiale Aufwand deutlich, denn hier müssen nun die 100 <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen im Verhältnis zueinander nach Wichtigkeit sortiert werden. Das klingt aber schlimmer </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">als es dann wirklich ist. Man fängt mit zwei Anforderungen an und fügt dann Anforderung für </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderung hinzu. Und wie oben schon mal erklärt, muss nicht bei jeder Anforderung unten mit der </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Sortierung angefangen werden, sondern in der Regel kann direkt weiter oben in der Reihenfolge </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">eingestiegen werden. Ich sage da gleich noch was zu.</span></p><p>Wie sieht es jetzt mit der Einplanung der Anforderungen aus? Auch hier treffen wir für unser Beispiel <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">ein paar vereinfachte Annahmen. Wir definieren:</span></p><ul><li>dass wir mit Scrum arbeiten, </li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">dass alle Anforderungen mit einem Aufwand von einem Story Point geschätzt sind </span></li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">und dass wir in einen Sprint 20 Story Points unterbringen können</span></li></ul><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-size: 1rem; font-weight: var( --e-global-typography-text-font-weight );">Wenn wir nun unseren ersten Sprint planen, dann stellen wir im Kategorienmodell fest, dass wir </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">insgesamt 30 Story Points haben, die Priorität vor allem anderen haben. Soweit ist das Modell ja </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">schon mal hilfreich. </span></p><p>Im ersten Sprint unterbringen können wir aber nur 20 Story Points. Welche sollen wir da nun <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">nehmen? Hier fangen wir dann vermutlich an, diese 30 Anforderungen untereinander zu vergleichen, </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">um innerhalb dieser Gruppe eine gewisse Sortierung zu erzielen. Das gleiche gilt dann für die </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">nächsten Sprints. </span></p><p>Vorausgesetzt, die 20 geplanten Story Points des ersten Sprints werden auch umgesetzt, dann stehen <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">für den zweiten Sprint 10 weitere Story Points der Priorität P1 an und 40 der Priorität P2, von denen </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">aber nur 10 im Sprint Platz finden. Also wieder vergleichen und sortieren innerhalb der Kategorie P2, </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">und so weiter. </span></p><p>Wir fangen uns also hier genau den Aufwand ein, den wir vorher bei der initialen Priorisierung <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">vermeintlich gespart hatten.</span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;"> </span></p><p>Bei der bereits eindeutig sortierten Reihenfolge des relativen Modells haben wir diese Probleme bei <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">der Einplanung in die Sprints nicht mehr. Es ist jederzeit klar was als nächstes am wichtigsten ist. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Dafür haben wir aber auch vorher mehr Aufwand reinstecken müssen.</span></p><p>Und jetzt kommen wir zur Königsdisziplin: Eine neue Anforderung, die wichtiger ist wie alles andere <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen, die wir bereits aufgenommen und bewertet hatten. Sagen wir, eine gesetzliche </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Vorgabe, die scheinbar über Nacht vom Himmel gefallen ist. Natürlich ist sie nicht wirklich </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">überraschend vom Himmel gefallen, aber einige Organisationen sind erstaunlich gut darin, z.B. neue </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">gesetzliche Vorgaben so lange zu ignoriert, bis sie dann auf den letzten Drücker doch plötzlich </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">unvermeidbar scheinen.</span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;"> </span></p><p>Wie bilde ich das mit meinen Kategorien ab? </p><p>P1 ist ja schon die höchste und wichtigste Kategorie. Aber meine neue Anforderung ist sogar noch <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">wichtiger als die 30 bereits als P1 eingestuften Anforderungen. Definiere ich jetzt adhoc eine neue </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Kategorie P0, die noch über P1 steht? Da dauert es garantiert nicht lange, bis auch diese neue </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Kategorie regelmäßig gefüllt wird, denn Kategorien mit Top-Priorität haben die Eigenschaft, </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen anzuziehen. </span></p><p><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Wir haben hier also ein nichttriviales Problem, dass in vielen Fällen damit gelöst wird, dass zusätzlich </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">zur eigentlichen Kategorie noch ein weiteres Attribut wie z.B. Severity hinzugefügt wird. Das kann </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">dann z.B. so erklärungsbedürftige Ausprägungen wie blocker, critical, major, normal, minor, trivial </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">und/oder enhancement annehmen. </span></p><p>Und falls Sie jetzt vermuten, dass ich mir das nur ausgedacht habe,  dann schauen Sie doch mal in <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Tools in ihrem Unternehmen nach, welche Attribute dort für die Bewertung von Anforderungen oder </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Tickets vorhanden sind und wie diese bei Ihnen verwendet werden.</span></p><p>Diese zusätzlichen Attribute sind aber nicht nur redundant, sondern können auch zu Inkonsistenzen <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">führen. Was ist denn nun wichtiger, eine Anforderung mit P1/enhancement oder eine mit </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">P3/blocker? Und wieso kann eine P3 Anforderung ein Blocker sein, bzw. wieso kann ein scheinbarer </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Blocker nur die Priorität P3 haben? Das führt eindeutig zu Chaos!</span></p><p>Bei der eindeutigen Reihenfolge des relativen Modells ohne Kategorien ist das Problem der neuen <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderung, die wichtiger ist als alle bisherigen, dahingegen leicht zu lösen. Die neue Anforderung </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">wird einfach ganz oben einsortiert. Problem gelöst.</span></p><p>Bis hierhin scheint das relative Modell also besser geeignet zu sein.</p><p>Jetzt hatte ich aber weiter oben ausgeführt, dass die meisten Methoden zur Priorisierung von <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen eher das Denken in Kategorien unterstützen. Das jetzt schon mehrfach zitierte Kano </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Modell der Kundenzufriedenheit z.B. teilt Produktmerkmale, aus denen später Anforderungen </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">werden, in fünf Kategorien ein:</span></p><ul><li>Basismerkmal, </li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Leistungsmerkmal, </span></li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Begeisterungsmerkmal, </span></li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Unerhebliches </span></li><li><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">und Rückweisungsmerkmal</span></li></ul><p>Muss ich nun auf diese Methoden verzichten, wenn ich mit einem relativen Prioritätsmodell arbeiten <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">möchte? </span></p><p>Natürlich nicht! Wenn ich eine eindeutige Reihenfolge meiner Anforderungen aufbauen möchte, <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">dann muss ich die Wichtigkeit der einzelnen Anforderungen irgendwie begründen können. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Warum ist denn die Anforderung A wichtiger als die Anforderung B? Da brauche ich für beide </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen irgendwelche Anhaltspunkte dafür, weshalb sie wichtig oder auch nicht wichtig sind. </span></p><p>Und genau dafür sind viele Methoden der Priorisierung eine große Hilfe. Mit ihnen kann ich <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">zumindest schon mal ein grobes Raster schaffen, dass mir bei der ersten Vorsortierung hilft. </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Und wenn die Anforderung A nach dem Kano Modell in die Kategorie Basismerkmal fällt und die </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderung B in die Kategorie Leistungsmerkmal, dann weiß ich ganz automatisch, das A wichtiger </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">ist als B. Und nur wenn die Anforderung C ebenfalls ein Basismerkmal zu sein scheint, muss ich mir </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">im Vergleich von A und C mehr Informationen heranziehen, um hier eine eindeutige Entscheidung </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">fällen zu können.</span></p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-c9d7e3c elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c9d7e3c" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0a3afe9" data-id="0a3afe9" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-40f4890 elementor-widget elementor-widget-heading" data-id="40f4890" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Fazit</h4>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-44204dbc elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="44204dbc" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4befe17a" data-id="4befe17a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-a145204 elementor-widget elementor-widget-text-editor" data-id="a145204" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Kommen wir zur Antwort auf die sich nun stellende Frage, ob Kategorien in der Priorisierung von <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Anforderungen strikt abzulehnen sind. </span></p><p>Ich sage nein, denn sie sind eine hilfreiche Zwischenstufe auf dem Weg zu einer sortieren <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Reihenfolge relativer Wichtigkeit. Und diese Zwischenstufe kann nicht nur viel Zeit sparen, sondern </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">bei der Verwendung geeigneter Methoden die fundierte Basis für die Bewertung der relativen </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Wichtigkeiten liefern. </span></p><p>Ich allerdings davon ab, bei der Verwendung von Kategorien stehen zu bleiben und den <span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Aufwand der Transformation in eine sortierte Liste zu scheuen, da z.B. in iterativen </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">Verfahren wie Scrum die Kategorien meistens nicht dabei helfen zu identifizieren, was am </span><span style="color: var( --e-global-color-b9c1851 ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight ); font-size: 1rem;">sinnvollsten im nächsten Sprint umgesetzt werden soll.</span></p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p>The post <a href="https://stage-binaris-informatik.de/2023/04/05/prioritaeten-von-anforderungen-kategorie-oder-reihenfolge/">Prioritäten von Anforderungen –Kategorie oder Reihenfolge?</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Kartenspiel &#8222;Deine Meinung bitte! Scrum Edition&#8220;</title>
		<link>https://stage-binaris-informatik.de/2021/08/06/kartenspiel-deine-meinung-bitte-scrum-edition/</link>
		
		<dc:creator><![CDATA[Carsten Czeczine]]></dc:creator>
		<pubDate>Fri, 06 Aug 2021 11:44:13 +0000</pubDate>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Neuigkeiten]]></category>
		<category><![CDATA[Scrum]]></category>
		<guid isPermaLink="false">http://stage-binaris-informatik.de/?p=2026</guid>

					<description><![CDATA[<p>Kartenspiel &#8222;Deine Meinung bitte!&#8220; Scrum Edition Durch die Pandemie hat sich in vielen Unternehmen nicht nur die Arbeit, sondern auch die Interaktion zwischen Teammitgliedern in Home Office verlagert. Sowohl die Zusammenarbeit wie auch die sozialen Aspekte des Miteinanders finden dort nun überwiegend online statt. Und damit hat sich auch eine neue Kultur für Team Building [&#8230;]</p>
<p>The post <a href="https://stage-binaris-informatik.de/2021/08/06/kartenspiel-deine-meinung-bitte-scrum-edition/">Kartenspiel &#8222;Deine Meinung bitte! Scrum Edition&#8220;</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="2026" class="elementor elementor-2026" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-24a12f9 elementor-section-full_width elementor-section-height-default elementor-section-height-default" data-id="24a12f9" data-element_type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
						<div class="elementor-container elementor-column-gap-no">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c9d3d99" data-id="c9d3d99" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-2ec1c5c elementor-widget elementor-widget-heading" data-id="2ec1c5c" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h4 class="elementor-heading-title elementor-size-default">Kartenspiel</h4>				</div>
				</div>
				<div class="elementor-element elementor-element-ab9ad7d elementor-widget elementor-widget-heading" data-id="ab9ad7d" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h1 class="elementor-heading-title elementor-size-default">"Deine Meinung bitte!" <span class="blue">Scrum Edition</span></h1>				</div>
				</div>
				<div class="elementor-element elementor-element-216a192 elementor-widget elementor-widget-text-editor" data-id="216a192" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Durch die Pandemie hat sich in vielen Unternehmen nicht nur die Arbeit, sondern auch die Interaktion zwischen Teammitgliedern in Home Office verlagert. Sowohl die Zusammenarbeit wie auch die sozialen Aspekte des Miteinanders finden dort nun überwiegend online statt. Und damit hat sich auch eine neue Kultur für Team Building etabliert.</p><p>Etwas, dass sich bei uns gut bewährt hat, sind virtuelle Spielabende, bei denen wir uns im Kollegenkreis per Zoom (wahlweise gehen natürlich auch alles anderen Videokonferenztools) treffen und dann auf einem virtuellen Whiteboard System (wir verwenden dafür Miro <a href="https://miro.com/">https://miro.com</a>) Kartenspiele spielen. Dafür haben wir beliebte Frage-Antwort-Spiele wie beispielsweise Sag Mal! von Spielehelden (<a href="https://spielehelden.eu/">https://spielehelden.eu</a>) oder Verschätzt Noch Mal! von Kylskapspoesi ( <a href="https://www.kylskapspoesi.com/de/produkte/">https://www.kylskapspoesi.com/de/produkte/</a>) verwendet.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-47808ff elementor-widget elementor-widget-heading" data-id="47808ff" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h5 class="elementor-heading-title elementor-size-default">Warum nicht ein Spiel, dass sich um unsere Themen dreht?</h5>				</div>
				</div>
				<div class="elementor-element elementor-element-44c26c4 elementor-widget elementor-widget-text-editor" data-id="44c26c4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Schnell kam dabei die Idee auf, dass wir doch auch selbst so ein Kartenspiel entwickeln könnten, nur speziell für unsere Themen. Wir beschäftigen uns in unserer Projektarbeit viel mit Agilität und da vor allem mit Scrum. Fast alle Kollegen:innen arbeiten in agilen Teams, eine ganze Reihe sind sogar zertifizierte Scrum Master:innen und Product Owner:innen. Und auch wenn wir uns abends vor allem treffen, um uns auch mal abseits der geschäftlichen Tagesroutine auszutauschen, so ist doch nichts verkehrt daran, auch da über Agilität zu reden. Zumindest nicht solange, wie es Spaß macht. Und deshalb haben wir <strong>Deine Meinung bitte! Scrum Edition</strong> entwickelt, ein lustiges Frage-Antwort-Spiel rund um Scrum.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-c2f4031 elementor-widget elementor-widget-image" data-id="c2f4031" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="514" src="https://stage-binaris-informatik.de/wp-content/uploads/2023/01/BeitragsbildDeineMeinungBitte-1024x658.jpg" class="attachment-large size-large wp-image-4596" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2023/01/BeitragsbildDeineMeinungBitte-1024x658.jpg 1024w, https://stage-binaris-informatik.de/wp-content/uploads/2023/01/BeitragsbildDeineMeinungBitte-300x193.jpg 300w, https://stage-binaris-informatik.de/wp-content/uploads/2023/01/BeitragsbildDeineMeinungBitte-768x494.jpg 768w, https://stage-binaris-informatik.de/wp-content/uploads/2023/01/BeitragsbildDeineMeinungBitte-1536x987.jpg 1536w, https://stage-binaris-informatik.de/wp-content/uploads/2023/01/BeitragsbildDeineMeinungBitte.jpg 1920w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
				<div class="elementor-element elementor-element-1c7f08f elementor-widget elementor-widget-text-editor" data-id="1c7f08f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p> </p><p>Ja, es geht schon um Scrum. Aber nicht immer so ganz ernst gemeint und vor allem nicht um ein reines Quiz, in dem theoretisches Wissen abgefragt wird. <strong>Deine Meinung bitte! Scrum Edition</strong> wirft spannende und unterhaltsame Fragen auf, zu denen wir die ganz persönlichen Meinungen und Ansichten der Mitspielenden hören möchten. Und die oft der Startpunkt für wertvolle Diskussionen sind.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-34b743a elementor-widget elementor-widget-heading" data-id="34b743a" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h5 class="elementor-heading-title elementor-size-default">Wie bekomme ich das Spiel?</h5>				</div>
				</div>
				<div class="elementor-element elementor-element-d24c2eb elementor-widget elementor-widget-text-editor" data-id="d24c2eb" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<div class="fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling"><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-text fusion-text-11"><p>Schön, dass wir jetzt dieses Spiel entwickelt haben und nutzen, aber was haben Sie davon? Wie kommen Sie an das Spiel und wie benutzen Sie es?</p><p>Alles ganz einfach. Unten finden Sie den Link auf eine Zip-Datei, in der wir das komplette Spiel inklusive Spielanleitung, aller Karten, einer Vorlage für einen virtuellen Spielraum und einer Anleitung, wie Sie das Spiel in einem virtuellen Spielraum vorbereiten können. Alles was Sie noch dazu beisteuern müssen ist ein Videokonferenztool, ein digitales Whiteboard System wie beispielsweise Miro oder Mural und natürlich begeisterte Mitspieler:innen.</p></div></div></div></div></div><div class="fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling"><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_1_1 1_1 fusion-flex-column"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-text fusion-text-12"> </div></div></div></div></div>								</div>
				</div>
				<div class="elementor-element elementor-element-f0facfd elementor-widget elementor-widget-text-editor" data-id="f0facfd" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Download: <a href="https://stage-binaris-informatik.de/wp-content/uploads/2023/01/DeineMeinungBitteScrumEdition.zip">DeineMeinungBitteScrumEdition</a></p>								</div>
				</div>
				<div class="elementor-element elementor-element-6761ab9 elementor-widget elementor-widget-heading" data-id="6761ab9" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h5 class="elementor-heading-title elementor-size-default">Wofür kann ich Deine Meinung bitte! Scrum Edition verwenden?</h5>				</div>
				</div>
				<div class="elementor-element elementor-element-f3f0d68 elementor-widget elementor-widget-text-editor" data-id="f3f0d68" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<div class="fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling"><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-text fusion-text-11"><p>Sie können <strong>Deine Meinung bitte! Scrum Edition</strong> für ein Kick-Off Meeting eines neuen Scrum Teams verwenden, bei einem gemütlichen Teamabend oder auch einem agilen Stammtisch. Neue Scrum Master:innen nutzen das Spiel, um das Scrum Team kennenzulernen, in das sie gekommen sind. Und umgekehrt nutzen Teams das Spiel, um sich mit ihrer:m neuen Scrum Master:in vertraut zu machen. Oder Sie nutzen es zum Beginn eines agilen Workshops oder Seminares, um das Eis zu brechen und spielerisch ins Thema zu kommen.</p><p>Den Anwendungsmöglichkeiten sind kaum Grenzen gesetzt. Probieren Sie es einfach aus!</p></div></div></div></div></div><div class="fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling"><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_1_1 1_1 fusion-flex-column"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-text fusion-text-12"> </div></div></div></div></div>								</div>
				</div>
				<div class="elementor-element elementor-element-88dec43 elementor-widget elementor-widget-heading" data-id="88dec43" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h5 class="elementor-heading-title elementor-size-default">Kostet mich die Verwendung was?</h5>				</div>
				</div>
				<div class="elementor-element elementor-element-61c6cec elementor-widget elementor-widget-text-editor" data-id="61c6cec" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<div class="fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling"><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-text fusion-text-11"><p>Nein, wir stellen das Spiel allen Interessierten kostenfrei zur Verfügung. Wenn es Ihnen Spaß macht und vielleicht auch beim Team Building hilft, dann sind wir schon glücklich.</p><p>Und wir freuen uns natürlich über Feedback. Was sind ihre tollsten Erlebnisse mit dem Spiel, was sind die verrücktesten oder ausgefallensten Antworten, die jemand in Ihren Runden gegeben hat. Wir sind gespannt darauf.</p></div></div></div></div></div>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p>The post <a href="https://stage-binaris-informatik.de/2021/08/06/kartenspiel-deine-meinung-bitte-scrum-edition/">Kartenspiel &#8222;Deine Meinung bitte! Scrum Edition&#8220;</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Die AAA-Regel</title>
		<link>https://stage-binaris-informatik.de/2020/04/09/one-page-learning/</link>
		
		<dc:creator><![CDATA[Carsten Czeczine]]></dc:creator>
		<pubDate>Thu, 09 Apr 2020 12:28:31 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Neuigkeiten]]></category>
		<category><![CDATA[Testen]]></category>
		<guid isPermaLink="false">http://webseite.binaris-informatik.de/?p=389</guid>

					<description><![CDATA[<p>Die Grundlage einer guten Testautomatisierung in der Softwareentwicklung sind Unit Tests. Um wirklich gute Unit Tests zu schreiben, gibt es ein paar Faustformeln dafür, wie ein Unit Test aussehen sollte. Eine davon ist die AAA-Regel. AAA steht dabei für: Arrange Act Assert und beschreibt den Aufbau eines Unit Tests. Im Arrange wird die Startsituation des [&#8230;]</p>
<p>The post <a href="https://stage-binaris-informatik.de/2020/04/09/one-page-learning/">Die AAA-Regel</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="389" class="elementor elementor-389" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-2e07cac elementor-section-full_width elementor-section-content-top elementor-section-height-default elementor-section-height-default" data-id="2e07cac" data-element_type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
						<div class="elementor-container elementor-column-gap-no">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5f3ccb5" data-id="5f3ccb5" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-16ca9cd4 elementor-widget elementor-widget-text-editor" data-id="16ca9cd4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Die Grundlage einer guten Testautomatisierung in der Softwareentwicklung sind Unit Tests. Um wirklich gute Unit Tests zu schreiben, gibt es ein paar Faustformeln dafür, wie ein Unit Test aussehen sollte. Eine davon ist die AAA-Regel. <br><br>AAA steht dabei für:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-14a2989 elementor-widget elementor-widget-text-editor" data-id="14a2989" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<ul><li>Arrange</li><li>Act</li><li>Assert<br></li></ul>								</div>
				</div>
				<div class="elementor-element elementor-element-89493d3 elementor-widget elementor-widget-text-editor" data-id="89493d3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>und beschreibt den Aufbau eines Unit Tests. </p>
<p>Im <b>Arrange </b>wird die Startsituation des Tests definiert. Die Komponente wird erzeugt und initialisiert, Mocks werden erzeugt, gesetzt und evtl. das Verhalten der Mocks definiert, Variablen werden gesetzt.</p>
<p>Im <b>Act </b>wird die eigentliche Aktion, die das zu verifizierende Ergebnis erzeugen soll, durchgeführt. In der Regel ist das der Aufruf der Methode, deren Verhalten getestet werden soll. Ein guter Unit-Test besteht dabei aus nur einem Aufruf. Ist mehr als ein Aufruf notwendig, ist das ein Hinweis darauf, dass mehr als nur ein einfacher Aspekt getestet wird! Das ist dann kein Unit Test mehr.</p>
<p>Und schlussendlich wird im <b>Assert </b>überprüft, ob das erwartete Ergebnis durch das Act erzielt wurde. Hier gilt, dass nur ein einzelnes fachliches Ergebnis geprüft werden soll. Dabei liegt die Betonung darauf, dass auf ein fachliches Ergebnis geprüft wird, nicht ein technisches. Das bedeutet nicht zwangsläufig, dass dafür nur ein einzelnes Assert-Statement verwendet werden darf. Wenn über mehrere Vergleiche verschiedene Teilaspekte des fachlichen Ergebnisses überprüft werden müssen, dann ist das schon in Ordnung. Wenn allerdings z.B. ein Unit-Test TestInsertKunde im Assert prüft, ob der Kunde wirklich in die Datenbank geschrieben UND ein entsprechender Logeintrag im Logfile erzeugt wurde, dann ist das ein Hinweis darauf, dass hier mehr als nur ein einzelner Aspekt getestet wurde. So simple und vielleicht manchmal auch nervig, wie die Einhaltung der AAA-Regel scheinen mag, sie hilft, echte Unit Tests zu identifizieren.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-54cba44 elementor-widget elementor-widget-image" data-id="54cba44" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="203" src="https://stage-binaris-informatik.de/wp-content/uploads/2020/04/AAA-Regel-Bild1.png" class="attachment-large size-large wp-image-4765" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2020/04/AAA-Regel-Bild1.png 827w, https://stage-binaris-informatik.de/wp-content/uploads/2020/04/AAA-Regel-Bild1-300x76.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2020/04/AAA-Regel-Bild1-768x195.png 768w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
				<div class="elementor-element elementor-element-24e7a6e elementor-widget elementor-widget-text-editor" data-id="24e7a6e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p> </p><p>In dem Beispiel sehen wir, dass Act und Assert in einer Zeile, quasi ineinander verschachtelt stehen. Hier kann man argumentieren, dass für die bessere Lesbarkeit dieses zu trennen sind. Also den Schlag des Spielers in einer einzelnen Zeile und das Ergebnis daraus in einer lokalen Variable fangen und dann diese im Assert auswerten.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-a9c34aa elementor-widget elementor-widget-image" data-id="a9c34aa" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="800" height="245" src="https://stage-binaris-informatik.de/wp-content/uploads/2020/04/AAA-Regel-Bild2.png" class="attachment-large size-large wp-image-4766" alt="" srcset="https://stage-binaris-informatik.de/wp-content/uploads/2020/04/AAA-Regel-Bild2.png 827w, https://stage-binaris-informatik.de/wp-content/uploads/2020/04/AAA-Regel-Bild2-300x92.png 300w, https://stage-binaris-informatik.de/wp-content/uploads/2020/04/AAA-Regel-Bild2-768x235.png 768w" sizes="(max-width: 800px) 100vw, 800px" />															</div>
				</div>
				<div class="elementor-element elementor-element-0886dc1 elementor-widget elementor-widget-text-editor" data-id="0886dc1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p><br></p><p>Ob das der besseren Lesbarkeit und Wartbarkeit wegen wirklich notwendig ist, ist schwer objektiv zu beurteilen. Deshalb überlassen wir diese Entscheidung denen, die mit dem Code und den Tests arbeiten müssen.</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p>The post <a href="https://stage-binaris-informatik.de/2020/04/09/one-page-learning/">Die AAA-Regel</a> appeared first on <a href="https://stage-binaris-informatik.de">Binaris Informatik</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
