<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Business. Prozesse. Software.</title>
		<link>https://koetterheinri.ch/posts/</link>
		<description>Neueste Einträge auf Business. Prozesse. Software.</description>
		<generator>Hugo -- gohugo.io</generator>
		<language>de-de</language>
		<copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright>
		<lastBuildDate>Mon, 18 Aug 2025 00:00:00 +0000</lastBuildDate>
		<atom:link href="https://koetterheinri.ch/posts/index.xml" rel="self" type="application/rss+xml" />
		
		<item>
			<title>Wenn User Stories zu Romanen werden</title>
			<link>https://koetterheinri.ch/posts/software-engineering/202508-18-story-prosa-killer/</link>
			<pubDate>Mon, 18 Aug 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/202508-18-story-prosa-killer/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Viele Teams kämpfen mit User Stories, die länger sind als nötig.
Manchmal werden sie mit Prosa überfrachtet – in der Hoffnung, dass mehr Text auch mehr Klarheit bedeutet. Doch das Gegenteil ist oft der Fall.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_das_problem_mit_prosa&#34;&gt;Das Problem mit Prosa&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Zu lange Stories führen dazu, dass:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;ulist&#34;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Entwickler die Texte nicht vollständig lesen&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;wichtige Details übersehen werden&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Diskussionen erst im Sprint entstehen, statt schon im Refinement&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;die eigentliche Intention der Story im Text untergeht&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
				
#userstories #agile #anforderungen 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Viele Teams kämpfen mit User Stories, die länger sind als nötig.
Manchmal werden sie mit Prosa überfrachtet – in der Hoffnung, dass mehr Text auch mehr Klarheit bedeutet. Doch das Gegenteil ist oft der Fall.</p>
</div>
<div class="sect1">
<h2 id="_das_problem_mit_prosa">Das Problem mit Prosa</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Zu lange Stories führen dazu, dass:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Entwickler die Texte nicht vollständig lesen</p>
</li>
<li>
<p>wichtige Details übersehen werden</p>
</li>
<li>
<p>Diskussionen erst im Sprint entstehen, statt schon im Refinement</p>
</li>
<li>
<p>die eigentliche Intention der Story im Text untergeht</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_warum_passiert_das">Warum passiert das?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In vielen Projekten fehlt ein gemeinsames Verständnis, wie „genug Information&#34; in einer Story aussieht.
Fachbereiche schreiben zu viel Kontext in die Beschreibung, während Entwickler nur das Nötigste für die Umsetzung suchen.
Das Spannungsfeld zwischen <strong>vollständiger Dokumentation</strong> und <strong>praktischer Umsetzbarkeit</strong> wird selten bewusst adressiert.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wie_es_besser_geht">Wie es besser geht</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>Klarheit schlägt Länge: Formuliere die Story in maximal 3–5 Sätzen</p>
</li>
<li>
<p>Konzentriere dich auf das „Was&#34; und das „Warum&#34; – das „Wie&#34; entsteht in der Umsetzung</p>
</li>
<li>
<p>Nutze präzise Akzeptanzkriterien, statt lange Fließtexte</p>
</li>
<li>
<p>Vermeide Nebensätze, die Interpretationsspielräume öffnen</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Mehr Text bedeutet nicht automatisch mehr Klarheit.
Gute Stories sind <strong>präzise, kurz und verständlich</strong> – so, dass Entwickler sie auf den ersten Blick umsetzen können.</p>
</div>
<div class="paragraph">
<p>Welche Erfahrungen habt ihr mit „Roman-Stories&#34; gemacht?
Ich freue mich auf eure Beispiele und Sichtweisen.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Weniger machen, mehr fragen: Die unterschätzte Kunst der Beratung</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-04-09-kunst_beratung/</link>
			<pubDate>Wed, 09 Apr 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-04-09-kunst_beratung/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Manche Anforderungen kommen klar und präzise formuliert bei dir an.
Andere wirken… seltsam.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Du liest sie mehrfach. Der Code passt dazu – irgendwie.
Aber ein komisches Gefühl bleibt: &lt;strong&gt;Da stimmt doch was nicht.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Und wenn du nachfragst, bekommst du Antworten wie:
&lt;strong&gt;„Das muss so sein.&amp;#34;&lt;/strong&gt;
Oder: &lt;strong&gt;„Das hat irgendeinen Hintergrund – wir wissen nur nicht mehr welchen.&amp;#34;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_wenn_keiner_mehr_fragt_bleibt_alles_beim_alten&#34;&gt;Wenn keiner mehr fragt, bleibt alles beim Alten&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich hätte einfach weitermachen können.
Code so lassen. Ticket schließen. Fertig.
Doch irgendwas ließ mich nicht los:
Was, wenn wir alle nur noch reagieren, aber nicht mehr hinterfragen?&lt;/p&gt;
&lt;/div&gt;
				
#beratung #softwareentwicklung #prozesse #unsicherheit #kommunikation 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Manche Anforderungen kommen klar und präzise formuliert bei dir an.
Andere wirken… seltsam.</p>
</div>
<div class="paragraph">
<p>Du liest sie mehrfach. Der Code passt dazu – irgendwie.
Aber ein komisches Gefühl bleibt: <strong>Da stimmt doch was nicht.</strong></p>
</div>
<div class="paragraph">
<p>Und wenn du nachfragst, bekommst du Antworten wie:
<strong>„Das muss so sein.&#34;</strong>
Oder: <strong>„Das hat irgendeinen Hintergrund – wir wissen nur nicht mehr welchen.&#34;</strong></p>
</div>
<div class="sect1">
<h2 id="_wenn_keiner_mehr_fragt_bleibt_alles_beim_alten">Wenn keiner mehr fragt, bleibt alles beim Alten</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ich hätte einfach weitermachen können.
Code so lassen. Ticket schließen. Fertig.
Doch irgendwas ließ mich nicht los:
Was, wenn wir alle nur noch reagieren, aber nicht mehr hinterfragen?</p>
</div>
<div class="paragraph">
<p>In Meetings werden Anforderungen präsentiert, umgesetzt, abgenommen.
Aber was fehlt, ist oft das <strong>Warum</strong>.</p>
</div>
<div class="paragraph">
<p>Und damit auch die Grundlage für jede sinnvolle Beratung.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_beobachtungen_statt_vorwürfe">Beobachtungen statt Vorwürfe</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Als Entwickler ist es nicht deine Aufgabe, alles zu wissen.
Aber es ist deine Verantwortung, Dinge zu bemerken – und sichtbar zu machen, wo etwas wackelt.</p>
</div>
<div class="paragraph">
<p>Nicht mit dem Finger zeigen. Nicht den Prozess „angreifen&#34;.
Sondern ruhig dokumentieren:</p>
</div>
<div class="paragraph">
<p><strong>„An dieser Stelle liefert das System X zurück, obwohl Y fachlich plausibler wäre. Gibt es einen bekannten Grund für dieses Verhalten?&#34;</strong></p>
</div>
<div class="paragraph">
<p>Solche Fragen öffnen Türen.
Nicht sofort. Aber irgendwann.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_beratung_bedeutet_den_nebel_zu_zeigen">Beratung bedeutet, den Nebel zu zeigen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Manchmal sind wir zu sehr damit beschäftigt, Lösungen zu präsentieren.
Dabei wäre der wichtigere Beitrag:
<strong>Den Nebel zeigen.</strong></p>
</div>
<div class="paragraph">
<p>Also klar machen, wo Dinge unklar sind.
Wo niemand mehr genau weiß, warum es ist, wie es ist.
Und wo der Code nur deshalb so aussieht, weil es niemand mehr anfasst.</p>
</div>
<div class="paragraph">
<p>Gute Beratung beginnt dort, wo wir bereit sind zuzugeben, dass wir etwas nicht verstehen.
Und den Mut haben, trotzdem Fragen zu stellen.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Feature by Fear: Wenn keiner mehr den Fehler anfassen will</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-04-02-feature_by_fear/</link>
			<pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-04-02-feature_by_fear/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich hatte gerade einen Fehler gefunden.
Dachte ich jedenfalls.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ein Teil des Systems lieferte einen Wert zurück, der aus technischer Sicht falsch war. Die Logik konnte so nicht stimmen – das war eindeutig. Also habe ich den Fall analysiert, reproduziert, eine saubere Lösung entwickelt und zum Review vorgelegt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die Reaktion:
„Das ist kein Bug. Das &lt;strong&gt;muss&lt;/strong&gt; so.&amp;#34;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_wenn_der_prozess_gewinnt_und_die_logik_verliert&#34;&gt;Wenn der Prozess gewinnt – und die Logik verliert&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Was mich irritierte: Die Logik war objektiv falsch.
Aber die Antwort war nicht fachlich, sondern prozessual.
Man wusste, dass es „nicht korrekt&amp;#34; ist – aber der Prozess, wie er heute abläuft, erwartet genau dieses Verhalten. Und der Prozess sei wichtig. Unverhandelbar.&lt;/p&gt;
&lt;/div&gt;
				
#softwareentwicklung #beratung #prozesse #fachlichkeit #entwickleralltag 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich hatte gerade einen Fehler gefunden.
Dachte ich jedenfalls.</p>
</div>
<div class="paragraph">
<p>Ein Teil des Systems lieferte einen Wert zurück, der aus technischer Sicht falsch war. Die Logik konnte so nicht stimmen – das war eindeutig. Also habe ich den Fall analysiert, reproduziert, eine saubere Lösung entwickelt und zum Review vorgelegt.</p>
</div>
<div class="paragraph">
<p>Die Reaktion:
„Das ist kein Bug. Das <strong>muss</strong> so.&#34;</p>
</div>
<div class="sect1">
<h2 id="_wenn_der_prozess_gewinnt_und_die_logik_verliert">Wenn der Prozess gewinnt – und die Logik verliert</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Was mich irritierte: Die Logik war objektiv falsch.
Aber die Antwort war nicht fachlich, sondern prozessual.
Man wusste, dass es „nicht korrekt&#34; ist – aber der Prozess, wie er heute abläuft, erwartet genau dieses Verhalten. Und der Prozess sei wichtig. Unverhandelbar.</p>
</div>
<div class="paragraph">
<p>Das ist einer dieser Momente, in denen man als Entwickler schluckt.
Du <strong>könntest</strong> das Problem lösen – aber du <strong>darfst</strong> es nicht.</p>
</div>
<div class="paragraph">
<p>Weil die Lösung den Prozess stören würde.
Oder jemanden in der Fachabteilung verunsichert.
Oder weil „es halt immer so war&#34;.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ein_feature_das_wie_ein_bug_aussieht_und_umgekehrt">Ein Feature, das wie ein Bug aussieht – und umgekehrt</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Solche Situationen sind keine Einzelfälle.
Oft sind es Prozesse, die über Jahre gewachsen sind, sich an Systeme angepasst haben oder politische Rücksichtnahmen verkörpern. Sie sind nicht optimiert – sie sind einfach da. Und damit unantastbar.</p>
</div>
<div class="paragraph">
<p>In diesen Prozessen entstehen Verhalten, die für jeden Außenstehenden wie Bugs wirken.
Aber intern gelten sie als „korrekt&#34;. Und wehe, du willst das ändern.</p>
</div>
<div class="paragraph">
<p>Was es noch schwieriger macht:
Nicht selten sind selbst die Gründe für bestimmte Anforderungen im Dunkeln.
Es heißt dann: <strong>„Das muss so – wegen regulatorischer Vorgaben.&#34;</strong>
Fragt man nach, bleibt es vage: <strong>„Das war schon immer so.&#34;</strong>
Oder: <strong>„Ich glaube, das hat mit irgendwelchen Richtlinien zu tun.&#34;</strong></p>
</div>
<div class="paragraph">
<p>Diese Ungewissheit ist der wahre Gegner.
Denn wie sollst du beraten, wenn niemand sicher sagen kann, ob das Ziel überhaupt gültig ist?</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_beratung_heißt_auch_unsicherheit_sichtbar_machen">Beratung heißt auch: Unsicherheit sichtbar machen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Als beratender Entwickler musst du nicht alles wissen. Aber du musst den Mut haben, das Nicht-Wissen zu benennen.</p>
</div>
<div class="paragraph">
<p>Wenn du spürst, dass eine Anforderung auf wackligem Fundament steht, darfst du das nicht einfach ignorieren. Auch wenn es unbequem ist.</p>
</div>
<div class="paragraph">
<p>Du kannst aufzeigen, dokumentieren, Alternativen anbieten.
Aber manchmal ist das Beste, was du tun kannst:
<strong>Transparenz über die Unsicherheit schaffen.</strong></p>
</div>
<div class="paragraph">
<p>Denn Prozesse ändern sich nicht durch besseren Code – sondern durch bessere Fragen.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Entwickler oder Hellseher? Warum du Anforderungen nicht erraten solltest</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-03-26-entwickler_oder_hellseher/</link>
			<pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-03-26-entwickler_oder_hellseher/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;„Das hatten wir doch alles besprochen!&amp;#34;
Ein Satz, den ich im Projekt immer wieder höre – und innerlich seufze.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Denn ja, wir &lt;strong&gt;haben&lt;/strong&gt; über die Anforderung gesprochen.
Aber wir &lt;strong&gt;haben sie nicht wirklich verstanden.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_die_illusion_der_klarheit&#34;&gt;Die Illusion der Klarheit&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Im Meeting klang alles logisch: Ein Business Analyst beschreibt, was gebraucht wird, die Entwickler nicken, die Anforderungen werden als „spezifiziert&amp;#34; markiert. Und dann beginnt die Umsetzung – und plötzlich tauchen Fragen auf, die niemand gestellt hat.&lt;/p&gt;
&lt;/div&gt;
				
#softwareentwicklung #beratung #anforderungen #spezifikation #entwickleralltag 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>„Das hatten wir doch alles besprochen!&#34;
Ein Satz, den ich im Projekt immer wieder höre – und innerlich seufze.</p>
</div>
<div class="paragraph">
<p>Denn ja, wir <strong>haben</strong> über die Anforderung gesprochen.
Aber wir <strong>haben sie nicht wirklich verstanden.</strong></p>
</div>
<div class="sect1">
<h2 id="_die_illusion_der_klarheit">Die Illusion der Klarheit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Im Meeting klang alles logisch: Ein Business Analyst beschreibt, was gebraucht wird, die Entwickler nicken, die Anforderungen werden als „spezifiziert&#34; markiert. Und dann beginnt die Umsetzung – und plötzlich tauchen Fragen auf, die niemand gestellt hat.</p>
</div>
<div class="paragraph">
<p>Was passiert, wenn der Kunde zwei IBANs hat?
Was, wenn das Konto zu dem Zeitpunkt schon geschlossen ist?
Wie soll der Prozess mit fehlerhaften Daten umgehen?
Und was bedeutet eigentlich „fehlerhaft&#34;?</p>
</div>
<div class="paragraph">
<p>Die Fragen wirken banal. Aber sie entlarven eine harte Realität: Die Anforderung war nicht durchdacht – nur aufgeschrieben.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wenn_entwicklung_zur_anforderungsanalyse_wird">Wenn Entwicklung zur Anforderungsanalyse wird</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Als Entwickler stolperst du mitten im Code über offene Punkte, die nie geklärt wurden. Und dann beginnt das große Nachfragen – manchmal zum dritten Mal, weil der letzte Stand nirgends dokumentiert wurde oder sich zwischenzeitlich wieder geändert hat.</p>
</div>
<div class="paragraph">
<p>In solchen Momenten wird die eigentliche Arbeit unterbrochen. Statt sauber zu entwickeln, führst du Recherchegespräche. Du wirst zum Dolmetscher zwischen Logik und Realität – oft ohne klare Ansprechpartner.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_mein_learning">Mein Learning</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein Satz, den ich mir immer wieder vor Augen führe:</p>
</div>
<div class="quoteblock">
<blockquote>
<div class="paragraph">
<p>Nur weil eine Anforderung <strong>besprochen</strong> wurde, ist sie noch lange nicht <strong>verstanden</strong>.</p>
</div>
</blockquote>
</div>
<div class="paragraph">
<p>Gerade in komplexen Systemen reicht „ungefähr richtig&#34; nicht.
Man muss die Ausnahmefälle denken, die Systemgrenzen verstehen und den Mut haben, auch nach der dritten Rückfrage nochmal zu sagen: <strong>Das reicht nicht.</strong></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_beraten_heißt_auch_nachbohren_dürfen">Beraten heißt auch: nachbohren dürfen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Als beratender Entwickler bist du nicht nur für sauberen Code zuständig. Du bist auch dafür da, Unklarheiten sichtbar zu machen. Und zwar so früh wie möglich.</p>
</div>
<div class="paragraph">
<p>Auch wenn das heißt, dass du die Rolle des „Unbequemen&#34; einnimmst – der, der nochmal fragt, der nochmal bremst, der nicht einfach blind umsetzt.</p>
</div>
<div class="paragraph">
<p>Denn das ist echte Qualität: Nicht was du coden <strong>kannst</strong>, sondern was du vorher <strong>hinterfragt</strong> hast.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Die trügerische Sicherheit von Queues – Warum Banken aufpassen müssen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-03-19-truegerische-sicherheit-queues/</link>
			<pubDate>Wed, 19 Mar 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-03-19-truegerische-sicherheit-queues/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Moderne Banken setzen auf Queues wie Apache Kafka, um Skalierbarkeit, Fehlertoleranz und Entkopplung ihrer Systeme zu gewährleisten. Ohne Queues wäre es nahezu unmöglich, die hohen Anforderungen an Stabilität und Verfügbarkeit im Zahlungsverkehr zu erfüllen. Sie ermöglichen es Banken, Transaktionen unabhängig von der Verfügbarkeit einzelner Systeme zu verarbeiten und stellen sicher, dass Zahlungen nicht verloren gehen, selbst wenn Systeme temporär ausfallen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ein zentraler Vorteil von Queues ist die Lastverteilung. Im Zahlungsverkehr gibt es Stoßzeiten, etwa am Monatsende, wenn viele Gehälter überwiesen werden. Eine synchrone Verarbeitung würde Systeme in solchen Momenten überlasten. Mit Queues können Zahlungen zwischengespeichert und nach und nach abgearbeitet werden, sodass die Last gleichmäßiger verteilt wird. Außerdem bieten sie eine zuverlässige Fehlerbehandlung: Sollte eine Transaktion fehlschlagen, bleibt sie in der Queue und kann später erneut verarbeitet werden.&lt;/p&gt;
&lt;/div&gt;
				
#Zahlungsverkehr #Echtzeit #Queues #Apache Kafka #Banken 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Moderne Banken setzen auf Queues wie Apache Kafka, um Skalierbarkeit, Fehlertoleranz und Entkopplung ihrer Systeme zu gewährleisten. Ohne Queues wäre es nahezu unmöglich, die hohen Anforderungen an Stabilität und Verfügbarkeit im Zahlungsverkehr zu erfüllen. Sie ermöglichen es Banken, Transaktionen unabhängig von der Verfügbarkeit einzelner Systeme zu verarbeiten und stellen sicher, dass Zahlungen nicht verloren gehen, selbst wenn Systeme temporär ausfallen.</p>
</div>
<div class="paragraph">
<p>Ein zentraler Vorteil von Queues ist die Lastverteilung. Im Zahlungsverkehr gibt es Stoßzeiten, etwa am Monatsende, wenn viele Gehälter überwiesen werden. Eine synchrone Verarbeitung würde Systeme in solchen Momenten überlasten. Mit Queues können Zahlungen zwischengespeichert und nach und nach abgearbeitet werden, sodass die Last gleichmäßiger verteilt wird. Außerdem bieten sie eine zuverlässige Fehlerbehandlung: Sollte eine Transaktion fehlschlagen, bleibt sie in der Queue und kann später erneut verarbeitet werden.</p>
</div>
<div class="paragraph">
<p>Doch genau diese Sicherheit ist trügerisch. Queues verhindern zwar den Verlust von Nachrichten, aber sie lösen nicht das Problem der verzögerten Verarbeitung. Eine Zahlung in einer Queue mag sicher gespeichert sein, aber solange sie nicht verarbeitet wurde, existiert sie nur als offene Anweisung. In einem Echtzeit-Zahlungssystem ist das ein Problem: Kunden erwarten, dass Überweisungen sofort beim Empfänger ankommen. Wenn eine Bank eine Zahlung in eine Queue stellt, bedeutet das nicht, dass sie auch sofort verarbeitet wird – je nach Systemlast kann das länger dauern, ohne dass der Kunde davon etwas merkt.</p>
</div>
<div class="paragraph">
<p>Ein weiteres Problem ist die fehlende direkte Rückmeldung. Eine Bank, die eine Zahlung abschickt, erhält in einem Queue-basierten System keine sofortige Bestätigung, dass das Geld wirklich angekommen ist. Die Transaktion wird zwar sicher übermittelt, aber der endgültige Status bleibt ungewiss, bis die Empfängerbank die Nachricht verarbeitet hat. Das führt zu Unsicherheiten und kann in bestimmten Szenarien zu Problemen führen, insbesondere wenn Zahlungen schnell weiterverarbeitet oder abgesichert werden müssen.</p>
</div>
<div class="paragraph">
<p>Besonders kritisch ist die Rolle von Queues in Echtzeit-Zahlungssystemen. Echtzeit bedeutet, dass alle beteiligten Systeme zum Zeitpunkt der Transaktion verfügbar sein müssen. Liegen Transaktionen in einer Queue, können sie nicht sofort verarbeitet werden – und schlimmer noch: Sie können andere Zahlungen blockieren. Da viele Queues eine strikte Reihenfolge der Abarbeitung einhalten, müssen ältere Transaktionen zuerst bearbeitet werden, bevor neuere Zahlungen durchkommen. In einem System, das auf Echtzeit ausgelegt ist, kann dies fatale Folgen haben, weil eine fehlerhafte oder blockierte Transaktion die gesamte Verarbeitung ins Stocken bringt.</p>
</div>
<div class="paragraph">
<p>Trotz dieser Herausforderungen bieten Queues weitere Vorteile. Sie ermöglichen eine hohe Systementkopplung, da Sender- und Empfängersysteme nicht gleichzeitig verfügbar sein müssen. Dies verbessert die Wartbarkeit und erleichtert Updates, da einzelne Komponenten unabhängig voneinander ausgetauscht oder skaliert werden können. Zudem unterstützen Queues eine garantierte Reihenfolge der Verarbeitung, was in Szenarien wie Massenzahlungen oder Abrechnungsprozessen essenziell sein kann. Auch die Möglichkeit, Transaktionen in mehreren Schritten zu verarbeiten, ist ein Vorteil: So können beispielsweise Vorprüfungen durchgeführt werden, bevor eine endgültige Buchung erfolgt.</p>
</div>
<div class="paragraph">
<p>Queues sind essenziell für den stabilen Betrieb von Bankensystemen und lösen viele technische Herausforderungen. Doch sie sind nicht für jeden Anwendungsfall ideal. Die vermeintliche Sicherheit, die sie bieten, kann zu einer falschen Annahme von Kontrolle und Echtzeitfähigkeit führen. Banken müssen sorgfältig abwägen, wann und wo sie Queues einsetzen, um ihre Vorteile zu nutzen, ohne sich unnötige Verzögerungen einzuhandeln.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Das Fundament für Echtzeit-Zahlungen – Ein Netzwerk für den Austausch von Nachrichten in Echtzeit</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-03-12-echtzeit_zv/</link>
			<pubDate>Wed, 12 Mar 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-03-12-echtzeit_zv/</guid>
			<description>
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_warum_brauchen_wir_ein_echtzeit_netzwerk&#34;&gt;Warum brauchen wir ein Echtzeit-Netzwerk?&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Der Zahlungsverkehr ist heute komplexer denn je. Instant Payments, &lt;strong&gt;Verification of Payee (VoP)&lt;/strong&gt; und &lt;strong&gt;Request to Pay&lt;/strong&gt; sind moderne Konzepte, die schnelle und zuverlässige Transaktionen ermöglichen sollen. Doch die zugrunde liegende Infrastruktur ist oft alles andere als &lt;strong&gt;echtzeitfähig&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Viele bestehende Systeme setzen auf &lt;strong&gt;asynchrone Verarbeitung&lt;/strong&gt;, Message Queues oder sogar noch &lt;strong&gt;Batch-Prozesse&lt;/strong&gt;. Das führt zu unnötigen Verzögerungen, obwohl die Technologie für eine &lt;strong&gt;echte&lt;/strong&gt; Echtzeit-Kommunikation längst existiert.&lt;/p&gt;
&lt;/div&gt;
				
#Echtzeit #Zahlungsverkehr #APIs #Instant Payments #VoP #R2P 
				
			</description>
			<content type="html"><![CDATA[<div class="sect1">
<h2 id="_warum_brauchen_wir_ein_echtzeit_netzwerk">Warum brauchen wir ein Echtzeit-Netzwerk?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Der Zahlungsverkehr ist heute komplexer denn je. Instant Payments, <strong>Verification of Payee (VoP)</strong> und <strong>Request to Pay</strong> sind moderne Konzepte, die schnelle und zuverlässige Transaktionen ermöglichen sollen. Doch die zugrunde liegende Infrastruktur ist oft alles andere als <strong>echtzeitfähig</strong>.</p>
</div>
<div class="paragraph">
<p>Viele bestehende Systeme setzen auf <strong>asynchrone Verarbeitung</strong>, Message Queues oder sogar noch <strong>Batch-Prozesse</strong>. Das führt zu unnötigen Verzögerungen, obwohl die Technologie für eine <strong>echte</strong> Echtzeit-Kommunikation längst existiert.</p>
</div>
<div class="paragraph">
<p>Die Lösung? Ein Netzwerk für den <strong>synchronen Austausch von Nachrichten auf Basis von HTTPS</strong> – eine Architektur, die nicht nur für Zahlungen, sondern auch für Bestätigungs- und Anforderungsprozesse funktioniert.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_warum_klassische_zahlungsverkehrssysteme_nicht_für_echtzeit_gemacht_sind">Warum klassische Zahlungsverkehrssysteme nicht für Echtzeit gemacht sind</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Viele bestehende Zahlungssysteme wurden in einer Zeit entwickelt, in der Echtzeit-Kommunikation keine Priorität hatte. Das zeigt sich in mehreren Problemfeldern:</p>
</div>
<div class="sect2">
<h3 id="_1_asynchrone_verarbeitung_durch_queues">1. Asynchrone Verarbeitung durch Queues</h3>
<div class="ulist">
<ul>
<li>
<p>Banken nutzen häufig Message Queues, um Zahlungsanfragen zwischen Sender- und Empfängerbank zu übermitteln.</p>
</li>
<li>
<p>Das bedeutet: Eine Zahlung wird <strong>nicht direkt verarbeitet</strong>, sondern erst in eine Queue gestellt.</p>
</li>
<li>
<p>Die Empfängerbank holt sich die Nachricht erst, wenn sie dazu kommt – eine echte Verzögerung.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_2_batch_verarbeitung_statt_sofortiger_antwort">2. Batch-Verarbeitung statt sofortiger Antwort</h3>
<div class="ulist">
<ul>
<li>
<p>Viele Banken verarbeiten Transaktionen noch in festen Zeitintervallen.</p>
</li>
<li>
<p>Das widerspricht dem Echtzeit-Gedanken und sorgt für unvorhersehbare Verzögerungen.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_3_keine_durchgängige_api_kommunikation">3. Keine durchgängige API-Kommunikation</h3>
<div class="ulist">
<ul>
<li>
<p>Viele Banken arbeiten noch mit proprietären Formaten und Protokollen.</p>
</li>
<li>
<p>Statt einer standardisierten API-Architektur gibt es individuelle Implementierungen, die nicht miteinander kompatibel sind.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Die Folge? <strong>Zahlungen sind zwar schneller als früher, aber echte Echtzeit ist damit nicht möglich.</strong></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ein_netzwerk_für_echtzeit_kommunikation_die_basis_von_instant_payments_vop_und_request_to_pay">Ein Netzwerk für Echtzeit-Kommunikation: Die Basis von Instant Payments, VoP und Request to Pay</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein modernes Zahlungsverkehrssystem braucht eine Architektur, die <strong>synchronen</strong> Nachrichtenaustausch ermöglicht – und das <strong>standardisiert</strong>.</p>
</div>
<div class="sect2">
<h3 id="_1_https_als_basis_für_echtzeit_zahlungen">1. HTTPS als Basis für Echtzeit-Zahlungen</h3>
<div class="ulist">
<ul>
<li>
<p><strong>Anstelle von Queues oder Batches</strong> sollte der Nachrichtenaustausch direkt zwischen den beteiligten Banken über möglichst geringe Zahl von Zwischenstellen stattfinden.</p>
</li>
<li>
<p><strong>HTTPS und REST- oder gRPC-APIs</strong> ermöglichen es, Anfragen und Antworten in <strong>Millisekunden</strong> zu übermitteln.</p>
</li>
<li>
<p>Eine API-basierte Kommunikation stellt sicher, dass <strong>jede Zahlung sofort verarbeitet wird</strong> – ohne unnötige Wartezeiten.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_2_einheitliche_api_spezifikationen_für_banken">2. Einheitliche API-Spezifikationen für Banken</h3>
<div class="ulist">
<ul>
<li>
<p>Jede Bank sollte eine standardisierte API bereitstellen, um Zahlungen <strong>direkt</strong> zu empfangen und zu bestätigen. Systeme dafür sollten unabhängig von ihren Jahrzente alten Systemen funktionieren.</p>
</li>
<li>
<p>Diese API könnte für verschiedene Zwecke genutzt werden:</p>
</li>
<li>
<p><strong>Instant Payments</strong>: Sofortige Überweisungen mit direkter Bestätigung.</p>
</li>
<li>
<p><strong>Verification of Payee (VoP)</strong>: Überprüfung des Empfängers vor einer Zahlung.</p>
</li>
<li>
<p><strong>Request to Pay (RTP)</strong>: Anfragen für Zahlungen in Echtzeit.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_3_eindeutige_ids_für_jede_transaktion">3. Eindeutige IDs für jede Transaktion</h3>
<div class="ulist">
<ul>
<li>
<p>Um sicherzustellen, dass jede Nachricht nur einmal verarbeitet wird, braucht es <strong>eindeutige Identifikatoren</strong>.</p>
</li>
<li>
<p>Diese verhindern <strong>Doppelbuchungen</strong> und ermöglichen eine <strong>transparente Nachverfolgung</strong>.</p>
</li>
<li>
<p>Diese müssen innerhalb des Netzwerks eindeutig sein. Eventuell könnten sie sich aus mehreren Feldern (Debtor-BIC und einer Id) zusammensetzen.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_warum_diese_architektur_nicht_nur_für_zahlungen_relevant_ist">Warum diese Architektur nicht nur für Zahlungen relevant ist</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein Netzwerk für Echtzeit-Kommunikation bringt nicht nur Vorteile für <strong>Zahlungen</strong>, sondern auch für <strong>andere kritische Prozesse</strong> im Finanzwesen.</p>
</div>
<div class="sect2">
<h3 id="_verification_of_payee_vop">Verification of Payee (VoP)</h3>
<div class="ulist">
<ul>
<li>
<p>Bevor eine Zahlung ausgeführt wird, kann überprüft werden, ob der Name des Empfängers zur angegebenen Kontonummer passt.</p>
</li>
<li>
<p>Der Zahler erhält <strong>unmittelbar</strong> eine Rückmeldung, sodass fehlerhafte Überweisungen vermieden werden.</p>
</li>
<li>
<p>Mit einem <strong>synchronen System</strong> wäre diese Prüfung in <strong>Echtzeit</strong> möglich – nicht erst nach der Buchung.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_request_to_pay_rtp">Request to Pay (RTP)</h3>
<div class="ulist">
<ul>
<li>
<p>Verkäufer oder Dienstleister könnten Kunden eine Zahlung <strong>in Echtzeit anfordern</strong>.</p>
</li>
<li>
<p>Der Kunde kann diese Anfrage <strong>sofort bestätigen</strong> oder ablehnen.</p>
</li>
<li>
<p>In einem synchronen System geschieht das ohne Verzögerung – genau dann, wenn es gebraucht wird.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_echtzeit_beginnt_mit_der_richtigen_infrastruktur">Fazit: Echtzeit beginnt mit der richtigen Infrastruktur</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Echte Echtzeit-Zahlungen sind nur möglich, wenn <strong>die Kommunikation zwischen den Banken ebenfalls in Echtzeit abläuft</strong>.</p>
</div>
<div class="paragraph">
<p>Das bedeutet:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Weg von Queues und Batch-Verarbeitung, hin zu direkter API-Kommunikation</strong></p>
</li>
<li>
<p><strong>Standardisierte API-Spezifikationen für Instant Payments, VoP und RTP</strong></p>
</li>
<li>
<p><strong>Eindeutige IDs für jede Transaktion, um Verzögerungen und Doppelbuchungen zu vermeiden</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Ein Netzwerk für den synchronen Austausch von Nachrichten über HTTPS ist die Grundlage für alle modernen Zahlungsverkehrsprozesse.</strong> Erst wenn Banken diese Infrastruktur schaffen, können sie das Versprechen von Echtzeit-Zahlungen wirklich einlösen.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Beraten und ignoriert: Wie du mit abgelehnten Ratschlägen umgehst</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-03-05-abgelehnter-rat-berater/</link>
			<pubDate>Wed, 05 Mar 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-03-05-abgelehnter-rat-berater/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Es ist eine wiederkehrende Erfahrung in der Beratung: Du gibst einen fundierten, durchdachten Rat – und er wird ignoriert. Nicht, weil er schlecht wäre, sondern weil er aus den verschiedensten Gründen nicht angenommen wird. Das kann frustrierend sein, vor allem wenn du überzeugt bist, dass dein Vorschlag eine echte Verbesserung bringen würde. Doch wer langfristig erfolgreich beraten will, muss lernen, damit umzugehen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Nicht jeder Rat wird aus denselben Gründen abgelehnt. Manchmal liegt es an psychologischen Faktoren – Menschen haben Angst vor Veränderungen oder wollen nicht zugeben, dass jemand anderes eine bessere Idee hat. In anderen Fällen sind es organisatorische Hürden wie Budgetbeschränkungen, politische Interessen oder schlichtweg andere Prioritäten. Und manchmal wird ein Rat einfach nicht richtig vermittelt oder verstanden.&lt;/p&gt;
&lt;/div&gt;
				
#beratung #consulting #kommunikation #psychologie 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Es ist eine wiederkehrende Erfahrung in der Beratung: Du gibst einen fundierten, durchdachten Rat – und er wird ignoriert. Nicht, weil er schlecht wäre, sondern weil er aus den verschiedensten Gründen nicht angenommen wird. Das kann frustrierend sein, vor allem wenn du überzeugt bist, dass dein Vorschlag eine echte Verbesserung bringen würde. Doch wer langfristig erfolgreich beraten will, muss lernen, damit umzugehen.</p>
</div>
<div class="paragraph">
<p>Nicht jeder Rat wird aus denselben Gründen abgelehnt. Manchmal liegt es an psychologischen Faktoren – Menschen haben Angst vor Veränderungen oder wollen nicht zugeben, dass jemand anderes eine bessere Idee hat. In anderen Fällen sind es organisatorische Hürden wie Budgetbeschränkungen, politische Interessen oder schlichtweg andere Prioritäten. Und manchmal wird ein Rat einfach nicht richtig vermittelt oder verstanden.</p>
</div>
<div class="paragraph">
<p>Anstatt dich darüber zu ärgern, dass dein Rat nicht angenommen wird, hilft es, strategisch damit umzugehen. Die wichtigste Erkenntnis: Nicht jede Ablehnung ist endgültig. Oft braucht es nur Zeit, bis ein Vorschlag akzeptiert wird. Es kann helfen, nachzufragen: „Was spricht aktuell gegen diese Lösung?&#34; oder „Was müsste sich ändern, damit du das in Betracht ziehst?&#34; So bekommst du wertvolle Einblicke in die Entscheidungsprozesse deines Gegenübers.</p>
</div>
<div class="paragraph">
<p>Flexibilität ist ein weiterer Schlüssel. Wenn dein Vorschlag auf Widerstand stößt, kannst du alternative Ansätze anbieten, die vielleicht besser zur Situation passen. Gleichzeitig lohnt es sich, wichtige Empfehlungen zu dokumentieren. Falls das Problem später erneut auftritt, kannst du zeigen, dass du frühzeitig eine Lösung vorgeschlagen hast – das stärkt deine Position und dein Standing als Berater.</p>
</div>
<div class="paragraph">
<p>Wichtig ist auch, die eigene Perspektive zu wechseln. Vielleicht gibt es interne Zwänge oder ungeschriebene Regeln, die du nicht kennst. Ein wenig Empathie hilft, die Ablehnung nicht persönlich zu nehmen. Und manchmal muss man einen Rat einfach loslassen. Der Kunde oder Kollege muss selbst Erfahrungen machen, und es bringt nichts, sich an einem abgelehnten Vorschlag festzubeißen.</p>
</div>
<div class="paragraph">
<p>Am Ende gilt: Beratung ist keine Einbahnstraße. Dein Job ist es, Impulse zu geben, Alternativen aufzuzeigen und zu unterstützen – nicht, andere zu Entscheidungen zu zwingen. Jeder Rat, auch wenn er abgelehnt wird, hinterlässt Spuren. Und oft dauert es nur etwas länger, bis diese Spuren zu Veränderungen führen.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Doppelt hält schlechter: Wenn Prozesse unnötige Umwege machen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-02-26-doppelt_haelt_schlechter/</link>
			<pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-02-26-doppelt_haelt_schlechter/</guid>
			<description>
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_einleitung&#34;&gt;Einleitung&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Digitalisierung soll Prozesse effizienter machen – in der Theorie. In der Praxis sieht es oft anders aus: Ein neues System wird eingeführt, doch statt es direkt zu nutzen, halten sich alte Arbeitsweisen hartnäckig. Ein Klassiker: Daten werden erst in Excel gepflegt, bevor sie umständlich in ein eigentlich dafür vorgesehenes System übertragen werden.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Das Ergebnis? Zwei Arbeitsschritte statt einem. Mehr Zeitaufwand, höhere Fehleranfälligkeit und eine Menge Frust bei den Beteiligten. Doch warum entstehen solche ineffizienten Workarounds? Und was kann man tun, um sie zu vermeiden?&lt;/p&gt;
&lt;/div&gt;
				
#digitalisierung #prozesse #effizienz #workarounds #softwareentwicklung 
				
			</description>
			<content type="html"><![CDATA[<div class="sect1">
<h2 id="_einleitung">Einleitung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Digitalisierung soll Prozesse effizienter machen – in der Theorie. In der Praxis sieht es oft anders aus: Ein neues System wird eingeführt, doch statt es direkt zu nutzen, halten sich alte Arbeitsweisen hartnäckig. Ein Klassiker: Daten werden erst in Excel gepflegt, bevor sie umständlich in ein eigentlich dafür vorgesehenes System übertragen werden.</p>
</div>
<div class="paragraph">
<p>Das Ergebnis? Zwei Arbeitsschritte statt einem. Mehr Zeitaufwand, höhere Fehleranfälligkeit und eine Menge Frust bei den Beteiligten. Doch warum entstehen solche ineffizienten Workarounds? Und was kann man tun, um sie zu vermeiden?</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wenn_digitalisierung_ins_leere_läuft">Wenn Digitalisierung ins Leere läuft</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Stellen wir uns folgendes Szenario vor: Ein Unternehmen führt eine neue Software ein, mit der der Vertrieb Kundenverträge direkt erfassen soll. Doch anstatt das System zu nutzen, tragen die Mitarbeitenden ihre Daten weiterhin in Excel-Tabellen ein. Erst später übernimmt eine andere Abteilung die Aufgabe, die Verträge manuell ins System zu übertragen.</p>
</div>
<div class="paragraph">
<p>Was auf den ersten Blick nach einem einmaligen Ausnahmefall klingt, ist in vielen Unternehmen traurige Realität. Ein digitaler Prozess existiert – aber er wird umgangen. Und das hat Konsequenzen:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Mehr Aufwand, weniger Effizienz:</strong> Zwei Abteilungen erledigen unnötigerweise dieselbe Arbeit – eine trägt die Daten in Excel ein, die andere überträgt sie später ins System.</p>
</li>
<li>
<p><strong>Erhöhte Fehleranfälligkeit:</strong> Copy-Paste aus Excel ist fehleranfällig – Zahlendreher, unvollständige Einträge oder falsch zugeordnete Daten sind vorprogrammiert.</p>
</li>
<li>
<p><strong>Verlust von Kontextwissen:</strong> Die Mitarbeitenden, die die Daten nachträglich ins System eintragen, haben oft nicht alle Details oder den Hintergrund der ursprünglichen Eingabe.</p>
</li>
<li>
<p><strong>Frust bei den Beteiligten:</strong> Zeit, die für doppelte Arbeit aufgewendet wird, fehlt an anderer Stelle für wichtigere Aufgaben.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_warum_entstehen_solche_umwege">Warum entstehen solche Umwege?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Solche ineffizienten Workarounds entstehen nicht zufällig. Meist gibt es klare Gründe, warum ein System in der Praxis nicht so genutzt wird, wie es gedacht war:</p>
</div>
<div class="sect2">
<h3 id="_1_fehlannahmen_bei_der_systemgestaltung">1. Fehlannahmen bei der Systemgestaltung</h3>
<div class="paragraph">
<p>Ein typischer Fehler: Ein System wird für eine bestimmte Nutzergruppe entwickelt – aber nicht für diejenigen, die die eigentliche Arbeit damit erledigen sollen. In unserem Beispiel wurde das System vielleicht für die Verwaltung oder das Controlling entworfen, aber nicht mit Blick auf die Bedürfnisse des Vertriebs.</p>
</div>
<div class="paragraph">
<p>Wenn das System nicht auf die tägliche Arbeitsweise der Mitarbeitenden abgestimmt ist, entsteht zwangsläufig ein Workaround. Und der heißt oft Excel.</p>
</div>
</div>
<div class="sect2">
<h3 id="_2_fehlendes_nutzer_feedback_in_der_entwicklungsphase">2. Fehlendes Nutzer-Feedback in der Entwicklungsphase</h3>
<div class="paragraph">
<p>Viele Systeme werden nach technischen Anforderungen entwickelt, aber ohne die echten Nutzer zu befragen. In der Theorie sieht alles gut aus – in der Praxis stellen sich dann Probleme heraus, die vorher nicht bedacht wurden.</p>
</div>
<div class="paragraph">
<p>Wer hat sich vor der Einführung gefragt:
- Welche Prozesse nutzen die Mitarbeitenden bisher?
- Welche Hürden gibt es, das neue System direkt zu verwenden?
- Welche Funktionen fehlen vielleicht, damit es wirklich praktikabel ist?</p>
</div>
<div class="paragraph">
<p>Ohne dieses Feedback wird ein System schnell zur „Pflichtaufgabe&#34;, die man irgendwie umgehen muss.</p>
</div>
</div>
<div class="sect2">
<h3 id="_3_technische_oder_organisatorische_hürden">3. Technische oder organisatorische Hürden</h3>
<div class="paragraph">
<p>Manchmal gibt es ganz praktische Gründe, warum das System nicht direkt genutzt wird:
- Der Vertrieb hat keinen direkten Zugriff oder benötigt komplizierte Anmeldungen.
- Die Benutzeroberfläche ist zu kompliziert und nicht intuitiv.
- Die Dateneingabe dauert länger als die Nutzung einer Excel-Tabelle.
- Automatische Schnittstellen fehlen, sodass das System nicht flexibel genug ist.</p>
</div>
<div class="paragraph">
<p>Je umständlicher die direkte Nutzung ist, desto eher greifen die Nutzer auf die alte, bewährte Methode zurück.</p>
</div>
</div>
<div class="sect2">
<h3 id="_4_angst_vor_veränderungen_und_mangelnde_schulung">4. Angst vor Veränderungen und mangelnde Schulung</h3>
<div class="paragraph">
<p>„Das haben wir schon immer so gemacht!&#34; – Ein Satz, der jede digitale Transformation torpedieren kann. Selbst wenn ein neues System objektiv Vorteile bringt, braucht es Schulung und Überzeugung, damit es auch genutzt wird.</p>
</div>
<div class="paragraph">
<p>Wenn Mitarbeitende sich im neuen System nicht sicher fühlen oder das Gefühl haben, damit langsamer zu arbeiten, bleiben sie bei ihrer bisherigen Methode – selbst wenn das langfristig ineffizienter ist.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wie_lässt_sich_das_problem_lösen">Wie lässt sich das Problem lösen?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Damit digitale Prozesse wirklich funktionieren, muss man sich an der Realität der Nutzer orientieren. Einige entscheidende Ansätze helfen dabei, unnötige Umwege zu vermeiden:</p>
</div>
<div class="sect2">
<h3 id="_1_direkte_erfassung_ermöglichen">1. Direkte Erfassung ermöglichen</h3>
<div class="paragraph">
<p>Das wichtigste Prinzip: Wer die Daten kennt, sollte sie auch direkt eintragen können. Keine Zwischenschritte, keine zusätzlichen Schnittstellen, kein Excel-Umweg. Wenn ein Vertriebler einen Vertrag abschließt, sollte er ihn sofort und einfach ins System eintragen können – ohne auf eine andere Abteilung angewiesen zu sein.</p>
</div>
</div>
<div class="sect2">
<h3 id="_2_nutzerzentrierte_entwicklung">2. Nutzerzentrierte Entwicklung</h3>
<div class="paragraph">
<p>Systeme müssen so entwickelt werden, dass sie zur Arbeitsweise der Nutzer passen – nicht umgekehrt. Das bedeutet:
- <strong>Frühes Nutzer-Feedback:</strong> Vor der Entwicklung echte Anwender befragen und einbeziehen.
- <strong>Prototypen testen:</strong> Frühzeitig ausprobieren, ob die Lösung in der Praxis funktioniert.
- <strong>Iterativ verbessern:</strong> Anpassungen nach dem Livegang schnell umsetzen, um Workarounds zu verhindern.</p>
</div>
</div>
<div class="sect2">
<h3 id="_3_prozesse_hinterfragen">3. Prozesse hinterfragen</h3>
<div class="paragraph">
<p>Wenn Daten über Umwege erfasst werden, stellt sich die Frage: Warum?
- Ist das System zu kompliziert?
- Fehlt eine Funktion, die den Umweg überflüssig machen würde?
- Gibt es organisatorische Gründe, die den direkten Zugriff verhindern?</p>
</div>
<div class="paragraph">
<p>Nur wer die Ursache versteht, kann sie auch beheben.</p>
</div>
</div>
<div class="sect2">
<h3 id="_4_mitarbeitende_mitnehmen">4. Mitarbeitende mitnehmen</h3>
<div class="paragraph">
<p>Technische Lösungen funktionieren nur, wenn die Menschen sie auch akzeptieren. Das bedeutet:
- <strong>Schulungen anbieten:</strong> Nicht jeder fühlt sich sofort sicher mit neuen Systemen.
- <strong>Vorteile verdeutlichen:</strong> Warum spart die neue Lösung langfristig Zeit?
- <strong>Auf Widerstände eingehen:</strong> Sorgen und Bedenken ernst nehmen und praktische Lösungen anbieten.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein System, das in der Praxis nicht genutzt wird oder unnötige Workarounds provoziert, hat sein Ziel verfehlt. Digitalisierung ist mehr als nur Software – sie muss Prozesse einfacher und effizienter machen.</p>
</div>
<div class="paragraph">
<p>Wenn Mitarbeitende lieber Excel-Tabellen nutzen, statt direkt ins System zu arbeiten, liegt das Problem nicht an ihnen – sondern an der Lösung selbst. Unternehmen, die ihre digitalen Prozesse optimieren wollen, müssen sich fragen:
- Wer arbeitet wirklich mit dem System?
- Warum wird es nicht direkt genutzt?
- Wie kann man die Prozesse so gestalten, dass sie intuitiv und effizient sind?</p>
</div>
<div class="paragraph">
<p>Denn eines ist sicher: <strong>Ein System, das die Nutzer umständlicher arbeiten lässt, wird immer durch eine pragmatische Alternative ersetzt – egal ob mit oder ohne IT-Freigabe.</strong></p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Der wahre Blocker? Eure Angst, Verantwortung zu übernehmen!</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-02-19-blocker-angst-verantwortung/</link>
			<pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-02-19-blocker-angst-verantwortung/</guid>
			<description>
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_freigabe_gestoppt_und_jetzt&#34;&gt;Freigabe gestoppt! Und jetzt?&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ein kritischer Fehler kurz vor dem Release – das Worst-Case-Szenario vieler Teams. Die Panik steigt, Meetings werden einberufen, Prioritäten verschieben sich. Doch ist der Bug wirklich das Problem? Oder ist es die fehlende Entscheidungskraft, die das Release wirklich blockiert?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Denn mal ehrlich: &lt;strong&gt;Fehlerfreie Software gibt es nicht.&lt;/strong&gt; Jedes System, das produktiv geht, hat offene Bugs – die Frage ist nur, ob sie den Betrieb tatsächlich verhindern. Und genau hier beginnt das eigentliche Problem: &lt;strong&gt;Wann ist ein Fehler wirklich ein Blocker?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
				
#priorisierung #bugfixing #release-management #softwareentwicklung 
				
			</description>
			<content type="html"><![CDATA[<div class="sect1">
<h2 id="_freigabe_gestoppt_und_jetzt">Freigabe gestoppt! Und jetzt?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein kritischer Fehler kurz vor dem Release – das Worst-Case-Szenario vieler Teams. Die Panik steigt, Meetings werden einberufen, Prioritäten verschieben sich. Doch ist der Bug wirklich das Problem? Oder ist es die fehlende Entscheidungskraft, die das Release wirklich blockiert?</p>
</div>
<div class="paragraph">
<p>Denn mal ehrlich: <strong>Fehlerfreie Software gibt es nicht.</strong> Jedes System, das produktiv geht, hat offene Bugs – die Frage ist nur, ob sie den Betrieb tatsächlich verhindern. Und genau hier beginnt das eigentliche Problem: <strong>Wann ist ein Fehler wirklich ein Blocker?</strong></p>
</div>
<div class="paragraph">
<p>Oft wird ein Ticket erst dann als „kritisch&#34; eingestuft, wenn der Release-Termin unmittelbar bevorsteht. Plötzlich ist ein Bug, der wochenlang niemanden gestört hat, der Showstopper schlechthin. Ist das Zufall? Nein. Es ist ein Muster.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wenn_alles_ein_blocker_ist_habt_ihr_die_kontrolle_verloren">Wenn alles ein Blocker ist, habt ihr die Kontrolle verloren</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Es gibt Fehler, die eine Freigabe unmöglich machen. Sicherheitslücken, Datenverlust, regulatorische Verstöße – das sind echte Showstopper. Aber oft wird der Begriff „Blocker&#34; inflationär genutzt.</p>
</div>
<div class="paragraph">
<p>Typische Muster, die man in Projekten immer wieder sieht:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Das Ticket war lange bekannt, wurde aber ignoriert.</strong> Jetzt, kurz vor der Freigabe, fällt es plötzlich wieder auf – und niemand will die Verantwortung übernehmen, es ungelöst zu lassen.</p>
</li>
<li>
<p><strong>Der Kunde hat es sich anders überlegt.</strong> Ein Feature, das monatelang als „nice-to-have&#34; galt, ist nun „essenziell&#34; – nicht, weil sich das Geschäft geändert hat, sondern weil jemand kalte Füße bekommt.</p>
</li>
<li>
<p><strong>Es fehlt das Vertrauen in das eigene System.</strong> Weil niemand sicher ist, wie stabil die Software wirklich ist, sucht man nach Ausreden, den Release-Termin zu verschieben.</p>
</li>
<li>
<p><strong>Der Fehler ist unangenehm, aber nicht fatal.</strong> Doch anstatt das pragmatisch zu bewerten, erklärt ihn jemand zur Katastrophe – meist, weil er nicht erklären kann, warum er eigentlich irrelevant ist.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Die Wahrheit ist: <strong>Wenn jede Unschönheit als Blocker zählt, geht es längst nicht mehr um den Fehler – sondern um eine Kultur der Unsicherheit.</strong></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_was_macht_einen_echten_blocker_aus">Was macht einen echten Blocker aus?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die eigentliche Herausforderung ist nicht der Fehler selbst, sondern die Priorisierung. Ein echter Blocker bedeutet:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>✔ <strong>Kein Workaround möglich</strong> – Der Fehler kann nicht durch manuelle Maßnahmen überbrückt werden.</p>
</li>
<li>
<p>✔ <strong>Kritische Geschäftsprozesse sind betroffen</strong> – Ohne den Fix kann das System nicht produktiv genutzt werden.</p>
</li>
<li>
<p>✔ <strong>Die Auswirkungen sind gravierend</strong> – Umsatzverluste, gesetzliche Verstöße oder Sicherheitsrisiken drohen.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Häufig werden jedoch Dinge als Blocker bezeichnet, die es gar nicht sind:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>✘ <strong>„Es sieht nicht gut aus.&#34;</strong> Kosmetische Fehler sind ärgerlich, aber kein Grund, das Release zu stoppen.</p>
</li>
<li>
<p>✘ <strong>„Es funktioniert nicht in allen Fällen perfekt.&#34;</strong> Edge Cases sind oft nachträglich fixbar.</p>
</li>
<li>
<p>✘ <strong>„Das könnte für Nutzer verwirrend sein.&#34;</strong> Dokumentation, Support oder Hotfixes sind Alternativen.</p>
</li>
<li>
<p>✘ <strong>„Wir haben ein ungutes Gefühl.&#34;</strong> Keine valide Begründung.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Entscheidend ist, ob ein Problem den Betrieb tatsächlich verhindert – oder nur das Perfektionsbedürfnis stört.</strong></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_priorisieren_statt_panik_schieben">Priorisieren statt Panik schieben</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wenn sich jedes Teammitglied in jeder Situation als „nicht zuständig&#34; betrachtet und niemand Verantwortung übernimmt, dann landet am Ende alles auf der höchsten Priorität. Und genau das führt zu Chaos.</p>
</div>
<div class="paragraph">
<p>Die Lösung? <strong>Eine klare, objektive Entscheidungsmatrix</strong> für Bugs:</p>
</div>
<div class="ulist unstyled">
<ul class="unstyled">
<li>
<p><strong>Welche Prozesse sind betroffen?</strong> Wenn der Fehler keine Kernprozesse stört, ist er kein Blocker.</p>
</li>
<li>
<p><strong>Gibt es eine Alternative?</strong> Wenn das Problem umgangen werden kann, ist es kein Blocker.</p>
</li>
<li>
<p><strong>Wie viele Nutzer sind betroffen?</strong> Ein Fehler, der nur in exotischen Szenarien auftritt, ist selten kritisch.</p>
</li>
<li>
<p><strong>Welche Risiken entstehen?</strong> Ein Blocker ist nur ein Blocker, wenn er schwerwiegende Folgen hat.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_mut_zur_entscheidung_statt_angst_vor_fehlern">Mut zur Entscheidung statt Angst vor Fehlern</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Jede Software hat Fehler. Die Frage ist nicht, <strong>ob</strong> sie existieren, sondern <strong>welche Konsequenzen sie haben</strong>.</p>
</div>
<div class="paragraph">
<p>Und genau hier müssen Teams den Mut haben, Verantwortung zu übernehmen. Ein Release zu stoppen ist eine Entscheidung, die genauso begründet sein muss wie das Gegenteil. Es reicht nicht, einfach „Sicherheit geht vor&#34; zu rufen – denn oft bedeutet „Sicherheit&#34; in Wahrheit nur „Angst vor Entscheidungen&#34;.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_fehler_passieren_aber_blocker_sind_selten">Fazit: Fehler passieren, aber Blocker sind selten</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Fehlerfreie Software gibt es nicht. Wer das als Ausrede für endlose Verschiebungen nutzt, blockiert nicht nur Releases, sondern Fortschritt. Kritische Fehler müssen ernst genommen werden – aber nicht jede Unklarheit ist ein Grund für den Stillstand.</p>
</div>
<div class="paragraph">
<p>Und letztlich ist der wahre Blocker oft nicht der Bug – sondern das Zögern, die Verantwortung zu übernehmen.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Softwareentwicklung ist kein McDrive: Warum Anforderungen mehr brauchen als ein ‚Umsetzen bitte!‘</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-02-12-kein-mcdrive/</link>
			<pubDate>Wed, 12 Feb 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-02-12-kein-mcdrive/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Softwareentwicklung ist kein Fast-Food-Bestellvorgang. Trotzdem erleben viele Entwickler genau das: Eine Liste von Anforderungen wird ihnen auf den Tisch geknallt, und ihre Aufgabe ist es, sie ohne Widerrede umzusetzen. Kein Hinterfragen, kein Mitdenken – einfach nur „liefern&amp;#34;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Doch wer so arbeitet, programmiert nicht nur Code, sondern auch den Misserfolg.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_wenn_softwareentwicklung_wie_eine_mcdrive_bestellung_läuft&#34;&gt;Wenn Softwareentwicklung wie eine McDrive-Bestellung läuft&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Wer im McDrive bestellt, erwartet, dass exakt das geliefert wird, was auf der Karte steht – nichts mehr, nichts weniger. Und genau so stellen sich viele Unternehmen Softwareentwicklung vor:&lt;/p&gt;
&lt;/div&gt;
				
#Softwareentwicklung #Anforderungen #Digitalisierung #Prozesse #Agile #Qualität #Entwickler 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Softwareentwicklung ist kein Fast-Food-Bestellvorgang. Trotzdem erleben viele Entwickler genau das: Eine Liste von Anforderungen wird ihnen auf den Tisch geknallt, und ihre Aufgabe ist es, sie ohne Widerrede umzusetzen. Kein Hinterfragen, kein Mitdenken – einfach nur „liefern&#34;.</p>
</div>
<div class="paragraph">
<p>Doch wer so arbeitet, programmiert nicht nur Code, sondern auch den Misserfolg.</p>
</div>
<div class="sect1">
<h2 id="_wenn_softwareentwicklung_wie_eine_mcdrive_bestellung_läuft">Wenn Softwareentwicklung wie eine McDrive-Bestellung läuft</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wer im McDrive bestellt, erwartet, dass exakt das geliefert wird, was auf der Karte steht – nichts mehr, nichts weniger. Und genau so stellen sich viele Unternehmen Softwareentwicklung vor:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Anforderung aufsagen.</strong></p>
</li>
<li>
<p><strong>Kurz warten.</strong></p>
</li>
<li>
<p><strong>Software bekommen, genau so, wie bestellt.</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Aber Softwareentwicklung funktioniert nicht wie eine Burger-Bestellung. Wer stumpf Anforderungen entgegennimmt, serviert am Ende ein Menü, das vielleicht den ersten Hunger stillt – aber langfristig nicht gesund ist.</p>
</div>
<div class="paragraph">
<p><strong>Typisches Fast-Food-Software-Denken:</strong>
- „Wir brauchen genau das Gleiche wie vorher, nur digital.&#34;
- „Bitte nichts ändern, sonst müssen wir unsere Prozesse anpassen.&#34;
- „Die alte Software konnte das, also muss die neue es auch können.&#34;</p>
</div>
<div class="paragraph">
<p>Und das Ergebnis? Eine überteuerte, ineffiziente Lösung, die die Vergangenheit konserviert, anstatt die Zukunft zu gestalten.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_entwickler_sind_keine_kassierer">Entwickler sind keine Kassierer!</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Im McDrive hinterfragt niemand die Bestellung: „Sind Sie sicher, dass Sie Pommes und Cola wirklich brauchen?&#34; In der Softwareentwicklung muss genau das passieren. Ein Entwickler, der jede Anforderung nur entgegennimmt und umsetzt, ist kein Entwickler – sondern ein Kassierer mit Tastatur.</p>
</div>
<div class="paragraph">
<p>Deshalb muss es eine <strong>Pflicht zum Widerspruch</strong> geben:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Wenn eine Anforderung ineffizient oder unsinnig ist.</strong></p>
</li>
<li>
<p><strong>Wenn sie den bestehenden Prozess unnötig verkompliziert.</strong></p>
</li>
<li>
<p><strong>Wenn sie nur den Ist-Zustand digitalisiert, ohne an die Zukunft zu denken.</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Hier ist <strong>Mut zum „Nein&#34; gefragt</strong> – nicht als Blockade, sondern als Chance, Fehler zu verhindern, bevor sie entstehen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_warum_ist_das_so_schwer">Warum ist das so schwer?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Viele Entwickler haben gelernt, dass Widerspruch nicht erwünscht ist. Typische Killerphrasen:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>„Der Kunde will es aber so.&#34;</strong></p>
</li>
<li>
<p><strong>„Das steht doch in den Anforderungen.&#34;</strong></p>
</li>
<li>
<p><strong>„Wir haben keine Zeit für Diskussionen.&#34;</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Solche Sätze zementieren schlechte Software und verhindern echte Verbesserungen. Sie führen dazu, dass niemand Fehler anspricht – bis es zu spät ist.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_pflicht_zum_hinterfragen">Die Pflicht zum Hinterfragen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wenn jemand im McDrive ein rohes Steak bestellt, wird er es nicht bekommen – weil es nicht auf der Karte steht. In der Softwareentwicklung ist es oft umgekehrt: <strong>Alles, was bestellt wird, wird serviert – egal, wie schlecht es ist.</strong></p>
</div>
<div class="paragraph">
<p>Ein einfaches „Okay, mache ich&#34; reicht nicht. Entwickler müssen <strong>aktiv hinterfragen</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Welches Problem soll damit wirklich gelöst werden?</strong></p>
</li>
<li>
<p><strong>Gibt es eine bessere Lösung?</strong></p>
</li>
<li>
<p><strong>Wie würde das in einem Jahr funktionieren, wenn sich etwas ändert?</strong></p>
</li>
<li>
<p><strong>Brechen wir uns hier gerade selbst das Genick für zukünftige Weiterentwicklungen?</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Wer diese Fragen nicht stellt, programmiert nicht nur Software – sondern auch den nächsten IT-Flop.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_softwareentwicklung_ist_beratung_nicht_bedienung">Softwareentwicklung ist Beratung, nicht Bedienung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein guter Entwickler nimmt nicht einfach Anforderungen entgegen, sondern <strong>arbeitet am besten Ergebnis mit</strong>. Das bedeutet:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Hinterfragen, bis die eigentliche Anforderung klar ist.</strong></p>
</li>
<li>
<p><strong>Mut haben, „Nein&#34; zu sagen, wenn es nötig ist.</strong></p>
</li>
<li>
<p><strong>Verantwortung übernehmen für die langfristige Qualität der Software.</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Softwareentwicklung ist keine McDrive-Bestellung, bei der einfach das geliefert wird, was auf der Karte steht. <strong>Es geht nicht darum, zu servieren – sondern darum, eine Lösung zu gestalten.</strong></p>
</div>
<div class="paragraph">
<p><strong>Deshalb: Hört auf, einfach nur umzusetzen. Denkt mit. Fragt nach. Sagt „Nein&#34;, wenn es nötig ist. Entwickelt nicht nur Software – sondern auch die Zukunft der Prozesse.</strong></p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Der ISO20022-Standard, der kein Standard ist</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-02-05-iso20022_kein_standard/</link>
			<pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-02-05-iso20022_kein_standard/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;ISO20022 sollte die Revolution im globalen Zahlungsverkehr sein: ein einheitlicher Standard, der Banken und Unternehmen weltweit eine effiziente Kommunikation ermöglicht. Doch in der Praxis zeigt sich, dass ISO20022 seinem Anspruch nicht gerecht wird. Statt Einheitlichkeit zu schaffen, offenbart der Standard eine erschreckende Realität: Innerhalb der EU existieren verschiedene „Dialekte&amp;#34;, die den Zahlungsverkehr unnötig komplizieren und Unternehmen wie Banken vor große Herausforderungen stellen. Viele Unternehmen fragen sich, warum es diese Unterschiede überhaupt gibt – schließlich war das Ziel doch genau das Gegenteil.&lt;/p&gt;
&lt;/div&gt;
				
#ISO20022 #zahlungsverkehr #treasury #banken #standards 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>ISO20022 sollte die Revolution im globalen Zahlungsverkehr sein: ein einheitlicher Standard, der Banken und Unternehmen weltweit eine effiziente Kommunikation ermöglicht. Doch in der Praxis zeigt sich, dass ISO20022 seinem Anspruch nicht gerecht wird. Statt Einheitlichkeit zu schaffen, offenbart der Standard eine erschreckende Realität: Innerhalb der EU existieren verschiedene „Dialekte&#34;, die den Zahlungsverkehr unnötig komplizieren und Unternehmen wie Banken vor große Herausforderungen stellen. Viele Unternehmen fragen sich, warum es diese Unterschiede überhaupt gibt – schließlich war das Ziel doch genau das Gegenteil.</p>
</div>
<div class="sect1">
<h2 id="_die_illusion_eines_standards">Die Illusion eines Standards</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Auf dem Papier klingt ISO20022 perfekt. Ein globaler Standard, der durch eine einheitliche XML-Struktur für reibungslose Prozesse sorgt. Doch die Realität sieht anders aus. In der EU haben Länder wie Deutschland, Frankreich oder Italien ihre eigenen Interpretationen von ISO20022 entwickelt. In Deutschland beispielsweise wird das DK-Format verwendet, das spezifische Anforderungen an die Belegung von Feldern stellt. Ähnliche Abweichungen gibt es auch in anderen Ländern, was zu einem Flickenteppich an Standards führt. Der eigentliche Zweck – Interoperabilität und Effizienz – geht damit verloren.</p>
</div>
<div class="paragraph">
<p>Doch warum gibt es diese Unterschiede überhaupt? Die Antwort ist ebenso ernüchternd wie simpel: Nationale Regularien, bestehende Infrastrukturen und Eigeninteressen. Jede nationale Behörde und jede Bankengemeinschaft hat ihre eigenen Anforderungen eingebracht, um die lokalen Gegebenheiten zu berücksichtigen. Was für einzelne Länder sinnvoll erscheint, führt in der Summe jedoch zu einem globalen Problem: einem Standard, der faktisch keiner ist.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_herausforderungen_im_treasury_bereich">Herausforderungen im Treasury-Bereich</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein Bereich, in dem die Probleme besonders deutlich werden, ist das Treasury – der Austausch von Zahlungen zwischen Banken und Unternehmen. Treasury-Abteilungen sind auf eine hohe Straight-Through-Processing-Quote (STP-Quote) angewiesen, also eine möglichst automatische Verarbeitung von Zahlungen ohne manuelles Eingreifen. Doch die unterschiedlichen Dialekte von ISO20022 stellen genau das in Frage.</p>
</div>
<div class="paragraph">
<p>Bankenspezifische Anforderungen oder Ländervarianten führen dazu, dass Unternehmen ihre Systeme immer wieder anpassen müssen. Das betrifft beispielsweise die Belegung von Feldern für Zahlungsreferenzen, Buchungsinformationen oder den Umgang mit Sonderzeichen. Jede Abweichung erhöht das Risiko von Fehlern, senkt die STP-Quote und führt zu Verzögerungen in den Prozessen. Besonders problematisch ist, dass selbst innerhalb der EU keine einheitliche Linie erkennbar ist. Unternehmen, die in mehreren Ländern tätig sind, müssen daher eine Vielzahl von Varianten unterstützen – ein Albtraum für jede Treasury-Abteilung.</p>
</div>
<div class="paragraph">
<p>Die Unternehmen fragen sich zurecht, warum sie für einen globalen Standard zusätzliche Anpassungen vornehmen müssen. Schließlich war der ursprüngliche Gedanke, die Arbeit durch ISO20022 zu vereinfachen. Doch in der Realität kämpfen viele Firmen mit erhöhten IT-Kosten, zeitaufwendigen Implementierungen und einem erheblichen Ressourcenaufwand.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_folgen_für_unternehmen_und_banken">Die Folgen für Unternehmen und Banken</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Für Unternehmen sind die Auswirkungen deutlich spürbar. Die Anpassung an verschiedene ISO20022-Dialekte bedeutet höhere IT-Kosten, längere Implementierungszeiten und eine erhöhte Fehleranfälligkeit. Manuelle Nachbearbeitungen von Zahlungen, die eigentlich automatisiert laufen sollten, werden zur Norm. Diese zusätzliche Belastung ist besonders für kleine und mittlere Unternehmen schwer zu tragen, da sie oft nicht über die notwendigen Ressourcen verfügen.</p>
</div>
<div class="paragraph">
<p>Doch auch Banken bleiben nicht verschont. Jede Bank muss sich auf die länderspezifischen Varianten und die Anforderungen ihrer Geschäftspartner einstellen. Die damit verbundene Komplexität führt nicht nur zu höheren Kosten, sondern auch zu Schwierigkeiten bei der Zusammenarbeit mit internationalen Partnern. Der eigentliche Vorteil von ISO20022 – die globale Einheitlichkeit – wird so konterkariert.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ein_standard_mit_hindernissen">Ein Standard mit Hindernissen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>ISO20022 ist ein Standard, der keiner ist. Die Vielzahl an Dialekten innerhalb der EU zeigt, dass es mehr als nur einen gemeinsamen Rahmen braucht, um den Zahlungsverkehr tatsächlich zu vereinheitlichen. Solange jedes Land und jede Bank eigene Anpassungen vornimmt, bleibt ISO20022 ein theoretisches Konstrukt, das in der Praxis mehr Probleme schafft, als es löst.</p>
</div>
<div class="paragraph">
<p>Die Unternehmen, die mit diesen Herausforderungen konfrontiert sind, stellen sich eine zentrale Frage: Wäre es nicht sinnvoller, wenn alle Beteiligten – Banken, Behörden und Unternehmen – an einem wirklich einheitlichen Standard arbeiten würden, der keine nationalen Eigenheiten erlaubt? Solange es dafür keinen politischen Willen oder eine klare Strategie gibt, bleibt ISO20022 ein System voller Hindernisse und Kompromisse.</p>
</div>
<div class="paragraph">
<p>Der ISO20022-Standard zeigt, dass der Weg zu einem einheitlichen System noch weit ist. Doch die Frage bleibt: Ist ISO20022 wirklich der richtige Weg, oder braucht es einen Neustart? Solange diese Frage nicht beantwortet wird, bleibt der Standard das, was er heute ist – eine Illusion.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Unsichtbare Prozesse, sichtbare Probleme: Warum der Zahlungsverkehr klare Anforderungen braucht</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-01-29-zahlungsverkehr_anforderungen/</link>
			<pubDate>Wed, 29 Jan 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-01-29-zahlungsverkehr_anforderungen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Im Zahlungsverkehr läuft vieles reibungslos – zumindest für den Endnutzer. Überweisungen werden blitzschnell abgewickelt, Lastschriften automatisiert eingezogen, und am Ende steht die erfolgreiche Transaktion. Doch was im Hintergrund passiert, bleibt oft unsichtbar – und genau hier lauert eines der größten Probleme für Projekte in diesem Bereich. Anforderungen an Systeme und Prozesse sind nicht nur komplex, sondern oft auch unklar oder zu abstrakt formuliert. Das Ergebnis? Verzögerungen, kostspielige Nacharbeiten und Systeme, die nicht den gewünschten Nutzen liefern.&lt;/p&gt;
&lt;/div&gt;
				
#zahlungsverkehr #unsichtbare prozesse #stp-quote #prozessautomatisierung #anforderungsmanagement #user-stories 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Im Zahlungsverkehr läuft vieles reibungslos – zumindest für den Endnutzer. Überweisungen werden blitzschnell abgewickelt, Lastschriften automatisiert eingezogen, und am Ende steht die erfolgreiche Transaktion. Doch was im Hintergrund passiert, bleibt oft unsichtbar – und genau hier lauert eines der größten Probleme für Projekte in diesem Bereich. Anforderungen an Systeme und Prozesse sind nicht nur komplex, sondern oft auch unklar oder zu abstrakt formuliert. Das Ergebnis? Verzögerungen, kostspielige Nacharbeiten und Systeme, die nicht den gewünschten Nutzen liefern.</p>
</div>
<div class="paragraph">
<p>Der Druck auf den Zahlungsverkehr, eine hohe Straight-Through-Processing-Quote (STP) zu erreichen, ist enorm. Automatisierung ist das Ziel, manuelle Eingriffe sind die Ausnahme. Das führt dazu, dass es nur wenige Benutzeraktionen gibt, die als Ausgangspunkt für die Ermittlung von Anforderungen dienen können. Stattdessen stehen technische Prozesse im Vordergrund, die reibungslos und effizient im Hintergrund ablaufen sollen. Doch wie definiert man Anforderungen für Prozesse, die kaum sichtbar sind?</p>
</div>
<div class="paragraph">
<p>Ein häufiges Warnsignal sind unklare Ziele. Stakeholder sprechen von „schnellen Transaktionen&#34; oder „effizienten Prozessen&#34;, ohne genau zu definieren, was das bedeutet. Soll eine Transaktion innerhalb von einer Sekunde abgeschlossen sein? Welche Ausnahmen müssen berücksichtigt werden? Und was passiert, wenn eine Transaktion fehlschlägt? Solche Fragen bleiben oft unbeantwortet – entweder, weil sie nicht gestellt werden, oder weil niemand die Antworten kennt. Die Folge sind Anforderungen, die zu vage sind, um eine klare Entwicklungsrichtung vorzugeben.</p>
</div>
<div class="paragraph">
<p>Hinzu kommt die Unsichtbarkeit der Prozesse. Anders als in benutzerzentrierten Anwendungen, wo klare Feedbackschleifen und Interaktionen die Anforderungen greifbar machen, sind die Abläufe im Zahlungsverkehr für die Beteiligten oft schwer vorstellbar. Der Fokus liegt auf dem Endergebnis – einer erfolgreichen Transaktion –, während die einzelnen Prozessschritte übersehen werden. Das führt dazu, dass wichtige Details wie Fehlerbehandlung, Datenvalidierung oder Schnittstellen-Abhängigkeiten nicht ausreichend berücksichtigt werden.</p>
</div>
<div class="paragraph">
<p>Die Lösung beginnt mit der Sichtbarmachung dieser Prozesse. Modellierungstools wie BPMN-Diagramme können helfen, die Abläufe transparent darzustellen und den Beteiligten ein besseres Verständnis der Anforderungen zu vermitteln. Solche Modelle dienen als Diskussionsgrundlage, um frühzeitig Schwachstellen oder Unklarheiten zu identifizieren. Gleichzeitig ist es wichtig, gezielte Fragen zu stellen: „Welche Bedingungen müssen erfüllt sein, damit eine Transaktion erfolgreich abgeschlossen wird?&#34; oder „Wie sollen Fehlerfälle behandelt werden?&#34;</p>
</div>
<div class="paragraph">
<p>Eine weitere Methode, um Anforderungen präziser zu erfassen, sind User Stories. Auch wenn der Zahlungsverkehr wenige direkte Nutzer hat, können User Stories helfen, den Nutzen und die Ziele eines Prozesses klarer zu beschreiben. Statt allgemeiner Aussagen wie „Die Transaktion soll effizient sein&#34;, könnte eine User Story beispielsweise lauten: „Als Zahlungsdienstleister möchte ich Transaktionen innerhalb von zwei Sekunden bestätigen, um dem Kunden schnelle Rückmeldungen zu geben.&#34; Ergänzt durch klare Akzeptanzkriterien wird sichergestellt, dass alle Beteiligten dasselbe Verständnis von den Anforderungen haben.</p>
</div>
<div class="paragraph">
<p>Unsichtbare Prozesse machen den Zahlungsverkehr zu einer der anspruchsvollsten Domänen, wenn es um die Ermittlung klarer Anforderungen geht. Doch mit den richtigen Methoden – von der Visualisierung der Abläufe bis hin zur präzisen Zieldefinition – lassen sich die größten Stolpersteine umgehen. Am Ende sind klare Anforderungen der Schlüssel, um Projekte erfolgreich umzusetzen und sichtbare Probleme zu vermeiden. Denn eines ist sicher: Nur wer das Unsichtbare sichtbar macht, kann nachhaltig erfolgreiche Lösungen schaffen.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Wertschätzung endet, wo Karrierepfade beginnen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-01-22-wertschaetzung_karrieremodelle/</link>
			<pubDate>Wed, 22 Jan 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-01-22-wertschaetzung_karrieremodelle/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Starre Karrierepfade sollen Orientierung geben. Sie sollen Entwicklungsmöglichkeiten aufzeigen und Mitarbeitenden Sicherheit bieten. Doch oft bewirken sie das Gegenteil: Sie engen ein, beschneiden Talente und verhindern echte Wertschätzung. Denn wie kann ein Mensch sich geschätzt fühlen, wenn er nicht in seiner Ganzheitlichkeit gesehen wird, sondern auf eine vorgefertigte Richtung reduziert wird?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_wenn_der_mensch_nicht_mehr_zählt&#34;&gt;Wenn der Mensch nicht mehr zählt&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Karrierepfade folgen meist klar definierten Kriterien. Sie bestimmen, was jemand können oder erreichen muss, um aufzusteigen. Doch was passiert, wenn jemand diese Kriterien nicht erfüllt – nicht, weil es ihm an Fähigkeiten mangelt, sondern weil diese Kriterien seine Stärken gar nicht abbilden?&lt;/p&gt;
&lt;/div&gt;
				
#wertschätzung #karrierepfade #unternehmenskultur #motivation #innovation #personalentwicklung #talente 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Starre Karrierepfade sollen Orientierung geben. Sie sollen Entwicklungsmöglichkeiten aufzeigen und Mitarbeitenden Sicherheit bieten. Doch oft bewirken sie das Gegenteil: Sie engen ein, beschneiden Talente und verhindern echte Wertschätzung. Denn wie kann ein Mensch sich geschätzt fühlen, wenn er nicht in seiner Ganzheitlichkeit gesehen wird, sondern auf eine vorgefertigte Richtung reduziert wird?</p>
</div>
<div class="sect1">
<h2 id="_wenn_der_mensch_nicht_mehr_zählt">Wenn der Mensch nicht mehr zählt</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Karrierepfade folgen meist klar definierten Kriterien. Sie bestimmen, was jemand können oder erreichen muss, um aufzusteigen. Doch was passiert, wenn jemand diese Kriterien nicht erfüllt – nicht, weil es ihm an Fähigkeiten mangelt, sondern weil diese Kriterien seine Stärken gar nicht abbilden?</p>
</div>
<div class="paragraph">
<p>In solchen Fällen wird der Mensch unsichtbar. Seine einzigartigen Fähigkeiten, seine Erfahrungen und seine Persönlichkeit werden ausgeblendet, weil sie in das vorgefertigte System nicht hineinpassen. Was bleibt, ist das Gefühl, dass man austauschbar ist. Und genau hier endet die Wertschätzung.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_eingeschränkte_pfade_eingeschränkte_wertschätzung">Eingeschränkte Pfade = eingeschränkte Wertschätzung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Starre Karrierepfade vermitteln oft, dass der Wert eines Menschen nur in seiner Anpassungsfähigkeit an das System liegt. Mitarbeitende sollen in eine Richtung marschieren – oder sie bleiben auf der Strecke. Dabei wird übersehen, dass Menschen vielseitig sind. Sie haben Talente und Perspektiven, die sich nicht in starren Modellen abbilden lassen.</p>
</div>
<div class="paragraph">
<p>Doch statt diese Vielfalt zu fördern, zwingen Unternehmen ihre Mitarbeitenden in Schubladen. Wer in keine passt, wird übersehen. Das ist nicht nur eine Frage der Karrierechancen – es ist eine Frage der Wertschätzung.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_folgen_starrer_karrierepfade">Die Folgen starrer Karrierepfade</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wenn Unternehmen Menschen nicht in ihrer Ganzheitlichkeit sehen, leidet nicht nur die Motivation, sondern auch die gesamte Unternehmenskultur:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Demotivation durch Unsichtbarkeit:</strong> Mitarbeitende, deren Talente nicht anerkannt werden, fühlen sich übergangen. Warum sollten sie sich engagieren, wenn ihre Stärken keine Rolle spielen?</p>
</li>
<li>
<p><strong>Verlust von Innovation:</strong> Wer Menschen auf wenige Kriterien reduziert, verpasst die Chance, von ihren kreativen Ideen und Perspektiven zu profitieren.</p>
</li>
<li>
<p><strong>Dienst nach Vorschrift:</strong> Mitarbeitende, die sich nicht gesehen fühlen, erfüllen nur noch das Nötigste. Denn warum sollte man mehr leisten, wenn es nicht gewürdigt wird?</p>
</li>
<li>
<p><strong>Hohe Fluktuation:</strong> Talente suchen sich ein Umfeld, in dem sie als Individuen wahrgenommen werden – oder ziehen sich innerlich zurück.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_was_wertschätzung_wirklich_bedeutet">Was Wertschätzung wirklich bedeutet</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Echte Wertschätzung entsteht, wenn Menschen in ihrer Ganzheitlichkeit gesehen werden. Dazu gehört, ihre individuellen Stärken zu erkennen, sie einzusetzen und ihnen die Möglichkeit zu geben, ihre Talente weiterzuentwickeln – auch jenseits starrer Karrierepfade.</p>
</div>
<div class="paragraph">
<p><strong>Wertschätzung heißt:</strong>
- Menschen nicht auf Titel oder Funktionen zu reduzieren.
- Entwicklungspfade flexibel zu gestalten, die auf die Stärken und Interessen der Mitarbeitenden eingehen.
- Raum für Vielfalt und Eigeninitiative zu schaffen.
- Die Leistung und Persönlichkeit der Menschen hinter der Position anzuerkennen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_der_ausweg_flexibilität_statt_enge">Der Ausweg: Flexibilität statt Enge</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Um echte Wertschätzung zu ermöglichen, müssen Unternehmen ihre Karrierepfade überdenken. Statt starre Richtungen vorzugeben, könnten sie ein Netzwerk aus Möglichkeiten schaffen:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Individuelle Entwicklungswege:</strong> Mitarbeitende sollten sich in verschiedene Richtungen entwickeln können – auch quer zu etablierten Modellen.</p>
</li>
<li>
<p><strong>Mehrfachrollen und kombinierte Talente:</strong> Ein Mensch kann Fähigkeiten aus unterschiedlichen Bereichen kombinieren. Unternehmen sollten dies fördern, anstatt Mitarbeitende in eine Schublade zu stecken.</p>
</li>
<li>
<p><strong>Anerkennung jenseits der Pfade:</strong> Nicht jeder Karriereschritt muss auf einer Stufe in einem Modell basieren. Auch ohne „Aufstieg“ können Leistung und Engagement honoriert werden – durch Feedback, Verantwortung und flexible Vergütungsmodelle.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wertschätzung endet, wo Karrierepfade beginnen – wenn diese Pfade so eng sind, dass sie den Menschen dahinter unsichtbar machen. Unternehmen, die ihre Mitarbeitenden wirklich schätzen, sehen den ganzen Menschen: mit all seinen Fähigkeiten, Interessen und Eigenheiten.</p>
</div>
<div class="paragraph">
<p>Denn echte Wertschätzung ist die Grundlage für Motivation, Innovation und langfristigen Erfolg. Und sie beginnt dort, wo starre Strukturen enden – und Flexibilität beginnt.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Kein Grund, kein Büro: Warum Arbeitgeber endlich beweisen müssen, dass Präsenz nötig ist</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-01-15-kein_grund-kein_buero/</link>
			<pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-01-15-kein_grund-kein_buero/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Präsenzarbeit galt lange als Norm, doch in einer modernen Arbeitswelt stellt sich zunehmend die Frage: Muss Arbeit wirklich immer vor Ort im Büro stattfinden? Arbeitnehmer schätzen die Flexibilität, die Home-Office ihnen bietet, während Arbeitgeber häufig betriebliche Herausforderungen betonen. Dieser Artikel beleuchtet, warum es an der Zeit ist, Home-Office als Standard zu etablieren, und zeigt auf, wie Anreize wie CO₂-Kosten Arbeitgeber dazu motivieren könnten, diesen Wandel aktiv mitzugestalten.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_die_perspektive_der_arbeitnehmer&#34;&gt;Die Perspektive der Arbeitnehmer&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Für Arbeitnehmer ist Home-Office vor allem eine Frage der Flexibilität und Lebensqualität. Durch den Wegfall von Pendelzeiten sparen sie Zeit und Kosten. Statt morgens und abends im Verkehr zu stehen, bleibt mehr Raum für Familie, Hobbys oder einfach für Erholung. Besonders für Tätigkeiten, die Ruhe und Konzentration erfordern, ist Home-Office oft eine produktivere Umgebung.&lt;/p&gt;
&lt;/div&gt;
				
#home-office #arbeitsrecht #flexibilität #nachhaltigkeit #coworking-spaces 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Präsenzarbeit galt lange als Norm, doch in einer modernen Arbeitswelt stellt sich zunehmend die Frage: Muss Arbeit wirklich immer vor Ort im Büro stattfinden? Arbeitnehmer schätzen die Flexibilität, die Home-Office ihnen bietet, während Arbeitgeber häufig betriebliche Herausforderungen betonen. Dieser Artikel beleuchtet, warum es an der Zeit ist, Home-Office als Standard zu etablieren, und zeigt auf, wie Anreize wie CO₂-Kosten Arbeitgeber dazu motivieren könnten, diesen Wandel aktiv mitzugestalten.</p>
</div>
<div class="sect1">
<h2 id="_die_perspektive_der_arbeitnehmer">Die Perspektive der Arbeitnehmer</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Für Arbeitnehmer ist Home-Office vor allem eine Frage der Flexibilität und Lebensqualität. Durch den Wegfall von Pendelzeiten sparen sie Zeit und Kosten. Statt morgens und abends im Verkehr zu stehen, bleibt mehr Raum für Familie, Hobbys oder einfach für Erholung. Besonders für Tätigkeiten, die Ruhe und Konzentration erfordern, ist Home-Office oft eine produktivere Umgebung.</p>
</div>
<div class="paragraph">
<p>Doch nicht alle Arbeitnehmer haben die gleichen Voraussetzungen. Wer in einer kleinen Wohnung lebt oder keinen ergonomischen Arbeitsplatz hat, steht vor Herausforderungen. Hier könnten nahegelegene Coworking Spaces eine sinnvolle Alternative bieten: Sie schaffen professionelle Arbeitsbedingungen in der Nähe des Wohnorts und fördern gleichzeitig den sozialen Austausch – auch wenn es nicht mit direkten Kollegen ist.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_perspektive_der_arbeitgeber">Die Perspektive der Arbeitgeber</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Arbeitgeber stehen vor der Herausforderung, Flexibilität zu ermöglichen, ohne betriebliche Effizienz oder Teamzusammenhalt zu gefährden. Während Home-Office oft als Möglichkeit gesehen wird, Kosten zu sparen und die Attraktivität als Arbeitgeber zu steigern, gibt es auch praktische Herausforderungen. Nicht alle Tätigkeiten lassen sich remote durchführen, beispielsweise solche, die spezielle technische Ausstattung oder den direkten Austausch erfordern.</p>
</div>
<div class="paragraph">
<p>Gleichzeitig bietet der Wandel Chancen: Unternehmen können Büroflächen reduzieren und damit Fixkosten senken. Hybride Modelle, die Home-Office mit Büro- und Coworking-Lösungen kombinieren, könnten die Vorteile beider Welten verbinden und sowohl den Bedürfnissen der Arbeitnehmer als auch den Anforderungen der Arbeitgeber gerecht werden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ein_anreiz_durch_co_kosten">Ein Anreiz durch CO₂-Kosten</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Um Arbeitgeber aktiv zu motivieren, Home-Office als Standard zu etablieren, könnte ein finanzieller Anreiz geschaffen werden. Unternehmen könnten verpflichtet werden, eine Pauschale für jeden Büro-Arbeitsplatz zu zahlen, der regelmäßig genutzt wird. Diese Pauschale würde die durch das Pendeln der Mitarbeiter verursachten CO₂-Emissionen kompensieren. Eine solche Regelung hätte mehrere Vorteile:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Nachhaltigkeit fördern:</strong> Arbeitgeber würden ermutigt, den CO₂-Ausstoß ihrer Mitarbeiter zu reduzieren, indem sie Home-Office als bevorzugte Arbeitsform etablieren.</p>
</li>
<li>
<p><strong>Bürokratie minimieren:</strong> Anstatt individuelle Pendelstrecken oder Arbeitswege zu dokumentieren, wäre die Pauschale einfach und einheitlich pro Arbeitsplatz geregelt.</p>
</li>
<li>
<p><strong>Flexible Arbeitsmodelle unterstützen:</strong> Unternehmen könnten durch hybride Lösungen die Anzahl der regelmäßig genutzten Büro-Arbeitsplätze reduzieren und dadurch Kosten sparen.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_coworking_spaces_als_ergänzung">Coworking Spaces als Ergänzung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Neben dem klassischen Büro und dem Home-Office könnten Coworking Spaces eine Brücke zwischen beiden Arbeitsformen schlagen. Diese ermöglichen es Arbeitnehmern, einen professionellen Arbeitsplatz in der Nähe ihres Wohnorts zu nutzen, ohne lange Pendelzeiten in Kauf nehmen zu müssen. Besonders in kleineren Städten könnten leerstehende Gebäude umfunktioniert werden, um neue Arbeitsräume zu schaffen. So entsteht eine Mischung aus Flexibilität und sozialem Austausch.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_warum_ein_moderner_gesetzlicher_rahmen_nötig_ist">Warum ein moderner gesetzlicher Rahmen nötig ist</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein moderner Ansatz sollte Home-Office als Standard definieren und Arbeitgeber in die Beweispflicht nehmen. Präsenzarbeit sollte nur dann angeordnet werden dürfen, wenn triftige betriebliche Gründe vorliegen – etwa für Tätigkeiten, die besondere technische Ausstattung erfordern oder bei denen der persönliche Austausch unverzichtbar ist. Eine solche Regelung würde nicht nur Konflikte vermeiden, sondern auch klare Strukturen schaffen, die beide Seiten unterstützen.</p>
</div>
<div class="paragraph">
<p>Durch Anreize wie die CO₂-Pauschale könnten Arbeitgeber zusätzlich motiviert werden, Home-Office und hybride Modelle aktiv zu fördern. Dies wäre nicht nur ein Schritt in Richtung Nachhaltigkeit, sondern würde auch die Attraktivität des Unternehmens steigern und langfristig Kosten sparen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Arbeitswelt ist bereit für einen Wandel. Ein moderner gesetzlicher Rahmen, der Home-Office als Standard etabliert und Arbeitgeber zur Begründung von Präsenzarbeit verpflichtet, könnte die Arbeitswelt gerechter und nachhaltiger machen. Mit hybriden Modellen, Coworking Spaces und klaren Anreizen wie der CO₂-Pauschale lässt sich eine moderne Arbeitskultur schaffen, die sowohl den Bedürfnissen der Arbeitnehmer als auch den Anforderungen der Unternehmen gerecht wird.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Domain-Driven Transformation: Wie wir den Zahlungsverkehr vom Mainframe befreien</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-01-08-domain_driven_transformation_mainframe/</link>
			<pubDate>Wed, 08 Jan 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-01-08-domain_driven_transformation_mainframe/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Der Zahlungsverkehr ist das Rückgrat moderner Banken – eine kritische Infrastruktur, die täglich Milliarden von Transaktionen verarbeitet. Doch während sich die Anforderungen an Geschwindigkeit, Flexibilität und Innovation stetig weiterentwickeln, arbeiten viele Institute noch immer mit Mainframe-Systemen, die Jahrzehnte alt sind. Diese Systeme sind zwar stabil und leistungsfähig, doch sie bringen gravierende Herausforderungen mit sich: fehlende Agilität, hohe Betriebskosten und ein wachsendes Risiko durch den Verlust von Know-how.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Der Mainframe, einst eine bahnbrechende Technologie, wird zunehmend zu einem Hindernis. Entwickler, die mit COBOL oder Assembler vertraut sind, verlassen den Arbeitsmarkt, und der Nachwuchs zeigt wenig Interesse an diesen Technologien. Banken riskieren, von der technischen Basis abhängig zu bleiben, ohne die nötigen Fachkräfte zu haben, um diese zu pflegen. Die Lösung? Eine Domain-Driven Transformation, die nicht nur die technischen Grundlagen modernisiert, sondern auch die fachlichen Domänen des Zahlungsverkehrs in den Mittelpunkt stellt.&lt;/p&gt;
&lt;/div&gt;
				
#domain-driven-design #zahlungsverkehr #modernisierung #mainframe 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Der Zahlungsverkehr ist das Rückgrat moderner Banken – eine kritische Infrastruktur, die täglich Milliarden von Transaktionen verarbeitet. Doch während sich die Anforderungen an Geschwindigkeit, Flexibilität und Innovation stetig weiterentwickeln, arbeiten viele Institute noch immer mit Mainframe-Systemen, die Jahrzehnte alt sind. Diese Systeme sind zwar stabil und leistungsfähig, doch sie bringen gravierende Herausforderungen mit sich: fehlende Agilität, hohe Betriebskosten und ein wachsendes Risiko durch den Verlust von Know-how.</p>
</div>
<div class="paragraph">
<p>Der Mainframe, einst eine bahnbrechende Technologie, wird zunehmend zu einem Hindernis. Entwickler, die mit COBOL oder Assembler vertraut sind, verlassen den Arbeitsmarkt, und der Nachwuchs zeigt wenig Interesse an diesen Technologien. Banken riskieren, von der technischen Basis abhängig zu bleiben, ohne die nötigen Fachkräfte zu haben, um diese zu pflegen. Die Lösung? Eine Domain-Driven Transformation, die nicht nur die technischen Grundlagen modernisiert, sondern auch die fachlichen Domänen des Zahlungsverkehrs in den Mittelpunkt stellt.</p>
</div>
<div class="sect1">
<h2 id="_der_mainframe_ein_relikt_mit_risiken">Der Mainframe: Ein Relikt mit Risiken</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Mainframes haben über Jahrzehnte hinweg zuverlässig die Zahlungsströme von Banken abgewickelt. Ihre Stabilität und Skalierbarkeit machten sie zur idealen Lösung für die Anforderungen ihrer Zeit. Doch die Welt hat sich verändert. Heute erwarten Kunden und Unternehmen Echtzeit-Zahlungen, umfassende Analysen und eine schnelle Anpassung an neue regulatorische Anforderungen. Mainframes hingegen sind oft schwerfällig und erfordern große Anpassungsprojekte, um neue Funktionen zu integrieren.</p>
</div>
<div class="paragraph">
<p>Hinzu kommt der schwindende Pool an Experten. Viele der ursprünglichen Entwickler und Administratoren gehen in den Ruhestand, und junge IT-Fachkräfte setzen lieber auf moderne Technologien wie Cloud-Architekturen oder Programmiersprachen wie Python und Java. Das Wissen über Mainframe-Systeme wird so zu einem knappen Gut – ein Risiko, das Banken nicht ignorieren können.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_domain_driven_transformation_der_strategische_ansatz">Domain-Driven Transformation: Der strategische Ansatz</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Domain-Driven Transformation bietet einen Weg, um Banken aus der Abhängigkeit von Mainframes zu befreien. Dabei geht es darum, die Architektur der Zahlungsverkehrssysteme entlang der fachlichen Domänen neu zu denken und zu organisieren. Fachliche Domänen wie SEPA-Überweisungen, Lastschriften oder Auslandszahlungen werden voneinander getrennt und klar abgegrenzt.</p>
</div>
<div class="paragraph">
<p>Diese Entkopplung schafft nicht nur Transparenz, sondern erlaubt es auch, jede Domäne unabhängig weiterzuentwickeln. Wichtig ist dabei, dass die Systeme so gestaltet werden, dass eine technische Trennung jederzeit möglich ist. Auch wenn die Domänen zunächst auf einer gemeinsamen Plattform betrieben werden, sorgt eine lose Kopplung dafür, dass sie in Zukunft eigenständig betrieben oder skaliert werden können.</p>
</div>
<div class="paragraph">
<p>Das Ziel ist keine monolithische Lösung, die alle Domänen umfasst, sondern eine Architektur, die flexibel, modular und zukunftssicher ist. So bleibt die technologische Basis anpassungsfähig, auch wenn sich die Anforderungen in der Zukunft weiterentwickeln.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wie_die_transformation_gelingt">Wie die Transformation gelingt</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Modernisierung der Zahlungsverkehrssysteme erfolgt schrittweise, um Risiken zu minimieren und bestehende Prozesse nicht zu stören:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Analyse der Domänen:</strong> Im ersten Schritt werden die verschiedenen Domänen identifiziert und ihre fachlichen sowie technischen Abhängigkeiten analysiert. Ziel ist es, klare Grenzen zu ziehen und unnötige Verflechtungen zu lösen.</p>
</li>
<li>
<p><strong>Modularisierung:</strong> Auf Basis der Analyse werden die technischen Komponenten so gestaltet, dass sie eigenständig und unabhängig von anderen Domänen betrieben werden können. Klare Schnittstellen und lose Kopplung sind dabei essenziell.</p>
</li>
<li>
<p><strong>Iterative Migration:</strong> Anstatt den Mainframe komplett abzulösen, werden zunächst einzelne Funktionen schrittweise in die neue Architektur überführt. Der Mainframe bleibt während der Transformation bestehen, verliert jedoch nach und nach an Bedeutung.</p>
</li>
<li>
<p><strong>Integration moderner Technologien:</strong> Technologien wie Event-Streaming, API-First-Ansätze und Cloud-Plattformen bieten die Grundlage für eine flexible und skalierbare Architektur.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_vorteile_einer_domain_driven_transformation">Vorteile einer Domain-Driven Transformation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Der Wechsel von Mainframe-Systemen zu einer domänenzentrierten Architektur bietet zahlreiche Vorteile:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Flexibilität:</strong> Die klare Trennung der Domänen ermöglicht eine schnellere Anpassung an neue Anforderungen. Banken können spezifische Domänen unabhängig weiterentwickeln und skalieren.</p>
</li>
<li>
<p><strong>Zukunftssicherheit:</strong> Moderne Technologien und lose gekoppelte Architekturen schaffen die Grundlage für Innovationen und neue Geschäftsmodelle.</p>
</li>
<li>
<p><strong>Erhalt von Wissen:</strong> Durch die schrittweise Transformation können bestehende Mitarbeiter aktiv eingebunden werden, was den Wissenstransfer erleichtert und den Verlust von Expertise minimiert.</p>
</li>
<li>
<p><strong>Effizienz:</strong> Technische und organisatorische Entkopplung reduzieren die Komplexität und erleichtern den Betrieb.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_herausforderungen_auf_dem_weg">Herausforderungen auf dem Weg</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Der Weg zur Befreiung vom Mainframe ist anspruchsvoll. Neben der technischen Komplexität erfordert die Transformation auch einen kulturellen Wandel. Teams müssen lernen, domänenzentriert zu denken und Entscheidungen an den Bedürfnissen der Fachbereiche auszurichten.</p>
</div>
<div class="paragraph">
<p>Zudem bleibt der Mainframe während der Übergangsphase oft ein integraler Bestandteil der Architektur. Das bedeutet, dass alte und neue Systeme parallel betrieben werden müssen, was die Komplexität vorübergehend erhöht. Mit einem iterativen Ansatz und einer klaren Vision lassen sich diese Herausforderungen jedoch meistern.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_ein_schritt_in_die_zukunft">Fazit: Ein Schritt in die Zukunft</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Ablösung des Mainframes im Zahlungsverkehr ist kein einfacher Weg, aber ein notwendiger. Banken, die sich nicht mit den Herausforderungen der Modernisierung auseinandersetzen, riskieren, technologisch ins Hintertreffen zu geraten und auf lange Sicht ihre Wettbewerbsfähigkeit zu verlieren.</p>
</div>
<div class="paragraph">
<p>Mit Domain-Driven Transformation schaffen sie eine zukunftssichere Architektur, die nicht nur technische, sondern auch fachliche Anforderungen erfüllt. Es ist an der Zeit, die Fesseln des Mainframes zu sprengen und den Zahlungsverkehr in eine agile, flexible und skalierbare Zukunft zu führen – nicht, weil es einfach ist, sondern weil es notwendig ist.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Netzwerk statt Pyramide: Wie Rollen Unternehmen skalierbar machen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2025-01-01_unternehmen_als_netzwerk/</link>
			<pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2025-01-01_unternehmen_als_netzwerk/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Unternehmen wachsen. Neue Teams entstehen, neue Märkte werden erschlossen, und neue Technologien halten Einzug. Doch mit diesem Wachstum steigt oft die Komplexität: Hierarchien werden ausgebaut, Titel vergeben, und Karriereleitern aufgebaut, die nicht immer mit den agilen Prinzipien vereinbar sind, die viele Organisationen anstreben. Aber was wäre, wenn wir Unternehmen nicht wie Pyramiden betrachten, sondern wie Netzwerke? Netzwerke, in denen Verbindungen, Rollen und Flexibilität den Takt vorgeben – und nicht Titel und starre Strukturen.&lt;/p&gt;
&lt;/div&gt;
				
#karrieremodelle #agiles_arbeiten #unternehmen #skalierbarkeit #unternehmsnwachstum #flexibilität #teamarbeit 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Unternehmen wachsen. Neue Teams entstehen, neue Märkte werden erschlossen, und neue Technologien halten Einzug. Doch mit diesem Wachstum steigt oft die Komplexität: Hierarchien werden ausgebaut, Titel vergeben, und Karriereleitern aufgebaut, die nicht immer mit den agilen Prinzipien vereinbar sind, die viele Organisationen anstreben. Aber was wäre, wenn wir Unternehmen nicht wie Pyramiden betrachten, sondern wie Netzwerke? Netzwerke, in denen Verbindungen, Rollen und Flexibilität den Takt vorgeben – und nicht Titel und starre Strukturen.</p>
</div>
<div class="sect1">
<h2 id="_das_problem_mit_titeln_und_hierarchien">Das Problem mit Titeln und Hierarchien</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In klassischen Unternehmen sind Titel der Inbegriff von Status und Erfolg. Sie definieren die Position in der Hierarchie, das Gehalt und oft auch die Macht, Entscheidungen zu treffen. Doch dieses Modell hat Schwächen. Titel schaffen starre Strukturen und verhindern oft, dass Mitarbeiter flexibel auf neue Herausforderungen reagieren können. Außerdem fördern sie eine Karriereleiter-Mentalität: Der nächste Titel wird angestrebt, selbst wenn er nicht den Stärken oder Interessen der Person entspricht – etwa wenn ein hervorragender Entwickler Teamleiter wird, obwohl seine Talente in einer technischen Rolle besser genutzt wären.</p>
</div>
<div class="paragraph">
<p>In agilen Unternehmen hingegen stehen Teams, Zusammenarbeit und der Kunde im Fokus. Hierarchien und Titel können schnell zum Hindernis werden, wenn sie den agilen Fluss blockieren. Die Lösung? Rollen, die flexibel sind und sich an den Bedürfnissen des Unternehmens und der Mitarbeiter orientieren.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_unternehmen_als_netzwerk_denken">Unternehmen als Netzwerk denken</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein Netzwerk wächst durch Verbindungen, nicht durch Ebenen. Übertragen auf Unternehmen bedeutet das: Statt Hierarchien auszubauen, entstehen neue Rollen, die Teams und Domänen miteinander verbinden. Rollen wie „Innovation Scout“, „Technischer Coach“ oder „Markt-Connector“ schaffen Verbindungen, die den Wissensfluss fördern und das Unternehmen agiler machen.</p>
</div>
<div class="paragraph">
<p>Im Gegensatz zu Titeln sind Rollen flexibel: Sie können sich mit den Anforderungen ändern, ohne dass Mitarbeiter in starren Strukturen gefangen sind. Ein Mitarbeiter, der heute als „Produkt-Scout“ tätig ist, könnte morgen eine Rolle als „Technologischer Berater“ übernehmen – je nachdem, wo seine Stärken gebraucht werden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_gehalt_und_rollenflexibilität">Gehalt und Rollenflexibilität</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein oft diskutierter Punkt ist, wie sich Gehälter in einem rollenbasierten System regeln lassen. Schließlich sind Gehälter in klassischen Organisationen oft eng mit Titeln verknüpft. Doch in einem Netzwerkmodell könnte das Gehalt an den Beitrag einer Rolle im Gesamtsystem gekoppelt werden.</p>
</div>
<div class="paragraph">
<p>Wichtig dabei:
1. <strong>Gehaltssicherheit:</strong> Mitarbeiter sollten niemals Gehaltseinbußen hinnehmen müssen, wenn sich ihre Rolle verändert. Rollen können sich anpassen, ohne dass die finanzielle Sicherheit der Person gefährdet wird.
2. <strong>Rollenwert:</strong> Gehälter könnten sich an der Wirkung der Rolle orientieren. Rollen, die mehrere Teams unterstützen oder eine hohe strategische Bedeutung haben, könnten entsprechend höher vergütet werden.
3. <strong>Flexibilität:</strong> Rollen dürfen sich ändern, ohne dass dies zu Unsicherheiten führt. Neue Verantwortlichkeiten können nahtlos an bestehende Gehälter anknüpfen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_skalierbarkeit_durch_rollen">Skalierbarkeit durch Rollen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Je größer ein Unternehmen wird, desto schwieriger ist es, flexibel zu bleiben. Hierarchische Organisationen reagieren oft mit dem Aufbau neuer Managementebenen – was die Entscheidungsfindung verlangsamt. Ein rollenbasiertes Netzwerk hingegen wächst organisch. Neue Rollen entstehen, um spezifische Herausforderungen zu adressieren, ohne dass zusätzliche Hierarchien notwendig sind.</p>
</div>
<div class="paragraph">
<p>Beispiel: Ein Unternehmen, das in einen neuen Markt expandiert, könnte eine Rolle wie „Markt-Connector“ schaffen, um Teams vor Ort mit zentralen Einheiten zu vernetzen. Solche Rollen fördern nicht nur die Agilität, sondern auch die persönliche Weiterentwicklung der Mitarbeiter, die ihre Kompetenzen in neuen Kontexten einsetzen können.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_herausforderungen_und_lösungen">Herausforderungen und Lösungen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Natürlich bringt ein rollenbasiertes Netzwerkmodell auch Herausforderungen mit sich. Rollen müssen klar definiert sein, damit sie nicht zu Unsicherheit führen. Transparenz ist entscheidend: Mitarbeiter müssen wissen, welche Erwartungen an ihre Rolle geknüpft sind und wie sich diese Rolle im Laufe der Zeit entwickeln kann.</p>
</div>
<div class="paragraph">
<p>Regelmäßiges Feedback und offene Kommunikation sind ebenfalls unverzichtbar. Sie helfen dabei, Rollen dynamisch anzupassen und sicherzustellen, dass sowohl die Bedürfnisse des Unternehmens als auch die der Mitarbeiter berücksichtigt werden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein Unternehmen als Netzwerk zu denken, bedeutet, Wachstum und Flexibilität zu vereinen. Rollen ersetzen dabei Titel und schaffen die Grundlage für dynamisches Wachstum – ohne starre Karriereleitern, aber mit klaren Perspektiven. Das Ergebnis ist ein System, das nicht nur agiler ist, sondern auch die persönliche Entwicklung der Mitarbeiter stärker in den Mittelpunkt stellt.</p>
</div>
<div class="paragraph">
<p>Netzwerke leben von Verbindungen, nicht von Ebenen. Und genau diese Verbindungen sind es, die Unternehmen zukunftssicher machen können.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Grenzenloses Home-Office: Wie wir uns selbst ausbeuten – und es Freiheit nennen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-12-25-home_office_selbstausbeutung/</link>
			<pubDate>Wed, 25 Dec 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-12-25-home_office_selbstausbeutung/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Das Home-Office gilt als die ultimative Freiheit der modernen Arbeitswelt. Kein Pendeln, keine starren Arbeitszeiten, keine lästigen Büroregeln. Stattdessen: Flexibilität, Komfort und maximale Selbstbestimmung. Doch diese vermeintliche Freiheit hat auch eine dunkle Seite, über die selten gesprochen wird. Denn oft wird das Home-Office zum perfekten Ort der Selbstausbeutung – und wir merken es nicht einmal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Auf den ersten Blick scheint alles ideal. Du entscheidest, wann und wo Du arbeitest, niemand schaut Dir über die Schulter. Doch genau hier lauert die Gefahr. Ohne klare Strukturen verschwimmen Arbeit und Freizeit. Der Laptop bleibt geöffnet, die To-Do-Liste scheint endlos. Schnell entsteht der Eindruck, dass der Tag nie endet und die Arbeit immer präsent ist. Aus der vermeintlichen Freiheit wird eine schleichende Belastung.&lt;/p&gt;
&lt;/div&gt;
				
#home-office #remote-work #selbstdisziplin 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Das Home-Office gilt als die ultimative Freiheit der modernen Arbeitswelt. Kein Pendeln, keine starren Arbeitszeiten, keine lästigen Büroregeln. Stattdessen: Flexibilität, Komfort und maximale Selbstbestimmung. Doch diese vermeintliche Freiheit hat auch eine dunkle Seite, über die selten gesprochen wird. Denn oft wird das Home-Office zum perfekten Ort der Selbstausbeutung – und wir merken es nicht einmal.</p>
</div>
<div class="paragraph">
<p>Auf den ersten Blick scheint alles ideal. Du entscheidest, wann und wo Du arbeitest, niemand schaut Dir über die Schulter. Doch genau hier lauert die Gefahr. Ohne klare Strukturen verschwimmen Arbeit und Freizeit. Der Laptop bleibt geöffnet, die To-Do-Liste scheint endlos. Schnell entsteht der Eindruck, dass der Tag nie endet und die Arbeit immer präsent ist. Aus der vermeintlichen Freiheit wird eine schleichende Belastung.</p>
</div>
<div class="paragraph">
<p>Hinzu kommt, dass das grenzenlose Home-Office eine Fähigkeit verlangt, die viele erst mühsam lernen müssen: sich selbst klare Grenzen zu setzen. Doch wie oft passiert das Gegenteil? Statt bewusst Pausen einzulegen, wird schnell noch eine E-Mail beantwortet, noch ein Anruf erledigt, noch eine Aufgabe abgeschlossen. So werden wir zu unseren eigenen Sklaventreibern und nennen es Effizienz.</p>
</div>
<div class="paragraph">
<p>Die ständige Erreichbarkeit und das Fehlen eines klaren Abschlusses des Arbeitstags belasten nicht nur den Körper, sondern auch den Geist. Die eigene Wohnung, eigentlich ein Rückzugsort, wird zum permanenten Arbeitsplatz. Selbst Erholung fühlt sich oft nicht mehr wie Erholung an, weil die Gedanken unbewusst immer wieder zur Arbeit abschweifen.</p>
</div>
<div class="paragraph">
<p>Es gibt Wege, aus diesem Kreislauf auszubrechen. Klare Rituale helfen, den Arbeitstag zu strukturieren. Feste Arbeitszeiten und bewusste Offline-Zeiten sorgen dafür, dass Arbeit und Freizeit wieder getrennt wahrgenommen werden können. Auch ein dedizierter Arbeitsplatz, der vom Rest der Wohnung abgegrenzt ist, hilft dabei, diese Trennung aufrechtzuerhalten. Genauso wichtig ist es, soziale Kontakte bewusst zu pflegen, um der Isolation entgegenzuwirken.</p>
</div>
<div class="paragraph">
<p>Letztendlich ist das Home-Office eine großartige Möglichkeit, Arbeit flexibler zu gestalten – aber nur, wenn wir uns vor Augen führen, dass echte Freiheit auch Regeln braucht. Ohne diese Regeln wird das grenzenlose Arbeiten schnell zur Falle, aus der wir nur schwer entkommen können. Es liegt an uns, den Traum vom Home-Office zur Realität zu machen, ohne uns selbst dabei zu verlieren.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Builds, Bugs und Burnout: Warum der Testumgebungs-Wahnsinn gestoppt werden muss!</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-12-18-testumgebungen-wahnsinn/</link>
			<pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-12-18-testumgebungen-wahnsinn/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In der heutigen Softwareentwicklung scheint ein Übermaß an Testumgebungen zur Norm zu werden. Jede neue Anforderung, jede Iteration und jedes Feature rechtfertigen den Aufbau zusätzlicher Umgebungen, um Business-Anforderungen zu validieren. Doch während Business Analysten und Stakeholder ihre Vorschauen genießen, kämpfen Entwicklerteams an einer anderen Front: Instabile Nightly Builds, fehlerhafte Deployments und – das größte Problem von allen – Test-Stammdaten, die ständig aktuell gehalten werden müssen. Schlimmer noch, es wird nahezu erwartet, dass jede Umgebung exakt gleich funktioniert, als hätte jede Testumgebung Produktionsreife. Dieser Wahnsinn muss gestoppt werden – bevor er die Agilität und die Menschen dahinter zerstört.&lt;/p&gt;
&lt;/div&gt;
				
#testumgebungen #stammdaten #nightly-builds #entwickleralltag #agilität #burnout #effizienz #softwareentwicklung #teams #umgebungschaos 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In der heutigen Softwareentwicklung scheint ein Übermaß an Testumgebungen zur Norm zu werden. Jede neue Anforderung, jede Iteration und jedes Feature rechtfertigen den Aufbau zusätzlicher Umgebungen, um Business-Anforderungen zu validieren. Doch während Business Analysten und Stakeholder ihre Vorschauen genießen, kämpfen Entwicklerteams an einer anderen Front: Instabile Nightly Builds, fehlerhafte Deployments und – das größte Problem von allen – Test-Stammdaten, die ständig aktuell gehalten werden müssen. Schlimmer noch, es wird nahezu erwartet, dass jede Umgebung exakt gleich funktioniert, als hätte jede Testumgebung Produktionsreife. Dieser Wahnsinn muss gestoppt werden – bevor er die Agilität und die Menschen dahinter zerstört.</p>
</div>
<div class="sect1">
<h2 id="_das_problem_test_stammdaten_als_zeitfresser">Das Problem: Test-Stammdaten als Zeitfresser</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Test-Stammdaten sind das Herzstück jeder Umgebung – und gleichzeitig ihre größte Schwachstelle. Damit Tests aussagekräftig sind, müssen die Daten in jeder Umgebung aktuell, vollständig und konsistent sein. Doch in der Praxis ist das oft ein Albtraum. Daten müssen manuell synchronisiert, auf Abhängigkeiten geprüft und ständig angepasst werden, um mit den neuesten Entwicklungen Schritt zu halten.</p>
</div>
<div class="paragraph">
<p>Fehlt auch nur ein Datensatz oder ist eine Konfiguration veraltet, können Tests fehlschlagen – unabhängig davon, ob das Feature eigentlich korrekt funktioniert. Die Folge: Entwickler verbringen unzählige Stunden damit, Umgebungen zu debuggen, statt sich auf die eigentliche Entwicklung zu konzentrieren.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_erwartung_jede_umgebung_muss_perfekt_sein">Die Erwartung: Jede Umgebung muss perfekt sein</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein weiteres Problem: Die Erwartungshaltung. In vielen Projekten wird fast selbstverständlich angenommen, dass jede Testumgebung identisch zur Produktion funktioniert – oder sogar besser. Doch in der Realität sind Testumgebungen niemals so stabil und konsistent wie das Produktionssystem.</p>
</div>
<div class="paragraph">
<p>Dieses Streben nach Perfektion erzeugt nicht nur einen immensen zusätzlichen Aufwand, sondern auch Frustration: Tests scheitern nicht, weil der Code schlecht ist, sondern weil die Umgebung nicht mithalten kann. Und wenn die Ergebnisse aus Testumgebungen nicht verlässlich sind, leidet auch das Vertrauen in den gesamten Entwicklungsprozess.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_kosten_fokusverlust_frust_und_ineffiziente_sprints">Die Kosten: Fokusverlust, Frust und ineffiziente Sprints</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Folgen dieser Probleme sind gravierend:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Zeitverschwendung</strong>: Teams investieren mehr Zeit in die Pflege von Stammdaten und Umgebungen als in die Entwicklung neuer Features.</p>
</li>
<li>
<p><strong>Demotivation</strong>: Entwickler fühlen sich gezwungen, Probleme zu lösen, die nichts mit ihrem eigentlichen Job zu tun haben.</p>
</li>
<li>
<p><strong>Ineffizienz</strong>: Sprints verlieren ihren Fokus, weil Fehler behoben werden müssen, die durch bessere Datenpflege vermeidbar wären.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Letztendlich wird die Agilität – das Herzstück moderner Softwareentwicklung – durch den Verwaltungsaufwand rund um Testumgebungen erstickt.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_warum_es_so_weit_kommt">Warum es so weit kommt</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wie konnte es so weit kommen? Die Gründe sind vielfältig:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Komplexität der Systeme</strong>: Moderne Anwendungen bestehen aus einer Vielzahl von Microservices, Datenbanken und Schnittstellen. Jede Änderung zieht einen Dominoeffekt nach sich.</p>
</li>
<li>
<p><strong>Fehlende Automatisierung</strong>: Viele Prozesse rund um Stammdaten und Testumgebungen sind noch immer manuell.</p>
</li>
<li>
<p><strong>Unrealistische Anforderungen</strong>: Die Erwartung, dass jede Umgebung produktionsreif sein muss, ignoriert die Realität der Softwareentwicklung.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_lösung_weniger_perfektion_mehr_pragmatismus">Die Lösung: Weniger Perfektion, mehr Pragmatismus</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Um den Testumgebungs-Wahnsinn zu stoppen, braucht es pragmatische Lösungen:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Automatisierte Datenpflege</strong>: Tools zur Synchronisation von Stammdaten können den Aufwand erheblich reduzieren.</p>
</li>
<li>
<p><strong>Gezielte Teststrategien</strong>: Statt jede Umgebung perfekt zu halten, sollten Tests auf wenige, kritische Szenarien konzentriert werden.</p>
</li>
<li>
<p><strong>Realistische Erwartungen</strong>: Teams und Stakeholder müssen akzeptieren, dass Testumgebungen niemals 1:1 mit der Produktion vergleichbar sein können.</p>
</li>
<li>
<p><strong>Kontinuierliche Verbesserungen</strong>: Statt Perfektion zu erzwingen, sollten Teams iterativ daran arbeiten, Testumgebungen stabiler und effizienter zu machen.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Der Testumgebungs-Wahnsinn gefährdet nicht nur die Effizienz von Entwicklerteams, sondern auch die Qualität der Software. Test-Stammdaten müssen ständig gepflegt werden, Umgebungen werden überladen, und die Erwartungen an Perfektion sind schlichtweg unrealistisch.</p>
</div>
<div class="paragraph">
<p>Es ist Zeit, sich auf das Wesentliche zu konzentrieren: Funktionierenden Code, effiziente Tests und eine klare Trennung zwischen Entwicklung und Verwaltung. Mit einem pragmatischen Ansatz können wir den Burnout von Teams vermeiden und Agilität wiederbeleben – ohne uns in einem Labyrinth aus Umgebungen zu verlieren.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Von Entwicklern für Entwickler: Die Business Analyse gehört uns!</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-12-11-von_entwicklern_fuer_entwickler/</link>
			<pubDate>Wed, 11 Dec 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-12-11-von_entwicklern_fuer_entwickler/</guid>
			<description>
&lt;div id=&#34;preamble&#34;&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die Anforderungen an Softwareentwickler steigen rasant. Sie sollen nicht nur hochwertigen Code schreiben, sondern auch die Geschäftsprozesse dahinter verstehen, moderne Technologien wie Cloud-native Architekturen und Infrastructure as Code beherrschen und gleichzeitig innovative Lösungen entwickeln. Diese Doppelrolle birgt große Chancen, aber auch Risiken der Überforderung. Doch wie können Entwickler dieser Herausforderung gerecht werden? Der Schlüssel könnte darin liegen, moderne Technologien und Künstliche Intelligenz gezielt einzusetzen, um sich auf die Aufgaben zu konzentrieren, die wirklich zählen.&lt;/p&gt;
&lt;/div&gt;
				
#businessanalyse #entwickler #ki #softwareentwicklung #infrastructure-as-code 
				
			</description>
			<content type="html"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Die Anforderungen an Softwareentwickler steigen rasant. Sie sollen nicht nur hochwertigen Code schreiben, sondern auch die Geschäftsprozesse dahinter verstehen, moderne Technologien wie Cloud-native Architekturen und Infrastructure as Code beherrschen und gleichzeitig innovative Lösungen entwickeln. Diese Doppelrolle birgt große Chancen, aber auch Risiken der Überforderung. Doch wie können Entwickler dieser Herausforderung gerecht werden? Der Schlüssel könnte darin liegen, moderne Technologien und Künstliche Intelligenz gezielt einzusetzen, um sich auf die Aufgaben zu konzentrieren, die wirklich zählen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_doppelrolle_des_modernen_entwicklers">Die Doppelrolle des modernen Entwicklers</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Zeit, in der Entwickler sich ausschließlich um den Code gekümmert haben, ist längst vorbei. Heute sind sie oft die Brücke zwischen Fachabteilung und Technologie. Sie analysieren Anforderungen, hinterfragen Geschäftsprozesse und sorgen dafür, dass die technischen Lösungen optimal auf die Bedürfnisse der Nutzer abgestimmt sind. Gleichzeitig müssen sie immer auf dem neuesten Stand der Technik bleiben, um Architekturen zu entwerfen, die langfristig tragfähig sind, und um mit Paradigmen wie Infrastructure as Code oder Microservices Schritt zu halten.</p>
</div>
<div class="paragraph">
<p>Doch diese Aufgabenfülle bringt auch Herausforderungen mit sich. Ein Entwickler, der sich in Details der Business Analyse verliert, riskiert, den Anschluss an technologische Entwicklungen zu verpassen. Umgekehrt läuft ein Entwickler, der sich nur auf Technologie fokussiert, Gefahr, Lösungen zu entwickeln, die an den Bedürfnissen der Fachbereiche vorbeigehen. Diese Balance zu finden, ist eine Kernaufgabe des modernen Entwicklers.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_künstliche_intelligenz_als_unterstützer_nicht_als_ersatz">Künstliche Intelligenz als Unterstützer, nicht als Ersatz</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Hier kommt Künstliche Intelligenz ins Spiel. KI kann nicht die Verantwortung eines Entwicklers übernehmen, aber sie kann als Werkzeug dienen, um Routineaufgaben zu automatisieren und Zeit für komplexere Themen zu schaffen. Im Bereich der Business Analyse kann KI beispielsweise große Datenmengen analysieren, Muster erkennen und Vorhersagen treffen. Entwickler könnten so schneller verstehen, welche Prozesse optimiert werden müssen, oder erste Anforderungen ableiten, ohne selbst alle Details analysieren zu müssen.</p>
</div>
<div class="paragraph">
<p>Auch bei der technologischen Seite bietet KI wertvolle Unterstützung. So können moderne Tools Empfehlungen für Architekturentscheidungen geben oder Infrastruktur automatisiert bereitstellen, während der Entwickler den Überblick behält. Der Schlüssel liegt darin, KI als Ergänzung zu betrachten, die repetitive oder zeitaufwendige Aufgaben übernimmt, während der Entwickler sich auf strategische Entscheidungen und kreative Lösungen konzentriert.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wie_entwickler_die_balance_halten_können">Wie Entwickler die Balance halten können</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Trotz der Unterstützung durch KI bleibt die Rolle des Entwicklers anspruchsvoll. Der Schlüssel zur erfolgreichen Bewältigung liegt in der Fähigkeit, Prioritäten zu setzen. Entwickler müssen entscheiden, welche Aufgaben sie selbst übernehmen und welche sie delegieren oder automatisieren können. Hierbei spielen nicht nur Teamarbeit, sondern auch die individuelle Weiterbildung eine zentrale Rolle.</p>
</div>
<div class="paragraph">
<p>Moderne Lernplattformen, die auf KI basieren, können Entwicklern helfen, Wissen effizient aufzubauen. Sie bieten maßgeschneiderte Inhalte, die auf den individuellen Kenntnisstand und die aktuellen Projekte abgestimmt sind. So können Entwickler sowohl ihre fachliche als auch ihre technische Kompetenz ausbauen, ohne sich in allgemeinen Schulungen zu verlieren.</p>
</div>
<div class="paragraph">
<p>Ein weiterer wichtiger Aspekt ist die Zusammenarbeit im Team. Nicht jeder Entwickler muss alle Aufgaben gleich gut beherrschen. Vielmehr sollten Teams so aufgebaut sein, dass die verschiedenen Kompetenzen sich ergänzen. In einer idealen Zusammenarbeit übernehmen einige Teammitglieder die fachliche Analyse, während andere sich stärker auf Technologie und Architektur fokussieren.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Rolle des Entwicklers hat sich verändert. Heute müssen sie nicht nur technische Experten, sondern auch Fachleute für Business Analyse sein. Gleichzeitig dürfen sie den Anschluss an neue Technologien nicht verlieren. Diese Anforderungen sind hoch, aber nicht unüberwindbar. Mit der richtigen Priorisierung, einer guten Zusammenarbeit im Team und dem gezielten Einsatz von KI können Entwickler ihre Rolle als Allrounder erfolgreich ausfüllen. Dabei geht es nicht darum, alles allein zu schaffen, sondern sich auf die Aufgaben zu konzentrieren, die den größten Mehrwert schaffen. Denn am Ende zählt nur eines: Software, die sowohl fachlich als auch technisch überzeugt.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Coden stirbt, Denken bleibt: Wie KI die Softwareentwicklung transformiert</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-12-04-coden_stirbt_denken_bleibt/</link>
			<pubDate>Wed, 04 Dec 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-12-04-coden_stirbt_denken_bleibt/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die Softwareentwicklung erlebt derzeit eine Revolution. Künstliche Intelligenz (KI) übernimmt Aufgaben, die einst in der Hand von Entwicklern lagen, und verändert damit nicht nur die Prozesse, sondern auch die Rolle, die Entwickler in der Zukunft einnehmen. Die entscheidende Frage ist nicht, ob Entwickler durch KI ersetzt werden, sondern wie sich ihre Arbeit und ihre Kompetenzen grundlegend wandeln. Während das Schreiben von Code an Bedeutung verliert, wird das Verständnis hinter dem Code immer wichtiger.&lt;/p&gt;
&lt;/div&gt;
				
#ki #softwareentwicklung #zukunft #bildung #technologien #transformation #ausbildung 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Die Softwareentwicklung erlebt derzeit eine Revolution. Künstliche Intelligenz (KI) übernimmt Aufgaben, die einst in der Hand von Entwicklern lagen, und verändert damit nicht nur die Prozesse, sondern auch die Rolle, die Entwickler in der Zukunft einnehmen. Die entscheidende Frage ist nicht, ob Entwickler durch KI ersetzt werden, sondern wie sich ihre Arbeit und ihre Kompetenzen grundlegend wandeln. Während das Schreiben von Code an Bedeutung verliert, wird das Verständnis hinter dem Code immer wichtiger.</p>
</div>
<div class="sect1">
<h2 id="_die_zeiten_des_standard_codings_sind_vorbei">Die Zeiten des Standard-Codings sind vorbei</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Traditionelle Softwareentwicklung war lange von Routineaufgaben geprägt: Methoden schreiben, Algorithmen implementieren und bekannte Muster anwenden. Solche Tätigkeiten bildeten die Grundlage vieler Projekte, aber sie erforderten wenig kreatives Denken. Genau hier setzt KI an. Tools wie GitHub Copilot oder ChatGPT können in Sekunden Code generieren, der zuvor Stunden an Arbeit gekostet hätte.</p>
</div>
<div class="paragraph">
<p>Dabei geht es nicht nur um einfache Aufgaben. Auch komplexere Anforderungen wie die Generierung von Frameworks, die Optimierung von Algorithmen oder das Debugging werden zunehmend von KI unterstützt. Die Geschwindigkeit und Präzision, mit der diese Werkzeuge arbeiten, eröffnen Entwicklern neue Möglichkeiten – aber sie nehmen ihnen auch die Gewissheit, dass ihr handwerkliches Können allein ausreicht.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_verstehen_statt_schreiben_die_neue_entwicklerrolle">Verstehen statt Schreiben: Die neue Entwicklerrolle</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Mit dem Aufstieg der KI verschiebt sich der Schwerpunkt der Entwicklerarbeit grundlegend. Die eigentliche Codierung tritt in den Hintergrund, während die Rolle des Verstehens, Analysierens und Kontrollierens in den Vordergrund rückt. Entwickler werden zu Kuratoren von Code. Sie müssen sicherstellen, dass KI-generierte Lösungen nicht nur funktionieren, sondern auch den Anforderungen entsprechen, effizient sind und keine Sicherheitslücken aufweisen.</p>
</div>
<div class="paragraph">
<p>Ein Beispiel hierfür ist die Integration von KI-generiertem Code in bestehende Systeme. Dieser Code mag auf den ersten Blick korrekt erscheinen, doch ohne tiefes Verständnis des Gesamtsystems können kritische Fehler übersehen werden. Entwickler müssen die Fähigkeit besitzen, den generierten Code im Kontext zu interpretieren und bei Bedarf anzupassen. Es geht weniger darum, wie der Code geschrieben wird, sondern warum er auf eine bestimmte Weise funktioniert – oder eben nicht.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_warum_denken_die_entscheidende_fähigkeit_wird">Warum Denken die entscheidende Fähigkeit wird</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eine KI ist unglaublich effizient, wenn es um die Umsetzung technischer Anforderungen geht. Aber sie hat keine eigene Intuition, kein Fachwissen über die geschäftlichen oder sozialen Kontexte einer Anwendung. Hier bleibt der Mensch unverzichtbar. Entwickler müssen in der Lage sein, abstrakte Probleme zu lösen, strategisch zu denken und die ethischen Implikationen ihrer Arbeit zu berücksichtigen.</p>
</div>
<div class="paragraph">
<p>Dieser Wandel bringt neue Herausforderungen mit sich. Entwickler müssen lernen, die Ergebnisse der KI kritisch zu hinterfragen. Welche Annahmen liegen dem generierten Code zugrunde? Welche unbeabsichtigten Folgen könnten entstehen? Besonders in sensiblen Bereichen wie der Finanzbranche oder dem Gesundheitswesen ist es entscheidend, dass der Entwickler die volle Kontrolle über die Entscheidungen der KI behält.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ausbildung_und_mindset_müssen_sich_ändern">Ausbildung und Mindset müssen sich ändern</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Ausbildung in der Softwareentwicklung steckt vielerorts noch in alten Denkmustern fest. Programmieren wird nach wie vor als die zentrale Fähigkeit angesehen, während die kritische Auseinandersetzung mit Code und Systemen oft zu kurz kommt. Doch in einer Welt, in der KI das Schreiben von Code weitgehend automatisiert, braucht es einen Paradigmenwechsel.</p>
</div>
<div class="paragraph">
<p>Die nächste Generation von Entwicklern muss lernen, über den Tellerrand hinauszublicken. Anstatt Werkzeuge einfach nur zu bedienen, müssen sie diese hinterfragen, bewerten und verbessern können. Auch Soft Skills wie Kommunikation, Problemlösungsfähigkeit und interdisziplinäres Denken werden immer wichtiger. Entwickler der Zukunft sind nicht mehr nur Handwerker, sondern strategische Denker und Moderatoren zwischen Technologie und Fachbereichen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_bildung_neu_denken_vom_wissen_hin_zum_verstehen">Bildung neu denken: Vom Wissen hin zum Verstehen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Doch die Veränderung betrifft nicht nur die Ausbildung von Softwareentwicklern – sie beginnt viel früher. Schon in Schulen muss ein neuer Bildungsansatz etabliert werden, der weniger auf der Vermittlung von Spezialwissen und mehr auf der Fähigkeit, Wissen zu finden, zu verstehen und zu hinterfragen, basiert.</p>
</div>
<div class="paragraph">
<p>Kinder und Jugendliche müssen lernen, wie sie Informationen beschaffen und deren Verlässlichkeit überprüfen können. Besonders in einer Welt, in der KI in Sekundenschnelle unzählige Antworten liefert, wird es entscheidend sein, zwischen Wahrheit und Fehlinformation zu unterscheiden. Dabei sollte Wissen, das nur in spezifischen Lebensbereichen notwendig ist – wie der Satz des Pythagoras –, auch gezielt nur dort vermittelt werden, wo es gebraucht wird.</p>
</div>
<div class="paragraph">
<p>Ein weiterer wichtiger Punkt ist, dass Kinder und Jugendliche frühzeitig die Möglichkeit bekommen sollten, verschiedene Bereiche auszuprobieren. So können sie ihre Interessen und Stärken entdecken. Mehr Praktika oder ähnliche Programme, bei denen sie aktiv Einblicke in verschiedene Berufe und Tätigkeitsfelder erhalten, wären ein großer Schritt in die richtige Richtung. Dadurch lernen sie nicht nur, was sie wirklich interessiert, sondern auch, wo sie ihre Fähigkeiten sinnvoll einsetzen können.</p>
</div>
<div class="paragraph">
<p>Ein großes Hindernis auf diesem Weg ist jedoch die aktuelle Generation von Lehrkräften. Viele von ihnen wurden von Kollegen ausgebildet, die selbst nicht mit diesen neuen Anforderungen vertraut sind. Dieser Kreislauf veralteter Bildungsansätze erschwert den notwendigen Wandel enorm. Es braucht nicht nur neue Methoden, sondern auch die Bereitschaft, bestehende Lehrpläne und Denkweisen grundlegend zu hinterfragen.</p>
</div>
<div class="paragraph">
<p>Die notwendige Veränderung in der Bildung ist dabei kein Widerspruch zu den Entwicklungen in der Softwareentwicklung, sondern vielmehr ein Spiegel dieser Transformation. So wie Entwickler lernen müssen, Ergebnisse von KI zu hinterfragen, müssen auch Schüler und Lehrer lernen, Wissen nicht nur zu konsumieren, sondern es zu bewerten und sinnvoll anzuwenden. Beide Welten – Bildung und Technologie – sind eng miteinander verknüpft und beeinflussen sich gegenseitig.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_coden_stirbt_denken_bleibt">Fazit: Coden stirbt, Denken bleibt</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Welt der Softwareentwicklung verändert sich – und mit ihr die Rolle der Entwickler. Die Automatisierung von Routineaufgaben durch KI schafft Raum für anspruchsvollere und kreativere Tätigkeiten. Doch diese neuen Anforderungen gehen weit über die Programmierung hinaus: Kritisches Denken, strategisches Planen und die Fähigkeit, komplexe Zusammenhänge zu verstehen, werden zum Schlüssel für die Zukunft.</p>
</div>
<div class="paragraph">
<p>Diese Veränderung beginnt jedoch nicht erst mit der Berufsausbildung. Schon früh müssen Kinder und Jugendliche lernen, wie sie Wissen sinnvoll anwenden und kritisch hinterfragen können. In einer Welt, in der KI nicht nur Code, sondern auch Informationen generiert, wird diese Fähigkeit zu einer zentralen Lebenskompetenz.</p>
</div>
<div class="paragraph">
<p>Die Zukunft gehört nicht den schnellsten Codern, sondern denen, die denken, verstehen und gestalten können. KI nimmt uns das Handwerk ab, aber sie macht das Denken wichtiger denn je. Entwickler und Bildungsexperten gleichermaßen sind gefordert, sich auf diese neue Realität einzulassen – und damit den Grundstein für eine innovative und kritische Gesellschaft zu legen.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Chaos im Projekt: Schluss mit dem Durcheinander!</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-11-27-struktur_ins-chaos/</link>
			<pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-11-27-struktur_ins-chaos/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Wenn ein Projekt ins Chaos abdriftet, ist das für das ganze Team spürbar – Deadlines werden knapp, Anforderungen sind unklar, und die Stimmung kann schnell kippen. Doch wie schafft man es, solche Situationen zu bewältigen und wieder auf Kurs zu kommen? In diesem Artikel stelle ich bewährte Methoden vor, um Projekte aus der Schieflage zu holen und erfolgreich zu stabilisieren – von strukturierten Priorisierungen bis hin zur Einführung von agilen Methoden wie Scrum.&lt;/p&gt;
&lt;/div&gt;
				
#projektmanagement #chaosmanagement #effizienz #agile #scrum 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Wenn ein Projekt ins Chaos abdriftet, ist das für das ganze Team spürbar – Deadlines werden knapp, Anforderungen sind unklar, und die Stimmung kann schnell kippen. Doch wie schafft man es, solche Situationen zu bewältigen und wieder auf Kurs zu kommen? In diesem Artikel stelle ich bewährte Methoden vor, um Projekte aus der Schieflage zu holen und erfolgreich zu stabilisieren – von strukturierten Priorisierungen bis hin zur Einführung von agilen Methoden wie Scrum.</p>
</div>
<div class="sect1">
<h2 id="_erkennen_der_symptome">Erkennen der Symptome</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Bevor Maßnahmen ergriffen werden, ist es entscheidend, die Symptome des Chaos zu erkennen. Typische Anzeichen sind:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Kommunikationsprobleme</strong>: Widersprüchliche Informationen kursieren oder das Team weiß nicht, wer für welche Aufgaben verantwortlich ist.</p>
</li>
<li>
<p><strong>Fehlende Prioritäten</strong>: Alles scheint gleich wichtig zu sein, was zur Überforderung der Ressourcen und der Mitarbeiter führt.</p>
</li>
<li>
<p><strong>Unklare Verantwortlichkeiten</strong>: Jeder tut etwas, aber keiner weiß genau, wer welche Rolle übernimmt oder für was zuständig ist.</p>
</li>
<li>
<p><strong>Unrealistische Zeitpläne</strong>: Deadlines wurden entweder zu eng gesteckt oder durch unvorhergesehene Hindernisse verpasst, was zu mehr Chaos führt.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_schritt_1_rückbesinnung_auf_die_ziele">Schritt 1: Rückbesinnung auf die Ziele</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein häufiges Problem ist, dass das ursprüngliche Projektziel im Laufe der Zeit verwässert wird. Deshalb ist es wichtig, gemeinsam einen Schritt zurückzutreten und das Ziel neu zu fokussieren. Dabei sollten folgende Fragen geklärt werden:
- Was wollen wir mit diesem Projekt wirklich erreichen?
- Welche Prioritäten sind in diesem Zusammenhang wichtig?
- Welche Anforderungen sind für das Projektziel tatsächlich entscheidend?</p>
</div>
<div class="paragraph">
<p>Mit einem klaren Ziel vor Augen lässt sich das Team neu ausrichten, und alle können besser verstehen, wie ihre Aufgaben zum großen Ganzen beitragen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_schritt_2_priorisierung_und_fokussierung">Schritt 2: Priorisierung und Fokussierung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In chaotischen Phasen kann es hilfreich sein, alle offenen Punkte zu sammeln und strukturiert zu priorisieren. Hier bieten sich mehrere Methoden an:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Eisenhower-Matrix</strong>: Durch das Einteilen der Aufgaben in „dringend/nicht dringend&#34; und „wichtig/nicht wichtig&#34; wird deutlich, was sofortige Aufmerksamkeit benötigt und was warten kann.</p>
</li>
<li>
<p><strong>Moscow-Methode (Must-have, Should-have, Could-have, Won’t-have)</strong>: Besonders in überladenen Projekten hilft diese Methode, den Fokus auf das Wesentliche zu setzen und unnötige Arbeit zu vermeiden.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_schritt_3_verantwortlichkeiten_klären">Schritt 3: Verantwortlichkeiten klären</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Unklare Verantwortlichkeiten führen oft zu Lücken oder Doppelarbeit. Ein <strong>RACI-Modell</strong> (Responsible, Accountable, Consulted, Informed) kann dabei helfen, die Rollen klar zu definieren und sicherzustellen, dass alle wissen, wofür sie zuständig sind. Ein klares Rollenverständnis verringert Unsicherheiten und hilft dem Team, effizienter zu arbeiten.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_schritt_4_strukturierung_durch_scrum_agilität_als_rettungsanker">Schritt 4: Strukturierung durch Scrum – Agilität als Rettungsanker</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Scrum kann als Struktur dienen, um aus dem Chaos herauszufinden und eine stabile, wiederholbare Arbeitsweise zu etablieren. Scrum-Elemente, die dabei hilfreich sind:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Daily Stand-ups</strong>: Durch tägliche Kurzbesprechungen (15 Minuten) bleibt das Team informiert, und potenzielle Hindernisse werden frühzeitig angesprochen. Dies schafft Transparenz und reduziert Missverständnisse.</p>
</li>
<li>
<p><strong>Sprints</strong>: In Zeitabschnitten von ein bis vier Wochen (je nach Projekt) wird jeweils ein Teilziel umgesetzt. Der Fokus auf kurze Sprints ermöglicht es, realistische Ziele zu setzen und zu erreichen, was für Motivation sorgt und das Vertrauen in den Projektverlauf stärkt.</p>
</li>
<li>
<p><strong>Product Backlog und Sprint Planning</strong>: Durch ein klar priorisiertes Backlog werden die wichtigsten Aufgaben sichtbar. Beim Sprint Planning werden Aufgaben für den nächsten Sprint ausgewählt, und das Team kann sich auf das Wesentliche konzentrieren.</p>
</li>
<li>
<p><strong>Retrospektiven</strong>: Nach jedem Sprint gibt es eine Retrospektive, in der das Team Verbesserungspotenziale identifiziert und neue Lösungsansätze entwickeln kann. So bleibt der Prozess flexibel und kann kontinuierlich an die Projektdynamik angepasst werden.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Scrum erfordert zwar etwas Aufwand für die Einführung und Disziplin im Ablauf, bietet jedoch klare Strukturen, die in chaotischen Projektsituationen helfen, das Team zu stabilisieren und wieder einen verlässlichen Rhythmus zu etablieren.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_schritt_5_etablierung_fester_kommunikationsstrukturen">Schritt 5: Etablierung fester Kommunikationsstrukturen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Chaos entsteht oft durch fehlende oder unstrukturierte Kommunikation. Deshalb ist es hilfreich, regelmäßige und kurze Meetings einzuführen, in denen die wichtigsten Punkte besprochen werden. Neben den täglichen Stand-ups aus Scrum eignen sich auch wöchentliche Status-Updates, um alle Teammitglieder auf den aktuellen Stand zu bringen. Klare Kommunikationsregeln, wie etwa „jede Information einmal und an alle&#34;, helfen, Missverständnisse und unnötige Doppelarbeit zu vermeiden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_schritt_6_kleine_erfolge_sichtbar_machen_und_feiern">Schritt 6: Kleine Erfolge sichtbar machen und feiern</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In chaotischen Projektphasen fühlen sich die Aufgaben oft wie ein unüberwindbarer Berg an. Um die Motivation und das Engagement im Team zu fördern, ist es hilfreich, auch kleine Fortschritte sichtbar zu machen und zu feiern. Kleine Erfolge zeigen dem Team, dass es auf dem richtigen Weg ist, und stärken den Zusammenhalt. Ein simples „Danke&#34; für die geleistete Arbeit oder ein gemeinsames virtuelles Kaffeetrinken am Ende der Woche können bereits Wunder wirken.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_vom_chaos_zur_ordnung_durch_klare_strukturen_und_agile_methoden">Fazit: Vom Chaos zur Ordnung durch klare Strukturen und agile Methoden</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein Projekt aus der chaotischen Phase zu holen, erfordert eine strukturierte Vorgehensweise, klare Verantwortlichkeiten und die Bereitschaft des Teams, sich auf das Wesentliche zu konzentrieren. Agile Methoden wie Scrum bieten dabei eine flexible, dennoch stabile Struktur, die Raum für Anpassungen lässt und dabei hilft, das Vertrauen und die Motivation des Teams zu stärken.</p>
</div>
<div class="paragraph">
<p>Mit einem klaren Ziel, priorisierten Aufgaben und festen Strukturen lässt sich das Chaos in eine geordnete Bahn lenken und der Projekterfolg wieder in greifbare Nähe rücken.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Junior und Senior raus! Agiles Arbeiten braucht keine alten Hierarchien</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-11-20-alte_hierarchien_junior_senior/</link>
			<pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-11-20-alte_hierarchien_junior_senior/</guid>
			<description>
&lt;div class=&#34;sect2&#34;&gt;
&lt;h3 id=&#34;_einleitung&#34;&gt;Einleitung&lt;/h3&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In der modernen Softwareentwicklung sind Titel wie &amp;#34;Junior&amp;#34;, &amp;#34;Senior&amp;#34; oder &amp;#34;Lead&amp;#34; allgegenwärtig. Sie sollen Orientierung bieten, den Karriereweg vorzeichnen und Gehaltsbänder definieren. Doch in agilen Teams, die flache Hierarchien und gemeinschaftliche Verantwortung fördern, erweisen sich diese Titel zunehmend als Hindernis. Statt Teamgeist und kontinuierliche Weiterentwicklung zu unterstützen, schaffen sie oft mehr Trennung als Zusammenhalt. Dieser Artikel untersucht, warum Titel in agilen Umgebungen oft mehr schaden als nutzen und wie agile Rollenmodelle und flexible Bewertungsansätze eine bessere Alternative darstellen.&lt;/p&gt;
&lt;/div&gt;
				
#karriere #agile #teamwork #titel #junior #senior 
				
			</description>
			<content type="html"><![CDATA[<div class="sect2">
<h3 id="_einleitung">Einleitung</h3>
<div class="paragraph">
<p>In der modernen Softwareentwicklung sind Titel wie &#34;Junior&#34;, &#34;Senior&#34; oder &#34;Lead&#34; allgegenwärtig. Sie sollen Orientierung bieten, den Karriereweg vorzeichnen und Gehaltsbänder definieren. Doch in agilen Teams, die flache Hierarchien und gemeinschaftliche Verantwortung fördern, erweisen sich diese Titel zunehmend als Hindernis. Statt Teamgeist und kontinuierliche Weiterentwicklung zu unterstützen, schaffen sie oft mehr Trennung als Zusammenhalt. Dieser Artikel untersucht, warum Titel in agilen Umgebungen oft mehr schaden als nutzen und wie agile Rollenmodelle und flexible Bewertungsansätze eine bessere Alternative darstellen.</p>
</div>
</div>
<div class="sect2">
<h3 id="_die_illusion_der_orientierung">Die Illusion der Orientierung</h3>
<div class="paragraph">
<p>Auf den ersten Blick scheinen Titel wie &#34;Junior&#34; oder &#34;Senior&#34; hilfreich. Sie sollen den Entwicklungsstand eines Mitarbeiters widerspiegeln und Verantwortlichkeiten definieren. Doch in agilen Teams, die auf gemeinschaftliche Verantwortung und dynamische Zusammenarbeit setzen, verlieren diese Titel schnell an Bedeutung. Ein „Senior&#34; und ein „Junior&#34; sollen hier auf Augenhöhe zusammenarbeiten, doch Titel schaffen oft unsichtbare Barrieren und fördern ungewollt Hierarchiedenken.</p>
</div>
<div class="paragraph">
<p>Statt Orientierung geben Titel oft eine trügerische Sicherheit darüber, was ein Entwickler können oder leisten sollte. Ein &#34;Senior&#34; könnte sich verleitet fühlen, seine bisherigen Methoden als überlegen zu betrachten, während ein &#34;Junior&#34; sich möglicherweise zurückhält und seine Ideen weniger aktiv einbringt. Dieses Status-Quo-Denken führt zu starren Rollen und behindert die Weiterentwicklung des gesamten Teams.</p>
</div>
</div>
<div class="sect2">
<h3 id="_titel_als_unsichtbare_barrieren">Titel als unsichtbare Barrieren</h3>
<div class="paragraph">
<p>Ein &#34;Senior Developer&#34; hat vermeintlich mehr Autorität als ein &#34;Junior&#34;. Das kann dazu führen, dass innovative Ideen oder andere Blickwinkel unterdrückt werden, weil sie nicht von den &#34;richtigen&#34; Personen kommen. Agile Teams leben jedoch von Diversität und Meinungsvielfalt, die durch Rollenflexibilität gefördert wird. Titel hingegen stehen diesem Prinzip oft im Weg und schaffen unsichtbare Hierarchien statt echten Teamgeist.</p>
</div>
<div class="paragraph">
<p>Titel verstärken so oft ein statisches Selbstbild, das den Gedanken an kontinuierliche Verbesserung hemmt. Ein agiles Team braucht jedoch Mitglieder, die offen für neue Perspektiven und ständig bereit sind, sich weiterzuentwickeln – unabhängig von einem Titel.</p>
</div>
</div>
<div class="sect2">
<h3 id="_flexible_rollen_statt_starrer_titel">Flexible Rollen statt starrer Titel</h3>
<div class="paragraph">
<p>Statt auf starre Titel wie &#34;Junior&#34; oder &#34;Senior&#34; zu setzen, können agile Teams durch flexible Rollenmodelle profitieren, die nach Bedarf und Projektanforderungen vergeben und gewechselt werden. Diese Rollen orientieren sich an den aktuellen Anforderungen und Fähigkeiten der Teammitglieder und fördern so eine dynamische, lernorientierte Arbeitsweise. Typische Rollen in agilen Teams könnten sein:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Tech Lead</strong>: Eine Rolle, die für die technische Ausrichtung des Teams verantwortlich ist, ohne eine hierarchische Position einzunehmen. Diese Rolle kann projektweise vergeben und an die jeweiligen Anforderungen angepasst werden.</p>
</li>
<li>
<p><strong>Scrum Master oder Agile Coach</strong>: Diese Rolle unterstützt das Team darin, agile Prinzipien einzuhalten und Hindernisse im Arbeitsfluss zu beseitigen. Sie ist dynamisch und kann auch rotieren, sodass sich unterschiedliche Teammitglieder in dieser Verantwortung ausprobieren können.</p>
</li>
<li>
<p><strong>Product Owner</strong>: Eine Rolle mit funktionaler Verantwortung, die jedoch ohne hierarchischen Rang auskommt. Der Product Owner trägt die Produktvision und das Backlog, ohne dass dies zu einer dauerhaften Hierarchiestufe wird.</p>
</li>
<li>
<p><strong>Mentoren und Fachliche Expertenrollen</strong>: Teammitglieder können temporär als Mentoren oder Fachexperten für bestimmte Bereiche agieren, wie Datenbankdesign oder UI-Entwicklung. Dies ermöglicht, Wissen gezielt weiterzugeben, ohne dass jemand in einen starren Titel festgelegt wird.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Durch diese flexiblen Rollen können Teammitglieder in verschiedenen Bereichen wachsen und lernen, ohne durch einen Titel in ihrem Potenzial eingeschränkt zu sein. Die Hierarchien bleiben flach, und die Verantwortung kann dynamisch an aktuelle Projektanforderungen und individuelle Stärken angepasst werden.</p>
</div>
</div>
<div class="sect2">
<h3 id="_einordnung_in_gehaltsbänder_durch_entwicklung_nicht_durch_titel">Einordnung in Gehaltsbänder durch Entwicklung, nicht durch Titel</h3>
<div class="paragraph">
<p>Ein häufiges Thema bei der Abschaffung von Titeln ist die faire Einordnung in Gehaltsbänder. Ein rollenbasiertes Modell bietet hier eine Lösung, indem es Gehaltsstufen auf die Übernahme von Verantwortung und den individuellen Beitrag zur Teamarbeit stützt. Statt Gehälter ausschließlich an den Titel zu koppeln, kann die Gehaltsentwicklung so transparenter und an die tatsächliche Leistung gebunden werden. Mögliche Ansätze:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Erfahrungsstufen</strong>: Statt an Titeln wird die Gehaltsentwicklung an Erfahrungsstufen gekoppelt, die durch kontinuierliche Weiterentwicklung, das Erreichen persönlicher Ziele und zusätzliche Verantwortungsübernahmen gekennzeichnet sind. Der Fokus liegt hier auf dem Beitrag zur Teamarbeit und Lösungskompetenz statt auf einem fixen Titel.</p>
</li>
<li>
<p><strong>Verantwortungsbänder</strong>: Gehaltsbänder können durch die Übernahme von projekt- und rollenabhängiger Verantwortung gestaffelt werden. Ein Teammitglied, das regelmäßig die Rolle des Tech Leads oder Product Owners übernimmt, könnte in eine höhere Gehaltsklasse eingeordnet werden.</p>
</li>
<li>
<p><strong>Fachliche Spezialisierung</strong>: Fachliche Exzellenz wird durch Spezialisierung in bestimmten Bereichen belohnt, etwa als technischer Experte oder Mentor. Auch ohne den Titel &#34;Senior&#34; können Teammitglieder so in eine höhere Gehaltsklasse aufsteigen.</p>
</li>
<li>
<p><strong>Team- und Projektbeitrag</strong>: Regelmäßige Feedback-Sessions und Peer Reviews können dazu beitragen, den individuellen Beitrag zur Teamarbeit zu bewerten und als Grundlage für Gehaltsentwicklungen zu nutzen. So kann Gehaltserhöhung an den tatsächlichen Einfluss auf das Team und das Projekt gebunden werden, statt an einen festen Titel.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Dieses Modell fördert eine flexiblere Karriereentwicklung, in der Mitarbeitende ihre Kompetenzen gezielt ausbauen können und Gehaltsentwicklung sich an Leistung und Verantwortung orientiert.</p>
</div>
</div>
<div class="sect2">
<h3 id="_herausforderung_bewertung_ohne_titel">Herausforderung: Bewertung ohne Titel</h3>
<div class="paragraph">
<p>Eine faire Bewertung ohne Titel stellt Teams vor Herausforderungen, vor allem wenn Vorgesetzte keinen direkten Einblick in die Projektarbeit haben. Statt auf starre Titel oder auf indirektes Feedback zu setzen, können agile Teams von einem hybriden Bewertungsansatz profitieren, der kontinuierliche Verbesserung und Transparenz unterstützt:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Peer-Feedback und projektübergreifende Einschätzungen</strong>: Regelmäßige Peer Reviews helfen dabei, ein realistisches Bild der Arbeit und des Beitrags jedes Teammitglieds zu erhalten. Das Feedback der Kolleginnen und Kollegen, die direkt mit den Einzelnen arbeiten, kann eine objektive Grundlage schaffen.</p>
</li>
<li>
<p><strong>Strukturiertes Kundenfeedback</strong>: Falls Teammitglieder in kundennahen Rollen arbeiten, kann gezieltes, strukturiertes Kundenfeedback helfen, den individuellen Beitrag realistischer einzuschätzen. Dies sollte anhand klarer Kriterien wie Fachkompetenz, Anpassungsfähigkeit und Teamfähigkeit erhoben werden.</p>
</li>
<li>
<p><strong>Selbstreflexion und dokumentierte Ziele</strong>: Die Einführung von persönlichen Entwicklungszielen und regelmäßige Selbstreflexion fördern eine langfristige Entwicklung und bieten eine nachvollziehbare Grundlage für die Bewertung.</p>
</li>
<li>
<p><strong>Feedback-Kultur und kontinuierliche Verbesserung</strong>: Eine starke Feedback-Kultur ermöglicht, dass Teammitglieder regelmäßig reflektieren und an sich arbeiten können, ohne den Druck, eine bestimmte Titelschublade zu erreichen. Peer Reviews und Feedback-Sessions stärken das Verständnis für individuelle Stärken und Verbesserungsmöglichkeiten.</p>
</li>
</ol>
</div>
</div>
<div class="sect2">
<h3 id="_fazit_ein_hybrider_bewertungsansatz_und_dynamische_rollen_statt_starre_titel">Fazit: Ein hybrider Bewertungsansatz und dynamische Rollen statt starre Titel</h3>
<div class="paragraph">
<p>Titel wie &#34;Junior&#34; und &#34;Senior&#34; sind in agilen Teams nicht nur unnötig, sondern können auch hinderlich sein. Durch flexible Rollenmodelle und eine Feedback-Kultur, die den individuellen Beitrag zur Teamarbeit objektiv bewertet, kann eine faire und transparente Bewertungskultur geschaffen werden. Gehaltsbänder und persönliche Entwicklung orientieren sich dabei nicht an fixen Titeln, sondern an Verantwortung, Leistung und kontinuierlichem Wachstum.</p>
</div>
<div class="paragraph">
<p>Ein rollenbasierter Bewertungsansatz fördert nicht nur die Teamdynamik, sondern unterstützt auch die persönliche Weiterentwicklung jedes Einzelnen. Letztlich ist es für agile Teams der beste Weg, Hierarchien hinter sich zu lassen und eine echte Kultur der kontinuierlichen Verbesserung zu schaffen – ohne starre Titel und ohne unflexible Karrierestufen.</p>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Software mit IQ 0: Wie fachliches Unverständnis mehr Projekte zerstört als fehlerhafter Code!</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-11-13-software_iq_0/</link>
			<pubDate>Wed, 13 Nov 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-11-13-software_iq_0/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In der Softwareentwicklung ist es ein weit verbreiteter Irrglaube, dass technische Perfektion den Erfolg eines Projekts garantiert. Entwickler arbeiten akribisch an optimiertem Code, während Business Analysten versuchen, die &amp;#34;perfekte Lösung&amp;#34; zu definieren – und am Ende scheitert das Projekt. Die brutale Wahrheit ist: Fachliches Unverständnis zerstört mehr Projekte als fehlerhafter Code. Eine Software, die technisch beeindruckt und analytisch durchdacht ist, wird nutzlos, wenn sie die Realität und den Bedarf der Anwender ignoriert.&lt;/p&gt;
&lt;/div&gt;
				
#softwareentwicklung #fachlichkeit #anforderungsmanagement #projektmanagement 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In der Softwareentwicklung ist es ein weit verbreiteter Irrglaube, dass technische Perfektion den Erfolg eines Projekts garantiert. Entwickler arbeiten akribisch an optimiertem Code, während Business Analysten versuchen, die &#34;perfekte Lösung&#34; zu definieren – und am Ende scheitert das Projekt. Die brutale Wahrheit ist: Fachliches Unverständnis zerstört mehr Projekte als fehlerhafter Code. Eine Software, die technisch beeindruckt und analytisch durchdacht ist, wird nutzlos, wenn sie die Realität und den Bedarf der Anwender ignoriert.</p>
</div>
<div class="sect1">
<h2 id="_der_unsichtbare_projekt_killer_fachliches_unverständnis_bei_allen_beteiligten">Der unsichtbare Projekt-Killer: Fachliches Unverständnis bei allen Beteiligten</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Fehler im Code lassen sich reparieren, missverständliche Analysen lassen sich überarbeiten. Doch was tun, wenn die Grundidee eines Projekts am Fachbereich vorbeigeht? Viele Softwareprojekte erreichen einen Punkt, an dem das System theoretisch funktioniert, die tatsächlichen Probleme der Anwender jedoch ungelöst bleiben. Der Schaden ist enorm: Monate oder sogar Jahre an Arbeit gehen in Systeme, die „perfekt&#34; definiert und umgesetzt sind, aber in der Praxis keine Relevanz haben.</p>
</div>
<div class="paragraph">
<p>Es ist nicht nur der Entwickler, der sich in technischen Details verliert. Auch Business Analysten verfallen oft dem Wunsch, die ultimative Lösung zu entwerfen, ohne sicherzustellen, dass sie das Problem der Anwender wirklich adressieren. Der Tunnelblick in Richtung „perfektes System&#34; führt dazu, dass sich Business und IT beide am Bedarf der Anwender vorbei bewegen – und letztlich nur eine Lösung schaffen, die keinen Mehrwert bringt.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_technik_und_analyse_als_selbstzweck_ein_gefährlicher_doppel_irrtum">Technik und Analyse als Selbstzweck: Ein gefährlicher Doppel-Irrtum</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Entwickler und Business Analysten haben zwar unterschiedliche Rollen, doch häufig denselben Hang zur Detailverliebtheit. Während der Entwickler sich in technischen Entscheidungen verliert – welche Sprache, welches Pattern, welches Framework – fokussiert der Analyst auf ein System, das theoretisch lückenlos alle Anforderungen erfüllt. Beide Perspektiven sind wertlos, wenn sie die eigentlichen Bedürfnisse des Anwenders nicht verstehen. Der technische Tunnelblick auf der einen Seite und die analytische Überoptimierung auf der anderen Seite führen dazu, dass die Lösung zu einem komplexen, unbrauchbaren Konstrukt verkommt.</p>
</div>
<div class="paragraph">
<p>Das Ergebnis sind überladene Systeme, die mehr Aufwand bedeuten als Nutzen bringen. Projekte, die auf purer technischer oder analytischer Lust am Detail basieren, führen zu Lösungen, die an der Praxis vorbeigehen. Am Ende bleibt eine Software, die alles tut – außer das, was die Anwender wirklich brauchen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_nicht_nur_umsetzen_sondern_verstehen_die_kunst_des_hinterfragens">Nicht nur umsetzen, sondern verstehen: Die Kunst des Hinterfragens</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein schwerwiegender Fehler in der Softwareentwicklung ist die Annahme, dass Anforderungen nur gesammelt und umgesetzt werden müssen. Sowohl Entwickler als auch Business Analysten müssen die Anforderungen kritisch hinterfragen, um den wahren Bedarf zu erkennen. Der Fachbereich liefert oft nur eine oberflächliche Beschreibung des Problems. Ohne das Verständnis dessen, was wirklich benötigt wird, bleibt die Lösung an der Oberfläche.</p>
</div>
<div class="paragraph">
<p>Ein Business Analyst, der wirklich hinterfragt, erkennt zum Beispiel, dass eine komplexe Reporting-Funktion, die der Fachbereich fordert, nicht das eigentliche Problem löst. Das wahre Problem könnte in der Datenqualität liegen. Der Analyst, der diese Tiefe erfasst und den Entwickler einbezieht, schafft es, eine Lösung zu finden, die das Problem an der Wurzel packt, anstatt es durch ein Feature zu verschleiern.</p>
</div>
<div class="paragraph">
<p>Beide Rollen müssen über das Offensichtliche hinausdenken, um eine Lösung zu entwickeln, die das Problem tatsächlich löst. Andernfalls entsteht Software, die auf dem Papier perfekt ist, in der Praxis aber versagt.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_der_trugschluss_der_vollständigen_lösung_mehrwert_statt_funktionswut">Der Trugschluss der „vollständigen&#34; Lösung: Mehrwert statt Funktionswut</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein weiterer großer Irrtum ist der Glaube, dass Software in ihrer ersten Version „alles können&#34; muss. Dieser Ansatz führt oft dazu, dass monatelang ein komplexes System gebaut wird, das zwar jede Anforderung abdeckt, den Anwender jedoch vor eine zu steile Lernkurve stellt. Dabei kann eine erste Version, die nur grundlegende Funktionalitäten bietet, oft einen viel größeren Mehrwert schaffen. Sie ermöglicht es den Anwendern, sich frühzeitig mit der Software vertraut zu machen und sie in den täglichen Arbeitsablauf zu integrieren.</p>
</div>
<div class="paragraph">
<p>Der Fokus sollte auf dem tatsächlichen Nutzen für die Anwender liegen, und dieser kann oft schon durch kleine Funktionen erreicht werden. Eine erste Version mit reduzierter, aber nützlicher Funktionalität gibt dem Fachbereich die Möglichkeit, das System im Alltag zu testen und frühzeitig Feedback zu geben. Nur regulatorische oder sicherheitsrelevante Anforderungen müssen von Anfang an vollständig erfüllt werden – alles andere sollte iterativ entwickelt werden, um die Lösung schrittweise zu optimieren.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_brillanz_ersetzt_kein_fachwissen_egal_in_welcher_rolle">Brillanz ersetzt kein Fachwissen – egal in welcher Rolle</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Illusion, dass technische oder analytische Exzellenz ausreicht, um ein Projekt erfolgreich zu machen, ist weit verbreitet. Doch technische und analytische Brillanz allein sind wertlos, wenn sie am tatsächlichen Bedarf vorbeigehen. Projekte scheitern nicht an schlechter Performance oder fehlender Lückenlosigkeit in der Anforderungsspezifikation – sie scheitern daran, dass der Kern des Problems nie verstanden wurde.</p>
</div>
<div class="paragraph">
<p>Erschwerend kommt hinzu, dass sowohl Entwickler als auch Business Analysten dem „Shiny-Object-Effekt&#34; erliegen können. Der Wunsch, das modernste Framework oder die ausgeklügeltste Systemlogik zu verwenden, führt oft dazu, dass die Realität des Anwenders vergessen wird. Wenn Systeme entstehen, die technisch und analytisch beeindrucken, aber praktisch unbrauchbar sind, ist der wahre Wert der Software gleich null.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_kommunikationschaos_wenn_fachbereich_und_it_aneinander_vorbeireden">Kommunikationschaos: Wenn Fachbereich und IT aneinander vorbeireden</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eine weitere oft übersehene Hürde ist die Kommunikation zwischen Fachbereich, Business Analysten und Entwicklern. Während der Fachbereich Anforderungen aus Sicht der Anwender beschreibt, übersetzen Business Analysten diese in Systeme und Prozesse, die für die Entwickler oft fremd und schwer verständlich sind. Die Entwickler wiederum antworten in technischem Jargon, den der Fachbereich nicht nachvollziehen kann. Dieses Kommunikationschaos führt dazu, dass die Anforderungen falsch interpretiert werden und die Lösungen am Bedarf vorbeigehen.</p>
</div>
<div class="paragraph">
<p>Ein erfahrener Analyst und ein guter Entwickler sind in der Lage, die Sprache des Fachbereichs zu sprechen und technische sowie fachliche Aspekte klar zu vermitteln. Nur durch eine klare und verständliche Kommunikation kann sichergestellt werden, dass alle Beteiligten auf dasselbe Ziel hinarbeiten – eine Lösung, die in der Praxis sinnvoll ist und tatsächlich genutzt wird.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_der_wahre_feind_ignoranz_gegenüber_der_fachlichkeit">Der wahre Feind: Ignoranz gegenüber der Fachlichkeit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wenn Entwickler und Analysten die Anforderungen des Fachbereichs nicht vollständig verstehen, wird selbst die schönste Software wertlos. Die technische Perfektion und analytische Durchdachtheit können noch so hoch sein – wenn die Software das tatsächliche Problem des Anwenders nicht löst, ist sie nichts weiter als eine teure Enttäuschung. Die Ignoranz gegenüber der Fachlichkeit ist der wahre Feind erfolgreicher Softwareentwicklung.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_mehr_als_nur_technik_und_theorie">Fazit: Mehr als nur Technik und Theorie</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Softwareentwicklung ist mehr als das Schreiben von Code und das Definieren von Anforderungen. Technik und Analyse sind Werkzeuge, aber kein Selbstzweck. Der wahre Schlüssel zum Erfolg liegt darin, die Fachlichkeit zu verstehen und eine Lösung zu schaffen, die den Anwender im Alltag unterstützt. Projekte scheitern nicht an fehlender technischer Brillanz oder lückenhafter Anforderungsanalyse, sondern an Ignoranz gegenüber der fachlichen Realität. Alle Beteiligten – Entwickler wie Analysten – müssen den Fokus auf das Wesentliche richten und das Problem des Anwenders wirklich verstehen. Nur so entsteht eine Lösung, die im Alltag Sinn ergibt und einen echten Mehrwert bietet.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Drei Monate Chaos: Wenige Anforderungen, aber klare Lösungen? Wie Teams das Unmögliche möglich machen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-11-06-chaos_projekte/</link>
			<pubDate>Wed, 06 Nov 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-11-06-chaos_projekte/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In Softwareprojekten, die innerhalb von nur drei Monaten abgeschlossen werden sollen und mit minimalen oder unklaren Anforderungen starten, sehen viele ein Rezept für Scheitern und Chaos. Die Zeit drängt, die Ziele sind unscharf, und die Ressourcen sind knapp bemessen. Dennoch gibt es Teams, die es schaffen, unter solchen Bedingungen bemerkenswerte Ergebnisse zu erzielen. Wie gelingt es ihnen, das scheinbar Unmögliche möglich zu machen? In diesem Beitrag werfen wir einen Blick darauf, wie Teams trotz weniger Anforderungen klare Lösungen entwickeln und Projekte erfolgreich abschließen.&lt;/p&gt;
&lt;/div&gt;
				
#projektmanagement #agile #softwareentwicklung #teamarbeit 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In Softwareprojekten, die innerhalb von nur drei Monaten abgeschlossen werden sollen und mit minimalen oder unklaren Anforderungen starten, sehen viele ein Rezept für Scheitern und Chaos. Die Zeit drängt, die Ziele sind unscharf, und die Ressourcen sind knapp bemessen. Dennoch gibt es Teams, die es schaffen, unter solchen Bedingungen bemerkenswerte Ergebnisse zu erzielen. Wie gelingt es ihnen, das scheinbar Unmögliche möglich zu machen? In diesem Beitrag werfen wir einen Blick darauf, wie Teams trotz weniger Anforderungen klare Lösungen entwickeln und Projekte erfolgreich abschließen.</p>
</div>
<div class="paragraph">
<p>Der Druck in einem Dreimonatsprojekt ist enorm. Zeit ist die knappste Ressource, und Verzögerungen können fatale Auswirkungen haben. Unklare Anforderungen erschweren die Planung und Umsetzung zusätzlich. Ohne klare Ziele besteht die Gefahr, in die falsche Richtung zu arbeiten oder sich in unwichtigen Details zu verlieren. Die Erwartungen der Stakeholder sind dennoch hoch; sie wollen schnelle und qualitativ hochwertige Ergebnisse sehen, auch wenn sie selbst noch nicht genau wissen, was sie brauchen. Dieser Erwartungsdruck kann das Team zusätzlich belasten.</p>
</div>
<div class="paragraph">
<p>Doch wie schaffen es erfolgreiche Teams, unter diesen Bedingungen zu bestehen? Ein wesentlicher Erfolgsfaktor ist die <strong>agile Zusammenarbeit</strong>. Agile Methoden wie Scrum oder Kanban bieten den Rahmen, um flexibel und effizient auf Veränderungen zu reagieren. Durch kurze Entwicklungszyklen kann das Team regelmäßig Ergebnisse liefern und Feedback einholen. Selbstorganisierende Teams, die eigenverantwortlich arbeiten und Entscheidungen treffen können, sind in der Lage, schneller auf Herausforderungen zu reagieren. Die agilen Prinzipien fördern eine Kultur des kontinuierlichen Lernens und der Anpassung, was in einem dynamischen Projektumfeld unverzichtbar ist.</p>
</div>
<div class="paragraph">
<p>Ein weiterer Schlüssel zum Erfolg ist der <strong>Fokus auf das Wesentliche</strong>. Anstatt zu versuchen, das gesamte Problem auf einmal zu lösen, konzentrieren sich erfolgreiche Teams auf das Minimum Viable Product (MVP) – die kleinste Produktversion, die einen echten Nutzen bietet. Durch Timeboxing, also das Festlegen fester Zeitrahmen für Aufgaben, verhindert das Team, dass es sich in unwichtigen Details verliert. Eine klare Priorisierung der Anforderungen stellt sicher, dass die Ressourcen optimal eingesetzt werden und die wichtigsten Funktionen zuerst entwickelt werden.</p>
</div>
<div class="paragraph">
<p><strong>Transparente Kommunikation</strong> ist ebenfalls entscheidend. Regelmäßige Meetings und offene Diskussionen helfen, Missverständnisse zu vermeiden und sicherzustellen, dass alle auf dem gleichen Stand sind. Eine offene und transparente Kommunikation mit den Stakeholdern schafft Vertrauen und ermöglicht es, Erwartungen frühzeitig zu managen. Moderne Kollaborationstools erleichtern die Zusammenarbeit und sorgen dafür, dass Informationen für alle zugänglich sind.</p>
</div>
<div class="paragraph">
<p>Das <strong>technische Design</strong> spielt ebenfalls eine wichtige Rolle. Ein flexibles, modulares Design ermöglicht es dem Team, schnell auf Änderungen zu reagieren und Anpassungen vorzunehmen, ohne das gesamte System überarbeiten zu müssen. Der Einsatz bewährter Technologien reduziert das Risiko von technischen Problemen und beschleunigt die Entwicklung. Automatisierte Tests und Continuous Integration/Continuous Deployment (CI/CD) erhöhen die Effizienz und Qualität der Softwareentwicklung.</p>
</div>
<div class="paragraph">
<p>Der Umgang mit <strong>Risiken und Herausforderungen</strong> erfordert proaktives Risikomanagement. Risiken sollten frühzeitig identifiziert und bewertet werden. Das Team muss bereit sein, Pläne anzupassen und neue Wege zu gehen. Eine Kultur des kontinuierlichen Lernens hilft, aus Fehlern zu lernen und sich ständig zu verbessern.</p>
</div>
<div class="paragraph">
<p>Ein praktisches Beispiel zeigt, wie diese Ansätze in der Realität funktionieren können. Ein mittelständisches Unternehmen möchte innerhalb von drei Monaten eine Webanwendung entwickeln lassen, die interne Prozesse automatisiert. Die Anforderungen sind vage, und die Stakeholder sind sich selbst nicht einig, was genau benötigt wird. Das Team organisiert Workshops, erstellt User Stories und definiert ein MVP. Durch agiles Projektmanagement und regelmäßige Reviews mit den Stakeholdern gelingt es, ein funktionierendes Produkt zu liefern, das die internen Prozesse erheblich verbessert.</p>
</div>
<div class="paragraph">
<p>Abschließend lässt sich sagen, dass Drei-Monats-Projekte mit wenigen oder unklaren Anforderungen eine Herausforderung darstellen, aber keineswegs unmöglich zu bewältigen sind. Der Schlüssel zum Erfolg liegt in der agilen Zusammenarbeit des gesamten Teams, einem klaren Fokus auf das Wesentliche und einer offenen Kommunikation mit allen Beteiligten. Durch ein flexibles Design und proaktives Risikomanagement können Hindernisse überwunden und beeindruckende Ergebnisse erzielt werden.</p>
</div>
<div class="paragraph">
<p>Für das nächste Projekt:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Fragen Sie nach dem &#34;Warum&#34;</strong>: Verstehen Sie die Motivation hinter den Anforderungen.</p>
</li>
<li>
<p><strong>Setzen Sie auf kollaborative Anforderungsanalyse</strong>: Beziehen Sie alle relevanten Stakeholder ein.</p>
</li>
<li>
<p><strong>Starten Sie früh mit der Entwicklung</strong>: Warten Sie nicht auf perfekte Anforderungen.</p>
</li>
<li>
<p><strong>Nutzen Sie Prototyping</strong>: Visualisieren Sie Ideen frühzeitig.</p>
</li>
<li>
<p><strong>Pflegen Sie eine offene Fehlerkultur</strong>: Lernen Sie aus Fehlern und verbessern Sie sich kontinuierlich.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Mit der richtigen Einstellung, passenden Methoden und starkem Teamzusammenhalt kann aus anfänglichem Chaos ein erfolgreiches Projekt entstehen, das sowohl das Team als auch die Stakeholder begeistert.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Cloud-Kollaps: Was passiert, wenn Europas Unternehmen den Zugriff verlieren?</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-10-30-cloud_kollaps/</link>
			<pubDate>Wed, 30 Oct 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-10-30-cloud_kollaps/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Europas Unternehmen stehen vor einer unsichtbaren Bedrohung: Sie hängen zunehmend von amerikanischen Cloud-Giganten ab. &lt;strong&gt;Über 66 %&lt;/strong&gt; des europäischen Cloud-Marktes werden von den US-Riesen &lt;strong&gt;AWS&lt;/strong&gt;, &lt;strong&gt;Microsoft Azure&lt;/strong&gt; und &lt;strong&gt;Google Cloud&lt;/strong&gt; dominiert. Doch die eigentliche Gefahr liegt nicht nur im Zugriff auf die Daten. Viel gravierender ist die Kontrolle über die &lt;strong&gt;Verarbeitung&lt;/strong&gt; und den &lt;strong&gt;Zugang zu den Systemen&lt;/strong&gt;. Was passiert, wenn diese Anbieter den Stecker ziehen? Das Ergebnis wäre fatal – Produktionsprozesse, Finanzsysteme und ganze Branchen könnten zum Stillstand kommen.&lt;/p&gt;
&lt;/div&gt;
				
#Cloud #Digitalisierung #MultiCloud #ITSecurity #DigitalSovereignty #CloudStrategy #AWS #Azure #GoogleCloud 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Europas Unternehmen stehen vor einer unsichtbaren Bedrohung: Sie hängen zunehmend von amerikanischen Cloud-Giganten ab. <strong>Über 66 %</strong> des europäischen Cloud-Marktes werden von den US-Riesen <strong>AWS</strong>, <strong>Microsoft Azure</strong> und <strong>Google Cloud</strong> dominiert. Doch die eigentliche Gefahr liegt nicht nur im Zugriff auf die Daten. Viel gravierender ist die Kontrolle über die <strong>Verarbeitung</strong> und den <strong>Zugang zu den Systemen</strong>. Was passiert, wenn diese Anbieter den Stecker ziehen? Das Ergebnis wäre fatal – Produktionsprozesse, Finanzsysteme und ganze Branchen könnten zum Stillstand kommen.</p>
</div>
<div class="sect1">
<h2 id="_die_illusion_der_sicherheit_was_passiert_bei_einem_ausfall">Die Illusion der Sicherheit: Was passiert bei einem Ausfall?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Viele Unternehmen vertrauen darauf, dass ihre Daten in der Cloud sicher sind. Doch das wahre Risiko liegt nicht allein in der Datenspeicherung, sondern in der <strong>Verfügbarkeit der Systeme</strong> selbst. Ein politischer Konflikt, Sanktionen oder sogar ein technischer Ausfall könnten dazu führen, dass europäische Unternehmen von ihren Cloud-Systemen abgeschnitten werden. Der Zugang zu Anwendungen, Prozessen und kritischen Systemen wäre blockiert. <strong>Was bleibt übrig? Eine lahmgelegte Wirtschaft.</strong></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_multi_cloud_strategien_nicht_nur_ein_backup">Multi-Cloud-Strategien: Nicht nur ein Backup</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Lösung? <strong>Multi-Cloud-Strategien</strong>, die sowohl verschiedene Anbieter als auch geografische Standorte berücksichtigen. Es reicht nicht aus, sich auf die Infrastruktur eines einzigen Cloud-Anbieters zu verlassen. In der Vergangenheit haben Unternehmen ihre Rechenzentren auf verschiedene Standorte verteilt, um Ausfälle zu vermeiden. Dasselbe muss jetzt mit der Cloud geschehen: Eine Kombination aus <strong>europäischen Anbietern</strong> wie <strong>OVHcloud</strong> oder <strong>T-Systems</strong> und US-Anbietern schafft eine echte Resilienz. Nur so können Unternehmen verhindern, dass sie im Falle eines Ausfalls oder einer Sperre komplett handlungsunfähig werden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_gefahr_der_monokultur">Die Gefahr der Monokultur</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wer nur auf einen Cloud-Anbieter setzt, riskiert, Opfer eines <strong>Cloud-Kollapses</strong> zu werden. Diese Monokultur ist nicht nur unsicher, sondern auch gefährlich, denn sie schafft ein digitales Machtgefälle. Wenn ein Anbieter den Zugang blockiert – sei es durch einen politischen Konflikt oder einen technischen Fehler – steht das Unternehmen vor dem Aus. Diese Art der Abhängigkeit darf nicht die Zukunft europäischer Unternehmen bestimmen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_die_digitale_unabhängigkeit_sichern">Fazit: Die digitale Unabhängigkeit sichern</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Es ist höchste Zeit, dass europäische Unternehmen ihre Cloud-Strategien überdenken und sich gegen den möglichen Kollaps absichern. <strong>Multi-Cloud</strong> ist nicht nur eine strategische Option, sondern eine Notwendigkeit. Unternehmen müssen nicht nur ihre Anbieter diversifizieren, sondern auch sicherstellen, dass ihre Systeme auf verschiedene geografische Standorte verteilt sind. <strong>Die Kontrolle über die Cloud ist die Kontrolle über die Zukunft</strong> – und diese Kontrolle darf nicht in den Händen weniger Anbieter liegen.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Werden wir von Künstlicher Intelligenz überholt, weil wir vergessen haben, Mensch zu sein?</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-10-23-ki-emotionen/</link>
			<pubDate>Wed, 23 Oct 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-10-23-ki-emotionen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Vergiss die Angst vor Künstlicher Intelligenz. Sie wird uns nicht ersetzen, solange wir Menschen bleiben – doch genau das ist unser Problem. In einer Welt, die Effizienz und Kontrolle über alles stellt, laufen wir Gefahr, den entscheidenden Faktor zu verlieren: unsere Fähigkeit, zu fühlen. Und das ist die wahre Bedrohung. KI wird uns nur dann überholen, wenn wir aufhören, das zu sein, was uns unersetzlich macht – emotional intelligente Wesen.&lt;/p&gt;
&lt;/div&gt;
				
#künstlicheintelligenz #emotionaleintelligenz #menschlichkeit #zukunftstechnologien 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Vergiss die Angst vor Künstlicher Intelligenz. Sie wird uns nicht ersetzen, solange wir Menschen bleiben – doch genau das ist unser Problem. In einer Welt, die Effizienz und Kontrolle über alles stellt, laufen wir Gefahr, den entscheidenden Faktor zu verlieren: unsere Fähigkeit, zu fühlen. Und das ist die wahre Bedrohung. KI wird uns nur dann überholen, wenn wir aufhören, das zu sein, was uns unersetzlich macht – emotional intelligente Wesen.</p>
</div>
<div class="sect1">
<h2 id="_das_wahre_problem_wir_betäuben_uns_selbst">Das wahre Problem: Wir betäuben uns selbst</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Wahrheit ist: KI wird uns nicht ersetzen, wir werden uns selbst ersetzen. Immer mehr Menschen leben so, als wären sie Maschinen – logisch, kalt und unnahbar. Die wahren Maschinen sind nicht die KIs, es sind wir, wenn wir Emotionen als Schwäche betrachten. Aber genau hier liegt unsere Stärke: Gefühle sind nicht nur ein nettes Extra, sie sind unsere Superkraft. Wenn wir das vergessen, laufen wir freiwillig in die Falle, die wir uns selbst gestellt haben.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ki_wird_nie_wirklich_fühlen_oder">KI wird nie wirklich fühlen – oder?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Hier kommt die große Frage: Wird Künstliche Intelligenz jemals in der Lage sein, echte Gefühle zu entwickeln? Derzeit lautet die Antwort: Nein. KIs können Emotionen simulieren, auf Reize reagieren und menschliches Verhalten nachahmen – aber echte Gefühle? Das bleibt vorerst das exklusive Reich des Menschen. Gefühle sind eng mit unserem Bewusstsein verbunden, einer komplexen Kombination aus Biologie, Chemie und Erfahrung. Solange wir nicht vollständig verstehen, was Bewusstsein ist, und ob es jemals repliziert werden kann, bleibt es äußerst unwahrscheinlich, dass KIs fühlen werden wie wir.</p>
</div>
<div class="paragraph">
<p>Natürlich gibt es Theorien, die besagen, dass Maschinen eines Tages ein Bewusstsein entwickeln könnten – aber das liegt in einer Zukunft, die wir derzeit noch nicht einmal annähernd erreichen können. Fakt ist: KIs sind und bleiben Werkzeuge. Sie können Muster erkennen, Entscheidungen treffen und sogar Emotionen imitieren – doch echte Emotionen bleiben ihnen verschlossen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_gefühle_und_lebenslanges_lernen">Gefühle und lebenslanges Lernen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Emotionale Intelligenz ist kein statischer Zustand, sondern etwas, das sich im Laufe unseres Lebens weiterentwickelt – genau wie unser Wissen und unsere Fähigkeiten. In einer Welt, in der Technologie immer schneller voranschreitet, ist es wichtiger denn je, unsere emotionale Seite bewusst zu schulen und zu pflegen. Das ist Teil des lebenslangen Lernens. Sich weiterzubilden bedeutet nicht nur, neue technische Fähigkeiten zu erlangen, sondern auch, sich selbst besser zu verstehen, die eigenen Emotionen zu reflektieren und bewusster zu leben. Solange wir lernen, uns selbst als Menschen weiterzuentwickeln, bleibt KI ein Werkzeug – und nicht unser Ersatz.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_angst_vor_kontrollverlust_wir_haben_sie_längst_verloren">Angst vor Kontrollverlust? Wir haben sie längst verloren</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Menschen fürchten, die Kontrolle an KI zu verlieren. Doch der wahre Kontrollverlust passiert in uns. Wir haben längst verlernt, menschlich zu sein. In einer Welt, die immer schneller und kälter wird, haben wir aufgehört, zu fühlen. Und genau das öffnet der KI Tür und Tor. Nicht die Maschinen übernehmen die Welt – wir geben sie ihnen, indem wir unser größtes Kapital aufgeben: unsere Emotionen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wenn_wir_aufhören_zu_fühlen_ist_es_nicht_die_ki_die_uns_ersetzt_wir_machen_es_selbst">Wenn wir aufhören zu fühlen, ist es nicht die KI, die uns ersetzt – wir machen es selbst</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Das eigentliche Problem ist nicht die KI. Es ist unser Umgang mit uns selbst. Wir werden nicht von Maschinen überholt, wir geben uns selbst auf. Wenn wir weiterhin glauben, dass Emotionen überflüssig sind, dass Empathie und Mitgefühl im Weg stehen, dann haben wir uns selbst bereits ersetzt. Die Maschine, die uns bedroht, sind wir.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_nur_wer_fühlt_bleibt_mensch">Fazit: Nur wer fühlt, bleibt Mensch</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Zukunft gehört nicht der KI. Sie gehört denjenigen, die sich trauen, menschlich zu bleiben. Solange wir die Kraft haben, zu fühlen, ist KI keine Bedrohung – doch wenn wir diese Fähigkeit verlieren, brauchen wir uns nicht mehr zu fragen, ob Maschinen uns ersetzen. Wir haben es bereits getan.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Im Griff der Warteschlangen: Warum Queues Instant Payments die Luft abschneiden</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-10-16-queues-instant/</link>
			<pubDate>Wed, 16 Oct 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-10-16-queues-instant/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;&lt;strong&gt;Instant Payments&lt;/strong&gt; hätten längst Standard sein sollen, doch die Realität sieht anders aus. Erst ab 2025 werden sie für Banken verpflichtend – und das liegt vor allem an überholten Technologien, die weiterhin im Einsatz sind. Der größte Bremsklotz in der Welt der Echtzeitzahlungen? &lt;strong&gt;Queue-basierte Systeme&lt;/strong&gt;. Sie verhindern, dass Zahlungen in Echtzeit abgewickelt werden, und zwingen Banken dazu, Transaktionen zu speichern – was unnötige Verzögerungen verursacht.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Bei &lt;strong&gt;SEPA Instant Payments&lt;/strong&gt; geht es darum, Geld &lt;strong&gt;direkt von einem Konto auf ein anderes&lt;/strong&gt; zu überweisen – ohne den Umweg über Drittanbieter, ohne Verzögerungen. Doch Queue-basierte Systeme verschieben und blockieren Zahlungen und erfordern, dass jede Transaktion gespeichert wird, da eine direkte Antwort auf eine Transaktion in einer Queue nicht möglich ist. Warum also halten Banken und Unternehmen an dieser &lt;strong&gt;veralteten, ineffizienten Technologie&lt;/strong&gt; fest?&lt;/p&gt;
&lt;/div&gt;
				
#instant #payments #queues #banking #zahlungssysteme 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p><strong>Instant Payments</strong> hätten längst Standard sein sollen, doch die Realität sieht anders aus. Erst ab 2025 werden sie für Banken verpflichtend – und das liegt vor allem an überholten Technologien, die weiterhin im Einsatz sind. Der größte Bremsklotz in der Welt der Echtzeitzahlungen? <strong>Queue-basierte Systeme</strong>. Sie verhindern, dass Zahlungen in Echtzeit abgewickelt werden, und zwingen Banken dazu, Transaktionen zu speichern – was unnötige Verzögerungen verursacht.</p>
</div>
<div class="paragraph">
<p>Bei <strong>SEPA Instant Payments</strong> geht es darum, Geld <strong>direkt von einem Konto auf ein anderes</strong> zu überweisen – ohne den Umweg über Drittanbieter, ohne Verzögerungen. Doch Queue-basierte Systeme verschieben und blockieren Zahlungen und erfordern, dass jede Transaktion gespeichert wird, da eine direkte Antwort auf eine Transaktion in einer Queue nicht möglich ist. Warum also halten Banken und Unternehmen an dieser <strong>veralteten, ineffizienten Technologie</strong> fest?</p>
</div>
<div class="sect1">
<h2 id="_queues_ein_relikt_das_moderne_anforderungen_nicht_erfüllt">Queues: Ein Relikt, das moderne Anforderungen nicht erfüllt</h2>
<div class="sectionbody">
<div class="paragraph">
<p><strong>Queue-basierte Systeme</strong> sind der Inbegriff von ineffizientem Design. Sie verschieben Transaktionen in Warteschlangen, wo sie darauf warten, abgearbeitet zu werden – und das in einer Zeit, in der Kunden sofortige Rückmeldungen erwarten. In der Praxis bedeutet das:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Verzögerungen, die niemand mehr akzeptieren kann</strong>: Während die Zahlung in der Queue hängt, wartet der Kunde frustriert auf eine Rückmeldung. Ein Prozess, der nur Sekunden dauern sollte, zieht sich in die Länge. Das ist inakzeptabel in einer Welt, in der <strong>Schnelligkeit</strong> und <strong>Zuverlässigkeit</strong> längst den Standard setzen.</p>
</li>
<li>
<p><strong>Blockierte Ressourcen, ineffiziente Systeme</strong>: Eine Transaktion in der Queue blockiert das System. Andere Zahlungen müssen warten. Das Ergebnis? Ineffiziente Ressourcennutzung und ein veraltetes System, das die moderne Zahlungswelt einfach nicht mehr abbilden kann.</p>
</li>
<li>
<p><strong>Zwang zum Speichern von Transaktionen</strong>: Da bei Queue-basierten Systemen auf eine Transaktion in der Queue keine direkte Antwort folgen kann, muss jede Transaktion gespeichert werden, um später verarbeitet werden zu können. Diese unnötige Speicherung belastet die Systeme und schafft potenzielle Verzögerungen und Ineffizienzen.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_datenschutz_moderne_systeme_entlasten">Datenschutz: Moderne Systeme entlasten</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Im Gegensatz zu Queues bieten moderne Zahlungssysteme den Vorteil, dass sie nicht darauf angewiesen sind, jede Transaktion zu speichern. <strong>Moderne Systeme</strong> verarbeiten Transaktionen direkt und in Echtzeit, sodass keine zusätzlichen Daten gespeichert werden müssen, um auf eine spätere Antwort zu warten. Das sorgt für eine schnellere Abwicklung und minimiert die Speicherung sensibler Daten, was die Effizienz erheblich verbessert.</p>
</div>
<div class="paragraph">
<p>Es gibt keine technische Notwendigkeit, Transaktionen in Warteschlangen zu speichern, wenn Systeme direkt und ohne Verzögerung miteinander kommunizieren könnten. Dies bedeutet nicht nur eine effizientere Nutzung der Ressourcen, sondern auch eine schnellere Verarbeitung.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_sofortige_verarbeitung_die_lösung_die_wirklich_funktioniert">Sofortige Verarbeitung: Die Lösung, die wirklich funktioniert</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Anstatt auf Queues zu setzen, könnten moderne Zahlungssysteme jede Transaktion sofort durch <strong>HTTP-Requests</strong> abwickeln. Das würde bedeuten, dass Zahlungen nicht mehr auf eine lange Bearbeitung warten müssten, sondern <strong>in Echtzeit</strong> verarbeitet würden. Während ein Queue-System bremst, würde ein direktes System die Transaktionen kontinuierlich und reibungslos abwickeln.</p>
</div>
<div class="sect2">
<h3 id="_weg_mit_der_warteschlange_zeit_für_direkte_verarbeitung">Weg mit der Warteschlange: Zeit für direkte Verarbeitung</h3>
<div class="paragraph">
<p>Moderne Systeme könnten den starren Queue-Ansatz abschaffen und stattdessen jede Zahlung sofort und unabhängig von anderen behandeln. <strong>Effiziente Zeitnutzung</strong> wäre der Schlüssel: Anstatt zu warten, während eine Transaktion abgearbeitet wird, könnten andere parallel bearbeitet werden. Das Ergebnis?</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Endlich echte Echtzeit-Zahlungen</strong>: Anstatt zu verschieben, könnten alle Zahlungen gleichzeitig und ohne Verzögerung bearbeitet werden. Kunden würden ihre Bestätigungen erhalten, sobald sie ihre Transaktionen abschließen, ohne dass die Warteschlange den Prozess behindert.</p>
</li>
<li>
<p><strong>Effizientere Systeme, die nicht mehr im Mittelalter feststecken</strong>: Das System würde seine Ressourcen viel effizienter nutzen, indem es nicht länger auf blockierte Prozesse wartet, sondern immer weiterarbeitet.</p>
</li>
<li>
<p><strong>Flüssiger und ununterbrochener Zahlungsfluss</strong>: Keine Wartezeiten, keine Verzögerungen. Alle Zahlungen könnten sofort abgewickelt werden, ohne dass ein System im Weg steht.</p>
</li>
</ol>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_http_statt_queues_warum_kompromisse_nicht_mehr_akzeptabel_sind">HTTP statt Queues: Warum Kompromisse nicht mehr akzeptabel sind</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Es gibt keine Ausrede mehr, an <strong>Queues</strong> festzuhalten. HTTP könnte jede Transaktion als separaten Request verarbeiten, ohne Verzögerung und ohne Umwege. Was einst als technischer Kompromiss galt, ist heute ein <strong>unnötiger Flaschenhals</strong>, der Echtzeitzahlungen behindert und Kunden frustriert.</p>
</div>
<div class="sect2">
<h3 id="_die_endgültige_absage_an_queues">Die endgültige Absage an Queues</h3>
<div class="ulist">
<ul>
<li>
<p><strong>Sofortige Rückmeldungen, keine Ausflüchte</strong>: HTTP würde es ermöglichen, Transaktionen sofort abzuwickeln und Rückmeldungen in Echtzeit zu geben – genau das, was Kunden erwarten. Queues hingegen bieten nur unnötige Komplexität und Verzögerungen.</p>
</li>
<li>
<p><strong>Keine Warteschlangen, kein Stillstand</strong>: Warum sollten Zahlungen in einer Warteschlange stecken bleiben, wenn sie sofort verarbeitet werden könnten? HTTP eliminiert diese unnötige Schicht und ermöglicht es, Zahlungen in Echtzeit abzuwickeln.</p>
</li>
<li>
<p><strong>Skalierbarkeit ohne Ballast</strong>: Während Queues zusätzlichen Verwaltungsaufwand bedeuten, kann HTTP bei wachsender Transaktionszahl problemlos skalieren – und das ohne den ineffizienten Overhead.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_es_ist_zeit_queue_basierte_systeme_endlich_loszuwerden">Fazit: Es ist Zeit, Queue-basierte Systeme endlich loszuwerden</h2>
<div class="sectionbody">
<div class="paragraph">
<p><strong>Queue-basierte Systeme</strong> sind nicht nur veraltet, sie schaden auch der Effizienz von Instant Payments. Sie zwingen andere Systeme, sequentiell zu arbeiten, und behindern so den Fortschritt. Gleichzeitig verursachen sie durch das notwendige Speichern von Transaktionen Verzögerungen, die moderne Systeme längst vermeiden könnten.</p>
</div>
<div class="paragraph">
<p>Die Zukunft von Instant Payments liegt in <strong>modernen Systemen</strong>, die auf direkte Verarbeitung setzen, Ressourcen effizient nutzen und Transaktionen in Echtzeit abwickeln. Es ist an der Zeit, Queue-basierte Systeme abzuschaffen und Platz für eine Technologie zu schaffen, die tatsächlich funktioniert – sicher, schnell und ohne Hindernisse.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Der CO2-Killer: Wie Cloud-Migration Banken grüner macht</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-10-09-greenit_mainframe_cloud/</link>
			<pubDate>Wed, 09 Oct 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-10-09-greenit_mainframe_cloud/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die Migration von Mainframe-Systemen in die Cloud wird nicht nur aus technischer Sicht immer relevanter, sondern spielt auch eine entscheidende Rolle in der Reduktion des CO2-Fußabdrucks von Unternehmen, insbesondere Banken. Viele Banken erkennen die Vorteile der Cloud in Bezug auf Effizienzsteigerungen, doch auch die ökologischen Vorteile sind erheblich. Dieser Artikel beleuchtet, wie Banken durch den Umstieg in die Cloud ihre Nachhaltigkeitsziele erreichen und ihre IT-Infrastruktur modernisieren können.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_co2_reduzierung_durch_migration_vom_mainframe_in_die_cloud&#34;&gt;CO2-Reduzierung durch Migration vom Mainframe in die Cloud&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;sect2&#34;&gt;
&lt;h3 id=&#34;_1_energieeffizienz_der_cloud_infrastruktur&#34;&gt;1. Energieeffizienz der Cloud-Infrastruktur&lt;/h3&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Mainframe-Systeme, die in unternehmenseigenen Rechenzentren betrieben werden, sind oft mit einem hohen Energieverbrauch verbunden. Die Hardware ist in der Regel älter und verbraucht daher mehr Strom. Hinzu kommt, dass diese Systeme oft kontinuierlich laufen müssen, um die benötigte Leistung sicherzustellen. Dies führt nicht nur zu einem hohen Energieverbrauch, sondern auch zu einem großen Bedarf an Kühlung, was die Umweltbelastung weiter verstärkt.&lt;/p&gt;
&lt;/div&gt;
				
#Cloud #Nachhaltigkeit #CO2 #Mainframe #Energieeffizienz #Banken #GreenIT #Digitalisierung #Klimaschutz #Technologie 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Die Migration von Mainframe-Systemen in die Cloud wird nicht nur aus technischer Sicht immer relevanter, sondern spielt auch eine entscheidende Rolle in der Reduktion des CO2-Fußabdrucks von Unternehmen, insbesondere Banken. Viele Banken erkennen die Vorteile der Cloud in Bezug auf Effizienzsteigerungen, doch auch die ökologischen Vorteile sind erheblich. Dieser Artikel beleuchtet, wie Banken durch den Umstieg in die Cloud ihre Nachhaltigkeitsziele erreichen und ihre IT-Infrastruktur modernisieren können.</p>
</div>
<div class="sect1">
<h2 id="_co2_reduzierung_durch_migration_vom_mainframe_in_die_cloud">CO2-Reduzierung durch Migration vom Mainframe in die Cloud</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_1_energieeffizienz_der_cloud_infrastruktur">1. Energieeffizienz der Cloud-Infrastruktur</h3>
<div class="paragraph">
<p>Mainframe-Systeme, die in unternehmenseigenen Rechenzentren betrieben werden, sind oft mit einem hohen Energieverbrauch verbunden. Die Hardware ist in der Regel älter und verbraucht daher mehr Strom. Hinzu kommt, dass diese Systeme oft kontinuierlich laufen müssen, um die benötigte Leistung sicherzustellen. Dies führt nicht nur zu einem hohen Energieverbrauch, sondern auch zu einem großen Bedarf an Kühlung, was die Umweltbelastung weiter verstärkt.</p>
</div>
<div class="paragraph">
<p>Im Gegensatz dazu setzen Cloud-Anbieter wie AWS, Google Cloud und Microsoft Azure auf modernere und effizientere Rechenzentren. Diese Zentren nutzen fortschrittliche Kühltechnologien, wie z. B. Freikühlung und Flüssigkeitskühlung, um den Energieverbrauch deutlich zu senken. Zudem betreiben viele dieser Anbieter ihre Rechenzentren mit erneuerbaren Energien wie Wind- und Solarenergie, wodurch die CO2-Emissionen weiter reduziert werden. Durch die Migration in die Cloud können Banken diese Vorteile nutzen und ihren Energieverbrauch erheblich senken.</p>
</div>
</div>
<div class="sect2">
<h3 id="_2_dynamische_ressourcennutzung_und_skalierbarkeit">2. Dynamische Ressourcennutzung und Skalierbarkeit</h3>
<div class="paragraph">
<p>Ein weiteres Problem bei Mainframe-Systemen ist, dass sie oft auf Spitzenlasten ausgelegt sind. Das bedeutet, dass sie auch bei geringer Auslastung große Mengen an Energie verbrauchen, was ineffizient ist. Cloud-Systeme bieten hingegen eine dynamische Ressourcennutzung. Ressourcen werden je nach Bedarf automatisch hoch- oder heruntergefahren, was den Energieverbrauch optimiert und eine effiziente Nutzung der verfügbaren Infrastruktur ermöglicht.</p>
</div>
<div class="paragraph">
<p>Für Banken bedeutet das, dass nur die Ressourcen genutzt und bezahlt werden, die tatsächlich benötigt werden. Das reduziert nicht nur die Betriebskosten, sondern minimiert auch den Energieverbrauch, da ungenutzte Ressourcen nicht unnötig betrieben werden. Diese Flexibilität führt zu einer besseren Energieeffizienz und trägt damit zur Reduktion des CO2-Fußabdrucks bei.</p>
</div>
</div>
<div class="sect2">
<h3 id="_3_weniger_elektronikabfall_und_hardware">3. Weniger Elektronikabfall und Hardware</h3>
<div class="paragraph">
<p>Mainframe-Hardware ist auf langfristige Nutzung ausgelegt, aber auch hier gibt es einen hohen Bedarf an Wartung, Ersatzteilen und Upgrades. Dies führt zu einer stetigen Produktion von Elektronikabfall, der sowohl ökologisch als auch wirtschaftlich problematisch ist. Durch die Verlagerung in die Cloud reduziert sich der Bedarf an eigener Hardware drastisch. Banken profitieren von der Virtualisierung, bei der mehrere Anwendungen auf einer einzigen Maschine laufen können, was die Notwendigkeit für physische Server reduziert.</p>
</div>
<div class="paragraph">
<p>Cloud-Anbieter haben zudem eigene Recyclingprozesse für ihre Hardware etabliert, die sicherstellen, dass veraltete Geräte umweltfreundlich entsorgt oder wiederverwendet werden. Somit trägt die Cloud-Migration nicht nur zur Reduktion des Energieverbrauchs bei, sondern auch zur Verringerung des Elektronikabfalls.</p>
</div>
</div>
<div class="sect2">
<h3 id="_4_zugang_zu_globalen_nachhaltigkeitsinitiativen">4. Zugang zu globalen Nachhaltigkeitsinitiativen</h3>
<div class="paragraph">
<p>Ein weiterer Vorteil der Cloud-Migration ist der Zugang zu den Nachhaltigkeitsprogrammen der großen Cloud-Anbieter. Unternehmen wie Google und Microsoft investieren massiv in nachhaltige Technologien und haben ehrgeizige Ziele für eine CO2-neutrale oder sogar CO2-positive Zukunft. Google hat beispielsweise das Ziel, bis 2030 alle seine Rechenzentren ausschließlich mit CO2-freier Energie zu betreiben.</p>
</div>
<div class="paragraph">
<p>Durch die Migration in die Cloud können Banken diese Nachhaltigkeitsinitiativen nutzen und ihre eigenen Umweltziele schneller und effizienter erreichen. Anstatt in teure und komplizierte eigene Lösungen zu investieren, profitieren sie automatisch von den Bemühungen der Cloud-Anbieter.</p>
</div>
</div>
<div class="sect2">
<h3 id="_fazit">Fazit</h3>
<div class="paragraph">
<p>Die Migration vom Mainframe in die Cloud bietet Banken eine doppelte Chance: Einerseits können Systeme modernisiert und betrieblich effizienter gestaltet werden, andererseits können durch den Einsatz moderner, energieeffizienter und nachhaltiger Cloud-Technologien die CO2-Emissionen erheblich reduziert werden. Von einer verbesserten Ressourcennutzung über den Einsatz erneuerbarer Energien bis hin zur Reduktion von Elektronikabfall bietet die Cloud-Migration klare ökologische und wirtschaftliche Vorteile.</p>
</div>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Home-Office ohne Grenzen: Warum Anwesenheit nicht Leistung ist</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-10-02-home_office_ohne_grenzen/</link>
			<pubDate>Wed, 02 Oct 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-10-02-home_office_ohne_grenzen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In der heutigen Arbeitswelt ist das &lt;strong&gt;Home-Office zum Standard&lt;/strong&gt; geworden. Die Frage ist nicht mehr, &lt;strong&gt;ob&lt;/strong&gt; Mitarbeiter von zu Hause aus arbeiten dürfen, sondern &lt;strong&gt;wie oft&lt;/strong&gt; sie es tun können. Viele Unternehmen setzen jedoch weiterhin auf starre Regeln oder Quoten, die vorschreiben, wie oft das Home-Office genutzt werden darf. Doch &lt;strong&gt;Anwesenheit ist nicht gleich Leistung&lt;/strong&gt;. Besonders in der Softwareentwicklung, wo Kreativität und Konzentration gefragt sind, kann ein flexibles Arbeitsmodell ohne Grenzen die Produktivität erheblich steigern.&lt;/p&gt;
&lt;/div&gt;
				
#homeoffice #flexibilität #softwareentwicklung #leistungsmessung #arbeitnehmerbedürfnisse #unternehmenskultur 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In der heutigen Arbeitswelt ist das <strong>Home-Office zum Standard</strong> geworden. Die Frage ist nicht mehr, <strong>ob</strong> Mitarbeiter von zu Hause aus arbeiten dürfen, sondern <strong>wie oft</strong> sie es tun können. Viele Unternehmen setzen jedoch weiterhin auf starre Regeln oder Quoten, die vorschreiben, wie oft das Home-Office genutzt werden darf. Doch <strong>Anwesenheit ist nicht gleich Leistung</strong>. Besonders in der Softwareentwicklung, wo Kreativität und Konzentration gefragt sind, kann ein flexibles Arbeitsmodell ohne Grenzen die Produktivität erheblich steigern.</p>
</div>
<h1 id="_anwesenheit_ist_nicht_gleich_leistung" class="sect0">Anwesenheit ist nicht gleich Leistung</h1>
<div class="paragraph">
<p>Die traditionelle Präsenzkultur suggeriert, dass physische Anwesenheit im Büro mit Produktivität gleichzusetzen ist. Doch das ist ein Trugschluss. <strong>Studien haben gezeigt</strong>, dass Mitarbeiter im Home-Office oft produktiver sind als im Büro. Gründe dafür sind weniger Ablenkungen, individuell gestaltete Arbeitsumgebungen und die Möglichkeit, zu den persönlich optimalen Zeiten zu arbeiten.</p>
</div>
<div class="paragraph">
<p>Im Büro können <strong>Unterbrechungen durch Kollegen</strong>, Meetings oder die allgemeine Geräuschkulisse die Konzentration beeinträchtigen. Im Home-Office haben Mitarbeiter die Kontrolle über ihre Umgebung und können Störungen minimieren. Außerdem sparen sie die Zeit und Energie, die sonst für den Arbeitsweg aufgewendet wird, was zu einer höheren Zufriedenheit führt.</p>
</div>
<h1 id="_home_office_ohne_grenzen_fördert_produktivität" class="sect0">Home-Office ohne Grenzen fördert Produktivität</h1>
<div class="paragraph">
<p>Ein flexibles Home-Office-Modell ermöglicht es den Mitarbeitern, ihr volles Potenzial auszuschöpfen. <strong>Für Softwareentwickler</strong>, die oft komplexe Probleme lösen und kreativ sein müssen, ist eine ungestörte Arbeitsumgebung essenziell.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Ununterbrochene Konzentration</strong>: Tiefes Arbeiten oder &#34;Deep Work&#34; erfordert längere Phasen ohne Ablenkung. Im Home-Office können Entwickler diese Phasen besser planen und nutzen. So können sie sich voll und ganz auf ihre Aufgaben fokussieren und innovative Lösungen entwickeln.</p>
</li>
<li>
<p><strong>Flexible Arbeitszeiten</strong>: Jeder Mensch hat seine eigenen produktiven Zeiten. Einige sind früh morgens am leistungsfähigsten, andere spät abends. Ein flexibles Modell erlaubt es den Mitarbeitern, diese persönlichen Hochphasen zu nutzen. Das führt zu effizienterer Arbeit und besseren Ergebnissen.</p>
</li>
<li>
<p><strong>Vereinbarkeit von Beruf und Privatleben</strong>: Die Möglichkeit, Arbeitszeiten an persönliche Bedürfnisse anzupassen, trägt wesentlich zur Entlastung bei. Familienverpflichtungen, Hobbys oder Weiterbildung lassen sich so leichter integrieren, was zu weniger Stress und höherer Zufriedenheit führt.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Zudem fördert ein grenzenloses Home-Office-Modell die <strong>Selbstverantwortung</strong> der Mitarbeiter. Sie lernen, ihre Zeit effektiv zu managen und Prioritäten zu setzen, was langfristig zu einer höheren Effizienz führt.</p>
</div>
<h1 id="_vertrauen_statt_kontrolle" class="sect0">Vertrauen statt Kontrolle</h1>
<div class="paragraph">
<p>Die Einführung von Beschränkungen für die Home-Office-Nutzung kann als Ausdruck von Misstrauen empfunden werden. <strong>Mitarbeiter fühlen sich bevormundet</strong>, wenn ihnen vorgeschrieben wird, wann und wo sie zu arbeiten haben. Das kann die Motivation und das Engagement erheblich beeinträchtigen.</p>
</div>
<div class="paragraph">
<p>Stattdessen sollten Unternehmen eine <strong>Vertrauenskultur</strong> etablieren. Wenn klare Ziele und Erwartungen definiert sind, können Mitarbeiter eigenverantwortlich arbeiten. Dieses Vertrauen fördert die Loyalität und die Bereitschaft, sich für das Unternehmen einzusetzen.</p>
</div>
<div class="paragraph">
<p><strong>Beispiel</strong>: Ein Unternehmen, das seinen Mitarbeitern völlige Flexibilität gewährt, berichtete von einer signifikanten Steigerung der Produktivität und Mitarbeiterzufriedenheit. Die Mitarbeiter schätzten das entgegengebrachte Vertrauen und waren motiviert, dieses durch hohe Leistungsbereitschaft zu rechtfertigen.</p>
</div>
<h1 id="_leistung_messbar_machen" class="sect0">Leistung messbar machen</h1>
<div class="paragraph">
<p>Gerade in der Softwareentwicklung gibt es zahlreiche Möglichkeiten, Leistung zu messen, die unabhängig vom Arbeitsort sind.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Erreichte Ziele</strong>: Durch das Festlegen von <strong>SMART-Zielen</strong> (spezifisch, messbar, attraktiv, realistisch, terminiert) können Leistungen objektiv bewertet werden. Dies schafft Klarheit für beide Seiten und erleichtert die Erfolgskontrolle.</p>
</li>
<li>
<p><strong>Code-Qualität</strong>: Tools zur statischen Code-Analyse oder automatisierte Testverfahren geben Aufschluss über die Qualität des Codes. Sauberer, effizienter Code ist ein direktes Indiz für gute Arbeit.</p>
</li>
<li>
<p><strong>Produktivitätstools</strong>: Die Nutzung von <strong>Issue-Tracking-Systemen</strong> wie Jira ermöglicht es, den Fortschritt von Aufgaben transparent zu verfolgen. So kann die Arbeitslast besser verteilt und Engpässe frühzeitig erkannt werden.</p>
</li>
<li>
<p><strong>Peer-Feedback</strong>: Regelmäßige <strong>Code-Reviews</strong> und Team-Meetings fördern nicht nur die Qualität, sondern ermöglichen auch Feedback und Lernmöglichkeiten. Dies stärkt das Teamgefühl und die individuelle Weiterentwicklung.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Diese Methoden ermöglichen eine <strong>ergebnisorientierte Bewertung</strong> der Mitarbeiter, die deutlich aussagekräftiger ist als die reine Anwesenheit im Büro.</p>
</div>
<h1 id="_quoten_und_beschränkungen_sind_zu_starr_für_moderne_arbeitsmodelle" class="sect0">Quoten und Beschränkungen sind zu starr für moderne Arbeitsmodelle</h1>
<div class="paragraph">
<p>In einer Zeit, in der <strong>Agilität und Flexibilität</strong> Schlüsselbegriffe sind, wirken starre Home-Office-Quoten wie ein Relikt aus vergangenen Zeiten. Moderne Unternehmen setzen auf <strong>hybride Arbeitsmodelle</strong>, die sich den Bedürfnissen des Marktes und der Mitarbeiter anpassen.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Verteilte Teams</strong>: Global agierende Unternehmen haben Teams, die über verschiedene Kontinente verteilt sind. Die Zusammenarbeit erfolgt hier zwangsläufig digital. Starre Präsenzzeiten passen nicht in dieses Modell.</p>
</li>
<li>
<p><strong>Kollaborationstools</strong>: Mit Tools wie Slack, Microsoft Teams oder Zoom ist die Kommunikation ortsunabhängig möglich und oft effizienter als traditionelle Meetings. Dokumente können in Echtzeit gemeinsam bearbeitet werden, was die Produktivität steigert.</p>
</li>
<li>
<p><strong>Anpassungsfähigkeit</strong>: In Zeiten schneller technologischer Veränderungen müssen Unternehmen agil reagieren können. Starre Regeln behindern diese Anpassungsfähigkeit und können zu Wettbewerbsnachteilen führen.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Unternehmen, die auf <strong>Flexibilität setzen</strong>, können schneller auf Marktveränderungen reagieren und sind besser gerüstet für die Herausforderungen der Zukunft.</p>
</div>
<h1 id="_individuelle_bedürfnisse_anerkennen" class="sect0">Individuelle Bedürfnisse anerkennen</h1>
<div class="paragraph">
<p>Jeder Mitarbeiter hat individuelle Präferenzen und Lebensumstände. <strong>Einheitslösungen funktionieren selten</strong> und können zu Unzufriedenheit führen.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Familienfreundlichkeit</strong>: Mitarbeiter mit Kindern profitieren von flexiblen Arbeitszeiten und -orten, um Familie und Beruf besser vereinbaren zu können. Das erhöht die Loyalität und kann Fehlzeiten reduzieren.</p>
</li>
<li>
<p><strong>Gesundheitliche Aspekte</strong>: Für Menschen mit chronischen Erkrankungen oder Behinderungen kann das Home-Office erhebliche Erleichterungen bieten. Barrieren werden abgebaut und die Inklusion gefördert.</p>
</li>
<li>
<p><strong>Persönliche Produktivität</strong>: Manche Menschen arbeiten besser in einer ruhigen Umgebung, andere blühen im sozialen Umfeld des Büros auf. Die Möglichkeit, den Arbeitsort zu wählen, erhöht die individuelle Leistungsfähigkeit.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Unternehmen, die diese individuellen Bedürfnisse <strong>respektieren und unterstützen</strong>, profitieren von engagierten und loyalen Mitarbeitern.</p>
</div>
<h1 id="_mögliche_hintergründe_für_erzwungene_büropräsenz" class="sect0">Mögliche Hintergründe für erzwungene Büropräsenz</h1>
<div class="paragraph">
<p>Warum bestehen dennoch einige Unternehmen darauf, ihre Mitarbeiter zur Präsenz im Büro zu zwingen?</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Indirekter Personalabbau</strong>: Durch das Erzwingen von Büropräsenz hoffen manche Unternehmen, dass unzufriedene Mitarbeiter von selbst kündigen. Dies kann eine <strong>Strategie zur Reduzierung von Personal</strong> sein, ohne aktive Kündigungen auszusprechen. Dies spart kurzfristig Kosten, kann aber langfristig das Betriebsklima und den Ruf schädigen.</p>
</li>
<li>
<p><strong>Auslastung bestehender Infrastruktur</strong>: Unternehmen haben in Büros und Ausstattung investiert und wollen diese Ressourcen nutzen. Leere Büros werden als <strong>Kostenfaktor</strong> gesehen. Allerdings sollte die Frage gestellt werden, ob Investitionen in Flexibilität und moderne Arbeitsmodelle nicht sinnvoller sind.</p>
</li>
<li>
<p><strong>Kontrolle und Misstrauen</strong>: Ein traditioneller Führungsstil, der auf Kontrolle setzt, vertraut nicht auf die Selbstdisziplin der Mitarbeiter. Dies kann zu einem <strong>negativen Arbeitsklima</strong> führen und die Innovationskraft hemmen.</p>
</li>
<li>
<p><strong>Erhalt der Unternehmenskultur</strong>: Es besteht die Befürchtung, dass die Firmenkultur leidet, wenn Mitarbeiter nicht physisch präsent sind. Allerdings kann eine Kultur auch durch digitale Mittel und gezielte Präsenztermine gepflegt werden.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Diese Beweggründe basieren oft auf <strong>kurzfristigem Denken</strong> und können langfristig dem Unternehmen schaden. <strong>Mitarbeiterunzufriedenheit</strong> führt zu höherer Fluktuation, Verlust von Know-how und einem schlechten Ruf als Arbeitgeber.</p>
</div>
<h1 id="_effizienz_statt_präsenzkultur" class="sect0">Effizienz statt Präsenzkultur</h1>
<div class="paragraph">
<p>Eine <strong>Präsenzkultur</strong> suggeriert, dass lange Arbeitszeiten und ständige Sichtbarkeit im Büro mit hoher Leistungsbereitschaft gleichzusetzen sind. Doch dies kann zu <strong>Burnout und ineffizientem Arbeiten</strong> führen.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Output messen</strong>: Unternehmen sollten den Fokus auf Ergebnisse legen. <strong>Qualität statt Quantität</strong> ist hier der Schlüssel. Mitarbeiter, die effizient arbeiten, sollten nicht durch Präsenzpflicht demotiviert werden.</p>
</li>
<li>
<p><strong>Motivation fördern</strong>: Zufriedene Mitarbeiter sind produktiver. Ein flexibles Arbeitsmodell kann die <strong>intrinsische Motivation</strong> erhöhen und die Identifikation mit dem Unternehmen stärken.</p>
</li>
<li>
<p><strong>Innovationskraft stärken</strong>: Eine Kultur, die auf Vertrauen und Flexibilität setzt, fördert <strong>kreatives Denken</strong> und Innovation. Mitarbeiter trauen sich eher, neue Ideen einzubringen und unkonventionelle Wege zu gehen.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Durch den Wechsel von einer Präsenz- zu einer <strong>Leistungskultur</strong> können Unternehmen ihre Effizienz und Wettbewerbsfähigkeit steigern.</p>
</div>
<h1 id="_wettbewerbsvorteil_im_kampf_um_talente" class="sect0">Wettbewerbsvorteil im Kampf um Talente</h1>
<div class="paragraph">
<p>Der <strong>Fachkräftemangel</strong> ist in vielen Branchen spürbar. Unternehmen müssen attraktiv für Talente sein, um im Wettbewerb zu bestehen.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Employer Branding</strong>: Ein flexibles Arbeitsmodell verbessert das Image als moderner Arbeitgeber. Dies zieht qualifizierte Bewerber an und stärkt die Marktposition.</p>
</li>
<li>
<p><strong>Talente halten und gewinnen</strong>: Mitarbeiter schätzen Unternehmen, die ihre Bedürfnisse berücksichtigen. Dies erhöht die <strong>Mitarbeiterbindung</strong> und erleichtert die <strong>Rekrutierung</strong> neuer Talente.</p>
</li>
<li>
<p><strong>Globale Rekrutierung</strong>: Mit Remote-Arbeitsmodellen können Unternehmen weltweit nach den besten Fachkräften suchen. Dies eröffnet neue Potenziale und fördert die Diversität im Team.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Unternehmen, die an starren Modellen festhalten, riskieren, den Anschluss zu verlieren und wertvolle Mitarbeiter an die Konkurrenz zu verlieren.</p>
</div>
<h1 id="_nachhaltigkeit_und_lebensqualität_fördern" class="sect0">Nachhaltigkeit und Lebensqualität fördern</h1>
<div class="paragraph">
<p>Weniger Pendeln bedeutet:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Reduzierter CO₂-Ausstoß</strong>: Ein Beitrag zum <strong>Klimaschutz</strong> und zur <strong>Nachhaltigkeit</strong>. Unternehmen können so ihren ökologischen Fußabdruck verkleinern und ihrer gesellschaftlichen Verantwortung gerecht werden.</p>
</li>
<li>
<p><strong>Mehr Freizeit</strong>: Die eingesparte Zeit kann für Familie, Hobbys oder Erholung genutzt werden. Dies steigert die Lebensqualität der Mitarbeiter und kann gesundheitlichen Problemen vorbeugen.</p>
</li>
<li>
<p><strong>Gesundheitliche Vorteile</strong>: Weniger Stress durch Verkehr oder lange Arbeitswege fördert die <strong>mentale und physische Gesundheit</strong>. Zufriedene und gesunde Mitarbeiter sind weniger krank und leisten mehr.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Unternehmen, die diese Aspekte fördern, zeigen <strong>gesellschaftliche Verantwortung</strong> und stärken die <strong>Mitarbeiterzufriedenheit</strong>.</p>
</div>
<h1 id="_fazit" class="sect0">Fazit</h1>
<div class="paragraph">
<p>Anwesenheit ist nicht gleich Leistung. In einer Zeit, in der Flexibilität und Agilität entscheidend sind, sollten Unternehmen <strong>alte Denkmuster über Bord werfen</strong>. Ein <strong>grenzenloses Home-Office</strong> bietet Vorteile für Mitarbeiter und Unternehmen gleichermaßen.</p>
</div>
<div class="paragraph">
<p>Durch <strong>Vertrauen</strong>, <strong>moderne Leistungsmessung</strong> und das Anerkennen individueller Bedürfnisse können Unternehmen ihre <strong>Produktivität steigern</strong>, Talente gewinnen und sich zukunftsfähig aufstellen.</p>
</div>
<div class="paragraph">
<p>Es ist an der Zeit, den <strong>Wandel aktiv zu gestalten</strong> und die Chancen der modernen Arbeitswelt zu nutzen.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Von A nach B ohne Stillstand: Die ultimative Strategie für deine Software-Migration</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-09-26-migration_schrittweise/</link>
			<pubDate>Thu, 26 Sep 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-09-26-migration_schrittweise/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die Modernisierung alter Anwendungen ist ein komplexer und oft risikoreicher Prozess. Häufig versucht man, alle Funktionalitäten aus dem Altsystem in die neue Umgebung zu übertragen. Doch das birgt nicht nur ein erhöhtes Risiko, sondern auch unnötige Komplexität. Ein pragmatischerer Ansatz ist es, die Migration schrittweise durchzuführen, dabei bewusst auf bestimmte Features zu verzichten und das Altsystem parallel weiterlaufen zu lassen, um Risiken zu minimieren.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_parallelbetrieb_sicherheit_durch_schrittweise_migration&#34;&gt;Parallelbetrieb: Sicherheit durch schrittweise Migration&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ein zentraler Vorteil des schrittweisen Ansatzes bei der Migration ist, dass das Altsystem weiterhin die Verantwortung für Prozesse übernimmt, die noch nicht vollständig in der neuen Umgebung umgesetzt wurden. Anstatt alles auf einmal zu migrieren, was das Risiko von Ausfällen oder Fehlern erheblich erhöht, kann der Parallelbetrieb genutzt werden, um sicherzustellen, dass kritische Prozesse nahtlos weiterlaufen.&lt;/p&gt;
&lt;/div&gt;
				
#migration #softwareentwicklung #legacy-systeme #risikomanagement #feature-management 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Die Modernisierung alter Anwendungen ist ein komplexer und oft risikoreicher Prozess. Häufig versucht man, alle Funktionalitäten aus dem Altsystem in die neue Umgebung zu übertragen. Doch das birgt nicht nur ein erhöhtes Risiko, sondern auch unnötige Komplexität. Ein pragmatischerer Ansatz ist es, die Migration schrittweise durchzuführen, dabei bewusst auf bestimmte Features zu verzichten und das Altsystem parallel weiterlaufen zu lassen, um Risiken zu minimieren.</p>
</div>
<div class="sect1">
<h2 id="_parallelbetrieb_sicherheit_durch_schrittweise_migration">Parallelbetrieb: Sicherheit durch schrittweise Migration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein zentraler Vorteil des schrittweisen Ansatzes bei der Migration ist, dass das Altsystem weiterhin die Verantwortung für Prozesse übernimmt, die noch nicht vollständig in der neuen Umgebung umgesetzt wurden. Anstatt alles auf einmal zu migrieren, was das Risiko von Ausfällen oder Fehlern erheblich erhöht, kann der Parallelbetrieb genutzt werden, um sicherzustellen, dass kritische Prozesse nahtlos weiterlaufen.</p>
</div>
<div class="paragraph">
<p>Durch diesen Ansatz lassen sich mögliche Probleme in der neuen Anwendung leichter identifizieren und korrigieren, ohne dass der gesamte Betrieb beeinträchtigt wird. Insbesondere bei umfangreichen Anwendungen, die über Jahre gewachsen sind, hilft es, in Stufen zu migrieren und nur die wichtigsten Funktionalitäten zunächst umzusetzen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_der_bewusste_verzicht_auf_funktionalität">Der bewusste Verzicht auf Funktionalität</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein weiterer zentraler Aspekt dieses Ansatzes ist der bewusste Verzicht auf alte Funktionalitäten, die im laufenden Betrieb möglicherweise gar nicht mehr benötigt werden. Statt sich darauf zu konzentrieren, jede Funktionalität aus dem Altsystem zu migrieren, kann die Gelegenheit genutzt werden, das System zu entschlacken und Funktionen, die nicht mehr benötigt werden, bewusst loszulassen.</p>
</div>
<div class="paragraph">
<p>Während der Parallelbetrieb sicherstellt, dass keine wichtigen Funktionen verloren gehen, bietet er gleichzeitig die Möglichkeit, schrittweise zu prüfen, ob bestimmte Funktionen überhaupt noch notwendig sind. Wenn sich herausstellt, dass eine Funktion im Altsystem gar nicht mehr genutzt wird, kann sie in der neuen Version komplett weggelassen werden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_praktische_schritte_für_eine_risikominimierte_migration">Praktische Schritte für eine risikominimierte Migration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Um den Parallelbetrieb effizient zu nutzen, sollten Unternehmen eine klare Strategie entwickeln:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Funktionalitäten priorisieren</strong>: Welche Funktionen sind für den Betrieb unerlässlich und müssen sofort migriert werden? Welche Funktionen können warten, und welche können möglicherweise komplett gestrichen werden?</p>
</li>
<li>
<p><strong>Datenmigration schrittweise durchführen</strong>: Nicht alle Daten müssen sofort in die neue Umgebung übertragen werden. Es kann sinnvoll sein, nur die aktuell relevanten Daten zu migrieren und historische Daten erst später oder gar nicht zu übernehmen.</p>
</li>
<li>
<p><strong>Tests im Parallelbetrieb</strong>: Bevor Prozesse vollständig in die neue Anwendung überführt werden, sollten sie im Parallelbetrieb getestet werden. Dabei kann geprüft werden, ob die neue Lösung die Anforderungen erfüllt, während das Altsystem weiterhin die Verantwortung für kritische Funktionen übernimmt.</p>
</li>
<li>
<p><strong>Nutzerfeedback einholen</strong>: Während des schrittweisen Migrationsprozesses kann das Feedback der Nutzer helfen, besser zu verstehen, welche Funktionalitäten tatsächlich genutzt werden und welche gestrichen werden können.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_vorteile_eines_schrittweisen_migrationsansatzes">Vorteile eines schrittweisen Migrationsansatzes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Der kombinierte Ansatz aus bewusster Reduktion von Funktionalität und einem Parallelbetrieb bietet viele Vorteile:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Risikominimierung</strong>: Da das Altsystem weiterhin kritische Prozesse übernimmt, sinkt das Risiko eines vollständigen Systemausfalls bei der Migration.</p>
</li>
<li>
<p><strong>Flexibilität</strong>: Der schrittweise Prozess erlaubt es, bei Problemen flexibel zu reagieren und Anpassungen vorzunehmen, ohne dass der Betrieb gefährdet wird.</p>
</li>
<li>
<p><strong>Fokus auf relevante Funktionen</strong>: Durch den bewussten Verzicht auf nicht mehr benötigte Funktionen kann das neue System schlanker und effizienter gestaltet werden.</p>
</li>
<li>
<p><strong>Kosten- und Zeitersparnis</strong>: Der Parallelbetrieb ermöglicht es, die neue Anwendung schneller bereitzustellen, ohne auf jedes Detail sofort eingehen zu müssen.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Migration alter Anwendungen muss nicht zwingend ein Risiko darstellen. Durch eine schrittweise Vorgehensweise und den bewussten Verzicht auf veraltete oder nicht mehr genutzte Funktionen lässt sich das Risiko erheblich minimieren. Der Parallelbetrieb bietet die notwendige Sicherheit, um kritische Prozesse weiterhin stabil zu betreiben, während die neue Umgebung in kontrollierten Schritten aufgebaut wird. Dieser pragmatische Ansatz erlaubt es, schneller und effizienter zu migrieren, ohne die Stabilität des laufenden Betriebs zu gefährden.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Von Silos zu Synergien: Effektive Teamarbeit in Projekten</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-09-18-silos-synergien/</link>
			<pubDate>Wed, 18 Sep 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-09-18-silos-synergien/</guid>
			<description>
&lt;div id=&#34;preamble&#34;&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In modernen Projekten ist die Zusammenarbeit zwischen verschiedenen Bereichen und Teams unerlässlich. Ob Entwicklung, Qualitätssicherung, Produktmanagement oder Betrieb – jeder Bereich bringt spezifisches Wissen und Fähigkeiten ein, die entscheidend für den Projekterfolg sind. Aber wie kann diese Zusammenarbeit effektiv gestaltet werden? Welche Herausforderungen treten dabei auf, und welche Strategien haben sich bewährt?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_die_bedeutung_der_bereichsübergreifenden_zusammenarbeit&#34;&gt;Die Bedeutung der bereichsübergreifenden Zusammenarbeit&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ein Projekt besteht selten nur aus einer einzelnen Disziplin. In der Regel arbeiten Teams aus verschiedenen Bereichen zusammen, um ein gemeinsames Ziel zu erreichen. Diese Zusammenarbeit ist entscheidend, da sie sicherstellt, dass alle relevanten Aspekte eines Projekts berücksichtigt werden. Ein gutes Beispiel ist die Zusammenarbeit zwischen Entwicklung und Qualitätssicherung. Während das Entwicklungsteam für die Erstellung der Software verantwortlich ist, sorgt die Qualitätssicherung durch kontinuierliche Tests dafür, dass das Endprodukt den Anforderungen entspricht und fehlerfrei ist.&lt;/p&gt;
&lt;/div&gt;
				
#projektmanagement #teamarbeit #agile 
				
			</description>
			<content type="html"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>In modernen Projekten ist die Zusammenarbeit zwischen verschiedenen Bereichen und Teams unerlässlich. Ob Entwicklung, Qualitätssicherung, Produktmanagement oder Betrieb – jeder Bereich bringt spezifisches Wissen und Fähigkeiten ein, die entscheidend für den Projekterfolg sind. Aber wie kann diese Zusammenarbeit effektiv gestaltet werden? Welche Herausforderungen treten dabei auf, und welche Strategien haben sich bewährt?</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_bedeutung_der_bereichsübergreifenden_zusammenarbeit">Die Bedeutung der bereichsübergreifenden Zusammenarbeit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein Projekt besteht selten nur aus einer einzelnen Disziplin. In der Regel arbeiten Teams aus verschiedenen Bereichen zusammen, um ein gemeinsames Ziel zu erreichen. Diese Zusammenarbeit ist entscheidend, da sie sicherstellt, dass alle relevanten Aspekte eines Projekts berücksichtigt werden. Ein gutes Beispiel ist die Zusammenarbeit zwischen Entwicklung und Qualitätssicherung. Während das Entwicklungsteam für die Erstellung der Software verantwortlich ist, sorgt die Qualitätssicherung durch kontinuierliche Tests dafür, dass das Endprodukt den Anforderungen entspricht und fehlerfrei ist.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_herausforderungen_der_bereichsübergreifenden_zusammenarbeit">Herausforderungen der bereichsübergreifenden Zusammenarbeit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Trotz ihrer Bedeutung ist die bereichsübergreifende Zusammenarbeit oft mit Herausforderungen verbunden:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Kommunikationsbarrieren und Missverständnisse aufgrund gleicher Begriffe mit unterschiedlichen Bedeutungen:</strong> Unterschiedliche Fachbereiche sprechen oft verschiedene „Sprachen&#34; und haben unterschiedliche Perspektiven auf ein Problem. Ein häufiges Problem ist dabei, dass gleiche Begriffe in verschiedenen Kontexten unterschiedliche Bedeutungen haben. Dies kann zu Missverständnissen führen und Entscheidungen erschweren.</p>
</li>
<li>
<p><strong>Unterschiedliche Ziele:</strong> Jedes Team hat oft eigene Prioritäten, die nicht immer mit den Zielen anderer Teams übereinstimmen. Während der Fachbereich den Fokus auf die schnelle Umsetzung gewünschter Funktionen legt, muss die Anwendungsentwicklung darauf achten, dass diese Funktionen technisch in die bestehenden Prozesse passen und dass auch andere technische Anforderungen berücksichtigt werden, wie Skalierbarkeit, Sicherheit und Wartbarkeit.</p>
</li>
<li>
<p><strong>Zu späte Einbindung des Betriebs:</strong> Der Betrieb wird oft erst gegen Ende des Projekts involviert. Durch den MVP-Ansatz (Minimum Viable Product) ist es jedoch spätestens mit dem zweiten oder dritten Sprint notwendig, den Betrieb einzubeziehen. Idealerweise sollte der Betrieb jedoch bereits von Anfang an involviert sein, um sicherzustellen, dass auch seine Anforderungen berücksichtigt werden.</p>
</li>
<li>
<p><strong>Zu späte Einbindung der Qualitätssicherung:</strong> Die Qualitätssicherung darf nicht erst am Ende des Projekts stattfinden. Tests sollten kontinuierlich während der gesamten Projektdauer durchgeführt werden, idealerweise nach jedem Sprint. Dies stellt sicher, dass mögliche Probleme frühzeitig erkannt und behoben werden können.</p>
</li>
<li>
<p><strong>Mangel an Flexibilität:</strong> In agilen Projekten ist Flexibilität entscheidend. Wenn ein Bereich oder Team jedoch nicht flexibel genug ist, um auf Änderungen zu reagieren, kann dies den gesamten Projektfortschritt behindern. Beispielsweise könnten unvermeidliche technische Einschränkungen oder neue Erkenntnisse Anpassungen erfordern, die jedoch auf Widerstand stoßen, wenn das betroffene Team zu sehr an ursprünglichen Plänen festhält.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_erfolgsstrategien_für_eine_effektive_bereichsübergreifende_zusammenarbeit">Erfolgsstrategien für eine effektive bereichsübergreifende Zusammenarbeit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Um die Zusammenarbeit zwischen verschiedenen Bereichen zu verbessern und die beschriebenen Herausforderungen zu bewältigen, können folgende Strategien hilfreich sein:</p>
</div>
<div class="sect2">
<h3 id="_1_asynchrone_kommunikation_und_zentrale_dokumentation_etablieren">1. Asynchrone Kommunikation und zentrale Dokumentation etablieren</h3>
<div class="paragraph">
<p>Anstatt regelmäßiger Meetings kann der Austausch über asynchrone Kommunikationsmittel wie Chat-Plattformen (z. B. Microsoft Teams) oder kollaborative Dokumentationstools (z. B. Confluence) erfolgen. Dies erlaubt es Teammitgliedern, in ihrem eigenen Tempo zu arbeiten und dennoch auf dem neuesten Stand zu bleiben. Wichtige Entscheidungen und Diskussionen sollten transparent dokumentiert und für alle Beteiligten zugänglich gemacht werden.</p>
</div>
</div>
<div class="sect2">
<h3 id="_2_abstimmung_zwischen_fachbereich_anwendungsentwicklung_qualitätssicherung_und_betrieb">2. Abstimmung zwischen Fachbereich, Anwendungsentwicklung, Qualitätssicherung und Betrieb</h3>
<div class="paragraph">
<p>Es sollte ein fortlaufender Dialog zwischen dem Fachbereich, der Anwendungsentwicklung, der Qualitätssicherung und dem Betrieb stattfinden. Während die Anwendungsentwicklung sicherstellt, dass die Funktionen technisch realisierbar und nachhaltig sind, muss der Betrieb frühzeitig eingebunden werden, um sicherzustellen, dass die Anwendung auch in der Produktionsumgebung reibungslos läuft und alle betrieblichen Anforderungen berücksichtigt werden. Die Qualitätssicherung sollte ebenfalls von Anfang an dabei sein, um sicherzustellen, dass die entwickelten Features kontinuierlich getestet und validiert werden.</p>
</div>
</div>
<div class="sect2">
<h3 id="_3_gemeinsame_ziele_definieren">3. Gemeinsame Ziele definieren</h3>
<div class="paragraph">
<p>Wenn alle Beteiligten auf dasselbe Ziel hinarbeiten, wird die Zusammenarbeit wesentlich reibungsloser verlaufen. Gemeinsame Ziele und Metriken können helfen, alle auf denselben Stand zu bringen und mögliche Zielkonflikte frühzeitig zu erkennen und zu lösen.</p>
</div>
</div>
<div class="sect2">
<h3 id="_4_verantwortlichkeiten_klar_festlegen">4. Verantwortlichkeiten klar festlegen</h3>
<div class="paragraph">
<p>Jedes Teammitglied und jeder Bereich sollte genau wissen, welche Aufgaben und Verantwortlichkeiten er trägt. Dies vermeidet Missverständnisse und stellt sicher, dass Aufgaben effizient bearbeitet werden.</p>
</div>
</div>
<div class="sect2">
<h3 id="_5_kollaborative_tools_und_prozesse_nutzen">5. Kollaborative Tools und Prozesse nutzen</h3>
<div class="paragraph">
<p>Tools wie Jira, Confluence oder Microsoft Teams ermöglichen es, Informationen zentral zu teilen und Diskussionen zu führen. Auch agile Methoden wie Scrum oder Kanban fördern die bereichsübergreifende Zusammenarbeit, indem sie klare Strukturen und Prozesse vorgeben.</p>
</div>
</div>
<div class="sect2">
<h3 id="_6_kultur_des_gegenseitigen_respekts_und_vertrauens_aufbauen">6. Kultur des gegenseitigen Respekts und Vertrauens aufbauen</h3>
<div class="paragraph">
<p>Eine erfolgreiche bereichsübergreifende Zusammenarbeit setzt voraus, dass alle Beteiligten einander respektieren und Vertrauen in die Fähigkeiten der anderen haben. Dies kann durch offene Kommunikation und die Bereitschaft, auf die Bedürfnisse und Herausforderungen anderer Bereiche einzugehen, gefördert werden.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die bereichsübergreifende Zusammenarbeit ist ein entscheidender Erfolgsfaktor in modernen Projekten. Durch klare Kommunikation, gemeinsame Ziele, definierte Verantwortlichkeiten und den Einsatz geeigneter Tools und Prozesse kann sie effektiv gestaltet werden. Besondere Aufmerksamkeit sollte dabei der Verwendung von Begriffen, den unterschiedlichen Prioritäten von Fachbereich und Anwendungsentwicklung sowie der frühzeitigen Einbindung des Betriebs und der Qualitätssicherung geschenkt werden. Am Ende führt eine gute Zusammenarbeit nicht nur zu besseren Projektergebnissen, sondern auch zu einer positiven Arbeitskultur, von der alle Beteiligten profitieren.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Agile Testing: Anpassung oder Stillstand? Warum automatisierte Tests im Fluss bleiben müssen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-09-11-testumgebungen-agil/</link>
			<pubDate>Wed, 11 Sep 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-09-11-testumgebungen-agil/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In einem agilen Entwicklungsprozess sind ständige Veränderungen und Anpassungen nicht nur üblich, sondern auch notwendig, um den sich ändernden Anforderungen gerecht zu werden. Automatisierte Tests spielen dabei eine Schlüsselrolle, um sicherzustellen, dass neue Änderungen nicht zu unerwarteten Fehlern führen. Doch im agilen Kontext müssen diese Tests selbst regelmäßig überprüft und angepasst werden, um ihre Relevanz und Aussagekraft zu erhalten.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_die_natur_der_veränderung_im_agilen_umfeld&#34;&gt;Die Natur der Veränderung im agilen Umfeld&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Agiles Vorgehen basiert auf der Idee, dass Anforderungen, Designs und Pläne sich kontinuierlich weiterentwickeln. Diese Dynamik ist entscheidend für den Erfolg in einer Umgebung, die Flexibilität erfordert. Doch sie stellt auch besondere Herausforderungen an das Testen:&lt;/p&gt;
&lt;/div&gt;
				
#agile #testing #automatisierung #softwareentwicklung 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In einem agilen Entwicklungsprozess sind ständige Veränderungen und Anpassungen nicht nur üblich, sondern auch notwendig, um den sich ändernden Anforderungen gerecht zu werden. Automatisierte Tests spielen dabei eine Schlüsselrolle, um sicherzustellen, dass neue Änderungen nicht zu unerwarteten Fehlern führen. Doch im agilen Kontext müssen diese Tests selbst regelmäßig überprüft und angepasst werden, um ihre Relevanz und Aussagekraft zu erhalten.</p>
</div>
<div class="sect1">
<h2 id="_die_natur_der_veränderung_im_agilen_umfeld">Die Natur der Veränderung im agilen Umfeld</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Agiles Vorgehen basiert auf der Idee, dass Anforderungen, Designs und Pläne sich kontinuierlich weiterentwickeln. Diese Dynamik ist entscheidend für den Erfolg in einer Umgebung, die Flexibilität erfordert. Doch sie stellt auch besondere Herausforderungen an das Testen:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Ständige Codeänderungen:</strong> Mit jedem Sprint oder Release gibt es potenziell neue Features, Bugfixes oder Refactorings, die bestehende Tests betreffen können.</p>
</li>
<li>
<p><strong>Veränderungen an der Architektur:</strong> Änderungen in der Systemarchitektur können Auswirkungen auf die Testumgebung haben, insbesondere auf Integrationstests, die das Zusammenspiel mehrerer Komponenten überprüfen.</p>
</li>
<li>
<p><strong>Anpassung von Geschäftsanforderungen:</strong> Wenn sich die Anforderungen ändern, müssen die Tests angepasst werden, um sicherzustellen, dass sie weiterhin die korrekten Geschäftsregeln überprüfen.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_automatisierte_tests_im_fluss_halten">Automatisierte Tests im Fluss halten</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Automatisierte Tests bieten die Möglichkeit, Änderungen schnell zu validieren und sicherzustellen, dass bestehende Funktionalitäten weiterhin korrekt funktionieren. Um jedoch in einem agilen Umfeld effektiv zu sein, müssen diese Tests regelmäßig gewartet und überprüft werden:</p>
</div>
<div class="sect2">
<h3 id="_1_regelmäßige_überprüfung_der_testsuiten">1. Regelmäßige Überprüfung der Testsuiten</h3>
<div class="paragraph">
<p>Jede Iteration oder jedes Release sollte auch eine Überprüfung der bestehenden automatisierten Tests beinhalten. Dies umfasst:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Aktualisierung von Testfällen:</strong> Testfälle sollten regelmäßig auf ihre Relevanz überprüft und aktualisiert werden, um neue Anforderungen oder geänderte Funktionalitäten abzudecken.</p>
</li>
<li>
<p><strong>Entfernung veralteter Tests:</strong> Wenn bestimmte Funktionalitäten entfernt oder geändert wurden, sollten entsprechende Tests ebenfalls entfernt oder angepasst werden, um unnötigen Overhead zu vermeiden.</p>
</li>
<li>
<p><strong>Ergänzung neuer Tests:</strong> Jede neue Funktionalität sollte durch entsprechende automatisierte Tests abgedeckt werden, um sicherzustellen, dass sie im Rahmen künftiger Iterationen validiert wird.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_2_anpassungsfähigkeit_der_testumgebungen">2. Anpassungsfähigkeit der Testumgebungen</h3>
<div class="paragraph">
<p>Agile Teams profitieren von flexiblen Testumgebungen, die schnell an neue Anforderungen angepasst werden können:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Dynamische Umgebungen:</strong> Der Einsatz von Containerisierung und Cloud-Technologien ermöglicht es, Testumgebungen dynamisch zu erstellen und zu konfigurieren, sodass sie genau den aktuellen Bedürfnissen entsprechen.</p>
</li>
<li>
<p><strong>Simulierte Abhängigkeiten:</strong> Mocks und Stubs können helfen, externe Abhängigkeiten zu simulieren, insbesondere wenn sich diese ebenfalls häufig ändern oder schwer kontrollierbar sind.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_3_kontinuierliche_integration_und_kontinuierliches_testen">3. Kontinuierliche Integration und kontinuierliches Testen</h3>
<div class="paragraph">
<p>Ein zentraler Aspekt agiler Entwicklung ist die kontinuierliche Integration (CI), die sicherstellt, dass alle Codeänderungen regelmäßig in das gemeinsame Repository integriert und getestet werden. Automatisierte Tests spielen hier eine entscheidende Rolle:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Schnelle Rückmeldung:</strong> Automatisierte Tests liefern schnell Feedback darüber, ob eine Codeänderung erfolgreich war oder Probleme verursacht hat.</p>
</li>
<li>
<p><strong>Erhöhung der Testabdeckung:</strong> Durch die kontinuierliche Ergänzung neuer Tests in jeder Iteration wird die Testabdeckung systematisch erhöht, was die Zuverlässigkeit der Software weiter steigert.</p>
</li>
<li>
<p><strong>Automatisiertes Monitoring:</strong> CI/CD-Pipelines können so konfiguriert werden, dass sie nicht nur Tests ausführen, sondern auch überwachen, welche Tests im Laufe der Zeit veraltet oder überflüssig werden.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_herausforderungen_und_lösungen">Herausforderungen und Lösungen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die regelmäßige Überprüfung und Anpassung von automatisierten Tests kann aufwendig sein, insbesondere wenn Änderungen häufig sind. Hier sind einige Strategien, um diesen Prozess effizienter zu gestalten:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Automatisierte Testwartung:</strong> Tools und Skripte können entwickelt werden, um die Wartung der Tests zu automatisieren, indem z.B. veraltete Testfälle identifiziert oder automatisch aktualisiert werden.</p>
</li>
<li>
<p><strong>Pair Testing:</strong> Entwickler und Tester arbeiten gemeinsam daran, Tests zu überprüfen und anzupassen. Dies fördert das Verständnis für die aktuellen Anforderungen und ermöglicht eine schnellere Anpassung der Tests.</p>
</li>
<li>
<p><strong>Modularisierung von Tests:</strong> Indem Tests modular aufgebaut werden, kann die Anpassung einzelner Testmodule einfacher und schneller erfolgen, ohne dass ganze Testsuiten überarbeitet werden müssen.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Im agilen Umfeld sind Veränderungen unvermeidlich, und automatisierte Tests müssen sich an diese Veränderungen anpassen, um ihre Relevanz zu behalten. Regelmäßige Überprüfung, Anpassung und eine flexible Testinfrastruktur sind entscheidend, um sicherzustellen, dass automatisierte Tests weiterhin effektiv und zuverlässig bleiben. Durch die Kombination dieser Strategien können agile Teams sicherstellen, dass ihre Tests nicht nur ein Schutzschild gegen Fehler, sondern auch ein integraler Bestandteil des kontinuierlichen Verbesserungsprozesses sind.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Mit MVP zu flexiblen Meilensteinen: Effiziente Ablösung von IT-Systemen durch agile Prozesse</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-09-04-mvp-verstaendnis/</link>
			<pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-09-04-mvp-verstaendnis/</guid>
			<description>
&lt;div id=&#34;preamble&#34;&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die Ablösung von IT-Systemen, sei es ein altes Mainframe-System oder eine erst vor wenigen Jahren implementierte Anwendung, stellt Unternehmen vor enorme Herausforderungen. Systeme, die einst als modern galten, können innerhalb kurzer Zeit veralten oder nicht mehr optimal zu neuen Technologien und Prozessen passen. Im Zuge der Modernisierung und der Migration auf neue Plattformen zeigt sich häufig, dass die bestehende Fachlichkeit und die zugrunde liegenden Prozesse kritisch hinterfragt werden müssen. Hier kann das Konzept des Minimum Viable Product (MVP) eine entscheidende Rolle spielen.&lt;/p&gt;
&lt;/div&gt;
				
#MVP #IT-Systeme #Migration #agile Prozesse #Meilensteine 
				
			</description>
			<content type="html"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Die Ablösung von IT-Systemen, sei es ein altes Mainframe-System oder eine erst vor wenigen Jahren implementierte Anwendung, stellt Unternehmen vor enorme Herausforderungen. Systeme, die einst als modern galten, können innerhalb kurzer Zeit veralten oder nicht mehr optimal zu neuen Technologien und Prozessen passen. Im Zuge der Modernisierung und der Migration auf neue Plattformen zeigt sich häufig, dass die bestehende Fachlichkeit und die zugrunde liegenden Prozesse kritisch hinterfragt werden müssen. Hier kann das Konzept des Minimum Viable Product (MVP) eine entscheidende Rolle spielen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_herausforderungen_bei_der_ablösung_von_it_systemen">Herausforderungen bei der Ablösung von IT-Systemen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>IT-Systeme, unabhängig davon, ob sie vor Jahrzehnten oder erst vor wenigen Jahren entwickelt wurden, entstanden unter Bedingungen, in denen die Gestaltung von Prozessen durch die technologischen Einschränkungen stark begrenzt war. Viele Prozesse und Geschäftslogiken sind daher stark durch die zu der Zeit verfügbaren Technologien geprägt. Oft wurden spezifische Lösungen implementiert, um die Anforderungen innerhalb dieser Einschränkungen zu erfüllen.</p>
</div>
<div class="paragraph">
<p>Mit der schnellen Entwicklung neuer Technologien und sich verändernden Geschäftsanforderungen können diese einstigen Lösungen jedoch schnell veralten. Selbst moderne Anwendungen, die vor wenigen Jahren als technologisch führend galten, passen möglicherweise nicht mehr optimal zu den heutigen Anforderungen. Bei der Migration auf moderne Systeme eröffnen sich daher oft neue Möglichkeiten, Prozesse effizienter und flexibler zu gestalten. Dies führt zu einer genauen Analyse der bestehenden Fachlichkeit und zu der Frage, wie diese in der neuen technologischen Umgebung umgesetzt werden kann – und ob sie in ihrer bisherigen Form überhaupt noch sinnvoll ist.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_der_irrglaube_schnelleres_vorankommen_durch_11_migration">Der Irrglaube: Schnelleres Vorankommen durch 1:1-Migration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In vielen Migrationsprojekten herrscht ein hoher Zeitdruck. Straffe Zeitvorgaben führen oft dazu, dass eine detaillierte Analyse der bestehenden Prozesse und Fachlichkeit vernachlässigt wird. Es entsteht der Irrglaube, dass man schneller vorankommt, wenn man das Altsystem 1:1 auf die neue Technologie überträgt. Diese Herangehensweise mag auf den ersten Blick Zeit sparen, birgt jedoch das Risiko, dass man die Gelegenheit verpasst, bestehende Prozesse zu vereinfachen und an die neuen technischen Möglichkeiten anzupassen.</p>
</div>
<div class="paragraph">
<p>Durch die Übernahme von veralteten Prozessen in die neue Umgebung kann es passieren, dass ineffiziente oder unnötig komplizierte Abläufe unkritisch übernommen werden. Dadurch wird nicht nur Potenzial für Prozessoptimierungen verschenkt, sondern auch die langfristige Wartbarkeit und Effizienz des neuen Systems beeinträchtigt.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_das_mvp_als_werkzeug_zur_neuinterpretation_der_fachlichkeit">Das MVP als Werkzeug zur Neuinterpretation der Fachlichkeit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein Minimum Viable Product (MVP)-Ansatz kann in diesem Kontext äußerst wertvoll sein. Anstatt zu versuchen, alle bestehenden Prozesse eins zu eins in das neue System zu übertragen, ermöglicht ein MVP, die wesentlichen Funktionen und Prozesse zu identifizieren, die den Kern des Geschäfts ausmachen. Diese können dann als erstes migriert und in der neuen Umgebung getestet werden.</p>
</div>
<div class="paragraph">
<p>Während dieser ersten Migrationsphase kommen oft Fragen auf, die im ursprünglichen System – ob alt oder neu – aufgrund technischer Beschränkungen oder damaliger Entscheidungen gar nicht gestellt wurden. Plötzlich wird es möglich, Prozesse einfacher, effizienter oder sogar ganz anders zu gestalten, was neue Chancen, aber auch Herausforderungen mit sich bringt.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_beispiel_prozessvereinfachung_durch_neue_technologien">Beispiel: Prozessvereinfachung durch neue Technologien</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein typisches Szenario könnte wie folgt aussehen: Eine Anwendung, die vor fünf Jahren entwickelt wurde, nutzt eine spezifische Technologie zur Datenverarbeitung, die damals als optimal galt. Im Laufe der Zeit hat sich jedoch eine neue Technologie etabliert, die dieselben Prozesse in Echtzeit und mit weniger Ressourcenaufwand durchführen kann.</p>
</div>
<div class="paragraph">
<p>In einem modernen technologischen Umfeld könnte dieser Prozess nun wesentlich effizienter gestaltet werden. Anstatt den alten Prozess zu migrieren, könnte ein MVP-Ansatz verwendet werden, um eine neue, effizientere Lösung zu entwickeln und zu testen, bevor weitere Schritte unternommen werden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fachlichkeit_im_fokus_die_chance_zur_optimierung">Fachlichkeit im Fokus: Die Chance zur Optimierung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Auseinandersetzung mit der bestehenden Fachlichkeit bietet eine einzigartige Gelegenheit, Prozesse zu optimieren und Geschäftslogiken zu modernisieren. Durch die Verwendung eines MVP-Ansatzes können Unternehmen schrittweise vorgehen, indem sie die kritischsten Funktionen zuerst migrieren und testen. Dies gibt den Teams die Flexibilität, auf neue Erkenntnisse zu reagieren und die Fachlichkeit an die neuen technologischen Möglichkeiten anzupassen.</p>
</div>
<div class="paragraph">
<p>Während dieses Prozesses kann es notwendig sein, bisherige Annahmen über Bord zu werfen und Prozesse komplett neu zu denken. Das MVP erlaubt es, diese neuen Ansätze schnell zu validieren, bevor umfassende Ressourcen in die vollständige Umsetzung investiert werden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_mvp_als_strategisches_werkzeug_bei_der_ablösung_von_it_systemen">Fazit: MVP als strategisches Werkzeug bei der Ablösung von IT-Systemen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Ablösung von IT-Systemen, egal ob alt oder relativ neu, ist mehr als nur eine technische Herausforderung. Es erfordert ein tiefes Verständnis der bestehenden Fachlichkeit und die Bereitschaft, diese in Frage zu stellen. Ein MVP-Ansatz bietet hier die nötige Flexibilität und Sicherheit, um diesen Wandel erfolgreich zu gestalten.</p>
</div>
<div class="paragraph">
<p>Durch die gezielte Fokussierung auf die essenziellen Funktionen und die schrittweise Migration können Unternehmen nicht nur Risiken minimieren, sondern auch ihre Prozesse modernisieren und an die Möglichkeiten neuer Technologien anpassen. Indem sie sich gegen eine 1:1-Migration und für eine bewusste Neuinterpretation der Fachlichkeit entscheiden, können sie nicht nur kurzfristig Zeit sparen, sondern auch die langfristige Effizienz und Flexibilität ihrer Systeme sichern.</p>
</div>
<div class="paragraph">
<p>So wird das MVP zu einem wertvollen strategischen Werkzeug, das die erfolgreiche Ablösung von IT-Systemen unterstützt und gleichzeitig die Grundlage für eine zukunftssichere IT-Landschaft legt.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Liquiditätsmanagement im 24/7-Zahlungsverkehr: Herausforderungen und Lösungsansätze</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-08-28-sepa-inst-liqui/</link>
			<pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-08-28-sepa-inst-liqui/</guid>
			<description>
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_die_herausforderungen_des_liquiditätsmanagements_im_247_zahlungsverkehr&#34;&gt;Die Herausforderungen des Liquiditätsmanagements im 24/7-Zahlungsverkehr&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Mit der zunehmenden Flexibilität im Zahlungsverkehr, insbesondere durch SEPA Instant Payments, stehen Banken vor neuen und komplexen Herausforderungen im Liquiditätsmanagement. Die Möglichkeit, Gelder rund um die Uhr, sieben Tage die Woche, in Echtzeit zu transferieren, stellt nicht nur hohe Anforderungen an die technischen Systeme der Banken, sondern hat auch tiefgreifende Auswirkungen auf die Art und Weise, wie Banken ihre Liquidität steuern müssen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect2&#34;&gt;
&lt;h3 id=&#34;_rund_um_die_uhr_verfügbar_der_druck_auf_das_liquiditätsmanagement&#34;&gt;Rund um die Uhr verfügbar: Der Druck auf das Liquiditätsmanagement&lt;/h3&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Traditionell konnten Banken auf festgelegte Zeitfenster und Abrechnungszyklen zurückgreifen, um ihre Liquidität zu steuern und entsprechende Reserven bereitzuhalten. Mit der Einführung von SEPA Instant Payments und der damit verbundenen Möglichkeit, jederzeit und unbegrenzt Geld zu überweisen, entfällt diese Planbarkeit weitgehend. Das Liquiditätsmanagement muss nun in der Lage sein, auf unvorhersehbare Mittelabflüsse jederzeit zu reagieren, ohne die Zahlungsfähigkeit der Bank zu gefährden.&lt;/p&gt;
&lt;/div&gt;
				
#liquiditätsmanagement #banking #sepa 
				
			</description>
			<content type="html"><![CDATA[<div class="sect1">
<h2 id="_die_herausforderungen_des_liquiditätsmanagements_im_247_zahlungsverkehr">Die Herausforderungen des Liquiditätsmanagements im 24/7-Zahlungsverkehr</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Mit der zunehmenden Flexibilität im Zahlungsverkehr, insbesondere durch SEPA Instant Payments, stehen Banken vor neuen und komplexen Herausforderungen im Liquiditätsmanagement. Die Möglichkeit, Gelder rund um die Uhr, sieben Tage die Woche, in Echtzeit zu transferieren, stellt nicht nur hohe Anforderungen an die technischen Systeme der Banken, sondern hat auch tiefgreifende Auswirkungen auf die Art und Weise, wie Banken ihre Liquidität steuern müssen.</p>
</div>
<div class="sect2">
<h3 id="_rund_um_die_uhr_verfügbar_der_druck_auf_das_liquiditätsmanagement">Rund um die Uhr verfügbar: Der Druck auf das Liquiditätsmanagement</h3>
<div class="paragraph">
<p>Traditionell konnten Banken auf festgelegte Zeitfenster und Abrechnungszyklen zurückgreifen, um ihre Liquidität zu steuern und entsprechende Reserven bereitzuhalten. Mit der Einführung von SEPA Instant Payments und der damit verbundenen Möglichkeit, jederzeit und unbegrenzt Geld zu überweisen, entfällt diese Planbarkeit weitgehend. Das Liquiditätsmanagement muss nun in der Lage sein, auf unvorhersehbare Mittelabflüsse jederzeit zu reagieren, ohne die Zahlungsfähigkeit der Bank zu gefährden.</p>
</div>
<div class="paragraph">
<p>Dieser kontinuierliche Fluss von Zahlungen erfordert eine permanente Überwachung der Liquidität und eine sofortige Reaktion auf etwaige Engpässe. Für viele Banken bedeutet dies, dass sie ihre bestehenden Systeme und Prozesse überdenken und anpassen müssen, um diese neuen Anforderungen zu erfüllen. Traditionelle Liquiditätsreserven könnten in dieser neuen Realität nicht ausreichen, um die Stabilität zu gewährleisten.</p>
</div>
</div>
<div class="sect2">
<h3 id="_flexibilität_der_arbeitszeit_eine_zusätzliche_herausforderung">Flexibilität der Arbeitszeit: Eine zusätzliche Herausforderung</h3>
<div class="paragraph">
<p>Parallel zur Flexibilisierung des Zahlungsverkehrs hat sich auch die Arbeitswelt verändert. Immer mehr Unternehmen und ihre Mitarbeiter arbeiten außerhalb der traditionellen Bürozeiten, was zu unregelmäßigen und schwer vorhersehbaren Zahlungsströmen führt. Diese Entwicklung verstärkt den Druck auf das Liquiditätsmanagement, da Transaktionen zu Zeiten stattfinden können, die früher als &#34;Betriebsruhe&#34; galten.</p>
</div>
<div class="paragraph">
<p>Die erhöhte Flexibilität bei der Arbeitszeit und die damit verbundenen unregelmäßigen Überweisungen erschweren es den Banken, Liquiditätsflüsse vorherzusehen und zu planen. Banken müssen daher sicherstellen, dass ihre Liquiditätssysteme flexibel genug sind, um auf diese Veränderungen zu reagieren. Dies erfordert nicht nur moderne IT-Systeme, sondern auch eine Umstellung in der Denkweise und den Prozessen des Liquiditätsmanagements.</p>
</div>
</div>
<div class="sect2">
<h3 id="_echtzeit_disposition_bei_unternehmensüberweisungen">Echtzeit-Disposition bei Unternehmensüberweisungen</h3>
<div class="paragraph">
<p>Ein weiteres bedeutendes Problemfeld im Liquiditätsmanagement ergibt sich aus der Notwendigkeit, Unternehmensüberweisungen in Echtzeit zu disponieren. Unternehmen erwarten zunehmend, dass ihre Zahlungsströme ohne Verzögerung und zu jeder Tageszeit verarbeitet werden. Für Banken bedeutet dies, dass sie in der Lage sein müssen, diese Transaktionen sofort zu prüfen, zu genehmigen und zu verbuchen, ohne dass es zu Verzögerungen kommt.</p>
</div>
<div class="paragraph">
<p>Dies stellt nicht nur technische Herausforderungen dar, sondern erfordert auch eine enge Abstimmung zwischen den verschiedenen Abteilungen innerhalb der Bank, die für das Liquiditätsmanagement verantwortlich sind. Fehler oder Verzögerungen in diesem Prozess könnten zu erheblichen finanziellen Risiken führen und das Vertrauen der Kunden in die Bank erschüttern.</p>
</div>
</div>
<div class="sect2">
<h3 id="_lösungsansätze_für_das_moderne_liquiditätsmanagement">Lösungsansätze für das moderne Liquiditätsmanagement</h3>
<div class="paragraph">
<p>Um diesen Herausforderungen zu begegnen, müssen Banken ihre Liquiditätsmanagementsysteme modernisieren und an die neuen Anforderungen anpassen. Dies könnte unter anderem folgende Maßnahmen umfassen:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Echtzeit-Überwachung und -Analyse:</strong> Der Einsatz von fortschrittlichen Analysetools und KI-gesteuerten Systemen kann Banken dabei helfen, Liquiditätsflüsse in Echtzeit zu überwachen und potenzielle Engpässe frühzeitig zu erkennen.</p>
</li>
<li>
<p><strong>Automatisierte Dispositionssysteme:</strong> Automatisierte Systeme, die in der Lage sind, Unternehmensüberweisungen in Echtzeit zu disponieren, können den Dispositionsprozess beschleunigen und das Risiko menschlicher Fehler minimieren.</p>
</li>
<li>
<p><strong>Flexibilität in den Liquiditätsreserven:</strong> Banken sollten ihre Strategien für Liquiditätsreserven anpassen, um flexibler auf unerwartete Abflüsse reagieren zu können. Dies könnte auch den verstärkten Einsatz von kurzfristigen Finanzierungsmöglichkeiten beinhalten.</p>
</li>
<li>
<p><strong>Optimierung der internen Prozesse:</strong> Eine enge Abstimmung zwischen den Abteilungen und eine Optimierung der internen Prozesse sind entscheidend, um sicherzustellen, dass das Liquiditätsmanagement in der Lage ist, die neuen Anforderungen zu erfüllen.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_fazit_ein_neues_zeitalter_für_das_liquiditätsmanagement">Fazit: Ein neues Zeitalter für das Liquiditätsmanagement</h3>
<div class="paragraph">
<p>Der Übergang zu einem 24/7-Zahlungsverkehr stellt das Liquiditätsmanagement der Banken vor erhebliche Herausforderungen. Um in dieser neuen Realität erfolgreich zu sein, müssen Banken ihre Systeme, Prozesse und Strategien anpassen und modernisieren. Die Zukunft des Zahlungsverkehrs gehört denen, die sich anpassen und in der Lage sind, auch unter den Bedingungen eines rund um die Uhr aktiven Marktes flexibel und zuverlässig zu agieren.</p>
</div>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Agiles Testen: Mehr als nur Testen im agilen Umfeld</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-08-21-agile-testing/</link>
			<pubDate>Wed, 21 Aug 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-08-21-agile-testing/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In der agilen Softwareentwicklung wird häufig betont, wie wichtig es ist, flexibel und anpassungsfähig zu sein. Doch diese Flexibilität bedeutet nicht, dass Prozesse unstrukturiert oder chaotisch ablaufen sollten. Gerade im Bereich der Qualitätssicherung ist ein methodischer Ansatz entscheidend, um sicherzustellen, dass die angestrebte Softwarequalität erreicht wird. Das Buch &lt;strong&gt;&amp;#34;Agiles Testen: Der agile Weg zur erfolgreichen Qualitätssicherung&amp;#34;&lt;/strong&gt; bietet hierfür eine wertvolle Anleitung und macht deutlich, dass &lt;strong&gt;agiles Testen&lt;/strong&gt; mehr ist als nur traditionelles Testen, das in ein agiles Umfeld eingebettet wird.&lt;/p&gt;
&lt;/div&gt;
				
#agile #Testen #Qualitätssicherung #Softwareentwicklung 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In der agilen Softwareentwicklung wird häufig betont, wie wichtig es ist, flexibel und anpassungsfähig zu sein. Doch diese Flexibilität bedeutet nicht, dass Prozesse unstrukturiert oder chaotisch ablaufen sollten. Gerade im Bereich der Qualitätssicherung ist ein methodischer Ansatz entscheidend, um sicherzustellen, dass die angestrebte Softwarequalität erreicht wird. Das Buch <strong>&#34;Agiles Testen: Der agile Weg zur erfolgreichen Qualitätssicherung&#34;</strong> bietet hierfür eine wertvolle Anleitung und macht deutlich, dass <strong>agiles Testen</strong> mehr ist als nur traditionelles Testen, das in ein agiles Umfeld eingebettet wird.</p>
</div>
<div class="sect1">
<h2 id="_agiles_testen_ein_eigenständiger_ansatz">Agiles Testen: Ein eigenständiger Ansatz</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Das Konzept des agilen Testens geht weit über die bloße Anpassung bestehender Testmethoden an agile Rahmenwerke wie Scrum oder Kanban hinaus. Agiles Testen ist ein eigenständiger Ansatz, der tief in die Prinzipien und Werte der agilen Softwareentwicklung integriert ist. Es handelt sich nicht einfach um das &#34;Testen in einem agilen Umfeld&#34;, sondern um eine spezifische Art des Testens, die von den Grundsätzen des agilen Manifests getragen wird.</p>
</div>
<div class="paragraph">
<p>Agiles Testen erfordert ein Umdenken: Tester sind nicht mehr nur Qualitätsprüfer am Ende des Entwicklungsprozesses, sondern aktive Teilnehmer von Anfang an. Sie arbeiten eng mit Entwicklern und Product Ownern zusammen, um sicherzustellen, dass Qualität ein integraler Bestandteil jedes Schrittes in der Entwicklung ist.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_frühe_und_kontinuierliche_einbindung_der_tester">Frühe und kontinuierliche Einbindung der Tester</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein zentraler Aspekt des agilen Testens ist die frühe und kontinuierliche Einbindung der Tester in den Entwicklungsprozess. Tester sind von Beginn an involviert, arbeiten an der Definition von Anforderungen und bringen ihre Perspektive ein, um Risiken frühzeitig zu identifizieren und Testfälle zu entwerfen.</p>
</div>
<div class="paragraph">
<p>Durch diese enge Zusammenarbeit wird es möglich, Probleme bereits in einer sehr frühen Phase zu erkennen und direkt in die Entwicklung einzubeziehen. Agiles Testen ist daher nicht nur ein reaktiver Prozess, der darauf wartet, dass die Entwicklung abgeschlossen ist, sondern ein proaktiver Ansatz, der die Qualität von Anfang an mitgestaltet.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_flexible_testplanung_und_adaptive_teststrategien">Flexible Testplanung und adaptive Teststrategien</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Im agilen Umfeld ändern sich Anforderungen und Prioritäten oft schnell. Daher erfordert agiles Testen eine flexible Testplanung und adaptive Teststrategien, die den spezifischen Gegebenheiten eines Projekts gerecht werden. Es wird nicht einfach ein festes Testkonzept über das Projekt gestülpt, sondern die Teststrategie wird kontinuierlich angepasst, um auf Veränderungen zu reagieren.</p>
</div>
<div class="paragraph">
<p>Dabei geht es nicht nur um die Anpassung bestehender Testmethoden, sondern um die Entwicklung und Anwendung neuer, agiler Testpraktiken. Diese Praktiken sind darauf ausgelegt, die Qualität schnell und effizient sicherzustellen, ohne die Dynamik und Flexibilität des agilen Prozesses zu beeinträchtigen. Unterstützend kann hier auch die Rolle eines Quality Coach agieren, der das Team in Fragen der Qualitätssicherung berät, ohne dabei den agilen Fluss zu stören.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_bedeutung_der_testautomatisierung">Bedeutung der Testautomatisierung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein weiterer wichtiger Bestandteil des agilen Testens ist die Testautomatisierung. In einem agilen Kontext sind schnelle Feedback-Schleifen unerlässlich, und automatisierte Tests spielen dabei eine entscheidende Rolle. Sie ermöglichen es, kontinuierlich zu testen und sicherzustellen, dass neue Code-Änderungen keine bestehenden Funktionen beeinträchtigen.</p>
</div>
<div class="paragraph">
<p>Agiles Testen nutzt die Testautomatisierung, um die Entwicklungszyklen zu unterstützen und eine hohe Testabdeckung zu gewährleisten. Dabei ist es wichtig, dass die Automatisierung sinnvoll und zielgerichtet eingesetzt wird, um den größtmöglichen Nutzen für das Team zu bieten.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_qualitätssicherung_als_teamverantwortung">Qualitätssicherung als Teamverantwortung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ein grundlegendes Prinzip des agilen Testens ist die gemeinsame Verantwortung des gesamten Teams für die Qualität des Endprodukts. Qualitätssicherung ist nicht mehr nur die Aufgabe der Tester, sondern wird von allen Teammitgliedern getragen.</p>
</div>
<div class="paragraph">
<p>Regelmäßige Retrospektiven und kontinuierliche Verbesserungen spielen eine Schlüsselrolle, um die Qualität im Fokus zu behalten und ständig zu optimieren. Tester arbeiten hierbei eng mit Entwicklern und anderen Stakeholdern zusammen, um sicherzustellen, dass Qualitätssicherung ein integraler Bestandteil des gesamten Entwicklungsprozesses ist.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Das Buch <strong>&#34;Agiles Testen: Der agile Weg zur erfolgreichen Qualitätssicherung&#34;</strong> zeigt eindrucksvoll, dass agiles Testen mehr ist als nur traditionelles Testen in einem agilen Umfeld. Es handelt sich um einen eigenständigen Ansatz, der die Prinzipien und Werte der agilen Softwareentwicklung vollständig integriert und die Qualitätssicherung tief in den Entwicklungsprozess einbettet.</p>
</div>
<div class="paragraph">
<p>Agiles Testen erfordert eine enge Zusammenarbeit, flexible Teststrategien und eine starke Fokussierung auf kontinuierliche Verbesserung. Dieser Ansatz stellt sicher, dass die Softwarequalität in einem agilen Kontext nicht nur erhalten, sondern kontinuierlich gesteigert wird. Testen wird dabei zu einem integralen Bestandteil des agilen Prozesses und nicht zu einer nachträglichen Aktivität, die erst am Ende der Entwicklung stattfindet.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Der Countdown läuft: Wie Banken sich auf die SEPA Instant Payment-Pflicht vorbereiten sollten</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-08-14-sepa-instant/</link>
			<pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-08-14-sepa-instant/</guid>
			<description>
&lt;div id=&#34;preamble&#34;&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;SEPA Instant Payments (SCTInst) hat den europäischen Zahlungsverkehr nachhaltig verändert. Mit der Möglichkeit, Gelder in Echtzeit zwischen Banken zu transferieren, wird ein neuer Standard für Geschwindigkeit und Effizienz gesetzt. Ab 2025 wird dieser Standard für viele Banken in Europa verpflichtend: Der Gesetzgeber schreibt vor, dass alle Banken, die Privatkunden bedienen, auch SEPA Instant Payments anbieten müssen. Diese gesetzliche Vorgabe stellt viele Institute vor große Herausforderungen, und es gibt bereits erste Anzeichen, dass einige Banken sich überlegen, ihr Privatkundengeschäft einzustellen, um diesen Anforderungen zu entgehen.&lt;/p&gt;
&lt;/div&gt;
				
#sepa #banking #payments 
				
			</description>
			<content type="html"><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>SEPA Instant Payments (SCTInst) hat den europäischen Zahlungsverkehr nachhaltig verändert. Mit der Möglichkeit, Gelder in Echtzeit zwischen Banken zu transferieren, wird ein neuer Standard für Geschwindigkeit und Effizienz gesetzt. Ab 2025 wird dieser Standard für viele Banken in Europa verpflichtend: Der Gesetzgeber schreibt vor, dass alle Banken, die Privatkunden bedienen, auch SEPA Instant Payments anbieten müssen. Diese gesetzliche Vorgabe stellt viele Institute vor große Herausforderungen, und es gibt bereits erste Anzeichen, dass einige Banken sich überlegen, ihr Privatkundengeschäft einzustellen, um diesen Anforderungen zu entgehen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_herausforderungen_von_sepa_instant_payments">Die Herausforderungen von SEPA Instant Payments</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Mit der Einführung der gesetzlichen Verpflichtung wird SCTInst nicht nur zu einer technischen Herausforderung, sondern auch zu einem strategischen Thema. Banken müssen sicherstellen, dass sie ihre Infrastrukturen rechtzeitig anpassen, um Echtzeitzahlungen zuverlässig abzuwickeln. Die Kernanforderung dabei ist, dass jede Transaktion innerhalb von Sekunden abgeschlossen sein muss, unabhängig von der Last auf dem System oder der Anzahl der gleichzeitig ablaufenden Transaktionen.</p>
</div>
<div class="paragraph">
<p>Hier kommen die strukturellen Herausforderungen vieler Banken zum Tragen, die weiterhin auf traditionelle Architekturen und Prozesse setzen. Besonders problematisch sind Systeme, die auf sequentielle Verarbeitung oder die Verwendung von Queues angewiesen sind. Solche Ansätze können in einer Umgebung, die auf sofortige Transaktionsverarbeitung ausgelegt ist, zu erheblichen Verzögerungen führen und damit die gesetzlich vorgegebenen Zeitfenster für SEPA Instant Payments gefährden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_traditionelle_architekturen_und_ihre_limitationen">Traditionelle Architekturen und ihre Limitationen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Viele Banken arbeiten nach wie vor mit etablierten, bewährten Infrastrukturen, die auf eine zuverlässige, aber nicht unbedingt schnelle Transaktionsverarbeitung ausgelegt sind. Diese Architekturen haben in der Vergangenheit gut funktioniert, stoßen jedoch an ihre Grenzen, wenn sie Echtzeitzahlungen in der erforderlichen Geschwindigkeit und Parallelität verarbeiten müssen.</p>
</div>
<div class="paragraph">
<p>Die sequentielle Abarbeitung von Transaktionen über Queues kann in einem Echtzeit-Zahlungssystem problematisch sein. Selbst geringfügige Verzögerungen summieren sich und können dazu führen, dass die gesamte Zahlungsabwicklung ins Stocken gerät. Für Banken, die ab 2025 verpflichtet sind, Instant Payments anzubieten, kann dies nicht nur technische Schwierigkeiten mit sich bringen, sondern auch zu regulatorischen Risiken führen, wenn die gesetzlichen Vorgaben nicht erfüllt werden.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_der_drang_zur_modernisierung">Der Drang zur Modernisierung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Um den gesetzlichen Anforderungen gerecht zu werden und gleichzeitig im Wettbewerb bestehen zu können, müssen Banken ihre Infrastrukturen modernisieren. Der Übergang zu modernen, parallelen und asynchronen Verarbeitungssystemen wird unerlässlich. Diese Systeme sind in der Lage, mehrere Transaktionen gleichzeitig zu verarbeiten und so die strengen Zeitvorgaben von SEPA Instant Payments zu erfüllen.</p>
</div>
<div class="paragraph">
<p>Moderne Architekturen minimieren Latenzen und optimieren die Ressourcennutzung. Sie bieten die notwendige Skalierbarkeit, um auch bei hoher Belastung konstant gute Leistungen zu erbringen. Banken, die rechtzeitig auf solche Systeme umstellen, werden in der Lage sein, die gesetzlichen Vorgaben nicht nur zu erfüllen, sondern auch einen Wettbewerbsvorteil zu erzielen, indem sie ihren Kunden einen schnellen und zuverlässigen Zahlungsverkehr bieten.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_konsequenzen_für_das_privatkundengeschäft">Konsequenzen für das Privatkundengeschäft</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die bevorstehende Verpflichtung zur Einführung von SEPA Instant Payments hat bereits erste strategische Überlegungen innerhalb der Bankenlandschaft angestoßen. Einige Institute erwägen, sich ganz aus dem Privatkundengeschäft zurückzuziehen, um den Anforderungen und den damit verbundenen Investitionen zu entgehen. Dies zeigt, wie weitreichend die Auswirkungen der gesetzlichen Vorgaben sein können.</p>
</div>
<div class="paragraph">
<p>Für Banken, die weiterhin im Privatkundengeschäft aktiv bleiben möchten, führt kein Weg an einer umfassenden Modernisierung ihrer Zahlungsverkehrsinfrastruktur vorbei. Die Investitionen in moderne Technologien und Architekturen sind nicht nur notwendig, um die gesetzlichen Anforderungen zu erfüllen, sondern auch, um die Erwartungen der Kunden an eine schnelle und zuverlässige Zahlungsabwicklung zu erfüllen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit_handlungsbedarf_für_banken">Fazit: Handlungsbedarf für Banken</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Mit der bevorstehenden gesetzlichen Verpflichtung zur Einführung von SEPA Instant Payments wird die Modernisierung der Zahlungsverkehrsinfrastruktur für viele Banken zur dringenden Notwendigkeit. Traditionelle, queue-basierte Systeme sind nicht in der Lage, die Anforderungen an Geschwindigkeit und Parallelität zu erfüllen, die für Echtzeitzahlungen erforderlich sind.</p>
</div>
<div class="paragraph">
<p>Banken, die weiterhin im Privatkundengeschäft tätig sein möchten, müssen jetzt handeln. Die Umstellung auf moderne, nicht-blockierende Technologien wird nicht nur die Einhaltung gesetzlicher Vorgaben sicherstellen, sondern auch die Grundlage für zukünftigen Erfolg im hart umkämpften Markt für Zahlungsverkehrsdienste legen.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Chaos-Testing: Ein Leitfaden für Resilienz in Software-Systemen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2024-08-11-chaos-testing/</link>
			<pubDate>Sat, 10 Aug 2024 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2024-08-11-chaos-testing/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In der heutigen digitalisierten Welt ist die Zuverlässigkeit von Software-Systemen von entscheidender Bedeutung. Systeme müssen nicht nur unter normalen Bedingungen funktionieren, sondern auch in der Lage sein, unter extremen und unvorhergesehenen Bedingungen zu bestehen. Hier kommt Chaos-Testing ins Spiel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_was_ist_chaos_testing&#34;&gt;Was ist Chaos-Testing?&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Chaos-Testing ist eine experimentelle Technik zur Beurteilung der Resilienz eines Systems, indem es absichtlich in einen Zustand von Chaos oder Störungen versetzt wird. Das Ziel ist, Schwachstellen aufzudecken, die unter normalen Umständen verborgen bleiben könnten. Diese Methode wurde ursprünglich von Netflix mit ihrem Tool &amp;#34;Chaos Monkey&amp;#34; populär gemacht, das gezielt Instanzen in der Produktionsumgebung herunterfährt, um die Robustheit des Systems zu testen.&lt;/p&gt;
&lt;/div&gt;
				
#test #software 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In der heutigen digitalisierten Welt ist die Zuverlässigkeit von Software-Systemen von entscheidender Bedeutung. Systeme müssen nicht nur unter normalen Bedingungen funktionieren, sondern auch in der Lage sein, unter extremen und unvorhergesehenen Bedingungen zu bestehen. Hier kommt Chaos-Testing ins Spiel.</p>
</div>
<div class="sect1">
<h2 id="_was_ist_chaos_testing">Was ist Chaos-Testing?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Chaos-Testing ist eine experimentelle Technik zur Beurteilung der Resilienz eines Systems, indem es absichtlich in einen Zustand von Chaos oder Störungen versetzt wird. Das Ziel ist, Schwachstellen aufzudecken, die unter normalen Umständen verborgen bleiben könnten. Diese Methode wurde ursprünglich von Netflix mit ihrem Tool &#34;Chaos Monkey&#34; populär gemacht, das gezielt Instanzen in der Produktionsumgebung herunterfährt, um die Robustheit des Systems zu testen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_gründe_für_chaos_testing">Gründe für Chaos-Testing</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Traditionelle Testszenarien konzentrieren sich darauf, sicherzustellen, dass Systeme unter normalen und vorhersehbaren Bedingungen korrekt funktionieren. Doch was passiert, wenn unerwartete Ereignisse eintreten? Netzwerkausfälle, Überlastungen, plötzliche Serverausfälle – all das sind reale Szenarien, die ein System zum Absturz bringen können, wenn es nicht darauf vorbereitet ist.</p>
</div>
<div class="paragraph">
<p>Chaos-Testing bietet hier mehrere Vorteile:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><em>Aufdecken von Systemschwachstellen</em>: Es identifiziert Bereiche, in denen das System möglicherweise versagt oder unter Leistungsproblemen leidet.</p>
</li>
<li>
<p><em>Verbesserung der Resilienz</em>: Durch die Simulation von Störungen kann das System so konfiguriert werden, dass es auch unter extremen Bedingungen robust bleibt.</p>
</li>
<li>
<p><em>Proaktives Management von Problemen</em>: Potenzielle Probleme können im Voraus identifiziert und behoben werden, anstatt erst auf Fehler zu warten und dann zu reagieren.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_der_ablauf_eines_chaos_tests">Der Ablauf eines Chaos-Tests</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Chaos-Testing folgt einem strukturierten Ansatz, der auf wissenschaftlichen Experimenten basiert:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><em>Formulierung einer Hypothese</em>: Eine Hypothese über das Verhalten des Systems unter bestimmten Bedingungen wird definiert. Ein Beispiel könnte lauten: „Wenn ein Server abstürzt, sollte der Datenverkehr ohne Unterbrechung auf einen anderen Server umgeleitet werden.&#34;</p>
</li>
<li>
<p><em>Einleiten der Störung</em>: Eine kontrollierte Störung wird im System eingeführt, z. B. durch das Abschalten eines Servers oder das Drosseln der Netzwerkbandbreite.</p>
</li>
<li>
<p><em>Beobachtung und Messung</em>: Das Systemverhalten wird während und nach der Störung überwacht. Es wird überprüft, ob die Hypothese bestätigt wurde und ob unerwartete Fehler aufgetreten sind.</p>
</li>
<li>
<p><em>Implementierung von Verbesserungen</em>: Auf Basis der Ergebnisse können Schwachstellen behoben und das System weiter optimiert werden.</p>
</li>
<li>
<p><em>Wiederholung des Tests</em>: Chaos-Testing ist ein kontinuierlicher Prozess. Nach jeder Runde sollten neue Hypothesen aufgestellt und getestet werden.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_best_practices_für_chaos_testing">Best Practices für Chaos-Testing</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><em>Kleinen Umfang wählen</em>: Zu Beginn sollten einfache und kontrollierte Störungen durchgeführt werden. Abhängig von den Ergebnissen können die Tests schrittweise komplexer gestaltet werden.</p>
</li>
<li>
<p><em>Automatisierung einsetzen</em>: Tools wie Chaos Monkey oder Gremlin können genutzt werden, um Störungen automatisiert und regelmäßig einzuführen. Dies macht Chaos-Testing zu einem integralen Bestandteil des Entwicklungsprozesses.</p>
</li>
<li>
<p><em>Testen in der Produktionsumgebung</em>: Chaos-Testing entfaltet die größte Wirkung, wenn es in der realen Produktionsumgebung durchgeführt wird. So wird sichergestellt, dass das System in einer echten Krise richtig reagiert.</p>
</li>
<li>
<p><em>Transparente Kommunikation</em>: Die Ziele und Methoden des Chaos-Tests sollten klar mit dem gesamten Team kommuniziert werden. Es ist wichtig, dass alle Beteiligten verstehen, warum diese Tests durchgeführt werden und welche Vorteile sie bieten.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_herausforderungen_beim_chaos_testing">Herausforderungen beim Chaos-Testing</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Obwohl Chaos-Testing viele Vorteile bietet, gibt es auch Herausforderungen. Es erfordert sorgfältige Planung und eine Kultur, die bereit ist, Risiken einzugehen. Es besteht immer die Möglichkeit, dass ein Chaos-Test unerwartete Auswirkungen hat, die zu Ausfallzeiten führen können. Daher ist es entscheidend, Notfallpläne und Wiederherstellungsstrategien zu entwickeln.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fazit">Fazit</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Chaos-Testing ist eine leistungsstarke Methode, um die Resilienz und Zuverlässigkeit von Software-Systemen zu gewährleisten. In einer Welt, in der Ausfallzeiten nicht nur finanziellen Schaden, sondern auch Vertrauensverlust verursachen können, ist es unerlässlich, auf das Unerwartete vorbereitet zu sein. Durch Chaos-Testing kann sichergestellt werden, dass Systeme auch in extremen Situationen stabil bleiben und den Anforderungen der Nutzer gerecht werden.</p>
</div>
<div class="paragraph">
<p>Dieser experimentelle Ansatz ermöglicht es, Schwachstellen aufzudecken, bevor sie zu ernsthaften Problemen werden, und stellt sicher, dass Software-Systeme robust und widerstandsfähig sind – unabhängig davon, was die Zukunft bringt.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Agile Methoden in der Bankenwelt: Eine perfekte Kombination für unperfekte Anforderungen</title>
			<link>https://koetterheinri.ch/posts/service/2023-09-29-nearshore-und-scrum/</link>
			<pubDate>Fri, 29 Sep 2023 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2023-09-29-nearshore-und-scrum/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die Bankenbranche steht vor einer Vielzahl an Herausforderungen, von ständig wechselnden regulatorischen Anforderungen bis hin zu einer immer komplexer werdenden Technologielandschaft. In diesem Kontext sind flexible und effiziente Ansätze gefragt, die schnelle Anpassungen und iteratives Vorgehen ermöglichen. Agile Methoden haben sich als solch ein Ansatz bewährt und könnten einen entscheidenden Vorteil im Inland-Outsourcing darstellen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_die_grenzen_des_traditionellen_nearshoring&#34;&gt;Die Grenzen des traditionellen Nearshoring&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Bei klassischen Nearshoring-Projekten werden die Anforderungen häufig in einem Fachkonzept und einem Pflichtenheft festgehalten, welche dann an den Dienstleister übergeben werden. Anpassungen oder Diskussionen sind selten oder nur mit großem Aufwand möglich. Für Banken, die oft mit komplexen und sich rasch ändernden Anforderungen konfrontiert sind, kann diese Starrheit problematisch sein. Fehlende Flexibilität kann zu Projektverzögerungen, erhöhten Kosten und in letzter Konsequenz sogar zum Scheitern des Projekts führen.&lt;/p&gt;
&lt;/div&gt;
				
#nearshore #scrum 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Die Bankenbranche steht vor einer Vielzahl an Herausforderungen, von ständig wechselnden regulatorischen Anforderungen bis hin zu einer immer komplexer werdenden Technologielandschaft. In diesem Kontext sind flexible und effiziente Ansätze gefragt, die schnelle Anpassungen und iteratives Vorgehen ermöglichen. Agile Methoden haben sich als solch ein Ansatz bewährt und könnten einen entscheidenden Vorteil im Inland-Outsourcing darstellen.</p>
</div>
<div class="sect1">
<h2 id="_die_grenzen_des_traditionellen_nearshoring">Die Grenzen des traditionellen Nearshoring</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Bei klassischen Nearshoring-Projekten werden die Anforderungen häufig in einem Fachkonzept und einem Pflichtenheft festgehalten, welche dann an den Dienstleister übergeben werden. Anpassungen oder Diskussionen sind selten oder nur mit großem Aufwand möglich. Für Banken, die oft mit komplexen und sich rasch ändernden Anforderungen konfrontiert sind, kann diese Starrheit problematisch sein. Fehlende Flexibilität kann zu Projektverzögerungen, erhöhten Kosten und in letzter Konsequenz sogar zum Scheitern des Projekts führen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_flexibilität_des_agilen_inland_outsourcing">Die Flexibilität des agilen Inland-Outsourcing</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Agile Methoden bieten die Möglichkeit, Anforderungen und Lösungen kontinuierlich und in enger Zusammenarbeit mit dem Kunden zu erarbeiten. Durch den Einsatz von funktionsübergreifenden Teams, regelmäßigen Abstimmungen und iterativen Entwicklungszyklen wird eine höhere Flexibilität und Effizienz erreicht. Dieser Ansatz ist besonders wertvoll für Banken, da er es ermöglicht, schnell und effizient auf Änderungen im regulatorischen Umfeld oder bei den Kundenerwartungen zu reagieren.</p>
</div>
<div class="paragraph">
<p>Mit dem Einsatz von agilen Methoden im Inland-Outsourcing positioniert sich die Bank nicht nur als flexibler und anpassungsfähiger Marktteilnehmer, sondern erzielt auch einen Wettbewerbsvorteil durch die schnelle und effiziente Umsetzung von Projekten.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_vertrauen_durch_nähe_und_kulturelle_übereinstimmung">Vertrauen durch Nähe und kulturelle Übereinstimmung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Während Nearshoring vor allem für seine Kostenvorteile bekannt ist, bietet Inland-Outsourcing den Vorteil der geographischen und kulturellen Nähe. Dies erleichtert nicht nur die Kommunikation, sondern stärkt auch das gegenseitige Vertrauen. Im Bankensektor, wo vertrauliche Daten und hohe Sicherheitsstandards eine große Rolle spielen, kann diese Nähe ein entscheidender Faktor sein.</p>
</div>
<div class="paragraph">
<p>Darüber hinaus ermöglicht die geographische Nähe spontane persönliche Treffen und enge Abstimmungen, die im Rahmen eines Nearshoring-Projekts aufwändiger wären. Dies kann besonders bei der Anwendung agiler Methoden vorteilhaft sein, da die schnelle und effiziente Abstimmung ein Schlüssel für den Projekterfolg ist.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_vom_wasserfall_modell_zum_agilen_paradigma">Vom Wasserfall-Modell zum agilen Paradigma</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wie bereits erwähnt, sind klassische Nearshoring-Projekte oft an das Wasserfall-Modell gebunden, bei dem Änderungen nur mit erheblichem Aufwand möglich sind. Ein agiles Paradigma erlaubt jedoch eine engere Zusammenarbeit mit dem Kunden, die eine kontinuierliche Verbesserung des Endprodukts ermöglicht.</p>
</div>
<div class="paragraph">
<p>Durch die Kombination von agilen Methoden und Inland-Outsourcing können Banken ein effizientes und flexibles Modell schaffen, das den speziellen Anforderungen der Branche gerecht wird. Die Effizienzsteigerung ergibt sich dabei nicht nur durch die Anwendung agiler Prinzipien, sondern auch durch die Minimierung von Risiken, die mit kulturellen und geographischen Distanzen einhergehen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_anpassungsfähigkeit_als_erfolgsfaktor">Anpassungsfähigkeit als Erfolgsfaktor</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Finanzbranche ist von ständigen Veränderungen geprägt, sei es durch gesetzliche Auflagen, technologische Fortschritte oder Veränderungen im Verbraucherverhalten. In einem so dynamischen Umfeld ist die Fähigkeit zur schnellen Anpassung und Flexibilität unabdingbar. Agile Methoden können hier einen klaren Vorteil bieten, da sie den Prozess der Anpassung und Optimierung erleichtern.</p>
</div>
<div class="paragraph">
<p>Auch wenn Nearshoring ein kostengünstiges Modell darstellen kann, wird oft unterschätzt, wie viel Zeit und Aufwand in die Einarbeitung und Abstimmung mit einem entfernten Team fließen muss. Hinzu kommen Unsicherheiten, etwa durch Mitarbeiterfluktuation, die in Nearshoring-Projekten durchaus höher sein kann. All diese Faktoren können die Kostenvorteile schnell zunichtemachen.</p>
</div>
<div class="paragraph">
<p>Inland-Outsourcing hat hier den Vorteil der Beständigkeit und der Möglichkeit, ein langfristiges, zuverlässiges Team aufzubauen. Dieses Team kann dann nicht nur technisches Know-How, sondern auch fachliche Expertise im Bankenbereich entwickeln. Das reduziert nicht nur Risiken, sondern spart auch wertvolle Zeit bei der Umsetzung von Projekten. Wenn dieses Modell zudem mit agilen Methoden kombiniert wird, ergibt sich eine starke, zukunftsorientierte Lösung, die den spezifischen Anforderungen des Bankensektors mehr als gerecht wird.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Inland-Outsourcing im Bankensektor: Vom Mythos der Kosteneffizienz zum Mehrwert der Expertise</title>
			<link>https://koetterheinri.ch/posts/service/2023-09-26-inland-outsourcing-im-bankensektor/</link>
			<pubDate>Tue, 26 Sep 2023 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2023-09-26-inland-outsourcing-im-bankensektor/</guid>
			<description>
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_die_bedeutung_des_outsourcings_im_bankensektor&#34;&gt;Die Bedeutung des Outsourcings im Bankensektor&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Outsourcing ist für Banken schon lange kein Fremdwort mehr. Ob im Back-End-Bereich, bei der Datenverarbeitung oder im Kundenservice, die Auslagerung von Geschäftsprozessen ist eine bewährte Strategie, um sich auf das Kerngeschäft zu konzentrieren. Dabei stehen Banken vor der Entscheidung, ob sie Dienstleistungen im In- oder Ausland outsourcen sollten. Gerade in Zeiten der Digitalisierung und regulatorischen Veränderungen, wie etwa durch PSD2, zeigt sich, dass Outsourcing-Strategien neu bewertet werden müssen.&lt;/p&gt;
&lt;/div&gt;
				
#nearshore 
				
			</description>
			<content type="html"><![CDATA[<div class="sect1">
<h2 id="_die_bedeutung_des_outsourcings_im_bankensektor">Die Bedeutung des Outsourcings im Bankensektor</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Outsourcing ist für Banken schon lange kein Fremdwort mehr. Ob im Back-End-Bereich, bei der Datenverarbeitung oder im Kundenservice, die Auslagerung von Geschäftsprozessen ist eine bewährte Strategie, um sich auf das Kerngeschäft zu konzentrieren. Dabei stehen Banken vor der Entscheidung, ob sie Dienstleistungen im In- oder Ausland outsourcen sollten. Gerade in Zeiten der Digitalisierung und regulatorischen Veränderungen, wie etwa durch PSD2, zeigt sich, dass Outsourcing-Strategien neu bewertet werden müssen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_qualität_vor_preis_warum_inland_outsourcing">Qualität vor Preis: Warum Inland-Outsourcing?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Es ist ein weitverbreiteter Irrglaube, dass Offshoring oder Nearshoring die kosteneffizienteren Alternativen sind. Diese Sichtweise berücksichtigt jedoch nicht die versteckten Kosten, die durch Kommunikationsschwierigkeiten, kulturelle Differenzen oder unterschiedliche regulatorische Standards entstehen können.</p>
</div>
<div class="paragraph">
<p>Inland-Outsourcing bietet eine qualitativ hochwertige und sichere Alternative. Insbesondere in Deutschland, einer der stärksten Finanzmärkte der Welt, sind Outsourcing-Partner mit der komplexen regulatorischen Landschaft und den hohen Sicherheitsanforderungen vertraut, die der Bankensektor mit sich bringt.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_diskussion_statt_reine_umsetzung">Diskussion statt reine Umsetzung</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In der Softwareentwicklung für Banken geht es nicht nur um die Implementierung von Code, sondern um die Lösung komplexer Problemstellungen. Lokale Anbieter, die den Bankensektor gut kennen, können hier viel mehr als nur „Code-Schreiber“ sein. Sie können als strategische Partner fungieren, die die Geschäftsprozesse und Herausforderungen der Banken verstehen und in der Lage sind, entsprechende Lösungen proaktiv anzubieten.</p>
</div>
<div class="paragraph">
<p>Das beginnt schon in der Konzeptionsphase: Anstatt nur die vorgegebenen Anforderungen zu erfüllen, hinterfragen lokale Dienstleister diese kritisch. Die räumliche und kulturelle Nähe ermöglicht einen fortlaufenden und tiefgehenden Dialog. Dies führt nicht nur zu besseren Endprodukten, sondern spart oft auch Kosten, da ineffiziente oder sogar riskante Ansätze frühzeitig erkannt und vermieden werden können.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_komplexität_beherrschen_der_einfluss_des_fachwissens">Komplexität beherrschen: Der Einfluss des Fachwissens</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Im Bankensektor spielt die richtige Balance zwischen Funktionalität und Komplexität eine entscheidende Rolle. Allzu oft werden IT-Projekte mit einer Fülle von Features und Funktionen ausgestattet, die in der Praxis kaum Anwendung finden oder die Nutzer überfordern. Hier bieten inländische Dienstleister einen signifikanten Vorteil: Durch ihr tiefergehendes Verständnis der Branche und die enge Zusammenarbeit mit dem Kunden können sie gezielt Lösungen entwickeln, die auf den Punkt genau das bieten, was benötigt wird. Dies spart nicht nur Entwicklungskosten, sondern vereinfacht auch den weiteren Betrieb und die Wartung der Systeme.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_sicherheitsaspekte_und_compliance_ein_nicht_zu_unterschätzender_faktor">Sicherheitsaspekte und Compliance: Ein nicht zu unterschätzender Faktor</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Einhaltung von gesetzlichen Rahmenbedingungen und internen Sicherheitsrichtlinien ist im Bankensektor von essenzieller Bedeutung. Bei der Auslagerung an ausländische Dienstleister können hier Unsicherheiten auftreten, da es oft schwierig ist, die Einhaltung dieser Standards zu überprüfen oder bei Verstößen angemessen zu reagieren. Inländische Partner sind nicht nur mit den lokalen Gesetzen und Regulierungen vertraut, sie können auch einfacher in bestehende Auditing-Prozesse integriert werden. Dies minimiert Risiken und vereinfacht die Compliance.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_der_mehrwert_von_partnerschaft_und_vertrauen">Der Mehrwert von Partnerschaft und Vertrauen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eine oft unterschätzte Komponente bei der Auslagerung von Dienstleistungen ist das Vertrauensverhältnis zwischen Auftraggeber und Dienstleister. Gerade im sensiblen Bereich der Finanzdienstleistungen ist Vertrauen ein unverzichtbarer Faktor. Durch die geographische Nähe und kulturelle Vertrautheit ist es deutlich einfacher, ein solches Vertrauensverhältnis mit inländischen Partnern aufzubauen und zu pflegen. Dies kann sich positiv auf die Qualität der Zusammenarbeit und die Zufriedenheit aller Beteiligten auswirken.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_geschwindigkeit_und_flexibilität_als_entscheidende_faktoren">Geschwindigkeit und Flexibilität als entscheidende Faktoren</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In einer sich schnell verändernden Welt sind Agilität und Anpassungsfähigkeit entscheidende Erfolgsfaktoren, auch für Banken. Traditionelle Outsourcing-Modelle stoßen hier oft an ihre Grenzen, insbesondere wenn es darum geht, kurzfristig auf Änderungen im Markt oder bei regulatorischen Vorgaben zu reagieren. Inländische Dienstleister können durch ihre geografische und kulturelle Nähe deutlich schneller und flexibler auf solche Veränderungen reagieren. Sie können beispielsweise kurzfristige Meetings organisieren oder schneller auf unvorhergesehene Ereignisse reagieren, die eine Anpassung der Outsourcing-Strategie erforderlich machen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_nachhaltigkeit_und_langfristige_beziehungen">Nachhaltigkeit und langfristige Beziehungen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Die Auslagerung an inländische Dienstleister eröffnet die Möglichkeit, langfristige und nachhaltige Beziehungen aufzubauen. Dies ist nicht nur in Hinblick auf Vertrauen und Qualität von Vorteil, sondern ermöglicht auch eine stärkere Integration der ausgelagerten Dienstleistungen in die Geschäftsstrategie der Bank. Anstatt lediglich als &#34;Lieferant&#34; gesehen zu werden, entwickelt sich der inländische Dienstleister zu einem echten Partner, der proaktiv zur Weiterentwicklung des Geschäfts beiträgt.
Ein Fazit: Mehr als nur Kostenersparnis</p>
</div>
<div class="paragraph">
<p>Die Entscheidung für oder gegen das Outsourcing von Dienstleistungen im Bankensektor sollte nicht allein unter dem Gesichtspunkt der Kosten getroffen werden. Wie dieser Artikel aufzeigt, bieten inländische Dienstleister eine Reihe von Vorteilen, die über die rein finanzielle Betrachtung hinausgehen. Von höherer Qualität und Sicherheit über eine engere, vertrauensvollere Zusammenarbeit bis hin zur Möglichkeit einer schnellen und flexiblen Anpassung an veränderte Rahmenbedingungen – die Argumente für das Inland-Outsourcing sind vielfältig und überzeugend.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Die Illusion der Kosteneffizienz: Warum Inlandsvergabe für Banken die intelligentere Wahl sein kann</title>
			<link>https://koetterheinri.ch/posts/service/2023-09-24-illusion-der-kosteneffizienz/</link>
			<pubDate>Sun, 24 Sep 2023 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2023-09-24-illusion-der-kosteneffizienz/</guid>
			<description>
&lt;div class=&#34;sect1&#34;&gt;
&lt;h2 id=&#34;_wirtschaftlichkeit_und_risikomanagement_im_bankensektor&#34;&gt;Wirtschaftlichkeit und Risikomanagement im Bankensektor&lt;/h2&gt;
&lt;div class=&#34;sectionbody&#34;&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In der modernen Welt der Banken und Finanzinstitute ist die Wahl der richtigen Outsourcing-Strategie für Softwareentwicklung mehr als nur eine Frage der Kosten. Es ist eine Entscheidung, die sowohl die Wirtschaftlichkeit als auch das Risikomanagement betrifft. Nearshoring, die Auslagerung von Dienstleistungen an nahegelegene Länder, wird oft als kostengünstige Option präsentiert. Die nackten Zahlen scheinen diese Ansicht zu bestätigen: Ein Beispiel zeigt einen Tagessatz von 440€ für Nearshoring gegenüber 750€ für die Inlandsvergabe.&lt;/p&gt;
&lt;/div&gt;
				
#nearshore 
				
			</description>
			<content type="html"><![CDATA[<div class="sect1">
<h2 id="_wirtschaftlichkeit_und_risikomanagement_im_bankensektor">Wirtschaftlichkeit und Risikomanagement im Bankensektor</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In der modernen Welt der Banken und Finanzinstitute ist die Wahl der richtigen Outsourcing-Strategie für Softwareentwicklung mehr als nur eine Frage der Kosten. Es ist eine Entscheidung, die sowohl die Wirtschaftlichkeit als auch das Risikomanagement betrifft. Nearshoring, die Auslagerung von Dienstleistungen an nahegelegene Länder, wird oft als kostengünstige Option präsentiert. Die nackten Zahlen scheinen diese Ansicht zu bestätigen: Ein Beispiel zeigt einen Tagessatz von 440€ für Nearshoring gegenüber 750€ für die Inlandsvergabe.</p>
</div>
<div class="paragraph">
<p>Aber ist das wirklich die ganze Geschichte? Lassen sich Qualität, Fachkompetenz und Risikomanagement in Euro und Cent messen? Der bloße Vergleich von Tagessätzen blendet wichtige Aspekte aus, die für Banken von zentraler Bedeutung sind.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_versteckte_kosten_und_die_bedeutung_der_fachkompetenz">Versteckte Kosten und die Bedeutung der Fachkompetenz</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Beispielsweise kann ein Projektumfang von 440 Personentagen (PT) bei einer ersten Betrachtung für Nearshoring sprechen. Jedoch muss man zusätzliche Faktoren berücksichtigen, die die Wirtschaftlichkeitsberechnung verändern. Für Nearshoring fallen in unserem Beispiel zusätzlich 100 PT für die Einarbeitung an, während diese bei der Inlandsvergabe entfallen. Darüber hinaus gibt es bei der Inlandsvergabe einen Fachkompetenz-Vorsprung, der mit etwa 80 PT beziffert werden kann.</p>
</div>
<div class="paragraph">
<p>Auch die Schnelligkeit der Kommunikation spielt eine Rolle. Das Kommunikationstempo muss beim Nearshoring oft erhöht werden, was in unserem Beispiel weitere 50 PT kostet. Bei der Inlandsvergabe ist dieses Problem durch die räumliche und kulturelle Nähe geringer, was die Kommunikation effizienter macht.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ein_faktor_der_oft_übersehen_wird_langfristige_partnerschaften">Ein Faktor, der oft übersehen wird: Langfristige Partnerschaften</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Im Rahmen einer langjährigen Partnerschaft kann das Inland-Dienstleistungsunternehmen die Infrastruktur und die fachlichen Zusammenhänge besser verstehen. Dies führt zu einer Einsparung von etwa 20 PT im Vergleich zum Nearshoring. Auch das bessere Verständnis der fachlichen Zusammenhänge kann zusätzlich 30 PT einsparen. Zwar wird das Know-how auch bei einer längeren Partnerschaft mit einem Nearshore-Center aufgebaut, jedoch kann hier die Fluktuation höher sein, was die Kontinuität und somit die Qualität der Arbeit beeinträchtigen kann.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_risikomanagement_und_regulatorische_anforderungen">Risikomanagement und regulatorische Anforderungen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Für Banken ist es aufgrund der regulatorischen Anforderungen wie der Bankaufsichtlichen Anforderungen an die IT (BAIT) unerlässlich, sich Gedanken über eine mögliche Trennung vom Dienstleister zu machen. Auch das sogenannte Provider-Management spielt hier eine Rolle. Beide Aspekte stellen Risiken dar, die bei der Wahl der Outsourcing-Strategie berücksichtigt werden sollten. Sie lassen sich zwar nicht exakt quantifizieren, jedoch gibt es vermutlich Unterschiede bei den Wahrscheinlichkeiten für diese Risiken, je nachdem, ob man sich für Nearshoring oder Inlandsvergabe entscheidet.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_die_verschmelzung_beider_welten">Die Verschmelzung beider &#34;Welten&#34;</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Interessanterweise kann Nearshoring auch durch Inlands-Dienstleister verwendet werden. Durch die Kombination der beiden Modelle könnten Risiken wie die Fluktuation reduziert werden. Dies eröffnet neue Möglichkeiten für eine optimale Strategie, die die Vorteile beider Modelle kombiniert.</p>
</div>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>JavaEE-Anwendung im Docker-Container</title>
			<link>https://koetterheinri.ch/posts/java/2020-11-28-javaee-im-docker-container/</link>
			<pubDate>Sat, 28 Nov 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/java/2020-11-28-javaee-im-docker-container/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Anwendungen kommen selten ohne Datenbank aus.
Bei JavaEE-Anwendungen ist es so, dass im Application-Server eine Datasource mit
den benötigten Anmeldeinformationen für die Datenbank definiert wird.
Über einen JNDI-Namen findet die Anwendung dann diese Datasource.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Wenn man einen Docker-Container automatisch starten möchte,
muss man auch eine Datasource automatisch einrichten.
JavaEE ermöglicht dies z.B. über die &lt;a href=&#34;https://blog.payara.fish/deploying-data-source-configuration&#34;&gt;web.xml&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In der Regel werden über System-Variablen bei Cloud-Anbietern Passwörter
als Secrets an einen Docker-Container übergeben.
Leider löst nicht jeder Application-Server System-Variablen in einer web.xml auf.
Auch die nachfolgende Lösung wird nicht von jedem Application-Server unterstützt.
Auf die eine oder andere Art lässt sich aber das Anlegen einer Datasource für jeden Application-Server automatisieren.
Und in einem Shell-Skript kann auch auf System-Variablen zugegriffen werden.&lt;/p&gt;
&lt;/div&gt;
				
#java #javaee #docker 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Anwendungen kommen selten ohne Datenbank aus.
Bei JavaEE-Anwendungen ist es so, dass im Application-Server eine Datasource mit
den benötigten Anmeldeinformationen für die Datenbank definiert wird.
Über einen JNDI-Namen findet die Anwendung dann diese Datasource.</p>
</div>
<div class="paragraph">
<p>Wenn man einen Docker-Container automatisch starten möchte,
muss man auch eine Datasource automatisch einrichten.
JavaEE ermöglicht dies z.B. über die <a href="https://blog.payara.fish/deploying-data-source-configuration">web.xml</a></p>
</div>
<div class="paragraph">
<p>In der Regel werden über System-Variablen bei Cloud-Anbietern Passwörter
als Secrets an einen Docker-Container übergeben.
Leider löst nicht jeder Application-Server System-Variablen in einer web.xml auf.
Auch die nachfolgende Lösung wird nicht von jedem Application-Server unterstützt.
Auf die eine oder andere Art lässt sich aber das Anlegen einer Datasource für jeden Application-Server automatisieren.
Und in einem Shell-Skript kann auch auf System-Variablen zugegriffen werden.</p>
</div>
<div class="paragraph">
<p>Hier ein Beispiel für ein Skript, das automatisch von Payara ausgeführt werden kann:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>#!/bin/bash

# Check required variables are set
if [ -z $DB_USER ]; then
  echo &#34;Variable DB_USER is not set.&#34;
  exit 1
fi
if [ -z $DB_PASSWORD ]; then
  echo &#34;Variable DB_PASSWORD is not set.&#34;
  exit 1
fi
if [ -z $DB_NAME ]; then
  echo &#34;Variable DB_NAME is not set.&#34;
  exit 1
fi
if [ -z $DB_HOST ]; then
  echo &#34;Variable DB_HOST is not set.&#34;
  exit 1
fi
if [ -z $DB_PORT ]; then
  echo &#34;Variable DB_PORT is not set.&#34;
  exit 1
fi
if [ -z $POSTBOOT_COMMANDS ]; then
  echo &#34;Variable POSTBOOT_COMMANDS is not set.&#34;
  exit 1
fi

# Create post boot command files if it doesn&#39;t exist
touch $POSTBOOT_COMMANDS

echo &#34;Adding creation of datasource to post boot commands&#34;
echo &#34;create-jdbc-connection-pool --datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource --restype javax.sql.ConnectionPoolDataSource --property user=${DB_USER}:password=${DB_PASSWORD}:DatabaseName=${DB_NAME}:ServerName=${DB_HOST}:port=${DB_PORT} carPool&#34; &gt;&gt;$POSTBOOT_COMMANDS
echo &#34;ping-connection-pool carPool&#34; &gt;&gt;$POSTBOOT_COMMANDS
echo &#34;create-jdbc-resource --connectionpoolid=carPool jdbc/car&#34; &gt;&gt;$POSTBOOT_COMMANDS
echo &#34;list-jdbc-resources&#34; &gt;&gt;$POSTBOOT_COMMANDS

export DB_PASSWORD=&#34;&#34;
echo $DB_USER
echo $DB_PASSWORD</pre>
</div>
</div>
<div class="paragraph">
<p>Bitte nicht darüber wundern, dass hier über <code>echo $DB_PASSWORD</code> der Inhalt der System-Variablen ausgegeben wird.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Wird der Wert zuvor auf einen Leerstring gesetzt, was hier überprüft werden soll.</p>
</li>
<li>
<p>Secrets werden von den Systemen der Cloud-Anbieter durch Sterne (&#34;*&#34;) ersetzt, wenn sie geloggt werden.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Auf <a href="https://github.com/cybi/car">GitHub</a> habe ich ein Beispiel-Projekt erstellt, mit dem lokal über docker-compose.yml ein Container mit einer PostgresQL-Datenbank und ein Container mit dem Application-Server und der installierten Anwendung gestartet werden kann.</p>
</div>
<div class="paragraph">
<p>Das entscheidene an diesem Projektaufbau ist, dass der Docker-Container mit dem Application-Server und der installierten Anwendung 1:1 bei einem Cloud-Anbieter installiert werden kann. Für den Container müssen nur die im Shell-Skript oben beschriebenen System-Variablen angegeben werden, damit die Anwendung eine Verbindung zur Datenbank aufbauen kann.</p>
</div>
<div class="paragraph">
<p>In einem weiteren <a href="https://github.com/cybi/archetype-javaee-vaadin-docker">GitHub-Repository</a> habe ich einen Maven-Archetype erstellt, mit dem man das car-Projekt erstellen kann.
Mit der Property <em>dataSourcePrefix</em> kann die Datasource minimal individualisiert werden.</p>
</div>
<div class="paragraph">
<p>Das Projekt zeige ich auch in einem Demo-Video auf YouTube:</p>
</div>
<div class="videoblock">
<div class="content">
<iframe src="https://www.youtube.com/embed/XxgXR-B4PeM?rel=0" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Wie kann man einen GitHub Actions Workflow manuell ausführen?</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2020-08-17-github-action-workflow-manuell-ausfuehren/</link>
			<pubDate>Mon, 17 Aug 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2020-08-17-github-action-workflow-manuell-ausfuehren/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Der &lt;a href=&#34;https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/&#34;&gt;Blog-Post&lt;/a&gt;
vom &lt;a href=&#34;https://github.blog&#34;&gt;GitHub-Blog&lt;/a&gt; beschreibt, wie man einen Workflow für GitHub Actions
manuell ausführen kann.
Da die in dem Beispiel verwendeten Paramter optional sind, reichen folgende zwei Zeilen aus:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;pre class=&#34;highlight&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;on:
  workflow_dispatch:&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
				
#github #git 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Der <a href="https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/">Blog-Post</a>
vom <a href="https://github.blog">GitHub-Blog</a> beschreibt, wie man einen Workflow für GitHub Actions
manuell ausführen kann.
Da die in dem Beispiel verwendeten Paramter optional sind, reichen folgende zwei Zeilen aus:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">on:
  workflow_dispatch:</code></pre>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Wann erzeugt man einen Pull-Request?</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2020-08-14-wann-erzeugt-man-einen-pull-request/</link>
			<pubDate>Fri, 14 Aug 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2020-08-14-wann-erzeugt-man-einen-pull-request/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Für Git gibt es diverse Workflows.
Diese werden auf den &lt;a href=&#34;https://www.atlassian.com/de/git/tutorials/comparing-workflows&#34;&gt;Seiten von Atlassian&lt;/a&gt; sehr gut beschrieben.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Vor kurzem kam in einem Projekt die Frage auf, wann ein Pull-Request erstellt werden muss.
Atlassian hat dazu aus meiner Sicht die perfekte &lt;a href=&#34;https://www.atlassian.com/de/git/tutorials/making-a-pull-request&#34;&gt;Antwort&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;pre&gt;Ein Entwickler übermittelt einfach einen Pull-Request, wenn ein Feature, Release oder Hotfix Branch überprüft werden muss&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Und wann sollte ein Branch überprüft werden?
Spätestens wenn ein neues Release erzeugt werden soll;
also wenn Änderungen von einem Branch in einen anderen gemergt werden,
aus dem ein Release erzeugt werden soll.
Ein Pull-Request ist nämlich genau das: Ein Merge mit Review.&lt;/p&gt;
&lt;/div&gt;
				
#git 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Für Git gibt es diverse Workflows.
Diese werden auf den <a href="https://www.atlassian.com/de/git/tutorials/comparing-workflows">Seiten von Atlassian</a> sehr gut beschrieben.</p>
</div>
<div class="paragraph">
<p>Vor kurzem kam in einem Projekt die Frage auf, wann ein Pull-Request erstellt werden muss.
Atlassian hat dazu aus meiner Sicht die perfekte <a href="https://www.atlassian.com/de/git/tutorials/making-a-pull-request">Antwort</a>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>Ein Entwickler übermittelt einfach einen Pull-Request, wenn ein Feature, Release oder Hotfix Branch überprüft werden muss</pre>
</div>
</div>
<div class="paragraph">
<p>Und wann sollte ein Branch überprüft werden?
Spätestens wenn ein neues Release erzeugt werden soll;
also wenn Änderungen von einem Branch in einen anderen gemergt werden,
aus dem ein Release erzeugt werden soll.
Ein Pull-Request ist nämlich genau das: Ein Merge mit Review.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Wie ändere ich Inhalte für meine Hugo-Website?</title>
			<link>https://koetterheinri.ch/posts/service/2020-05-21-hugo-website-inhalte-hinzufuegen/</link>
			<pubDate>Tue, 28 Jul 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-05-21-hugo-website-inhalte-hinzufuegen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Da ich auf &lt;a href=&#34;https://www.fiverr.com/share/yepyo0&#34;&gt;Fiverr&lt;/a&gt; den Service anbiete, eine Website bzw. einen Blog auf GitHub einzurichten, kommt immer mal wieder die Frage auf, wie man denn Inhalte hinzufügt.
Das erkläre ich in meinem neuen Video auf &lt;a href=&#34;https://m.youtube.com/watch?v=dIGIbHYOgSo&#34;&gt;YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
				
#blog #Hugo 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Da ich auf <a href="https://www.fiverr.com/share/yepyo0">Fiverr</a> den Service anbiete, eine Website bzw. einen Blog auf GitHub einzurichten, kommt immer mal wieder die Frage auf, wie man denn Inhalte hinzufügt.
Das erkläre ich in meinem neuen Video auf <a href="https://m.youtube.com/watch?v=dIGIbHYOgSo">YouTube</a>.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Auf GitHub im Code navigieren</title>
			<link>https://koetterheinri.ch/posts/service/2020-05-21-github-code-navigation/</link>
			<pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-05-21-github-code-navigation/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich habe gerade ein wenig auf GitHub in einem Repository gestöbert und plötzlich
wurde mir &amp;#34;Code navigation available!&amp;#34; angezeigt.
Unter &lt;a href=&#34;https://help.github.com/en/github/managing-files-in-a-repository/navigating-code-on-github&#34;&gt;Navigating code on GitHub&lt;/a&gt;
kann man dazu mehr erfahren.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Jetzt kann man also z.B. für Java-Projekte zu den Referenzen oder der Definition von Methoden navigieren.
Das ermöglicht es auch online Klassenkonstrukte nachzuvollziehen.
Bisher musste man dafür ein Repository erst klonen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Also eine sehr willkommene neue Funktion!&lt;/p&gt;
&lt;/div&gt;
				
#github 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich habe gerade ein wenig auf GitHub in einem Repository gestöbert und plötzlich
wurde mir &#34;Code navigation available!&#34; angezeigt.
Unter <a href="https://help.github.com/en/github/managing-files-in-a-repository/navigating-code-on-github">Navigating code on GitHub</a>
kann man dazu mehr erfahren.</p>
</div>
<div class="paragraph">
<p>Jetzt kann man also z.B. für Java-Projekte zu den Referenzen oder der Definition von Methoden navigieren.
Das ermöglicht es auch online Klassenkonstrukte nachzuvollziehen.
Bisher musste man dafür ein Repository erst klonen.</p>
</div>
<div class="paragraph">
<p>Also eine sehr willkommene neue Funktion!</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>DocumentationTree als Package auf GitHub</title>
			<link>https://koetterheinri.ch/posts/service/2020-05-20-github-packages-documentationtree/</link>
			<pubDate>Wed, 20 May 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-05-20-github-packages-documentationtree/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Bisher habe ich nach jeder Änderung am DocumentationTree manuell die
JAR-Datei erzeugt und per E-Mail verteilt.
Mit GitHub Actions lässt sich so eine Aufgabe automatisieren
und mit GitHub Packages können Bibliotheken wie JAR-Dateien veröffentlicht werden.
Da es sich sowieso um ein Maven-Projekt handelt, brauchte ich nur noch ein
passendes Docker-Image und einen Workflow.
Durch GitHub Packages steht ein Maven Repository zur Verfügung und so können
mit Hilfe des &lt;a href=&#34;https://maven.apache.org/maven-release/maven-release-plugin/&#34;&gt;Maven Release Plugin&lt;/a&gt;s
die JAR-Dateien automatisch veröffentlicht werden.&lt;/p&gt;
&lt;/div&gt;
				
#github 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Bisher habe ich nach jeder Änderung am DocumentationTree manuell die
JAR-Datei erzeugt und per E-Mail verteilt.
Mit GitHub Actions lässt sich so eine Aufgabe automatisieren
und mit GitHub Packages können Bibliotheken wie JAR-Dateien veröffentlicht werden.
Da es sich sowieso um ein Maven-Projekt handelt, brauchte ich nur noch ein
passendes Docker-Image und einen Workflow.
Durch GitHub Packages steht ein Maven Repository zur Verfügung und so können
mit Hilfe des <a href="https://maven.apache.org/maven-release/maven-release-plugin/">Maven Release Plugin</a>s
die JAR-Dateien automatisch veröffentlicht werden.</p>
</div>
<div class="paragraph">
<p>Damit keine Konflikte bei den Versionen entstehen, habe ich die Major-Versionsnummer
mit der Major-Versionsnummer von Java versehen.
Somit findet man die aktuelle Version 13.0 jetzt unter &#34;package&#34;
im <a href="https://github.com/BeckmannundPartnerCONSULT/DocumentationTree/packages/227168">GitHub-Repository</a>.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>DocumentationTree</title>
			<link>https://koetterheinri.ch/posts/java/2020-05-07-documentationtree/</link>
			<pubDate>Thu, 07 May 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/java/2020-05-07-documentationtree/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Mein Kollege Dr. rer.pol. Bruno Kaiser hatte bereits vor längerer Zeit die Idee für eine Anwendung zur Darstellung von Zusammenhängen.
Im &lt;a href=&#34;https://www.it-finanzmagazin.de/individuelle-datenverarbeitung-idv-bafin-84667/&#34;&gt;Artikel beim IT Finanzmagazin&lt;/a&gt; beschreibt er, wie man im Kontext IDV-Anwendungen
die Zusammenhänge zwischen IDV-Anwendungen oder deren Daten darstellen kann.
Er hat zunächst mit Hilfe von Lua eine entsprechende Anwendung programmiert.
Im zweiten Schritt habe ich dann mit ihm zusammen eine Version mit Java entwickelt; den &lt;a href=&#34;https://github.com/BeckmannundPartnerCONSULT/DocumentationTree&#34;&gt;DocumentationTree&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Allerdings lässt sich diese Art von Dokumentation nicht nur für IDV-Anwendungen nutzen.
Alle die, die schon einmal ER- oder Klassendiagramme erstellt haben, kennen das Problem:
Die Beziehungen zwischen Entitäten bzw. Klassen überschneiden sich und man muss die Entitäten bzw. Klassen immer wieder so verschieben, dass man die Überschneidungen so weit wie möglich reduziert.
Zwar werden viele ER- bzw. Klassendiagramme heute relativ klein gehalten; aber es gibt auch weiterhin große Diagramme.
Mit einer einfachen Baumansicht lassen sich so auch die Zusammenhänge von Klassen oder Entitäten darstellen.
Informationen über die Relationen lassen sich über Blätter im &lt;a href=&#34;https://github.com/BeckmannundPartnerCONSULT/DocumentationTree&#34;&gt;DocumentationTree&lt;/a&gt; darstellen.&lt;/p&gt;
&lt;/div&gt;
				
#java #documentation 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Mein Kollege Dr. rer.pol. Bruno Kaiser hatte bereits vor längerer Zeit die Idee für eine Anwendung zur Darstellung von Zusammenhängen.
Im <a href="https://www.it-finanzmagazin.de/individuelle-datenverarbeitung-idv-bafin-84667/">Artikel beim IT Finanzmagazin</a> beschreibt er, wie man im Kontext IDV-Anwendungen
die Zusammenhänge zwischen IDV-Anwendungen oder deren Daten darstellen kann.
Er hat zunächst mit Hilfe von Lua eine entsprechende Anwendung programmiert.
Im zweiten Schritt habe ich dann mit ihm zusammen eine Version mit Java entwickelt; den <a href="https://github.com/BeckmannundPartnerCONSULT/DocumentationTree">DocumentationTree</a>.</p>
</div>
<div class="paragraph">
<p>Allerdings lässt sich diese Art von Dokumentation nicht nur für IDV-Anwendungen nutzen.
Alle die, die schon einmal ER- oder Klassendiagramme erstellt haben, kennen das Problem:
Die Beziehungen zwischen Entitäten bzw. Klassen überschneiden sich und man muss die Entitäten bzw. Klassen immer wieder so verschieben, dass man die Überschneidungen so weit wie möglich reduziert.
Zwar werden viele ER- bzw. Klassendiagramme heute relativ klein gehalten; aber es gibt auch weiterhin große Diagramme.
Mit einer einfachen Baumansicht lassen sich so auch die Zusammenhänge von Klassen oder Entitäten darstellen.
Informationen über die Relationen lassen sich über Blätter im <a href="https://github.com/BeckmannundPartnerCONSULT/DocumentationTree">DocumentationTree</a> darstellen.</p>
</div>
<div class="paragraph">
<p>Der DocumentationTree macht aus meiner Sicht also nicht nur im Kontext &#34;IDV&#34; Sinn.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Wiederkehrende Aufgaben mit GitHub Actions</title>
			<link>https://koetterheinri.ch/posts/service/2020-04-28-wiederkehrende-aufgaben/</link>
			<pubDate>Tue, 28 Apr 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-04-28-wiederkehrende-aufgaben/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Mit GitHub Actions lassen sich wiederkehrende Aufgaben automatisieren.
Eine solche Aufgabe kann die Veröffentlichung eines neuen Posts für einen Blog sein.
Es wird eine neue Datei erzeugt und ins GitHub Repository gepusht und über GitHub Actions wird aus der Datei ein neuer Blog-Post.
Über Fiverr biete ich das &lt;a href=&#34;https://www.fiverr.com/share/ae0mLa&#34;&gt;Einrichten eines Blogs&lt;/a&gt; an, mit dem das möglich ist.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Wenn man andere Aufgaben hat, die regelmäßig wiederholt werden müssen, kann man das natürlich auch automatisieren.
Die Eingabe wird ins GitHub Repository gepusht und nach dessen Verarbeitung wird die Ausgabe automatisch in das gleiche oder ein anderes Repository gepusht.
Man bekommt dadurch automatisch eine Versionsverwaltung der Eingaben und Ausgaben dazu.
Ebenfalls auf &lt;a href=&#34;https://www.fiverr.com/share/kXo5Qy&#34;&gt;Fiverr&lt;/a&gt; biete ich das Einrichten eines solchen Prozesses an.&lt;/p&gt;
&lt;/div&gt;
				
#github #fiverr 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Mit GitHub Actions lassen sich wiederkehrende Aufgaben automatisieren.
Eine solche Aufgabe kann die Veröffentlichung eines neuen Posts für einen Blog sein.
Es wird eine neue Datei erzeugt und ins GitHub Repository gepusht und über GitHub Actions wird aus der Datei ein neuer Blog-Post.
Über Fiverr biete ich das <a href="https://www.fiverr.com/share/ae0mLa">Einrichten eines Blogs</a> an, mit dem das möglich ist.</p>
</div>
<div class="paragraph">
<p>Wenn man andere Aufgaben hat, die regelmäßig wiederholt werden müssen, kann man das natürlich auch automatisieren.
Die Eingabe wird ins GitHub Repository gepusht und nach dessen Verarbeitung wird die Ausgabe automatisch in das gleiche oder ein anderes Repository gepusht.
Man bekommt dadurch automatisch eine Versionsverwaltung der Eingaben und Ausgaben dazu.
Ebenfalls auf <a href="https://www.fiverr.com/share/kXo5Qy">Fiverr</a> biete ich das Einrichten eines solchen Prozesses an.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Fehlende Version-Spalte für JPA-Entity-Bean</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2020-04-24-fehlende-version-spalte-fuer-jpa-entity-bean/</link>
			<pubDate>Fri, 24 Apr 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2020-04-24-fehlende-version-spalte-fuer-jpa-entity-bean/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;JPA-Entity-Beans bestehen normalerweise aus Properties mit entsprechenden Gettern und Settern.
Durch einen Fehler gab es für die Property version keinen Setter.
Der Getter war mit @Version annotiert.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;pre class=&#34;highlight&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;@Entity
public class Car {
    private Long id;
    private long version;
    private String name;
    private int numberOfWheels;
    private String brand;

    @Id
    @SequenceGenerator(name = &amp;#34;car_sequence_generator&amp;#34;,
            sequenceName = &amp;#34;car_sequence&amp;#34;,
            allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator = &amp;#34;car_sequence_generator&amp;#34;)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Version
    @Column(nullable = false)
    public long getVersion() {
        return version;
    }

    // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; hier fehlt der Setter

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNumberOfWheels() {
        return numberOfWheels;
    }

    public void setNumberOfWheels(int numberOfWheels) {
        this.numberOfWheels = numberOfWheels;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
				
#jpa #javaee 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>JPA-Entity-Beans bestehen normalerweise aus Properties mit entsprechenden Gettern und Settern.
Durch einen Fehler gab es für die Property version keinen Setter.
Der Getter war mit @Version annotiert.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@Entity
public class Car {
    private Long id;
    private long version;
    private String name;
    private int numberOfWheels;
    private String brand;

    @Id
    @SequenceGenerator(name = &#34;car_sequence_generator&#34;,
            sequenceName = &#34;car_sequence&#34;,
            allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator = &#34;car_sequence_generator&#34;)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Version
    @Column(nullable = false)
    public long getVersion() {
        return version;
    }

    // &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; hier fehlt der Setter

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNumberOfWheels() {
        return numberOfWheels;
    }

    public void setNumberOfWheels(int numberOfWheels) {
        this.numberOfWheels = numberOfWheels;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Durch diese Konstellation wird mit OpenJPA in Version 2.4.2 keine Spalte im DDL-Skript generiert.
Auch das einfache Hinzufügen einer Version-Spalte in der Datenbank hilft nicht dabei,
dass der OptimisticLock-Mechanismus funktioniert. Der Setter ist also zwingend notwendig.
Bei parallelem Zugriff werden sonst die Daten überschrieben.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>GitHub für Schulklassen</title>
			<link>https://koetterheinri.ch/posts/service/2020-04-17-github-fuer-schulen/</link>
			<pubDate>Fri, 17 Apr 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-04-17-github-fuer-schulen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Diese Woche hat GitHub die &lt;a href=&#34;https://github.com/pricing&#34;&gt;Preise&lt;/a&gt; angepasst.
Für Teams sind private Repositories nun kostenlos.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Das dürfte für Schulklassen speziell in der aktuellen Zeit interessant sein.
Lehrer und Lehrerinnen können so geschützt Aufgaben verteilen.
Zusätzlich könnten auch öffentlich Informationen über einen Blog verbreitet werden.
(Das Einrichten eines Blogs biete ich über &lt;a href=&#34;https://www.fiverr.com/share/L3eWZA&#34;&gt;Fiverr&lt;/a&gt; kostenpflichtig an.)
Gruppenarbeiten wären ebenfalls eingeschränkt möglich.
Und um die Arbeit mit GitHub zu vereinfachen gibt es &lt;a href=&#34;https://www.gitkraken.com/invite/8FnQh57C&#34;&gt;GitKraken&lt;/a&gt;, &lt;a href=&#34;https://desktop.github.com&#34;&gt;GitHub Desktop&lt;/a&gt; oder andere Tools.&lt;/p&gt;
&lt;/div&gt;
				
#github 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Diese Woche hat GitHub die <a href="https://github.com/pricing">Preise</a> angepasst.
Für Teams sind private Repositories nun kostenlos.</p>
</div>
<div class="paragraph">
<p>Das dürfte für Schulklassen speziell in der aktuellen Zeit interessant sein.
Lehrer und Lehrerinnen können so geschützt Aufgaben verteilen.
Zusätzlich könnten auch öffentlich Informationen über einen Blog verbreitet werden.
(Das Einrichten eines Blogs biete ich über <a href="https://www.fiverr.com/share/L3eWZA">Fiverr</a> kostenpflichtig an.)
Gruppenarbeiten wären ebenfalls eingeschränkt möglich.
Und um die Arbeit mit GitHub zu vereinfachen gibt es <a href="https://www.gitkraken.com/invite/8FnQh57C">GitKraken</a>, <a href="https://desktop.github.com">GitHub Desktop</a> oder andere Tools.</p>
</div>
<div class="paragraph">
<p>Für die Services und Tools ist dann auch kein Geld nötig.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Shell-Skripte unter Windows, die in Docker-Containern ausgeführt werden</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2020-04-09-shell-skripte-ausgefuehrt-in-docker/</link>
			<pubDate>Thu, 09 Apr 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2020-04-09-shell-skripte-ausgefuehrt-in-docker/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In verteilten Teams kommt es durchaus vor, dass nicht alle das gleiche Betriebssystem verwenden.
Wenn man  als Versionskontrolle Git verwendet, werden Umbrüche in Textdateien eventuell automatisch konvertiert:
Aus Line Feeds werden Carriage Return Line Feeds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Wird für ein Projekt Docker verwendet, kommt es durchaus vor, dass Shell-Skripte im Container ausgeführt werden.
Die automatische Konvertierung der Umbrüche unter Windows kann dabei zu Problemen führen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Deshalb sollte in der Datei .gitattributes für diese Art von Shell-Skripten folgendes angegeben werden:&lt;/p&gt;
&lt;/div&gt;
				
#docker #windows 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In verteilten Teams kommt es durchaus vor, dass nicht alle das gleiche Betriebssystem verwenden.
Wenn man  als Versionskontrolle Git verwendet, werden Umbrüche in Textdateien eventuell automatisch konvertiert:
Aus Line Feeds werden Carriage Return Line Feeds.</p>
</div>
<div class="paragraph">
<p>Wird für ein Projekt Docker verwendet, kommt es durchaus vor, dass Shell-Skripte im Container ausgeführt werden.
Die automatische Konvertierung der Umbrüche unter Windows kann dabei zu Problemen führen.</p>
</div>
<div class="paragraph">
<p>Deshalb sollte in der Datei .gitattributes für diese Art von Shell-Skripten folgendes angegeben werden:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>*.sh            text eol=lf</pre>
</div>
</div>
<div class="paragraph">
<p>Dadurch enthalten alle Shell-Skripte nur Line-Feeds als Umbrüche; auch unter Windows.
Soll das nicht für alle Shell-Skripte gelten, können in der Datei natürlich
auch nur die gewünschten Dateien angegeben werden.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Passwort unter Windows über RDP ändern</title>
			<link>https://koetterheinri.ch/posts/service/2020-04-08-passwort-aendern-in-rdp/</link>
			<pubDate>Wed, 08 Apr 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-04-08-passwort-aendern-in-rdp/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Unter Windows wird in der Regel angezeigt, dass man zum Ändern des Benutzerkennworts
die Tastenkombination Strg, Alt + Entf drücken und dann auf &amp;#34;Kennwort ändern…​&amp;#34; klicken soll.
Über eine RDP-Verbindung (Remote Desktop) ist das manchmal nicht möglich.
Allerdings gibt es dann eine andere Möglichkeit:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Über die Taskleiste ist &amp;#34;Windows-Sicherheit&amp;#34; erreichbar:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;imageblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;img src=&#34;https://koetterheinri.ch/img/posts/screenshot-taskleiste-windows-sicherheit.png&#34; alt=&#34;Screenshot Windows-Sicherheit&#34;/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Dann öffnet sich eine ähnliche Oberfläche wie wenn man die Tastenkombination
Strg, Alt + Entf drückt.&lt;/p&gt;
&lt;/div&gt;
				
#sicherheit #windows 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Unter Windows wird in der Regel angezeigt, dass man zum Ändern des Benutzerkennworts
die Tastenkombination Strg, Alt + Entf drücken und dann auf &#34;Kennwort ändern…​&#34; klicken soll.
Über eine RDP-Verbindung (Remote Desktop) ist das manchmal nicht möglich.
Allerdings gibt es dann eine andere Möglichkeit:</p>
</div>
<div class="paragraph">
<p>Über die Taskleiste ist &#34;Windows-Sicherheit&#34; erreichbar:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/img/posts/screenshot-taskleiste-windows-sicherheit.png" alt="Screenshot Windows-Sicherheit"/>
</div>
</div>
<div class="paragraph">
<p>Dann öffnet sich eine ähnliche Oberfläche wie wenn man die Tastenkombination
Strg, Alt + Entf drückt.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Wiederkehrende Maven-Projekt-Strukturen</title>
			<link>https://koetterheinri.ch/posts/service/2020-03-09-maven-archetype-wiederkehrende-maven-projekt-struktur/</link>
			<pubDate>Tue, 10 Mar 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-03-09-maven-archetype-wiederkehrende-maven-projekt-struktur/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Meine bisherige Erfahrung beim Erstellen einer neuen Java EE-Anwendung zeigt, dass
sich die Struktur der Projekte wiederholt.
Nicht ohne Grund gibt es soetwas wie Spring Boot.
Deshalb biete ich jetzt an, die wiederkehrende Struktur von Maven-Projekten als
Archetype zu erstellen.
Das spart Zeit bei der Einrichtung neuer Projekte.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Wenn jemand noch keine Struktur für eine Java EE-Anwendung hat, biete ich
dafür eine Beispiel-Anwendung an, die ich bereits in einem Beitrag vom
24.01.2020 erwähnt habe.&lt;/p&gt;
&lt;/div&gt;
				
#maven #java 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Meine bisherige Erfahrung beim Erstellen einer neuen Java EE-Anwendung zeigt, dass
sich die Struktur der Projekte wiederholt.
Nicht ohne Grund gibt es soetwas wie Spring Boot.
Deshalb biete ich jetzt an, die wiederkehrende Struktur von Maven-Projekten als
Archetype zu erstellen.
Das spart Zeit bei der Einrichtung neuer Projekte.</p>
</div>
<div class="paragraph">
<p>Wenn jemand noch keine Struktur für eine Java EE-Anwendung hat, biete ich
dafür eine Beispiel-Anwendung an, die ich bereits in einem Beitrag vom
24.01.2020 erwähnt habe.</p>
</div>
<div class="paragraph">
<p>Das Angebot findet ihr auf <a href="https://www.fiverr.com/share/VYKamz">Fiverr</a>.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Starten einer WAR-Datei schlägt fehl</title>
			<link>https://koetterheinri.ch/posts/java/2020-02-18-websphere-war-installation-fehlgeschlagen/</link>
			<pubDate>Tue, 18 Feb 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/java/2020-02-18-websphere-war-installation-fehlgeschlagen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In einem Projekt bei einem Kunden wurden Shared Libraries im Websphere verwendet. Gleichzeitig gab es ein Verzeichnis, in das Konfigurationsdateien abgelegt werden konnten und somit Teil des Klassenpfads war. Da wir irgendwann dazu übergegangen sind, diese Bibliotheken mit den EAR-Dateien auszuliefern und es auf einzelnen Instanzen mehrere Anwendungen gab, die nicht gleichzeitig migriert werden konnten, mussten wir für die neueren Versionen das Class Loading anpassen. Das musste man beim Deployment berücksichtigen, da sonst die Anwendung nicht mehr gestartet werden konnte. Dabei gab es keine Fehlermeldungen, die irgendwie auf das Problem hinweisen.
Wurde dies nicht berücksichtigt, konnte die EAR-Datei nicht gestartet werden.&lt;/p&gt;
&lt;/div&gt;
				
#java 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In einem Projekt bei einem Kunden wurden Shared Libraries im Websphere verwendet. Gleichzeitig gab es ein Verzeichnis, in das Konfigurationsdateien abgelegt werden konnten und somit Teil des Klassenpfads war. Da wir irgendwann dazu übergegangen sind, diese Bibliotheken mit den EAR-Dateien auszuliefern und es auf einzelnen Instanzen mehrere Anwendungen gab, die nicht gleichzeitig migriert werden konnten, mussten wir für die neueren Versionen das Class Loading anpassen. Das musste man beim Deployment berücksichtigen, da sonst die Anwendung nicht mehr gestartet werden konnte. Dabei gab es keine Fehlermeldungen, die irgendwie auf das Problem hinweisen.
Wurde dies nicht berücksichtigt, konnte die EAR-Datei nicht gestartet werden.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Statistik-Blog einrichten auf GitHub Pages</title>
			<link>https://koetterheinri.ch/posts/service/2020-02-14-blog-fuer-statistik-einrichten-auf-github/</link>
			<pubDate>Fri, 14 Feb 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-02-14-blog-fuer-statistik-einrichten-auf-github/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Für alle Statistik-Liebhaber, die mit der Programmiersprache R Datenanalyse betreiben,
biete ich jetzt an, einen Blog einzurichten.
Schaut unter &lt;a href=&#34;https://www.fiverr.com/share/rEzVDb&#34;&gt;Fiverr&lt;/a&gt; vorbei.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Gern erstelle ich auch Videos, um z.B. zu erklären, wie Blog-Posts erstellt werden.
Fragt auf Fiverr einfach nach einem passenden Angebot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Das oben genannte Angebot auf Fiverr habe ich jetzt als Teil eines anderen
Angebots aufgenommen:
&lt;a href=&#34;https://www.fiverr.com/share/NNKvdZ&#34;&gt;I will setup your blog with jekyll or hugo&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
				
#github #fiverr #r #statistic 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Für alle Statistik-Liebhaber, die mit der Programmiersprache R Datenanalyse betreiben,
biete ich jetzt an, einen Blog einzurichten.
Schaut unter <a href="https://www.fiverr.com/share/rEzVDb">Fiverr</a> vorbei.</p>
</div>
<div class="paragraph">
<p>Gern erstelle ich auch Videos, um z.B. zu erklären, wie Blog-Posts erstellt werden.
Fragt auf Fiverr einfach nach einem passenden Angebot.</p>
</div>
<div class="paragraph">
<p><strong>Update</strong>: Das oben genannte Angebot auf Fiverr habe ich jetzt als Teil eines anderen
Angebots aufgenommen:
<a href="https://www.fiverr.com/share/NNKvdZ">I will setup your blog with jekyll or hugo</a></p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Erklärvideo für GitHub Desktop auf YouTube</title>
			<link>https://koetterheinri.ch/posts/service/2020-02-13-howto-video-github-desktop/</link>
			<pubDate>Thu, 13 Feb 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-02-13-howto-video-github-desktop/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich habe auf YouTube ein neues HowTo-Video online gestellt.
Es ist ebenfalls im Rahmen meines Angebots auf &lt;a href=&#34;https://www.fiverr.com/s2/4857ba6319&#34;&gt;Fiverr&lt;/a&gt; entstanden.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Im Video zeige ich, wie man in &lt;a href=&#34;https://desktop.github.com&#34;&gt;GitHub Desktop&lt;/a&gt; einen Editor konfiguriert
und damit Änderungen vornimmt, die anschließend comittet und nach GitHub gespusht werden.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;videoblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;iframe src=&#34;https://www.youtube.com/embed/18oFCki25Sk?rel=0&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;
				
#github #youtube 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich habe auf YouTube ein neues HowTo-Video online gestellt.
Es ist ebenfalls im Rahmen meines Angebots auf <a href="https://www.fiverr.com/s2/4857ba6319">Fiverr</a> entstanden.</p>
</div>
<div class="paragraph">
<p>Im Video zeige ich, wie man in <a href="https://desktop.github.com">GitHub Desktop</a> einen Editor konfiguriert
und damit Änderungen vornimmt, die anschließend comittet und nach GitHub gespusht werden.</p>
</div>
<div class="videoblock">
<div class="content">
<iframe src="https://www.youtube.com/embed/18oFCki25Sk?rel=0" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Java EE, Docker und eine Datenbank</title>
			<link>https://koetterheinri.ch/posts/service/2020-02-12-javaee-docker-und-datenbank/</link>
			<pubDate>Wed, 12 Feb 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-02-12-javaee-docker-und-datenbank/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Für die Installation einer Java EE-Anwendung in einem Docker-Container
hatte ich immer die Anforderung, dass für die Anbindung einer Datenbank das
Image nicht neu erzeugt werden muss.
Nur so lässt sich ein Docker-Image in verschiedenen Umgebungen testen.
Die Erstellung der Datasource war dabei immer die größte Hürde.
Leider gibt es dafür kein einheitliches Vorgehen.
Zwar erlaubt Java EE die Definition z.B. über die web.xml oder Annotationen,
allerdings kann dabei nicht auf System-Variablen zugegriffen werden.&lt;/p&gt;
&lt;/div&gt;
				
#javaee 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Für die Installation einer Java EE-Anwendung in einem Docker-Container
hatte ich immer die Anforderung, dass für die Anbindung einer Datenbank das
Image nicht neu erzeugt werden muss.
Nur so lässt sich ein Docker-Image in verschiedenen Umgebungen testen.
Die Erstellung der Datasource war dabei immer die größte Hürde.
Leider gibt es dafür kein einheitliches Vorgehen.
Zwar erlaubt Java EE die Definition z.B. über die web.xml oder Annotationen,
allerdings kann dabei nicht auf System-Variablen zugegriffen werden.</p>
</div>
<div class="paragraph">
<p>Wenn es aber (wie in Payara) die Möglichkeit gibt, eine Datasource über die
Kommandozeile zu erstellen, ist die gewünschte Portabilität erreicht.</p>
</div>
<div class="paragraph">
<p>Das folgende Dockerfile basiert auf Payara und fügt den Treiber für PostgreSQL hinzu.
Anschließend wird über ein Skript die Datasource erstellt, um danach die Anwendung zu deployen.</p>
</div>
<div class="listingblock">
<div class="title">Dockerfile</div>
<div class="content">
<pre class="highlight"><code class="language-Dockerfile" data-lang="Dockerfile">FROM payara/server-full:5.192
RUN wget --no-verbose -O postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.2.5.jar &amp;&amp; mv postgresql.jar ${PAYARA_DIR}/glassfish/domains/${DOMAIN_NAME}/lib
COPY init_0_create_datasource.sh ${SCRIPT_DIR}
COPY ui/target/car.war ${DEPLOY_DIR}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Das Skript zum Erzeugen der Datasource erwartet, dass System-Variablen gesetzt wurden
und überprüft dies. Sind alle System-Variablen gesetzt, wird die Datasource erzeugt.</p>
</div>
<div class="listingblock">
<div class="title">init_0_create_datasource.sh</div>
<div class="content">
<pre class="highlight"><code class="language-sh" data-lang="sh">#!/bin/bash

# Check required variables are set
if [ -z $DB_USER ]; then
  echo &#34;Variable DB_USER is not set.&#34;
  exit 1
fi
if [ -z $DB_PASSWORD ]; then
  echo &#34;Variable DB_PASSWORD is not set.&#34;
  exit 1
fi
if [ -z $DB_NAME ]; then
  echo &#34;Variable DB_NAME is not set.&#34;
  exit 1
fi
if [ -z $DB_HOST ]; then
  echo &#34;Variable DB_HOST is not set.&#34;
  exit 1
fi
if [ -z $DB_PORT ]; then
  echo &#34;Variable DB_PORT is not set.&#34;
  exit 1
fi
if [ -z $POSTBOOT_COMMANDS ]; then
  echo &#34;Variable POSTBOOT_COMMANDS is not set.&#34;
  exit 1
fi

# Create post boot command files if it doesn&#39;t exist
touch $POSTBOOT_COMMANDS

echo &#34;Adding creation of datasource to post boot commands&#34;
echo &#34;create-jdbc-connection-pool --datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource --restype javax.sql.ConnectionPoolDataSource --property user=${DB_USER}:password=${DB_PASSWORD}:DatabaseName=${DB_NAME}:ServerName=${DB_HOST}:port=${DB_PORT} carPool&#34; &gt;&gt;$POSTBOOT_COMMANDS
echo &#34;ping-connection-pool carPool&#34; &gt;&gt;$POSTBOOT_COMMANDS
echo &#34;create-jdbc-resource --connectionpoolid=carPool jdbc/car&#34; &gt;&gt;$POSTBOOT_COMMANDS
echo &#34;list-jdbc-resources&#34; &gt;&gt;$POSTBOOT_COMMANDS

export DB_PASSWORD=&#34;&#34;
echo $DB_USER
echo $DB_PASSWORD</code></pre>
</div>
</div>
<div class="paragraph">
<p>So lässt sich dann zum lokalen Testen eine docker-compose.yml erstellen, über die
alle benötigten Daten definiert werden und eine Datenbank mitgestartet werden kann.</p>
</div>
<div class="paragraph">
<p>Ein Maven-Projekt mit einer Beispiel-Anwendung zeige ich in einem Demo-Video auf YouTube:</p>
</div>
<div class="videoblock">
<div class="content">
<iframe src="https://www.youtube.com/embed/XxgXR-B4PeM?rel=0" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
<div class="paragraph">
<p>Gern erstelle ich auch eine solche Anwendung nach euren Vorgaben.
Schaut auf <a href="https://www.fiverr.com/share/2Kw3De">Fiverr</a> vorbei.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Demo-Video auf YouTube für Java EE-Anwendung</title>
			<link>https://koetterheinri.ch/posts/service/2020-02-07-demo-video/</link>
			<pubDate>Fri, 07 Feb 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-02-07-demo-video/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich habe auf YouTube ein Demo-Video für eine Java EE-Anwendung online gestellt.
Es ist im Rahmen meines Angebots auf &lt;a href=&#34;https://www.fiverr.com/share/2Kw3De&#34;&gt;Fiverr&lt;/a&gt; entstanden.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Im Video zeige ich, wie das Maven-Projekt aufgebaut ist und wie die Vaadin-Oberfläche aussieht.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;videoblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;iframe src=&#34;https://www.youtube.com/embed/XxgXR-B4PeM?rel=0&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;
				
#javaee #docker #youtube 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich habe auf YouTube ein Demo-Video für eine Java EE-Anwendung online gestellt.
Es ist im Rahmen meines Angebots auf <a href="https://www.fiverr.com/share/2Kw3De">Fiverr</a> entstanden.</p>
</div>
<div class="paragraph">
<p>Im Video zeige ich, wie das Maven-Projekt aufgebaut ist und wie die Vaadin-Oberfläche aussieht.</p>
</div>
<div class="videoblock">
<div class="content">
<iframe src="https://www.youtube.com/embed/XxgXR-B4PeM?rel=0" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Erklärvideos auf YouTube</title>
			<link>https://koetterheinri.ch/posts/service/2020-02-07-howto-videos/</link>
			<pubDate>Fri, 07 Feb 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-02-07-howto-videos/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich habe auf YouTube 2 HowTo-Videos online gestellt.
Beide sind im Rahmen meines Angebots auf &lt;a href=&#34;https://www.fiverr.com/s2/4857ba6319&#34;&gt;Fiverr&lt;/a&gt; entstanden.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In einem wird beschrieben, wie ein Personal Access Token in GitHub erzeugt werden kann
und wie es als &amp;#34;Secret&amp;#34; in einem Repository eingerichtet werden kann.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;videoblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;iframe src=&#34;https://www.youtube.com/embed/mBLMAFw3Fqw?rel=0&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Im anderen wird erklärt, wie Repository für eine User Site für GitHub Pages eingerichtet werden kann
und wie ein anderer Benutzer als Committer für das Repository eingerichtet wird.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;videoblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;iframe src=&#34;https://www.youtube.com/embed/6WEPKNWZqTk?rel=0&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;
				
#github #fiverr #hugo #jekyll #youtube 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich habe auf YouTube 2 HowTo-Videos online gestellt.
Beide sind im Rahmen meines Angebots auf <a href="https://www.fiverr.com/s2/4857ba6319">Fiverr</a> entstanden.</p>
</div>
<div class="paragraph">
<p>In einem wird beschrieben, wie ein Personal Access Token in GitHub erzeugt werden kann
und wie es als &#34;Secret&#34; in einem Repository eingerichtet werden kann.</p>
</div>
<div class="videoblock">
<div class="content">
<iframe src="https://www.youtube.com/embed/mBLMAFw3Fqw?rel=0" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
<div class="paragraph">
<p>Im anderen wird erklärt, wie Repository für eine User Site für GitHub Pages eingerichtet werden kann
und wie ein anderer Benutzer als Committer für das Repository eingerichtet wird.</p>
</div>
<div class="videoblock">
<div class="content">
<iframe src="https://www.youtube.com/embed/6WEPKNWZqTk?rel=0" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Umstellung auf Hugo</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2020-02-07-umstellung-auf-hugo/</link>
			<pubDate>Fri, 07 Feb 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2020-02-07-umstellung-auf-hugo/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Heute habe ich die Erzeugung meines Blogs auf &lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo&lt;/a&gt; umgestellt.
Durch GitHub Actions werden alle Dateien generiert und anschließend in den Branch
&lt;em&gt;gh-pages&lt;/em&gt; gepusht.
Die Lösung mit Jekyll hat zuviel Zeit beim Erzeugen der Dateien benötigt.
Durch die Umstellung spare ich mindestens 50% der Zeit ein.
Das Einrichten eines Blogs biete ich auch über &lt;a href=&#34;https://www.fiverr.com/share/Q7QvL2&#34;&gt;Fiverr&lt;/a&gt; an.&lt;/p&gt;
&lt;/div&gt;
				
#fiverr #github #hugo 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Heute habe ich die Erzeugung meines Blogs auf <a href="https://gohugo.io">Hugo</a> umgestellt.
Durch GitHub Actions werden alle Dateien generiert und anschließend in den Branch
<em>gh-pages</em> gepusht.
Die Lösung mit Jekyll hat zuviel Zeit beim Erzeugen der Dateien benötigt.
Durch die Umstellung spare ich mindestens 50% der Zeit ein.
Das Einrichten eines Blogs biete ich auch über <a href="https://www.fiverr.com/share/Q7QvL2">Fiverr</a> an.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Funktionstrennung bei Banken und Finanzdienstleistern</title>
			<link>https://koetterheinri.ch/posts/zahlungsverkehr/2020-01-31-artikel-die-bank-funktionstrennung/</link>
			<pubDate>Fri, 31 Jan 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/zahlungsverkehr/2020-01-31-artikel-die-bank-funktionstrennung/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Am 31.01.2020 wurde in der Ausgabe 1/2020 von &amp;#34;die bank&amp;#34; mein Artikel &lt;em&gt;Das &amp;#34;Risiko Mensch&amp;#34;&lt;/em&gt;
veröffentlicht. Den Artikel gibt es auch auf der Homepage von meinem &lt;a href=&#34;https://www.beckmann-partner.de/beckmessage/das-risiko-mensch&#34;&gt;Arbeitgeber&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
				
#zahlungsverkehr 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Am 31.01.2020 wurde in der Ausgabe 1/2020 von &#34;die bank&#34; mein Artikel <em>Das &#34;Risiko Mensch&#34;</em>
veröffentlicht. Den Artikel gibt es auch auf der Homepage von meinem <a href="https://www.beckmann-partner.de/beckmessage/das-risiko-mensch">Arbeitgeber</a>.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>String zu BigDecimal konvertieren</title>
			<link>https://koetterheinri.ch/posts/java/2020-01-31-string-to-bigdecimal/</link>
			<pubDate>Fri, 31 Jan 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/java/2020-01-31-string-to-bigdecimal/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Es ist manchmal notwendig ein BigDecimal aus einem String zu erzeugen.
Dabei kann es vorkommen, dass die konfigurierte Sprache (Locale) der JVM nicht zu der Eingabe passt.
Denn Tausendertrennzeichen unterscheiden sich bei manchen Sprachen, sodass
Zahlen falsch interpretiert würden.
Die Klasse &lt;em&gt;DecimalFormat&lt;/em&gt; ermöglicht die Angabe der Sprache, sodass eine
fehlerhafte Interpretation vermieden wird.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;pre class=&#34;highlight&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;@Test
public void test() throws ParseException {
    DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
    numberFormat.setParseBigDecimal(true);
    BigDecimal bd = (BigDecimal) numberFormat.parse(&amp;#34;10,000&amp;#34;);

    System.out.println(&amp;#34;BigDecimal: &amp;#34; + bd.setScale(2, RoundingMode.HALF_UP));
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
				
#java 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Es ist manchmal notwendig ein BigDecimal aus einem String zu erzeugen.
Dabei kann es vorkommen, dass die konfigurierte Sprache (Locale) der JVM nicht zu der Eingabe passt.
Denn Tausendertrennzeichen unterscheiden sich bei manchen Sprachen, sodass
Zahlen falsch interpretiert würden.
Die Klasse <em>DecimalFormat</em> ermöglicht die Angabe der Sprache, sodass eine
fehlerhafte Interpretation vermieden wird.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@Test
public void test() throws ParseException {
    DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
    numberFormat.setParseBigDecimal(true);
    BigDecimal bd = (BigDecimal) numberFormat.parse(&#34;10,000&#34;);

    System.out.println(&#34;BigDecimal: &#34; + bd.setScale(2, RoundingMode.HALF_UP));
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>In dem Beispiel wird darüber hinaus die Anzahl der Nachkommastellen auf 2 reduziert.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Java EE-Anwendung mit angebundener Datenbank in Docker-Containern</title>
			<link>https://koetterheinri.ch/posts/service/2020-01-24-beispiel-javaee-und-datenbank-auf-docker/</link>
			<pubDate>Fri, 24 Jan 2020 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2020-01-24-beispiel-javaee-und-datenbank-auf-docker/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich biete jetzt an, eine Java EE-Anwendung für euch einzurichten.
Es handelt sich dabei um ein Maven-Projekt mit allen notwendigen Klassen, Skripten
und Dockerfiles.
Schaut unter &lt;a href=&#34;https://www.fiverr.com/share/2Kw3De&#34;&gt;Fiverr&lt;/a&gt; vorbei.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Benötigt ihr Anpassungen, fragt auf Fiverr einfach nach einem passenden Angebot.&lt;/p&gt;
&lt;/div&gt;
				
#java #javaee #fiverr 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich biete jetzt an, eine Java EE-Anwendung für euch einzurichten.
Es handelt sich dabei um ein Maven-Projekt mit allen notwendigen Klassen, Skripten
und Dockerfiles.
Schaut unter <a href="https://www.fiverr.com/share/2Kw3De">Fiverr</a> vorbei.</p>
</div>
<div class="paragraph">
<p>Benötigt ihr Anpassungen, fragt auf Fiverr einfach nach einem passenden Angebot.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Blog einrichten auf GitHub Pages</title>
			<link>https://koetterheinri.ch/posts/service/2019-12-27-blog-einrichten-auf-github/</link>
			<pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/service/2019-12-27-blog-einrichten-auf-github/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich biete jetzt an, einen Blog für euch einzurichten.
Schaut unter &lt;a href=&#34;https://www.fiverr.com/s2/4857ba6319&#34;&gt;Fiverr&lt;/a&gt; vorbei.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Gern erstelle ich auch Videos, um z.B. zu erklären, wie Blog-Posts erstellt werden.
Fragt auf Fiverr einfach nach einem passenden Angebot.&lt;/p&gt;
&lt;/div&gt;
				
#github #fiverr 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich biete jetzt an, einen Blog für euch einzurichten.
Schaut unter <a href="https://www.fiverr.com/s2/4857ba6319">Fiverr</a> vorbei.</p>
</div>
<div class="paragraph">
<p>Gern erstelle ich auch Videos, um z.B. zu erklären, wie Blog-Posts erstellt werden.
Fragt auf Fiverr einfach nach einem passenden Angebot.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Problematische Artifactory-Migration</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2019-10-25-problematische_artifactory_migration/</link>
			<pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2019-10-25-problematische_artifactory_migration/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Bei einem Kunden musste durch einen Wechsel eines Servers die gesamte Build-Infrastruktur migriert werden.
Um nicht alle Artefakte aus dem Artifactory zu kopieren, wurde ein neues Artifactory aufgesetzt und vom neuen auf das alte Artifactory verwiesen.
Neue Artefakte wurden dann in das neue Artifactory hochgeladen.
Da die &lt;em&gt;maven-metadata.xml&lt;/em&gt; immer den gleichen Namen (also ohne Zeitstempel) hat, konkurrieren zwei verschiedene &lt;em&gt;maven-metadata.xml&lt;/em&gt;-Dateien beim Download eines Artefakts während eines Builds. Unklar ist, wer (Artifactory, Maven) oder was (Reihenfolge der Repositories im Artifactory) darüber entscheidet, welche Datei verwendet werden soll.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering #artifactory 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Bei einem Kunden musste durch einen Wechsel eines Servers die gesamte Build-Infrastruktur migriert werden.
Um nicht alle Artefakte aus dem Artifactory zu kopieren, wurde ein neues Artifactory aufgesetzt und vom neuen auf das alte Artifactory verwiesen.
Neue Artefakte wurden dann in das neue Artifactory hochgeladen.
Da die <em>maven-metadata.xml</em> immer den gleichen Namen (also ohne Zeitstempel) hat, konkurrieren zwei verschiedene <em>maven-metadata.xml</em>-Dateien beim Download eines Artefakts während eines Builds. Unklar ist, wer (Artifactory, Maven) oder was (Reihenfolge der Repositories im Artifactory) darüber entscheidet, welche Datei verwendet werden soll.</p>
</div>
<div class="paragraph">
<p>Das hat zur Konsequenz, dass eventuell SNAPSHOT-Versionen verwendet werden, die veraltet sind.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>GitHub Actions - AsciiDoctor und Jekyll mit GitHub Pages verwenden</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2019-08-28-github-actions/</link>
			<pubDate>Wed, 28 Aug 2019 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2019-08-28-github-actions/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Diese Seite wird mit Hilfe von &lt;a href=&#34;https://jekyllrb&#34;&gt;Jekyll&lt;/a&gt; generiert.
Neue Blog-Einträge schreibe ich im
&lt;a href=&#34;https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/&#34;&gt;AsciiDoc&lt;/a&gt;-Format, das einige Möglichkeiten der Formatierung bietet.
So ist z.B. das Einbinden von Code-Beispielen sehr einfach und das Syntax-Highlighting wird während der Generierung der HTML-Seiten automatisch erledigt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Da GitHub Pages die Generierung auf Basis von AsciiDoc nicht unterstützt,
musste ich bisher die Seiten auf meinem Rechner generieren lassen und anschließend manuell
ins Repository auf den Branch &lt;em&gt;gh-pages&lt;/em&gt; pushen.
Ein unnötig komplizierter Prozess.&lt;/p&gt;
&lt;/div&gt;
				
#github #asciidoctor #jekyll 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Diese Seite wird mit Hilfe von <a href="https://jekyllrb">Jekyll</a> generiert.
Neue Blog-Einträge schreibe ich im
<a href="https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/">AsciiDoc</a>-Format, das einige Möglichkeiten der Formatierung bietet.
So ist z.B. das Einbinden von Code-Beispielen sehr einfach und das Syntax-Highlighting wird während der Generierung der HTML-Seiten automatisch erledigt.</p>
</div>
<div class="paragraph">
<p>Da GitHub Pages die Generierung auf Basis von AsciiDoc nicht unterstützt,
musste ich bisher die Seiten auf meinem Rechner generieren lassen und anschließend manuell
ins Repository auf den Branch <em>gh-pages</em> pushen.
Ein unnötig komplizierter Prozess.</p>
</div>
<div class="paragraph">
<p>Durch <a href="https://github.com/features/actions">GitHub Actions</a> (aktuell noch Beta mit Einladung) ist das nicht mehr nötig.
Die Action <a href="https://github.com/helaili/jekyll-action">jekyll-action</a> funktioniert durch einen Fehler aktuell zwar nicht. Aber da man die Action im eigenen Repository anpassen kann,
waren nur wenige Anpassungen nötig, bis das automatische Pushen funktionierte. Diese Änderungen
sind in meinem <a href="https://github.com/cybi/blog">Blog-Repository</a> zu finden.
Dabei war die größte Herausforderung herauszufinden, wie man das Erzwingen eines Pushs vermeidet, weil sonst die Änderungen nicht wirksam werden.
Das Problem habe ich durch löschen aller alten Dateien und dem Hinzufügen der generierten Dateien gelöst.</p>
</div>
<div class="paragraph">
<p>Durch GitHub Actions können Dockerfile- oder Javascript-Dateien ausgeführt werden. Die <em>jekyll-action</em> stellt dafür ein Dockerfile zur Verfügung durch das das Skript <em>entrypoint.sh</em> ausgeführt wird.</p>
</div>
<div class="paragraph">
<p>Die Action besteht aus zwei Dateien:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><a href="https://github.com/cybi/blog/blob/master/Dockerfile">Dockerfile</a></p>
</li>
<li>
<p><a href="https://github.com/cybi/blog/blob/master/entrypoint.sh">entrypoint.sh</a></p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Die Definition eines Workflows erfolgt bei mir in der Datei <a href="https://github.com/cybi/blog/blob/master/.github/main.workflow">main.workflow</a> im Verzeichnis <em>.github</em>.
Wenn man diese Datei dann direkt bei GitHub zur Bearbeitung öffnet, können dort
andere Secrets oder Umgebungsvsriablen abgelegt werden.</p>
</div>
<div class="paragraph">
<p>So ist es nun möglich, einen neuen Blog-Eintrag zu schreiben, sie ins
Repository in den Branch <em>master</em> zu pushen und nach wenigen Minuten ist der
Blog-Eintrag online.
Das macht es sehr einfach unterwegs neue Blog-Einträge zu schreiben und zu veröffentlichen.</p>
</div>
<div class="paragraph">
<p>Aktuell gibt es noch ein Problem mit der automatischen Veröffentlichung:
Unter &#34;Settings&#34; wird im Bereich &#34;GitHub Pages&#34; eine Fehlermeldung angezeigt.
Wenn man dann unter &#34;Source&#34; den Branch von &#34;gh-pages branch&#34; zu &#34;master branch&#34; wechselt,
und das wieder rückgängig macht, ist die Fehlermeldung weg und die Seite ist aktuell.
Den GitHub-Support habe ich darüber informiert, aber noch keine Rückmeldung erhalten.</p>
</div>
<div class="paragraph">
<p>Und natürlich lassen sich Dank Docker noch viele andere Dinge automatisieren.</p>
</div>
<div class="paragraph">
<p><strong>Update (09.10.2019)</strong>: Der GitHub-Support sagt, dass man ein &#34;Personal access token&#34; benötigt.
Dies kann in den Einstellungen des Benutzerkontos (Settings → Developer Settings
  → Personal access tokens) angelegt werden.
Anschließend muss dieses Token als Secret in den Einstellungen des Repositories
mit dem Namen JEKYLL_PAT abgelegt werden.</p>
</div>
<div class="paragraph">
<p><strong>Update (20.12.2019)</strong>: Ich biete an, den Blog für euch einzurichten.
Schaut unter <a href="https://www.fiverr.com/s2/4857ba6319?utm_source=CopyLink_Mobile">Fiverr</a> vorbei.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Vaadin - TwinColSelect</title>
			<link>https://koetterheinri.ch/posts/java/2017-11-30-twincolselect_gesetzte_werte/</link>
			<pubDate>Thu, 30 Nov 2017 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/java/2017-11-30-twincolselect_gesetzte_werte/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In Vaadin gibt es eine Komponente &lt;em&gt;TwinColSelect&lt;/em&gt;.
Der über einen Binder gebundene Wert muss ein Set sein.
Daraus resultiert, dass die Elemente vom Typ einer Klasse sein müssen, deren &lt;em&gt;equals&lt;/em&gt;- und &lt;em&gt;hashCode&lt;/em&gt;-Methoden überschrieben wurden.
Wenn das nicht gemacht wird, werden die selektierten Werte nicht auf der rechten Seite angezeigt.&lt;/p&gt;
&lt;/div&gt;
				
#java #vaadin 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In Vaadin gibt es eine Komponente <em>TwinColSelect</em>.
Der über einen Binder gebundene Wert muss ein Set sein.
Daraus resultiert, dass die Elemente vom Typ einer Klasse sein müssen, deren <em>equals</em>- und <em>hashCode</em>-Methoden überschrieben wurden.
Wenn das nicht gemacht wird, werden die selektierten Werte nicht auf der rechten Seite angezeigt.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Testen mit EntityManager und Transaktionen</title>
			<link>https://koetterheinri.ch/posts/java/2017-08-29-test_mit_entitymanager_und_transaktionen/</link>
			<pubDate>Tue, 29 Aug 2017 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/java/2017-08-29-test_mit_entitymanager_und_transaktionen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Immer wieder erlebe ich es, dass in Tests mit EntityManager Transaktionen gestartet und comitted werden.
Allerdings gibt es kein Exception-Handling, sodass kein Rollback ausgeführt wird.
Schlimmer noch: Die Transaktion wird nicht beendet und andere Tests schlagen ebenfalls fehl.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Um das zu verhindern, verwende ich ein solches Util:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;pre class=&#34;highlight&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;public class TestUtil {
	public static &amp;lt;ENTITY_TYPE&amp;gt; ENTITY_TYPE getEntity(EntityManager entityManager, Class&amp;lt;ENTITY_TYPE&amp;gt; classType, Long id) {
		Query query = entityManager.createQuery(&amp;#34;SELECT o FROM &amp;#34; + classType.getSimpleName() + &amp;#34; o&amp;#34;);
		return (ENTITY_TYPE) query.getSingleResult();
	}

	public static &amp;lt;ENTITY_TYPE&amp;gt; void persistInTransaction(EntityManager entityManager, ENTITY_TYPE entity) {
		executeInTransaction(entityManager, () -&amp;gt; entityManager.persist(entity));
	}

	public static void executeInTransaction(EntityManager entityManager, TransactionExecutor transactionExecutor) {
		try {
			entityManager.getTransaction().begin();
			transactionExecutor.executeInTransaction();
			entityManager.getTransaction().commit();
		} catch (RuntimeException e) {
			if (entityManager.getTransaction().isActive()) {
				entityManager.getTransaction().rollback();
			}
			throw e;
		}
	}

	@FunctionalInterface
	public interface TransactionExecutor {
		void executeInTransaction();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
				
#java #javaee #junit 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Immer wieder erlebe ich es, dass in Tests mit EntityManager Transaktionen gestartet und comitted werden.
Allerdings gibt es kein Exception-Handling, sodass kein Rollback ausgeführt wird.
Schlimmer noch: Die Transaktion wird nicht beendet und andere Tests schlagen ebenfalls fehl.</p>
</div>
<div class="paragraph">
<p>Um das zu verhindern, verwende ich ein solches Util:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public class TestUtil {
	public static &lt;ENTITY_TYPE&gt; ENTITY_TYPE getEntity(EntityManager entityManager, Class&lt;ENTITY_TYPE&gt; classType, Long id) {
		Query query = entityManager.createQuery(&#34;SELECT o FROM &#34; + classType.getSimpleName() + &#34; o&#34;);
		return (ENTITY_TYPE) query.getSingleResult();
	}

	public static &lt;ENTITY_TYPE&gt; void persistInTransaction(EntityManager entityManager, ENTITY_TYPE entity) {
		executeInTransaction(entityManager, () -&gt; entityManager.persist(entity));
	}

	public static void executeInTransaction(EntityManager entityManager, TransactionExecutor transactionExecutor) {
		try {
			entityManager.getTransaction().begin();
			transactionExecutor.executeInTransaction();
			entityManager.getTransaction().commit();
		} catch (RuntimeException e) {
			if (entityManager.getTransaction().isActive()) {
				entityManager.getTransaction().rollback();
			}
			throw e;
		}
	}

	@FunctionalInterface
	public interface TransactionExecutor {
		void executeInTransaction();
	}
}</code></pre>
</div>
</div>
]]></content>
		</item>
		
		<item>
			<title>Websphere, Lambda Expression und ArrayIndexOutOfBoundsException</title>
			<link>https://koetterheinri.ch/posts/java/2017-07-24-websphere_update_lambda_expression/</link>
			<pubDate>Mon, 24 Jul 2017 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/java/2017-07-24-websphere_update_lambda_expression/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;=
Jens Kötterheinrich&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Für das Deployment von Anwendungen lassen sich Python-Skripte verwenden.
Im Rahmen eines Projekts haben wir für eine solche Anwendung Java 8 verwendet.
Mit Hilfe eines Patches lässt sich das ermöglichen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Beim Deployment über ein solches Skript haben wir festgestellt, dass sich Lamba Expressions offenbar mit dieser Art Deployment nicht verstehen.
Beim Aufruf des Skripts wurde folgende Exception geworfen:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;pre class=&#34;highlight&#34;&gt;&lt;code&gt;WASX7017E: Exception received while running file &amp;#34;updateApplication.py&amp;#34;; exception information: com.ibm.websphere.management.application.client.AppDeploymentException: com.ibm.websphere.management.application.client.AppDeploymentException:  [Root exception is java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 52264]
java.lang.ArrayIndexOutOfBoundsException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 52264&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
				
#java #websphere 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>=
Jens Kötterheinrich</p>
</div>
<div class="paragraph">
<p>Für das Deployment von Anwendungen lassen sich Python-Skripte verwenden.
Im Rahmen eines Projekts haben wir für eine solche Anwendung Java 8 verwendet.
Mit Hilfe eines Patches lässt sich das ermöglichen.</p>
</div>
<div class="paragraph">
<p>Beim Deployment über ein solches Skript haben wir festgestellt, dass sich Lamba Expressions offenbar mit dieser Art Deployment nicht verstehen.
Beim Aufruf des Skripts wurde folgende Exception geworfen:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>WASX7017E: Exception received while running file &#34;updateApplication.py&#34;; exception information: com.ibm.websphere.management.application.client.AppDeploymentException: com.ibm.websphere.management.application.client.AppDeploymentException:  [Root exception is java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 52264]
java.lang.ArrayIndexOutOfBoundsException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 52264</code></pre>
</div>
</div>
<div class="paragraph">
<p>Um das Problem zu beheben, mussten wir die Lambda Expressions entfernen.</p>
</div>
<div class="paragraph">
<p><strong>Update:</strong>
Für das Deployment wurde eine alte Version der Websphere-Bibliotheken verwendet.
Nach dem Austausch der Bibliotheken funktionierte auch das Deployment wieder.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Tut es weh? Mach es nochmal (oder hör auf)!</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2017-05-23-tut_weh_nochmal/</link>
			<pubDate>Tue, 23 May 2017 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2017-05-23-tut_weh_nochmal/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Softwareprojekte werden heutzutage in der Regel so abgewickelt, dass zunächst eine Spezifikation einer Anforderung erstellt wird.
Anschließend überlegt sich jemand, wie man diese Anforderung umsetzen kann.
Abschließend kommt es zur Umsetzung.
Dieses Vorgehen ist in seiner Größe natürlich variabel.
Statt nur eine Anforderung werden eventuell auch mehrere gleichzeitig spezifiziert.
Es ändert aber nichts am generellen Vorgehen; auch nicht, wenn viele verschiedene Dokumente erstellt werden.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Bei Methoden wie Scrum gibt es dann Zyklen, vor denen eine Spezifikation erstellt wird.
Während eines Zykluses findet dann die Implementierung statt.
Abschließend gibt es ein Review und eine Retrospektive.
Dieses Vorgehen wiederholt sich in Zyklen von zum Beispiel zwei Wochen.
Reviews können insofern weh tun, als dass man nach zwei Wochen merkt, dass man in die falsche Richtung entwickelt hat.
Es hat aber auch den Vorteil, dass es eben nur zwei Wochen sind.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Softwareprojekte werden heutzutage in der Regel so abgewickelt, dass zunächst eine Spezifikation einer Anforderung erstellt wird.
Anschließend überlegt sich jemand, wie man diese Anforderung umsetzen kann.
Abschließend kommt es zur Umsetzung.
Dieses Vorgehen ist in seiner Größe natürlich variabel.
Statt nur eine Anforderung werden eventuell auch mehrere gleichzeitig spezifiziert.
Es ändert aber nichts am generellen Vorgehen; auch nicht, wenn viele verschiedene Dokumente erstellt werden.</p>
</div>
<div class="paragraph">
<p>Bei Methoden wie Scrum gibt es dann Zyklen, vor denen eine Spezifikation erstellt wird.
Während eines Zykluses findet dann die Implementierung statt.
Abschließend gibt es ein Review und eine Retrospektive.
Dieses Vorgehen wiederholt sich in Zyklen von zum Beispiel zwei Wochen.
Reviews können insofern weh tun, als dass man nach zwei Wochen merkt, dass man in die falsche Richtung entwickelt hat.
Es hat aber auch den Vorteil, dass es eben nur zwei Wochen sind.</p>
</div>
<div class="paragraph">
<p>Wenn man nun alle zwei Wochen eine Anwendung bereitstellt, muss man sich zwangsläufig auch über Migration Gedanken machen.
Denn neue Anforderungen bedeuten in der Regel auch Änderungen an der Datenbank oder an Verzeichnissen.
Wenn man dann nach zwei Wochen den Testern sagt, dass die Inhalte der Datenbank gelöscht werden, stößt das Vorgehen irgendwann auf seine Grenzen.
Das bedeutet dann, dass man sich eine Strategie überlegen muss, wie man Skripte zur Migration organisiert.</p>
</div>
<div class="paragraph">
<p>Ebenso verhält es sich beim Erstellen eines Releases.
Wenn alle zwei Wochen ein Release gebaut wird, kann das eventuell einen großen Teil der Zeit in Anspruch nehmen.
Dass dadurch Zeit für die Implementierung von neuen Anforderungen wegfällt, liegt auf der Hand.
Auch dafür ist dann eine Strategie zu entwickeln, um zum Beispiel die Erstellung eines Releases zu automatisieren.</p>
</div>
<div class="paragraph">
<p>Scrum schlägt einen Rahmen vor, wie man aus Projektsicht mit unangenehmen Vorkommnissen umgehen kann:
In kleinen Zyklen wiederholen!
Das sollte aber nicht nur aus Projektsicht so sein, sondern auf allen Ebenen der Softwareentwicklung.</p>
</div>
<div class="paragraph">
<p>Wenn es also &#34;weh tut&#34;, hilft Routine durch häufiges Wiederholen.
Manchmal ist es aber auch sinnvoll, aufzuhören und sich eine Alternative zu überlegen.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Trennung von Schnittstellen</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2017-05-07-software_engineering_schnittstellen/</link>
			<pubDate>Sun, 07 May 2017 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2017-05-07-software_engineering_schnittstellen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Mal angenommen es gibt 4 Systeme, die über eine Datei als Schnittstelle miteinander gekoppelt sind.
Jedes der 4 Systeme kann schreibend oder lesend darauf zugreifen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Problematisch sind dabei nicht die verschiedenen Systeme, sondern dass von allen eine Schnittstelle verwendet wird.
Wenn also ein System eine Änderung an der Schnittstelle benötigt, sind alle anderen Systeme ebenfalls betroffen.
Dass dadurch die Wartbarkeit beinahe bei 0% liegt, macht ein solches Konstrukt die Optimierung von Prozessen fast unmöglich.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Mal angenommen es gibt 4 Systeme, die über eine Datei als Schnittstelle miteinander gekoppelt sind.
Jedes der 4 Systeme kann schreibend oder lesend darauf zugreifen.</p>
</div>
<div class="paragraph">
<p>Problematisch sind dabei nicht die verschiedenen Systeme, sondern dass von allen eine Schnittstelle verwendet wird.
Wenn also ein System eine Änderung an der Schnittstelle benötigt, sind alle anderen Systeme ebenfalls betroffen.
Dass dadurch die Wartbarkeit beinahe bei 0% liegt, macht ein solches Konstrukt die Optimierung von Prozessen fast unmöglich.</p>
</div>
<div class="paragraph">
<p>Fraglich ist bei einem solchen Konstrukt, ob es überhaupt fachlich Sinn macht.
Aus meiner Sicht kann das in der Regel nicht so sein, weil es ja einen Grund hat, warum es verschiedene Systeme sind.
Dieser Grund kann dann auch nur fachlich sein, weil die Systeme verschiedene Funktionalitäten implementieren.</p>
</div>
<div class="paragraph">
<p>Funktionalitäten haben wiederum in der Regel unterschiedliche Anforderungen.
Das kann insbesondere auch die Granularität der zu liefernden Daten betreffen.
Durch die eine Datei als Schnittstelle muss diese Granularität an das System angepasst werden, das die niedrigste Aggregation der Daten benötigt.</p>
</div>
<div class="paragraph">
<p>Die Zeit, die vielleicht bei der Implementierung durch nur eine Schnittstelle gespart wurde, geht natürlich spätestens bei einer eventuell nötigen Optimerung verloren.
Noch mehr Zeit geht verloren, wenn bis dahin wegen Schnittstellenänderungen alle 4 Systeme angepasst werden müssen.</p>
</div>
<div class="paragraph">
<p>Natürlich kostet es Zeit, verschiedene Schnittstellen zu implementieren.
Wenn man sich die Zeit also nimmt, spart man sich langfristig Zeit und kann bei notwendigen Änderungen schneller reagieren und auf Absprachen zwischen vielen Systemen verzichten.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Trennung von Informationen basiert auf Fachlichkeit</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2017-01-27-software_engineering_fachlichkeit/</link>
			<pubDate>Fri, 27 Jan 2017 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2017-01-27-software_engineering_fachlichkeit/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Unter &lt;a href=&#34;https://www.heise.de/developer/artikel/Meine-Datenbank-gehoert-mir-3608372.html&#34;&gt;Meine Datenbank gehört mir&lt;/a&gt;
schreibt Eberhard Wolff darüber, dass Module nicht ein Datenbankschema teilen sollten.
Stattdessen sollte jedes Modul ein eigenes Datenbankschema verwenden.
Er begründet das mit dem Konzept des Information Hidings, das nicht nur für Klassen gelte.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Das hört aus meiner Sicht natürlich nicht bei der Datenbank auf, sondern gilt auch auf allen anderen Ebenen.
Informationen, die fachlich nichts miteinander zu tun haben, gehören nicht in ein Modul und auch nicht in einen Strukturbaum.
Einen solchen Strukturbaum gibt es bei Entitätsklassen.
Zwei Strukturbäume ließen sich einfach über bidirektionale Beziehungen verknüpfen.
Das sollte unbedingt vermieden werden, weil auch hier die Änderbarkeit leidet.
Dass wir Daten in verschiedenen Klassen oder Tabelllen unterbringen, gehört zum Alltag eines Software-Entwicklers.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Unter <a href="https://www.heise.de/developer/artikel/Meine-Datenbank-gehoert-mir-3608372.html">Meine Datenbank gehört mir</a>
schreibt Eberhard Wolff darüber, dass Module nicht ein Datenbankschema teilen sollten.
Stattdessen sollte jedes Modul ein eigenes Datenbankschema verwenden.
Er begründet das mit dem Konzept des Information Hidings, das nicht nur für Klassen gelte.</p>
</div>
<div class="paragraph">
<p>Das hört aus meiner Sicht natürlich nicht bei der Datenbank auf, sondern gilt auch auf allen anderen Ebenen.
Informationen, die fachlich nichts miteinander zu tun haben, gehören nicht in ein Modul und auch nicht in einen Strukturbaum.
Einen solchen Strukturbaum gibt es bei Entitätsklassen.
Zwei Strukturbäume ließen sich einfach über bidirektionale Beziehungen verknüpfen.
Das sollte unbedingt vermieden werden, weil auch hier die Änderbarkeit leidet.
Dass wir Daten in verschiedenen Klassen oder Tabelllen unterbringen, gehört zum Alltag eines Software-Entwicklers.</p>
</div>
<div class="paragraph">
<p>Diese geschickte Trennung von Informationen gehört zum Software Engineering und basiert immer auf der Fachlichkeit.
Das Konzept lässt sich nicht nur auf Klassen anwenden, sondern eben auch auf Module.
Meine Erfahrung ist bisher leider, dass sich viele Entwickler mit der Fachlichkeit kaum auseinandersetzen wollen.
Diesen Entwicklern Entscheidungen basierend auf der Fachlichkeit zu erläutern ist oft schwierig.
Problematisch wird es, wenn diese Entscheidungen ignoriert werden.
Umso wichtiger ist es für Software-Entwickler, sich nicht nur mit den neuesten Techniken zu beschäftigen, sondern einen genauen Blick auf die Fachlichtkeit zu werfen.
Meine Erfahrung ist nämlich auch, dass man mit Wissen über die Fachlichkeit, Systeme viel einfacher umsetzen kann.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Wissenstransfer durch Review?</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2014-10-31-wissenstransfer/</link>
			<pubDate>Fri, 31 Oct 2014 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2014-10-31-wissenstransfer/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Es gibt ja diverse Ideen, Wissen über ein laufendes System und dessen Kontext
von einem Wissenden zu einem Unwissenden zu übertragen.
Dokumentationen zu schreiben ist sicherlich nicht die Lieblingsaufgabe eines Softwareentwicklers;
aber es gehört dazu.
Diese als Softwareentwickler auch zu lesen, ist meist ebenfalls wenig spannend,
wenn man ein System kennen lernen möchte;
nsbesondere wenn diese dann auch noch veraltet ist und die Wahrheit sowieso im Code steht.
Eine Dokumentation zu lesen ist also eher wenig geeignet.
Es geht auch nicht in kurzer Zeit, sondern ist ein Prozess.
Hier möchte ich einmal veranschaulichen, wie man Schritt für Schritt jemanden
ein System näher bringen kann.
Dabei soll darauf geachtet werden, dass beide Seiten nicht frustriert werden
und für beide (gern auch für Dritte) ein Mehrwert entsteht.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Es gibt ja diverse Ideen, Wissen über ein laufendes System und dessen Kontext
von einem Wissenden zu einem Unwissenden zu übertragen.
Dokumentationen zu schreiben ist sicherlich nicht die Lieblingsaufgabe eines Softwareentwicklers;
aber es gehört dazu.
Diese als Softwareentwickler auch zu lesen, ist meist ebenfalls wenig spannend,
wenn man ein System kennen lernen möchte;
nsbesondere wenn diese dann auch noch veraltet ist und die Wahrheit sowieso im Code steht.
Eine Dokumentation zu lesen ist also eher wenig geeignet.
Es geht auch nicht in kurzer Zeit, sondern ist ein Prozess.
Hier möchte ich einmal veranschaulichen, wie man Schritt für Schritt jemanden
ein System näher bringen kann.
Dabei soll darauf geachtet werden, dass beide Seiten nicht frustriert werden
und für beide (gern auch für Dritte) ein Mehrwert entsteht.</p>
</div>
<div class="paragraph">
<p>Der fachliche Kontext eines Systems ist in der Regel schnell erklärt durch Fragen wie:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Warum ist das System da?</p>
</li>
<li>
<p>Was sind die Hauptfunktionen des Systems?</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Wie etwas umgesetzt ist und warum interessiert an dieser Stelle nicht;
das ist zuviel Detail für jemanden, der das System kennenlernen soll.
Das langweilt in der Regel und die Aufnahmefähigkeit des Menschen ist eben auch nur begrenzt.
Ein Wissender kann hier schnell über das Ziel hinausschießen.
Natürlich sollen aber auch die Fragen der Unwissenden berücksichtigt und beantwortet werden.
Der nächste Schritt ist dann, den Unwissenden die Tücken des Systems entdecken zu lassen - selbstständig;
ab ins kalte Wasser!
Angenommen es gibt rund um das System wiederkehrende Aufgaben zu erledigen.
Dann lässt man den Unwissenden diese erledigen.
Er wird einen Teil vielleicht schon allein durch die beantworteten Fragen alleine lösen können.
Für den anderen Teil wird er auf den Wissenden zugehen.
So entdeckt der Unwissende nach und nach das System und kann vielleicht auch die ersten Zusammenhänge erkennen.
Das Ganze immer zusammen mit dem Wissenden.
Es ist also wichtig, dass sch der Unwissende traut, bei ihm im Zweifelsfall nachzufragen.
Dazu sollte man abhängig vom System einen Zeitraum absprechen, der die Tücken auch erkennen lässt.
Bei einem System, das jeden Tag läuft könnte das eine Woche sein.</p>
</div>
<div class="paragraph">
<p>Sollten die Tücken gar nicht oder nicht vollständig dokumentiert sein, wird der Unwissende in der Regel von sich aus dies nachholen.
Dies dann für alle zugreifbar zu machen, ist anschließend nur noch ein kleiner Schritt.
Im nächsten Schritt geht es dann in den Code.
Pair-Programming macht in einem solchen Fall keinen Sinn, da der Wissensstand einfach viel zu unterschiedlich ist.
Der Wissende wird für den Unwissenden zu schnell zwischen den Klassen hin- und herspringen
und der Unwissende fühlt sich unsicher, weil der Wissende ihm zeigt, wie es gehen muss;
auf beiden Seiten Frust!</p>
</div>
<div class="paragraph">
<p>Der Unwissende soll also sein Tempo selbst bestimmen und seine eigenen Ideen entwickeln können.
Dazu sollte er eine Aufgabe bekommen, die in sich abgeschlossen ist und in wenigen
Stunden erledigt werden kann.
Der Wissende sollte dann bereit sein, eine Einstiegshilfe zu geben; also Klassen nennen,
die mit der Aufgabe zu tun haben.
Anschließend kann der Unwissende den Kontext der Klassen analysieren und die Aufgabe lösen.</p>
</div>
<div class="paragraph">
<p>Anschließend legt der Unwissende die Lösung dem Wissenden zum Review vor.
Dafür gibt es sehr gute Tools wie Atlassian Crucible.
Am Anfang wird es unter Umständen viele Anmerkungen geben.
Aber der Unwissende wird immer mehr zum Wissenden, je mehr Aufgaben er löst.
Wenn es viele Aufgaben in kurzer Zeit gibt, ist es sehr schnell soweit,
dass der zunächst Unwissende mit dem Wissenden über Lösungen diskutieren kann.
Dann ist auch die Zeit für Pair-Programming gekommen.</p>
</div>
<div class="paragraph">
<p>Speziell die Reviews sind eine sehr gute Unterstützung für Feedback und bieten
die Möglichkeit für Diskussionen fokussiert auf den Code; nur von Änderungen
betroffene Klassen werden betrachtet.</p>
</div>
<div class="paragraph">
<p>Die beschriebenen Schritte werden nicht unter allen Umständen funktionieren.
Aber wenn beide Seiten motiviert sind, das Wissen zu teilen und auch Neues aufzunehmen
(beides gilt für beide Seiten), profitieren beide Seiten und am Ende natürlich
auch der Arbeitgeber oder Kunde.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Big Data durch SEPA: Mehr Zahlungen, mehr Transaktionen, mehr Kosten</title>
			<link>https://koetterheinri.ch/posts/zahlungsverkehr/2014-10-27-sepa_dateien_durchsuchen/</link>
			<pubDate>Mon, 27 Oct 2014 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/zahlungsverkehr/2014-10-27-sepa_dateien_durchsuchen/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Am 09.10.2014 wurde mein insgesamt 4. Pressebericht von meinem Arbeitgeber veröffentlicht:
&lt;a href=&#34;http://www.beckmann-partner.de/news/93&#34;&gt;Big Data durch SEPA: Mehr Zahlungen, mehr Transaktionen, mehr Kosten&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Dort habe ich beschrieben, wie man mit einer nicht relationalen Datenbank Transaktionen abspeichern könnte.
In meinem aktuellen Projekt setzen wir dafür &lt;a href=&#34;http://www.elasticsearch.org&#34;&gt;Elasticsearch&lt;/a&gt; ein.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Dies war allerdings nicht unsere erste Lösung.
Zunächst haben wir Apache Lucene verwendet.
Dies wird auch in Elasticsearch verwendet.
Allerdings kapselt Elasticsearch einiges an Komplexität weg, sodass mit Einstellungen
im Auslieferungszustand sehr schnell Informationen durchsuchbar gemacht werden können.
Elasticsearch hatte zu Beginn allerdings einen Nachteil:
Man kann die Informationen nicht auf einen Schlag sichtbar machen.
Da man Transaktionen getrennt von einander speichern möchte,
kann man bei z.B. 10.000 Transaktionen innerhalb einer Datei nicht erst alle
Transaktionen für eine Suche sichtbar machen, wenn die 10.000. Transaktion indiziert wurde.
Die suchende Applikation muss mit diesem Umstand umgehen können.
Deshalb haben wir zunächst Apache Lucene direkt verwendet, da man dort einen commit-Mechanismus hat,
der das Beschriebene bietet.
Allerdings haben wir dazu für die gesamte Datenmenge einen einzelnen Index verwendet.
Das hat die Anwendung so sehr verlangsamt, dass wir Gefahr liefen,
einen Tag mit etwa 10 Millionen Transaktionen nicht innerhalb von 24 Stunden verarbeiten
zu können.
Da wir bisher maximal die Menge der letzten 8 Wochen vorhalten müssen,
machte es für uns Sinn, die Transaktionen in mehreren Indizes zu unterteilen.
Da sich außerdem die Indizes der vergangenen Tage nicht verändern,
sondern nur der aktuelle Tag, ist ein Tag die beste Größe für einen Index aus unserer Sicht.&lt;/p&gt;
&lt;/div&gt;
				
#zahlungsverkehr #sepa 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Am 09.10.2014 wurde mein insgesamt 4. Pressebericht von meinem Arbeitgeber veröffentlicht:
<a href="http://www.beckmann-partner.de/news/93">Big Data durch SEPA: Mehr Zahlungen, mehr Transaktionen, mehr Kosten</a>.</p>
</div>
<div class="paragraph">
<p>Dort habe ich beschrieben, wie man mit einer nicht relationalen Datenbank Transaktionen abspeichern könnte.
In meinem aktuellen Projekt setzen wir dafür <a href="http://www.elasticsearch.org">Elasticsearch</a> ein.</p>
</div>
<div class="paragraph">
<p>Dies war allerdings nicht unsere erste Lösung.
Zunächst haben wir Apache Lucene verwendet.
Dies wird auch in Elasticsearch verwendet.
Allerdings kapselt Elasticsearch einiges an Komplexität weg, sodass mit Einstellungen
im Auslieferungszustand sehr schnell Informationen durchsuchbar gemacht werden können.
Elasticsearch hatte zu Beginn allerdings einen Nachteil:
Man kann die Informationen nicht auf einen Schlag sichtbar machen.
Da man Transaktionen getrennt von einander speichern möchte,
kann man bei z.B. 10.000 Transaktionen innerhalb einer Datei nicht erst alle
Transaktionen für eine Suche sichtbar machen, wenn die 10.000. Transaktion indiziert wurde.
Die suchende Applikation muss mit diesem Umstand umgehen können.
Deshalb haben wir zunächst Apache Lucene direkt verwendet, da man dort einen commit-Mechanismus hat,
der das Beschriebene bietet.
Allerdings haben wir dazu für die gesamte Datenmenge einen einzelnen Index verwendet.
Das hat die Anwendung so sehr verlangsamt, dass wir Gefahr liefen,
einen Tag mit etwa 10 Millionen Transaktionen nicht innerhalb von 24 Stunden verarbeiten
zu können.
Da wir bisher maximal die Menge der letzten 8 Wochen vorhalten müssen,
machte es für uns Sinn, die Transaktionen in mehreren Indizes zu unterteilen.
Da sich außerdem die Indizes der vergangenen Tage nicht verändern,
sondern nur der aktuelle Tag, ist ein Tag die beste Größe für einen Index aus unserer Sicht.</p>
</div>
<div class="paragraph">
<p>Dafür bringt Elasticsearch einiges mit.
Denn eigentlich ist es für den Aufbau eines Clusters, also Verteilung auf mehrere
Server-Instanzen, konzipiert, um die Last zu verteilen.
Mit Hilfe von Index-Aliasen lassen sich dann mehrere Indizes durch nur einen Namen ansprechen.
Jede Abfrage wird ja zu einem bestimmten Zeitpunkt ausgeführt.
Da wird der Datumsteil entnommen und der entsprechende Alias draus erzeugt.
Anschließend wird abgefragt, ob es den Index gibt.
Ist dies nicht der Fall, wird für den vorherigen Tag das gleiche Vorgehen ausgeführt,
solange bis ein Index gefunden wird oder eine andere Abbruchbedingung greift.
Damit nicht bei jeder Abfrage überprüft werden muss, ob es den Index gibt,
sollte man natürlich den aktuellen Alias cachen, wenn man ihn bereits geprüft hat.</p>
</div>
<div class="paragraph">
<p>Der Entwickler bekommt also einiges an die Hand, um ein solches Konstrukt aufzubauen.
Nur den Commit-Mechanismus verliert man mit Elasticsearch.
Wie man diesen soweit wie möglich nachbilden kann, beschreibt Patrick Peschlow
unter &lt;<a href="https://blog.codecentric.de/en/2014/10/transactions-elasticsearch/">Transactions in Elasticsearch</a>.
Zu den Informationen, nach denen wir suchen wollen, werden die notwendigen Informationen
für die Prozesse abgespeichert.
Das ist unter anderem auch der Dateiname und die Positionen der maximal drei Ebenen
einer Datei (Datei-, Gruppe- und Transaktionsebene) innerhalb der Datei.
Mit Hilfe dieser Informationen können zu jeder in der Recherche vorliegenden Transaktion
die drei Ebenen einer Transaktion als XML-Zeichenkette ermittelt werden.
Mit Hilfe dieser Zeichenkette von Original-Transaktionen (pacs.003 (Lastschrift)
und pacs.008 (Gutschrift)) lassen sich dann automatisch R-Transaktionen mit
Hilfe eines entsprechenden Konverters erzeugen.
Dies lässt sich z.B. nutzen, um Validation-Files von anderen Clearing-Häusern
automatisch zu verarbeiten.
Auch eine Maske mit den bereits vorerfassten Daten einer Original-Transaktion
lässt sich so umsetzen.
Es sind viele Möglichkeiten denkbar.</p>
</div>
<div class="paragraph">
<p>Mit dem beschriebenen Konstrukt ist es möglich, über eine Milliarde Dokumente
schnell zu durchsuchen; ohne große Wartezeit selbst an Tagen mit über 40 Mio. Transaktionen.
Die größte Hürde stellt bisher noch die Bereitstellung der Daten dar:
Innerhalb kürzester Zeit sollen mehrere hundert Megabyte-große Dateien durchsuchbar sein.
Dies lässt sich nur durch parallele Verarbeitung lösen.
Bisher ist diese leider nicht effizient genug, da mehrere große Dateien auch mal
einen Prozess verstopfen können, während alle anderen Prozesse auf Dateien warten.
Dies ist aber unbestritten der Art der Bereitstellung geschuldet:
Die Dateien kommen in einem Verzeichnis an und werden dann von einem Prozess auf
verschiedene Unterverzeichnisse verteilt.
Für jedes Unterverzeichnis gibt es dann einen eigenen Prozess,
der die Dateien verarbeitet.
Leider ist die Verteilung nicht &#34;schlau&#34; genug, um zu erkennen,
ob in dem Unterverzeichnis nicht bereits mehrere große Dateien liegen.
Wenn diese Parallelisierung verbessert werden könnte,
wäre die Echtzeit-Suche nicht mehr weit entfernt,
um die automatischen Massenzahlungsverkehrsprozesse noch weiter zu verbessern.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Komplexität und Story Points</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2013-09-22-komplexitaet_und_story_points/</link>
			<pubDate>Sun, 22 Sep 2013 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2013-09-22-komplexitaet_und_story_points/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;In meinem aktuellen Projekt sollen Story Points eingeführt werden, um von den
&amp;#34;idealen Tagen&amp;#34; (8 Stunden Vollzeit für das Projekt) wegzukommen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die theoretische Einführung war dabei komplizierter als die tatsächliche Anwendung.
Denn in der Theorie sollen Story Points ein Maß für die Komplexität einer Aufgabe sein.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Für mich war die Komplexität einer Aufgabe allerdings nicht so einfach zu bestimmen.
Nach meinem bisherigen Verständnis hat Komplexität nichts mit der Anzahl an
notwendigen Wiederholungen bei der Lösung einer Aufgabe zu tun.
Angenommen die Aufgabe besteht darin, Kies von A nach B zu bringen,
dann könnte die Lösung darin liegen, eine Schaufel zu nehmen,
Kies drauf zu packen und von A nach B zu bringen.
Wenn zur Aufgabe dann noch eine weitere Informationen dazu kommt,
wird die Aufgabe durch die Anzahl der Informationen zwar komplexer,
aber deren Umsetzung muss dadurch nicht komplexer werden.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>In meinem aktuellen Projekt sollen Story Points eingeführt werden, um von den
&#34;idealen Tagen&#34; (8 Stunden Vollzeit für das Projekt) wegzukommen.</p>
</div>
<div class="paragraph">
<p>Die theoretische Einführung war dabei komplizierter als die tatsächliche Anwendung.
Denn in der Theorie sollen Story Points ein Maß für die Komplexität einer Aufgabe sein.</p>
</div>
<div class="paragraph">
<p>Für mich war die Komplexität einer Aufgabe allerdings nicht so einfach zu bestimmen.
Nach meinem bisherigen Verständnis hat Komplexität nichts mit der Anzahl an
notwendigen Wiederholungen bei der Lösung einer Aufgabe zu tun.
Angenommen die Aufgabe besteht darin, Kies von A nach B zu bringen,
dann könnte die Lösung darin liegen, eine Schaufel zu nehmen,
Kies drauf zu packen und von A nach B zu bringen.
Wenn zur Aufgabe dann noch eine weitere Informationen dazu kommt,
wird die Aufgabe durch die Anzahl der Informationen zwar komplexer,
aber deren Umsetzung muss dadurch nicht komplexer werden.</p>
</div>
<div class="paragraph">
<p>Im genannten Kies-Beispiel könnte die zusätzliche Information sein,
dass eine Tonne Kies von A nach B zu bringen.
Dann könnte die Lösung darin liegen, den Kies mit einer Schaufel zu transportieren.
Die Lösung der Aufgabe ist dann ebenso komplex wie die Lösung ohne zusätzliche Information.</p>
</div>
<div class="paragraph">
<p>Da Sprints aber nicht unendlich lange dauern, könnte die Lösung mit der Schaufel
allerdings nicht zielführend sein.
Dadurch kommt aber eine weitere Information zur Aufgabe hinzu.
Dies führt zu einer weiteren Erhöhung der Komplexität der Aufgabe.
Es muss also eine andere Lösung gefunden werden.
Die Lösung könnte ein Radlader sein, dessen Schaufel mit Kies an A befüllt
und an B entleert wird.
Die Lösung der Aufgabe wird dadurch komplexer, da man jemanden haben muss,
der das Gerät fahren kann.
Wenn man sojemanden im Team nicht hat, ist die Lösung der Aufgabe für das Team sehr komplex,
da die Lösung für das Team unter Umständen etwas noch nie Dagewesenes darstellt.
Eine Alternative zur genannten Lösung kann natürlich sein, dass man weiterhin die
Schaufel nimmt und die Aufgabe auf mehere Sprints verteilt.</p>
</div>
<div class="paragraph">
<p>Aber warum ist es überhaupt relevant, was man mit Story Points misst?
Eigentlich geht es bei Story Points doch nur um eine abstrakte Größe,
die man in Relation setzen kann.
Irgendwie möchte ich bestimmen, ob Aufgabe B komplexer ist als Aufgabe A.
Nach meinem Verständnis ist es aber irrelevant, wie komplex eine Aufgabe ist.
Es geht allein um den Schwierigkeitsgrad der Lösung.
Bei der Sprintplanung muss das Team sich also grob auf eine Lösung der Aufgabe
einigen und diese in Relation zu den Lösungen anderer Aufgaben setzen.</p>
</div>
<div class="paragraph">
<p>Story Points sagen also nichts über die Komplexität einer Aufgabe aus,
sondern sie beziehen sich auf die Lösung der Aufgabe.
Die Relation der Lösungen zueinander ist von Team zu Team unterschiedlich,
da jedes Team unterschiedliche Erfahrung hat, um die Lösungen in Relation zu setzen.</p>
</div>
<div class="paragraph">
<p>Das Konzept hinter Story Points ist aus meiner Sicht das Entscheidende:
Der Aufwand zu einer Aufgabe wird abgeleitet und nicht geschätzt.
Wie groß, schwer oder komplex die Lösung der Aufgabe ist, liegt am Verständnis des Teams.
Dies muss sich nur bei den Referenz-Lösungen einig sein.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Pressebericht: SEPA: Bei IBAN-Only gibt es nur Verlierer!</title>
			<link>https://koetterheinri.ch/posts/zahlungsverkehr/2013-07-19-pressebericht_sepa/</link>
			<pubDate>Fri, 19 Jul 2013 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/zahlungsverkehr/2013-07-19-pressebericht_sepa/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich habe es mal wieder getan!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Heute wurde mein dritter Pressebericht veröffentlicht!
Unter &lt;a href=&#34;http://www.beckmann-partner.de/news/88&#34;&gt;SEPA: Bei IBAN-Only gibt es nur Verlierer!&lt;/a&gt; oder in der &lt;a href=&#34;http://www.pressebox.de/pressemitteilung/beckmann-partner-consult-gmbh/SEPA-Bei-IBAN-Only-gibt-es-nur-Verlierer/boxid/612577&#34;&gt;Pressebox&lt;/a&gt; ist er zu finden.&lt;/p&gt;
&lt;/div&gt;
				
#zahlungsverkehr #sepa 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich habe es mal wieder getan!</p>
</div>
<div class="paragraph">
<p>Heute wurde mein dritter Pressebericht veröffentlicht!
Unter <a href="http://www.beckmann-partner.de/news/88">SEPA: Bei IBAN-Only gibt es nur Verlierer!</a> oder in der <a href="http://www.pressebox.de/pressemitteilung/beckmann-partner-consult-gmbh/SEPA-Bei-IBAN-Only-gibt-es-nur-Verlierer/boxid/612577">Pressebox</a> ist er zu finden.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Pressebericht &#34;SEPA - nur eine Absichtserklärung?&#34;</title>
			<link>https://koetterheinri.ch/posts/zahlungsverkehr/2012-10-06-sepa_dateiformate/</link>
			<pubDate>Sat, 06 Oct 2012 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/zahlungsverkehr/2012-10-06-sepa_dateiformate/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Vor ein paar Wochen wurde mein Pressebericht
&lt;a href=&#34;http://www.beckmann-partner.de/news/86&#34;&gt;SEPA - nur eine Absichtserklärung?&lt;/a&gt; veröffentlicht.
Darin kritisiere ich die fehlende Standardisierung der Zusammenfassung von verschiedenen
Nachrichtenarten in einer Datei.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ab spätestens 2014 wird die Anzahl der SEPA-Transaktionen deutlich zunehmen.
Damit nimmt auch die Größe von XML-Dateien zu.
Bereits heute haben die Dateien eine Größe von mehreren zig Megabyte.
Schon mit diesen kleinen Dateigrößen kann es problematisch sein,
die Dateien mit einem Editor zu öffnen.
Zwar sollten die Dateien in der Regel automatisch verarbeitet werden und keine
Notwendigkeit bestehen, sie mit einem Editor zu öffnen.
Allerdings zeigt die Praxis, dass dies vorkommt.
So wird z.B. eine Datei von einem Clearing-Institut abgewiesen und damit nicht verarbeitet.
Das Clearing-Institut schickt dann eine Datei, wo der Grund für die Abweisung der
Datei enthalten ist.
Es kann auf Datei-, Gruppen- und Transaktionsebene jeweils einen Grund geben.
Wenn z.B. nur eine Transaktion abgewiesen wird, so wird auf Dateiebene angegeben,
dass nur ein Teil der Datei akzeptiert wurde.
Für jeden Bulk, der vollständig akzeptiert wurde, wird der entsprechende Code angegeben.
Nur der Bulk mit der fehlerhaften Transaktion bekommt einen anderen Code und zusätzlich
wird die Transaktion angegeben, die fehlerhaft ist.
Für jede der Ebenen gibt es eine Auswahl von (Fehler-)Codes.&lt;/p&gt;
&lt;/div&gt;
				
#zahlungsverkehr #sepa 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Vor ein paar Wochen wurde mein Pressebericht
<a href="http://www.beckmann-partner.de/news/86">SEPA - nur eine Absichtserklärung?</a> veröffentlicht.
Darin kritisiere ich die fehlende Standardisierung der Zusammenfassung von verschiedenen
Nachrichtenarten in einer Datei.</p>
</div>
<div class="paragraph">
<p>Ab spätestens 2014 wird die Anzahl der SEPA-Transaktionen deutlich zunehmen.
Damit nimmt auch die Größe von XML-Dateien zu.
Bereits heute haben die Dateien eine Größe von mehreren zig Megabyte.
Schon mit diesen kleinen Dateigrößen kann es problematisch sein,
die Dateien mit einem Editor zu öffnen.
Zwar sollten die Dateien in der Regel automatisch verarbeitet werden und keine
Notwendigkeit bestehen, sie mit einem Editor zu öffnen.
Allerdings zeigt die Praxis, dass dies vorkommt.
So wird z.B. eine Datei von einem Clearing-Institut abgewiesen und damit nicht verarbeitet.
Das Clearing-Institut schickt dann eine Datei, wo der Grund für die Abweisung der
Datei enthalten ist.
Es kann auf Datei-, Gruppen- und Transaktionsebene jeweils einen Grund geben.
Wenn z.B. nur eine Transaktion abgewiesen wird, so wird auf Dateiebene angegeben,
dass nur ein Teil der Datei akzeptiert wurde.
Für jeden Bulk, der vollständig akzeptiert wurde, wird der entsprechende Code angegeben.
Nur der Bulk mit der fehlerhaften Transaktion bekommt einen anderen Code und zusätzlich
wird die Transaktion angegeben, die fehlerhaft ist.
Für jede der Ebenen gibt es eine Auswahl von (Fehler-)Codes.</p>
</div>
<div class="paragraph">
<p>In trivialen Fällen kann eine R-Transaktion erstellt werden und die Original-Transaktion
an den Absender zurückgegeben werden.
In der Regel sollte eine solche Transaktion natürlich gar nicht erst an das
Clearing-Institut übergeben werden.
Es gibt aber natürlich Fehler, die genau dazu führen.</p>
</div>
<div class="paragraph">
<p>In komplexeren Fällen muss aber manuell eingegriffen werden.
So wird z.B. ein ganzes Bulk abgewiesen weil alle darin enthaltenen Tranaktionen,
die darin enthalten sind, abgewiesen wurden.
Der entsprechende Fehlercode sagt genau dies aus.
Wenn in dem Bulk nur eine Transaktion enthalten war, hilft dieser Code natürlich
nicht bei der Behebung des Problems.
Also schaut man sich die Original-Transaktion an.
Wenn die Datei, die die Transaktion enthält, aber so groß ist, dass sie mit einem
Editor nicht mehr geöffnet werden kann, steht man vor einem Problem.</p>
</div>
<div class="paragraph">
<p>Die Systeme, die heute für die Verarbeitung von SEPA-Dateien entwickelt werden,
sollen mit mehreren Gigabyte großen Dateien umgehen können.
Damit nicht nur Maschinen deren Inhalt verstehen, sondern auch Menschen vor dem Bildschirm,
wurde das XML-Format gewählt.
Wenn aber die Dateien wegen ihrer Größe gar nicht erst geöffnet werden können,
macht das aus meiner Sicht alles keinen Sinn mehr.
Deshalb verstehe ich nicht, warum Bulks in nur einer Datei zusammengefasst werden.</p>
</div>
<div class="paragraph">
<p>Letztendlich werden die Bulks sowieso getrennt voneinander verarbeitet.
Wenn verschiedene Nachrichtenarten ausgetauscht werden, werden die Dateien also
wieder zerpflückt, die vorher für den Austausch zusammengefügt wurden.</p>
</div>
<div class="paragraph">
<p>Warum werden mehrere ISO20022-konforme Dateien nicht zu einer Datei zusammengefasst,
so wie man es von ZIP-Archiven kennt?
Eine Datei mit einem standardisiertem Namen (z.B. „header.xml“) könnte als
Container für Informationen über das Archiv genutzt werden.
Das hätte viele Vorteile:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Es gäbe einen gemeinsamen Standard.&lt;/li&gt;</p>
</li>
<li>
<p>Die im Archiv enthaltenen Dateien könnten komprimiert werden. Gerade bei XML-Dateien mit vielen Whitespaces würde dies vermutlich die Dateigröße deutlich minimieren und Übertragungszeit sparen.&lt;/li&gt;</p>
</li>
<li>
<p>Die Verarbeitung kann direkt parallel stattfinden, da aus einer Datei nicht erst noch die verschiedenen Nachrichtenarten extrahiert werden müssen. Außerdem müssen sie am Ende nicht wieder zusammen gefasst werden. Es spart also Verarbeitungszeit.&lt;/li&gt;</p>
</li>
<li>
<p>Da Clearing-Institute bereits heute die Größe von Bulks beschränken (ca. 100.000 Transaktionen), können die Dateien mit handelsüblichen Editoren geöffnet werden.&lt;/li&gt;</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>ISO20022 dient als vernünftige Vorlage für das SEPA-Dateiformat.
Was die Clearing-Institute bisher daraus gemacht haben, ist leider in vielen Belangen
nicht optimal.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Bedeutung der galvanischen Trennung für den Betrieb</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2012-02-09-galvanische_trennung/</link>
			<pubDate>Thu, 09 Feb 2012 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2012-02-09-galvanische_trennung/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Es gibt Java-Applikationen, deren Module Komponenten zugewiesen werden und in
einem EAR-File verschnürt werden, auch wenn die Anwendungen dann
&lt;a href=&#34;http://koetterheinri.ch/robustes_system&#34;&gt;wie beschrieben&lt;/a&gt; weniger robust sind.
Problematisch wird es, wenn unter mehreren Komponenten Abhängigkeiten entstehen.
Diese sorgen dafür, dass die Komponente A nur noch mit Komponente B laufen kann
und die galvanische Trennung ist nicht mehr gegeben.
Die Schnittstellen zwischen den Komponenten sind offensichtlich und leicht zu identifizieren,
denn bei entsprechender Benennung der Packages findet sich schnell der Name
der Komponente A im Code von Komponente B wieder.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Es gibt Java-Applikationen, deren Module Komponenten zugewiesen werden und in
einem EAR-File verschnürt werden, auch wenn die Anwendungen dann
<a href="http://koetterheinri.ch/robustes_system">wie beschrieben</a> weniger robust sind.
Problematisch wird es, wenn unter mehreren Komponenten Abhängigkeiten entstehen.
Diese sorgen dafür, dass die Komponente A nur noch mit Komponente B laufen kann
und die galvanische Trennung ist nicht mehr gegeben.
Die Schnittstellen zwischen den Komponenten sind offensichtlich und leicht zu identifizieren,
denn bei entsprechender Benennung der Packages findet sich schnell der Name
der Komponente A im Code von Komponente B wieder.</p>
</div>
<div class="paragraph">
<p>Eine Verletzung der galvanischen Trennung zu sehen, wird schwieriger,
wenn eine 3. Komponente C dazukommt, die von Komponente A und B genutzt wird.
Wenn z.B. Daten aus den Komponenten A und B in Komponente zusammengeführt werden,
wird die Trennung ebenfalls verletzt.
Die Verletzung sorgt nicht nur bei der Handhabung der Komponenten für Probleme,
sondern auch bei der Organisation der Zuständigkeiten.
Wenn die Komponenten A und B von je von einem Team betreut werden,
wer ist dann für die Komponente C zuständig?</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Pressebericht &#34;Zahlungsverkehr im Wandel&#34;</title>
			<link>https://koetterheinri.ch/posts/zahlungsverkehr/2011-10-07-erster_pressebericht/</link>
			<pubDate>Fri, 07 Oct 2011 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/zahlungsverkehr/2011-10-07-erster_pressebericht/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Ich habe meinen ersten Pressebericht verfasst und er wurde gestern veröffentlicht.
Auf der Homepage meines Arbeitgebers ist er zu finden:
&lt;a href=&#34;http://www.beckmann-partner.de/news/82&#34;&gt;Zahlungsverkehr im Wandel&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
				
#zahlungsverkehr 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Ich habe meinen ersten Pressebericht verfasst und er wurde gestern veröffentlicht.
Auf der Homepage meines Arbeitgebers ist er zu finden:
<a href="http://www.beckmann-partner.de/news/82">Zahlungsverkehr im Wandel</a></p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Galvanische Trennung in der Softwareentwicklung</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2011-08-30-galvanische_trennung/</link>
			<pubDate>Tue, 30 Aug 2011 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2011-08-30-galvanische_trennung/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Was &amp;#34;Galvanische Trennung&amp;#34; bedeutet wird bei &lt;a href=&#34;http://de.wikipedia.org/wiki/Galvanische_Trennung&#34;&gt;Wikipedia&lt;/a&gt; ganz gut beschrieben.
Aber was bedeutet es eigentlich in der Softwareentwicklung?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;ulist&#34;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Man kann 2 System-Teile getrennt voneinander implementieren.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Man kann diese Teile getrennt voneinander testen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Man kann diese Teile getrennt voneinander in Betrieb nehmen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Einleuchtend, oder? Aber halt! Fehlt da nicht etwas?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Richtig - der Betrieb selbst!
Problematisch wird es, wenn zwei voneinander getrennt entwickelte,
etestete und in Betrieb genommene System-Teile im Betrieb nicht mehr trennbar sind.
Es kann ja nicht sein, dass 2 Leitungen, die getrennt voneinander produziert wurden,
auf einer Platine überkreuz angebracht werden.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Was &#34;Galvanische Trennung&#34; bedeutet wird bei <a href="http://de.wikipedia.org/wiki/Galvanische_Trennung">Wikipedia</a> ganz gut beschrieben.
Aber was bedeutet es eigentlich in der Softwareentwicklung?</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Man kann 2 System-Teile getrennt voneinander implementieren.</p>
</li>
<li>
<p>Man kann diese Teile getrennt voneinander testen.</p>
</li>
<li>
<p>Man kann diese Teile getrennt voneinander in Betrieb nehmen.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Einleuchtend, oder? Aber halt! Fehlt da nicht etwas?</p>
</div>
<div class="paragraph">
<p>Richtig - der Betrieb selbst!
Problematisch wird es, wenn zwei voneinander getrennt entwickelte,
etestete und in Betrieb genommene System-Teile im Betrieb nicht mehr trennbar sind.
Es kann ja nicht sein, dass 2 Leitungen, die getrennt voneinander produziert wurden,
auf einer Platine überkreuz angebracht werden.</p>
</div>
<div class="paragraph">
<p>Ein typischer Fall von nicht zu Ende gedacht.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Robustes System – Auch aus Sicht von Wartung und Betreuung</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2011-08-30-robustes_system/</link>
			<pubDate>Tue, 30 Aug 2011 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2011-08-30-robustes_system/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Im Application-Server können mehrere EAR-Files deployed werden.
Solche EAR-Files enthalten JARs und auch WAR-Files.
Es sind letztlich mehrere Module, die zu einem großen Ganzen zusammengesteckt werden.
Dies macht Sinn, wenn es um Systeme geht, die mehrere Module enthalten,
um eine fachliche Aufgabe zu erledigen.&amp;lt;br /&amp;gt;
Es gibt die unterschiedlichsten nicht funktionalen Anforderungen an Systeme.
So unter anderem auch Robustheit.
Für mich bedeutet dies nicht nur für einen robusten Betrieb zu sorgen,
sondern auch für robuste Wartung und Betreuung.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Im Application-Server können mehrere EAR-Files deployed werden.
Solche EAR-Files enthalten JARs und auch WAR-Files.
Es sind letztlich mehrere Module, die zu einem großen Ganzen zusammengesteckt werden.
Dies macht Sinn, wenn es um Systeme geht, die mehrere Module enthalten,
um eine fachliche Aufgabe zu erledigen.&lt;br /&gt;
Es gibt die unterschiedlichsten nicht funktionalen Anforderungen an Systeme.
So unter anderem auch Robustheit.
Für mich bedeutet dies nicht nur für einen robusten Betrieb zu sorgen,
sondern auch für robuste Wartung und Betreuung.</p>
</div>
<div class="paragraph">
<p>Wenn nun ein großes System mit einer langen Prozesskette und mehreren Prozessschritten
in 2 EAR-Files verpackt wird, ist es unter Umständen für die Wartung und Betreuung nicht mehr robust,
weil ein möglicher Fehler in einem Prozessschritt die komplette Prozesskette lahm legt,
wenn wegen diesem Fehler eines oder beide EAR-Files neu deployed werden müssen.</p>
</div>
<div class="paragraph">
<p>Aus meiner Sicht, müssen die einzelnen Prozessschritte herausgelöst werden
und bestimmte Prozessschritte in ein eigenes EAR-File verpackt werden.
So ist es dann auch möglich, das System robuster zu gestalten;
denn einzelne Prozessschritte können auf andere Maschinen ausgelagert werden.
Fällt ein Fehler auf, kann ein Prozessschritt für kurze Zeit gestoppt werden,
ohne dass andere Prozessschritte davon betroffen sind.</p>
</div>
<div class="paragraph">
<p>Übrigens: Fehler treten dann auf, wenn man sie am wenigsten erwartet.
Beispiel: Nach 3 Jahren fehlerlosem Betrieb gab es eine Konstellation,
die wegen eines falschen Parameters zu einer falschen Ausgabe führte.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>NoSQL – Lamport Timestamps</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2011-06-29-lamport_timestamps/</link>
			<pubDate>Wed, 29 Jun 2011 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2011-06-29-lamport_timestamps/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Aktuell beschäftige ich mich mit der Problemlösung für ein Browsergame.
Dieses soll kostengünstig betrieben werden können - auf einem Tomcat!
Da die meisten (Cloud-)Provider vorallem Tomcat anbieten habe ich den anfänglichen Plan,
einen V-Server mit einem vollwertigen Application-Server zu verwenden, verworfen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Da CDI sehr mächtig ist und auch mit einem Tomcat nutzbar ist und
als Programmiermodell in der näheren Zukunft im Bereich Java aus meiner Sicht
immer mehr Anklang finden wird, ist es eine gute Übung für den beruflichen Alltag.
Jede Bean kann über Dependency Injection ganz elegant von außen in eine andere Bean
eingepflanzt und dort benutzt werden.&lt;/p&gt;
&lt;/div&gt;
				
#software engineering #nosql 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Aktuell beschäftige ich mich mit der Problemlösung für ein Browsergame.
Dieses soll kostengünstig betrieben werden können - auf einem Tomcat!
Da die meisten (Cloud-)Provider vorallem Tomcat anbieten habe ich den anfänglichen Plan,
einen V-Server mit einem vollwertigen Application-Server zu verwenden, verworfen.</p>
</div>
<div class="paragraph">
<p>Da CDI sehr mächtig ist und auch mit einem Tomcat nutzbar ist und
als Programmiermodell in der näheren Zukunft im Bereich Java aus meiner Sicht
immer mehr Anklang finden wird, ist es eine gute Übung für den beruflichen Alltag.
Jede Bean kann über Dependency Injection ganz elegant von außen in eine andere Bean
eingepflanzt und dort benutzt werden.</p>
</div>
<div class="paragraph">
<p>Dann bin ich auf die Problematik von Transaktionen gestoßen.
Mein erster, schlichter Ansatz war, dass ich mir einen EntityManager mit Hilfe von
Seam Persistence oder MyFaces CODI injecten lasse und über @Transactional dafür sorge,
dass Transaktionen für Methoden zur Verfügung stehen.
Ich wollte also mit JPA arbeiten.
Da dies nicht so funktionierte, wie ich es mir vorstellte, habe ich die Versuche,
es zum Laufen zu bringen, abgebrochen.</p>
</div>
<div class="paragraph">
<p>Aktuell suche ich mein Heil im Bereich NoSQL-Datenbanken.
Einfach ein Objekt an die Datenbank übergeben und es persistiert - damit ist es nicht getan.
Bei aufwändigeren Applikationen als einem reinen Archiv sollen die
Daten auch verändert werden können.
Und genau dort liegt der Grund für diesen Blog-Eintrag.
Beim Informationen-Sammeln habe ich das Buch <strong>NoSQL</strong> - Einstieg in die Welt nichtrelationaler Web-2.0-Datenbanken
von Stefan Edlich, Achim Friedland, Jens Hampe, Benjamin Brauer entdeckt.
Ich bin noch nicht durch, allerdings war das Kapitel 2.5 Vector Clocks besonders
interessant für mich.
Dort wird nämlich die <a href="http://de.wikipedia.org/wiki/Lamport-Uhr">Lamport-Uhr</a> erklärt,
die mich auf folgende Idee brachte:</p>
</div>
<div class="paragraph">
<p>In einem Browsergame ist die Konsistenz relativ unwichtig.
Natürlich sollten die Daten zu einem Zeitpunkt konsistent sein,
wann dieser Zeitpunkt ist, bleibt dabei aber unerheblich.
Bei meinem Browsergame soll es vorwiegend darum gehen, Ressourcen zu sammeln,
um eine Siedlung auszubauen und dadurch eine Armee erzeugen zu können,
mit der man andere Siedlungen von anderen Spielern angreifen kann.</p>
</div>
<div class="paragraph">
<p>Abstrakt gesehen geschieht also in der Regel folgendes:
Es wird eine Entität erzeugt an der viele Informationen hängen.
Es können Informationen hinzukommen (neue Armee), aber auch gelöscht werden
(Armee wird besiegt, da alle Soldaten tot).
Da davon auszugehen ist, dass nicht nur ein Spieler spielt,
werden mehrere Entitäten dieser Art erzeugt.
Für diese Entitäten werden regelmäßig Aktualisierungen bestimmter Felder vorgenommen.
Diese Felder sind in der Regel Zahlen.
Mit Zahlen können diverse Berechnungen vorgenommen werden.</p>
</div>
<div class="paragraph">
<p>Und hier kommt nun die Lamport-Uhr ins Spiel:
Kurz gesprochen geht es um das &#34;Zuweisen von eindeutigen Zeitstempeln an Nachrichten&#34; (<a href="http://de.wikipedia.org/wiki/Lamport-Uhr">Wikipedia</a>).
Die Lamport-Uhren erlauben allerdings nicht das Erkennen von Nebenläufigkeit.
Dazu wurden die Vektorenuhren entwickelt.</p>
</div>
<div class="paragraph">
<p>Nach meinem aktuellen Wissensstand (der noch sehr gering ist) zum Thema NoSQL-Datenbanken,
werden Entitäten in NoSQL-Datenbanken meist mit einem Timestamp oder einer
Revisionsnummer versehen, sodass man eine Art Reihenfolge von Änderungen der Entitäten erhält.
Dies geht mir persönlich nicht weit genug.</p>
</div>
<div class="paragraph">
<p>Funktionale Programmiersprachen machen es möglich, auf große Datenmengen
Funktionen ausführen zu lassen - und zwar parallel!
Ich möchte ungern eine Entität aus der Datenbank laden,
um einen Wert zu ändern und anschließend die ganze Entität aktualisieren.
Stattdessen möchte ich der Datenbank sagen können,
welches Feld für welche Entität mit welcher Funktion sie aktualisieren soll.
Die Datenbank nimmt diese 3 Informationen als Einheit (&#34;Nachricht&#34;) an und versieht
sie mit einem Timestamp.
Dabei ist es erstmal egal, wann diese Nachricht anschließend von der
Datenbank verarbeitet wird, wichtig ist nur, dass sie verarbeitet wird!
Die Reihenfolge der Verarbeitung mehrere Nachrichten wird durch den Timestamp festgelegt.</p>
</div>
<div class="paragraph">
<p>Dadurch, dass die Datenbank die Operationen verwaltet und keine Deltas ermitteln muss,
lassen sich solche Operationen auch rückgängig machen,
was sinnvoll für ein Browsergame ist.
So könnte durch den Zugriff auf eine inkonsistente Replikation eine Operation
ermöglicht werden, die auf einer konsistenten Replikation nicht möglich gewesen wäre.
Bei großen Datenmengen kann das rückgängig machen einer Operation nicht manuell,
sondern muss vollautomatisch geschehen.
Da man allerdings nicht jede Operation rückgängig machen möchte,
weil eine andere Operation Vorrang hat, müsste eine Nachricht neben dem Timestamp
auch eine Priorität erhalten.
So kann die Liste der Nachrichten nach zurückzurollenden Operationen durchsucht werden.
Wenn bei der Synchronisierung aller Replikationen Fehler erkannt werden,
können diese mit Hilfe des Timestamps und der Priorität ermitteln,
welche Operationen zurückgerollt (aus der Liste gelöscht oder Umkehrung der
Original-Operation) werden müssen und welche tatsächlich ausgeführt werden sollen.</p>
</div>
<div class="paragraph">
<p>Problematisch bleibt bei dieser Idee, dass es sehr viele Inkonsistenzen zwischen
den einzelnen Replikationen geben könnte und dadurch viele Nachrichten zurückgerollt
werden müssen.
&lt;p&gt;Außerdem stellt sich mir die Frage, ob solche Funktionalität von einer Datenbank
angeboten werden sollte oder über die Applikation selbst (z.B. durch die Nutzung eines Frameworks) implementiert werden muss?</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Analyse der Fachlichkeit</title>
			<link>https://koetterheinri.ch/posts/software-engineering/2011-04-18-analyse_fachlichkeit/</link>
			<pubDate>Mon, 18 Apr 2011 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/software-engineering/2011-04-18-analyse_fachlichkeit/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Java EE ist durch das Convention over Configuration Paradigma einfach zu handhaben,
solange man den Konventionen vertraut.
Sobald man davon abweicht, muss man vorsichtig sein, was man tut.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Speziell das Transaction-Handling sorgt immer wieder für Probleme.
Per Konvention läuft eine Methode einer EJB in einer Transaktion.
Gibt es bereits eine Transaktion, wird diese wiederverwendet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Wenn aber über die Annotation
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
eine neue Transaktion gestartet werden soll, dann wird es schwieriger.
Wenn dann dem Entwickler aus fachlicher Sicht nichtmal klar ist,
wie das Transaktionsverhalten sein sollte, werden Konstrukte gebaut,
die nicht mehr wartbar sind.&lt;/p&gt;
&lt;/div&gt;
				
#java #javaee 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Java EE ist durch das Convention over Configuration Paradigma einfach zu handhaben,
solange man den Konventionen vertraut.
Sobald man davon abweicht, muss man vorsichtig sein, was man tut.</p>
</div>
<div class="paragraph">
<p>Speziell das Transaction-Handling sorgt immer wieder für Probleme.
Per Konvention läuft eine Methode einer EJB in einer Transaktion.
Gibt es bereits eine Transaktion, wird diese wiederverwendet.</p>
</div>
<div class="paragraph">
<p>Wenn aber über die Annotation
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
eine neue Transaktion gestartet werden soll, dann wird es schwieriger.
Wenn dann dem Entwickler aus fachlicher Sicht nichtmal klar ist,
wie das Transaktionsverhalten sein sollte, werden Konstrukte gebaut,
die nicht mehr wartbar sind.</p>
</div>
<div class="paragraph">
<p>Meine bisherige Erfahrung ist, dass die Kombination der TransactionAttributeTypes
REQUIRES_NEW/REQUIRED und NEVER hilfreich ist, wenn es darum geht,
Timeouts für Transaktionen zu vermeiden.
Denn sobald man mit REQUIRES_NEW eine neue Transaktion starten lässt,
wird die Transaktion, die zuvor gestartet wurde, pausiert.
Wenn im Application-Server dann ein Timeout konfiguriert ist,
kommt es z.B. beim WebSphere AS nach 10 Minuten zu einem Transaction-Timeout
und durch eine TransactionRolledbackException wird die Transaktion zurückgerollt.
Deshalb versuche ich bei langläufigen Transaktionen (speziell Batch-Verarbeitung)
alles, was nicht innerhalb einer Transaktion ablaufen muss,
mit einer EJB ohne Transaktion (TransactionAttributeType.NEVER) verarbeitet wird.
Mit einer zweiten EJB werden dann mit einer neuen Transaktion alle Datensätze aktualisiert.
Dadurch verhindert man in den meisten Fällen, dass man den Konfigurationswert
für ein Transaction-Timeout immer weiter nach oben schrauben muss.</p>
</div>
<div class="paragraph">
<p>Wenn allerdings dem Entwickler nicht klar ist, wie die einzelnen EJBs überhaupt zusammenarbeiten,
wird es schwierig.
Dann werden Konstrukte gebaut, die weit weg vom Standard sind.
Da wird dann mit Hilfe des Decorator-Patterns mit Technik versucht etwas zu korrigieren,
was man bei genauerer Betrachtung mit einfachsten Mitteln hätte gelöst werden können.</p>
</div>
<div class="paragraph">
<p>Ein weiteres Problem sind Unit-Tests.
Viele solcher Tests sind meist keine richtigen Unit-Tests, sondern halbe Integrationstests.
Diese werden meist so aufgebaut, dass am Anfang eine Transaktion gestartet und
am Ende beendet wird.
Dies spiegelt natürlich nicht das tatsächliche Verhalten im Container wieder.</p>
</div>
<div class="paragraph">
<p>Jetzt lässt sich natürlich darüber streiten, ob es solche Tests überhaupt geben sollte.
Wenn man aber solche Tests schreibt, sollte man das Transaktionsverhalten auch
möglichst nachbauen und nicht über Code, der auch im produktiven Betrieb genutzt wird,
ein Konstrukt zu bauen, das scheinbar funktioniert.
Zum einen ist solch ein Code in vielen Fällen schwer wartbar und
zum anderen wird diese Art von Code in den meisten Fällen nicht wieder entfernt,
wenn er mal im Produktion war.</p>
</div>
<div class="paragraph">
<p>Am Besten ist es, sich auch mal mit der Fachlichkeit zu beschäftigen.
Dann muss man keine Probleme mit überkomplizierten Code lösen.</p>
</div>
]]></content>
		</item>
		
		<item>
			<title>Java Native Interface</title>
			<link>https://koetterheinri.ch/posts/java/2010-03-23-jni/</link>
			<pubDate>Tue, 23 Mar 2010 00:00:00 +0000</pubDate>
			
			<guid>https://koetterheinri.ch/posts/java/2010-03-23-jni/</guid>
			<description>
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Im aktuellen Projekt verwenden wir JNI zum Aufruf einer C-API.
Dabei habe ich verschiedene Herausforderungen gemeistert.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Die größte Herausforderung betrifft die Bibliothek, die im Java-Code über
System.loadLibrary(String) geladen werden soll.
Diese muss im java.library.path liegen.
Diesen kann man beim Aufruf über die Konsole angeben:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;
&lt;pre&gt;java -Djava.library.path=&amp;amp;lt;path_to_lib&amp;amp;gt; JNICall.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;paragraph&#34;&gt;
&lt;p&gt;Unter Sun Solaris kann man dafür auch die Umgebungsvariable LD_LIBRARY_PATH nutzen;
unter Windows ist es PATH.
Dann benötigt man den Parameter beim Aufruf nicht mehr.
Im Websphere 6.1 ist das etwas schwieriger. Dort kann man die Variable
java.library.path als benutzerdefiniertes Merkmal für die JVM definieren.
Für jeden Anwendungsserver kann man unter Java- und Prozessverwaltung in der
Prozessdefinition unter Java Virtual Machine ein entsprechendes Merkmal hinzufügen.&lt;/p&gt;
&lt;/div&gt;
				
#java #jni 
				
			</description>
			<content type="html"><![CDATA[<div class="paragraph">
<p>Im aktuellen Projekt verwenden wir JNI zum Aufruf einer C-API.
Dabei habe ich verschiedene Herausforderungen gemeistert.</p>
</div>
<div class="paragraph">
<p>Die größte Herausforderung betrifft die Bibliothek, die im Java-Code über
System.loadLibrary(String) geladen werden soll.
Diese muss im java.library.path liegen.
Diesen kann man beim Aufruf über die Konsole angeben:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>java -Djava.library.path=&amp;lt;path_to_lib&amp;gt; JNICall.</pre>
</div>
</div>
<div class="paragraph">
<p>Unter Sun Solaris kann man dafür auch die Umgebungsvariable LD_LIBRARY_PATH nutzen;
unter Windows ist es PATH.
Dann benötigt man den Parameter beim Aufruf nicht mehr.
Im Websphere 6.1 ist das etwas schwieriger. Dort kann man die Variable
java.library.path als benutzerdefiniertes Merkmal für die JVM definieren.
Für jeden Anwendungsserver kann man unter Java- und Prozessverwaltung in der
Prozessdefinition unter Java Virtual Machine ein entsprechendes Merkmal hinzufügen.</p>
</div>
<div class="paragraph">
<p>Das Kompilieren des C-Codes war leider auch nicht ganz so einfach.
Unter Windows haben wir dazu GCC von MinGW genutzt.
Unter Sun Solaris hatten wir CC zur Verfügung.
Mit Hilfe eines Ant-Scripts konnten wir relativ einfach für die entsprechenden
Umgebungen mit kleinen Anpassungen den Code compilieren.</p>
</div>
<div class="paragraph">
<p>Die größte Herausforderung war allerdings das Laden der Bibliothek unter Solaris.
Während es unter Windows eine *.dll ist, ist es unter Solaris eine *.so!
Unter Solaris kommt allerdings noch ein Präfix dazu: lib.
Das bedeutet, dass unter Windows die Bibliothek z.B. Demo.dll heißen muss,
unter Solaris jedoch libDemo.so!</p>
</div>
<div class="paragraph">
<p>Ich hoffe, dass diese Informationen dem einen oder anderen dabei helfen können,
selbst über JNI C-Code aufzurufen.</p>
</div>
<div class="paragraph">
<p><strong>Nachtrag:</strong>
Wenn eine Bibliothek bereits von einem Classloader geladen wurde,
kann diese nicht erneut geladen werden.
Wird es doch versucht, erhält man einen UnsatisfiedLinkError mit der Meldung
&#34;Native Library Demo already loaded in another classloader&#34;.</p>
</div>
<div class="paragraph">
<p>Das Laden einer Bibliothek in in einem Application Server wie dem Websphere AS
sollte im Allgemeinen vermieden werden.
Es gibt aber eben auch Fälle, in denen es notwendig ist.
Dann habe ich folgenden Tipp: Das Laden der Bibliothek und der Aufruf der nativen
Methoden sollte in ein JAR ausgelagert werden und nicht in einem EAR enthalten sein.
Dieses JAR sollte in das lib-Verzeichnis des Websphere AS kopiert werden.
Der Pfad zur Bibliothek im java.library.path muss, wie oben beschrieben,
im Anwendungsserver definiert werden.</p>
</div>
<div class="paragraph">
<p>So sollte die Bibliothek nicht von dem Classloader des Anwendungsservers geladen werden,
sondern von einem höher angesiedelten.</p>
</div>
<div class="paragraph">
<p>Übrigens: Wenn es einen UnsatisfiedLinkError beim Aufruf einer nativen Methode gibt
(im Stacktrace taucht &#34;Native Method&#34; ganz oben auf),
dann stimmt in den meisten Fällen der Klassenname oder der Packagename nicht.</p>
</div>
]]></content>
		</item>
		
	</channel>
</rss>
