<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
  <title>Jonas Hahn - Blog und Referenzen</title>
  <subtitle>Jonas Hahn, freiberuflicher IT-Berater aus München: Monitoring, Cloud Operations (Kubernetes, OpenShift, Terraform), Datenbanken und Datenplattformen sowie individuelle Softwareentwicklung mit Java Spring.</subtitle>
  <link href="https://it-consulting-hahn.de/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://it-consulting-hahn.de/" rel="alternate" type="text/html"/>
  <id>https://it-consulting-hahn.de/</id>
  <updated>2026-09-26T12:15:36+02:00</updated>
  <author><name>Jonas Hahn</name><uri>https://it-consulting-hahn.de/</uri></author>
  <entry>
    <title>Monitoring ist wie Rasen mähen</title>
    <link href="https://it-consulting-hahn.de/monitoring-ist-wie-rasen-maehen/" rel="alternate" type="text/html"/>
    <id>https://it-consulting-hahn.de/monitoring-ist-wie-rasen-maehen/</id>
    <published>2026-09-25T00:00:00+02:00</published>
    <updated>2026-09-25T00:00:00+02:00</updated>
    <category term="Blog"/>
    <summary type="html">Monitoring ist nie fertig. Mit vier Bildern – Rasen mähen, zerbrochene Fenster, Schmetterlingseffekt und der Junge, der „Wolf!“ rief – zeige ich, worauf es nach dem Aufsetzen des Monitorings wirklich ankommt.</summary>
    <content type="html">&lt;h2 id=&quot;1-monitoring-ist-wie-rasen-mähen--warum-man-nie-fertig-ist&quot;&gt;&lt;strong&gt;1. Monitoring ist wie Rasen mähen – warum man nie fertig ist&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/rasen_maehen.jpg&quot; alt=&quot;Image&quot; class=&quot;post-img-left post-img-landscape&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ist das Monitoring erst einmal aufgesetzt und eingeschwungen, ist die Freude groß: Alle wichtigen Metriken
auf dem Dashboard, keine offenen Alerts. Arbeit erledigt.&lt;/p&gt;

&lt;p&gt;Leider ist es nicht so einfach. Ein Monitoring lebt davon, dauerhaft gepflegt zu werden. Neue Systeme kommen dazu,
die Last verändert sich, neue Versionen werden deployt, Alerts wollen nachjustiert werden. Und die anfangs gute
Alert-Moral bröckelt, weil gerade ein neuer Kunde onboarded oder ein wichtiges Feature gebaut wird.&lt;/p&gt;

&lt;p&gt;Es ist wie beim Rasen: Nur weil man einmal gemäht hat, bleibt er nicht für immer kurz. Zwei Wochen nicht gemäht,
und das Unkraut wächst. Nach einem Monat verholzt es, nach einem halben Jahr steht dort ein kleiner Wald. Was anfangs
eine Fingerübung war, wird zum Kraftakt, der sich immer schwerer einplanen lässt – also macht es niemand.&lt;/p&gt;

&lt;p&gt;Deshalb: dranbleiben. Monitoring aktuell halten, regelmäßig aufräumen, Auffälligkeiten nachgehen. Und wenn es doch
einmal verwildert ist (das passiert jedem), nicht resignieren, sondern den Rhythmus wieder aufnehmen.&lt;/p&gt;

&lt;h2 id=&quot;2-der-broken-windows-effekt--warum-kleinigkeiten-zählen&quot;&gt;&lt;strong&gt;2. Der “Broken Windows”-Effekt – warum Kleinigkeiten zählen&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/broken_windows.jpg&quot; alt=&quot;Image&quot; class=&quot;post-img-right post-img-landscape&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Eine saubere Straße, ein Fenster geht kaputt, niemand repariert es. Andere sehen das kaputte Fenster und kümmern sich
auch weniger. Weitere Fenster gehen zu Bruch – am Ende stehen verfallene Häuser und brennende Autos.&lt;/p&gt;

&lt;p&gt;Im Betrieb sind die zerbrochenen Fenster die kleinen Dinge: ein Alert, den alle ignorieren. Pods, die „halt manchmal“
neu starten. Speicher, der dauerhaft am Limit läuft. Fehler im Log, die „schon immer da waren“. Werden die kleinen
Dinge erst einmal hingenommen, kann man sie irgendwann nicht mehr von den großen unterscheiden. Und plötzlich
verbringt man mehr Zeit damit, das System am Laufen zu halten, als es weiterzuentwickeln.&lt;/p&gt;

&lt;h2 id=&quot;3-der-schmetterlingseffekt--jede-kleinigkeit-ist-ein-geschenk&quot;&gt;&lt;strong&gt;3. Der Schmetterlingseffekt – jede Kleinigkeit ist ein Geschenk&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/schmetterling.jpg&quot; alt=&quot;Image&quot; class=&quot;post-img-left post-img-portrait&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ein Beispiel, das ich so oder so ähnlich schon mehrfach erlebt habe: 30 Pods laufen, ab und zu startet einer ohne
erkennbaren Grund neu. Der Service läuft ja weiter, also kümmert sich niemand darum. Dann kommt Last, und die
Plattform steht plötzlich komplett. Unter Stress wird neu gestartet, hoch- und runterskaliert – und die eigentliche
Ursache wird wieder nicht gefunden.&lt;/p&gt;

&lt;p&gt;Die seltenen Neustarts waren der Flügelschlag des Schmetterlings: ein frühes Signal für ein tieferliegendes Problem.
Ich sehe solche kleinen Auffälligkeiten deshalb als Geschenk. Man bekommt einen Hinweis, dass etwas nicht stimmt,
und hat noch die Ruhe, der Ursache in aller Gründlichkeit nachzugehen. Später, mitten im Incident, hat man diese Ruhe
nicht mehr.&lt;/p&gt;

&lt;h2 id=&quot;4-der-junge-der-wolf-rief--jede-benachrichtigung-muss-zählen&quot;&gt;&lt;strong&gt;4. Der Junge, der „Wolf!“ rief – jede Benachrichtigung muss zählen&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/wolf.jpg&quot; alt=&quot;Image&quot; class=&quot;post-img-right post-img-portrait&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ein Hirtenjunge ruft zum Spaß „Wolf! Wolf!“ und amüsiert sich, wenn die Dorfbewohner angerannt kommen. Als eines
Tages wirklich ein Wolf auftaucht, glaubt ihm niemand mehr.&lt;/p&gt;

&lt;p&gt;Der Hirtenjunge ist das Monitoring. Wenn Alerts kommen, bei denen es heißt „den kann man ignorieren“, werden
irgendwann alle Alerts ignoriert – bis die Kunden anfangen zu rufen. Meine Faustregeln:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Alerts sofort beheben.&lt;/strong&gt; Geht das nicht schnell, den Alert bewusst stummschalten (Downtime/Acknowledge)
und ein Ticket daran hängen.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Nur benachrichtigen, was sofortiges Handeln erfordert.&lt;/strong&gt; Alles andere gehört aufs Dashboard, nicht in den
Chat-Kanal oder auf den Pager. Sonst stumpft man gegen das ständige „Ping! Ping! Ping!“ ab – und der Wolf freut
sich über ein Festmahl.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;fazit&quot;&gt;&lt;strong&gt;Fazit&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Ein gutes Monitoring ist kein Projekt mit Enddatum, sondern eine Gewohnheit. Regelmäßig mähen, kaputte Fenster
reparieren, auf die kleinen Flügelschläge achten und nur „Wolf!“ rufen, wenn wirklich einer da ist. Dann wird aus
dem ständigen Gefühl, dass gleich etwas Schlimmes passiert, eine Plattform, bei der ein Ausfall wieder die Überraschung
ist – und nicht der Normalfall.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>There is no silver bullet – warum jede Entscheidung ein Kompromiss ist</title>
    <link href="https://it-consulting-hahn.de/there-is-no-silver-bullet/" rel="alternate" type="text/html"/>
    <id>https://it-consulting-hahn.de/there-is-no-silver-bullet/</id>
    <published>2026-05-16T00:00:00+02:00</published>
    <updated>2026-05-16T00:00:00+02:00</updated>
    <category term="Blog"/>
    <summary type="html">Jede Technologie, jede Architektur und jeder Prozess verspricht Vorteile – und bringt immer auch einen Preis mit. Warum es keine Wunderwaffe gibt und wie man klug zwischen Vor- und Nachteilen abwägt.</summary>
    <content type="html">&lt;h2 id=&quot;1-die-wunderwaffe-die-es-nicht-gibt&quot;&gt;&lt;strong&gt;1. Die Wunderwaffe, die es nicht gibt&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/silver_bullet.jpg&quot; alt=&quot;Image&quot; class=&quot;post-img-left post-img-landscape&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Im Volksglauben gibt es genau ein Mittel gegen Werwölfe: die Silberkugel. Ein Schuss, und das Problem ist gelöst.
Fred Brooks hat dieses Bild 1986 in seinem Aufsatz „No Silver Bullet“ auf die Softwareentwicklung übertragen:
Es gibt keine einzelne Technik, die Softwareentwicklung auf einen Schlag um ein Vielfaches schneller, einfacher oder
zuverlässiger macht.&lt;/p&gt;

&lt;p&gt;Trotzdem begegnet mir die Suche nach der Silberkugel ständig. Kubernetes soll die Betriebsprobleme lösen,
Microservices die Wartbarkeit, die Cloud die Kosten, KI die Entwicklungsgeschwindigkeit. All das kann helfen –
aber nichts davon gibt es umsonst.&lt;/p&gt;

&lt;h2 id=&quot;2-jeder-vorteil-hat-seinen-preis&quot;&gt;&lt;strong&gt;2. Jeder Vorteil hat seinen Preis&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/seiltaenzer.jpg&quot; alt=&quot;Image&quot; class=&quot;post-img-right post-img-portrait&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Jede Entscheidung, die man in Architektur und Betrieb trifft, verschiebt Gewichte. Man gewinnt auf der einen Seite
und bezahlt auf der anderen. Das ist kein Zeichen einer schlechten Entscheidung, sondern schlicht Physik.
Schlecht wird eine Entscheidung erst, wenn man den Preis nicht kennt – oder so tut, als gäbe es keinen.&lt;/p&gt;

&lt;p&gt;Ein paar Beispiele, die mir in Projekten immer wieder begegnen:&lt;/p&gt;

&lt;table class=&quot;table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Entscheidung&lt;/th&gt;
      &lt;th&gt;Vorteil&lt;/th&gt;
      &lt;th&gt;Preis&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Mehr Redundanz&lt;/td&gt;
      &lt;td&gt;Ausfallsicherheit&lt;/td&gt;
      &lt;td&gt;Mehr Komplexität, höhere Kosten, Fragen der Datenkonsistenz&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Caching&lt;/td&gt;
      &lt;td&gt;Geschwindigkeit, entlastete Datenbank&lt;/td&gt;
      &lt;td&gt;Veraltete Daten, schwierige Invalidierung&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Microservices&lt;/td&gt;
      &lt;td&gt;Unabhängige Deployments und Skalierung&lt;/td&gt;
      &lt;td&gt;Verteiltes System: Netzwerkfehler, Tracing, Konsistenz&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Strikte Resource Limits&lt;/td&gt;
      &lt;td&gt;Vorhersagbarkeit, Schutz der Nachbarn&lt;/td&gt;
      &lt;td&gt;Weniger Spielraum bei Lastspitzen, Throttling&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Autoscaling&lt;/td&gt;
      &lt;td&gt;Passt sich der Last an&lt;/td&gt;
      &lt;td&gt;Kaltstarts, schwankende Kosten, schwerer vorhersagbar&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Aggressive Health Checks&lt;/td&gt;
      &lt;td&gt;Fehler werden schnell erkannt&lt;/td&gt;
      &lt;td&gt;Fehlalarme und Neustart-Kaskaden unter Last&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Normalisiertes Datenmodell&lt;/td&gt;
      &lt;td&gt;Keine Redundanz, klare Konsistenz&lt;/td&gt;
      &lt;td&gt;Viele Joins, langsamere Leseabfragen&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;3-das-cap-theorem--der-klassiker-unter-den-kompromissen&quot;&gt;&lt;strong&gt;3. Das CAP-Theorem – der Klassiker unter den Kompromissen&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/cap_bruecke.jpg&quot; alt=&quot;Image&quot; class=&quot;post-img-left post-img-landscape&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Besonders schön sieht man das Prinzip bei verteilten Systemen. Das CAP-Theorem sagt: Ein verteiltes System kann
nicht gleichzeitig &lt;strong&gt;C&lt;/strong&gt;onsistency (alle Knoten liefern denselben, aktuellen Stand), &lt;strong&gt;A&lt;/strong&gt;vailability (jede Anfrage
bekommt eine Antwort) und &lt;strong&gt;P&lt;/strong&gt;artition Tolerance (das System funktioniert weiter, wenn das Netzwerk zwischen den
Knoten ausfällt) garantieren.&lt;/p&gt;

&lt;p&gt;Oft wird das als „wähle zwei aus drei“ zitiert. Genauer ist: Netzwerkausfälle passieren, man kann sie sich nicht
aussuchen. Die eigentliche Frage lautet also: &lt;strong&gt;Was soll das System tun, wenn die Verbindung zwischen den Knoten
abreißt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/diagrams/cap.svg&quot; alt=&quot;CAP-Theorem: Bei einer Netzwerkpartition muss sich das System zwischen Konsistenz und Verfügbarkeit entscheiden&quot; class=&quot;post-diagram&quot; width=&quot;420&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ein Onlineshop, der „noch 5 auf Lager“ anzeigt, obwohl es nur noch 4 sind, ist ärgerlich, aber verkraftbar – hier
ist Verfügbarkeit wichtiger. Ein Kontostand, der doppelt abgebucht werden kann, ist es nicht – hier gewinnt die
Konsistenz. Dieselbe Frage, zwei richtige Antworten, je nach Kontext.&lt;/p&gt;

&lt;p&gt;Auch Kafka stellt einen vor diese Wahl: Mit &lt;code&gt;acks=all&lt;/code&gt; und &lt;code&gt;min.insync.replicas=2&lt;/code&gt; lehnt der Broker Schreibzugriffe
lieber ab, als Daten auf nur einer Kopie zu speichern. Und &lt;code&gt;unclean.leader.election.enable&lt;/code&gt; entscheidet, ob eine
Partition lieber nicht verfügbar ist oder mit einem veralteten Replikat weiterläuft und dabei Daten verliert.&lt;/p&gt;

&lt;p&gt;Übrigens hört der Kompromiss nicht auf, wenn das Netzwerk funktioniert. Die Erweiterung PACELC ergänzt: Auch im
Normalbetrieb muss man zwischen &lt;strong&gt;L&lt;/strong&gt;atenz und &lt;strong&gt;C&lt;/strong&gt;onsistency abwägen. Jede Bestätigung durch ein weiteres Replikat
macht die Daten sicherer – und die Antwort langsamer.&lt;/p&gt;

&lt;h2 id=&quot;4-stabilität-oder-geschwindigkeit&quot;&gt;&lt;strong&gt;4. Stabilität oder Geschwindigkeit?&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Ein Beispiel aus dem Alltag vieler Teams ist der Release-Prozess. Wer auf &lt;strong&gt;Stabilität&lt;/strong&gt; optimiert, arbeitet mit
Release-Branches, Tags und geplanten Releases mit manuellen Tests. Man weiß genau, was ausgeliefert wird, und
Rollbacks sind sauber. Der Preis: langsamere Iteration und viel Verwaltungsaufwand.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/diagrams/release-branches.svg&quot; alt=&quot;Release-Branches mit Testphase vor der Freigabe&quot; class=&quot;post-diagram&quot; width=&quot;720&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Wer auf &lt;strong&gt;Geschwindigkeit&lt;/strong&gt; optimiert, arbeitet auf einem einzigen Branch, und jede Änderung geht automatisch in
Produktion. Das Feedback kommt schnell, die Pipeline macht die Arbeit. Der Preis: Man setzt alles auf Testabdeckung
und Automatisierung – und was durchrutscht, rutscht direkt in Produktion.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/diagrams/trunk.svg&quot; alt=&quot;Trunk-based Development: jede Änderung ist ein Release&quot; class=&quot;post-diagram&quot; width=&quot;480&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Kann man nicht beides haben? Doch – aber auch das hat seinen Preis. Feature Flags, Canary-Releases, gutes Monitoring
und automatische Rollbacks machen schnelle Releases sicher. Dafür muss man sie aufbauen, betreiben und verstehen.
Die obere rechte Ecke ist erreichbar, aber teuer erkauft.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/diagrams/release-quadrant.svg&quot; alt=&quot;Release-Strategien eingeordnet nach Geschwindigkeit und Stabilität&quot; class=&quot;post-diagram&quot; width=&quot;520&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Keiner der Ansätze ist falsch. Ein reguliertes Unternehmen braucht vielleicht den ersten, ein junges Startup würde
mit ihm nicht überleben.&lt;/p&gt;

&lt;h2 id=&quot;5-wenn-alle-alles-wollen&quot;&gt;&lt;strong&gt;5. Wenn alle alles wollen&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/tauziehen.jpg&quot; alt=&quot;Image&quot; class=&quot;post-img-right post-img-landscape&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Richtig spannend wird es, wenn die Kompromisse nicht nur technisch sind, sondern Menschen dahinterstehen. Der
Fachbereich möchte jede Woche neue Features, der Betrieb am liebsten gar keine Änderungen mehr. Die Security will
jede Bibliothek sofort patchen und gleichzeitig alles abschotten, was wiederum jedes Deployment verlangsamt. Das
Controlling möchte die Server bis zum Anschlag auslasten, die Nutzer erwarten, dass alles immer sofort antwortet –
auch in der Lastspitze, für die man die Reserve gebraucht hätte. Der Datenschutz fordert, so wenig Daten wie möglich
zu speichern und sie früh zu löschen, die Revision will alles jahrelang nachvollziehen können. Die
Entwicklungsteams wollen ihre Technologien frei wählen, die Architektur hätte gern eine einheitliche Plattform. Und
alle wollen das Ganze bis zum nächsten Quartal – natürlich ohne zusätzliches Budget.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/diagrams/anforderungen.svg&quot; alt=&quot;Widersprüchliche Anforderungen verschiedener Beteiligter&quot; class=&quot;post-diagram&quot; width=&quot;760&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Jede dieser Anforderungen ist für sich genommen berechtigt. Zusammen sind sie unerfüllbar. Wer versucht, allen
gleichzeitig gerecht zu werden, baut ein System, das alles ein bisschen und nichts richtig kann.&lt;/p&gt;

&lt;h2 id=&quot;6-wie-man-klug-abwägt&quot;&gt;&lt;strong&gt;6. Wie man klug abwägt&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Wenn es die Silberkugel nicht gibt, bleibt nur eines: bewusst entscheiden. Was mir dabei hilft:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Ziele priorisieren, nicht nur sammeln.&lt;/strong&gt; „Alles ist wichtig“ ist keine Priorisierung. Eine klare Reihenfolge,
etwa „Datensicherheit vor Verfügbarkeit vor Time-to-Market“, macht viele Entscheidungen fast von selbst.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Den Kontext ernst nehmen.&lt;/strong&gt; Was in einem Projekt die perfekte Lösung war, kann im nächsten genau falsch sein.
Best Practices sind Ausgangspunkte, keine Gesetze.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Den Preis benennen.&lt;/strong&gt; Zu jeder Entscheidung gehört die Frage: Was geben wir dafür auf? Wer den Nachteil kennt,
kann ihn überwachen und abfedern.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Umkehrbarkeit beachten.&lt;/strong&gt; Entscheidungen, die sich leicht rückgängig machen lassen, darf man schnell treffen.
Bei Datenmodell, Datenbank oder Cloud-Anbieter lohnt es sich, gründlich nachzudenken.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Entscheidungen dokumentieren.&lt;/strong&gt; Ein kurzer Architecture Decision Record mit Alternativen und bewusst in Kauf
genommenen Nachteilen erspart später lange Diskussionen darüber, „wer sich das denn ausgedacht hat“.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Regelmäßig überprüfen.&lt;/strong&gt; Last, Team und Anforderungen ändern sich. Was vor zwei Jahren der richtige Kompromiss
war, ist es heute vielleicht nicht mehr.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;fazit&quot;&gt;&lt;strong&gt;Fazit&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Es gibt keine Silberkugel – weder in der Technik noch in der Organisation. Jeder Vorteil hat einen Preis, und die
eigentliche Kunst besteht nicht darin, die perfekte Lösung zu finden, sondern darin, den Preis zu kennen, ihn
bewusst zu bezahlen und die Entscheidung wieder aufzugreifen, wenn sich die Lage ändert.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>IT Archäologie - Der Umgang mit Legacy Systemen</title>
    <link href="https://it-consulting-hahn.de/it-archaeologie/" rel="alternate" type="text/html"/>
    <id>https://it-consulting-hahn.de/it-archaeologie/</id>
    <published>2025-02-04T00:00:00+01:00</published>
    <updated>2025-02-04T00:00:00+01:00</updated>
    <category term="Blog"/>
    <summary type="html">Legacy-Systeme sind wie digitale Ruinen – tief in den IT-Landschaften vieler Unternehmen verankert. Sie laufen oft seit Jahrzehnten, niemand weiß mehr genau, wie sie funktionieren, und trotzdem sind sie geschäftskritisch. Ein Update? Unmöglich. Eine Ablösung? Ein Albtraum. Wie gehst du damit um? Abwarten, modernisieren oder ersetzen? In diesem Beitrag erfährst du, wie du Legacy-Systeme analysierst, Risiken minimierst und sinnvolle Strategien für den Umgang mit IT-Altlasten entwickelst.</summary>
    <content type="html">&lt;p&gt;&lt;img src=&quot;/assets/images/it-archaeologe.png&quot; alt=&quot;Image&quot; width=&quot;150px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Legacy-Systeme sind wie digitale Ruinen – tief in den IT-Landschaften vieler Unternehmen verankert.
Sie laufen oft seit Jahrzehnten, niemand weiß mehr genau, wie sie funktionieren, und trotzdem sind sie
geschäftskritisch. Ein Update? Unmöglich. Eine Ablösung? Ein Albtraum.&lt;/p&gt;

&lt;p&gt;Wie gehst du damit um? Abwarten, modernisieren oder ersetzen? In diesem Beitrag erfährst du, 
wie du Legacy-Systeme analysierst, Risiken minimierst und sinnvolle Strategien für den Umgang mit IT-Altlasten 
entwickelst.
&lt;!--more--&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;inhaltsverzeichnis&quot;&gt;&lt;strong&gt;Inhaltsverzeichnis&lt;/strong&gt;&lt;/h1&gt;

&lt;ol id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#inhaltsverzeichnis&quot; id=&quot;markdown-toc-inhaltsverzeichnis&quot;&gt;&lt;strong&gt;Inhaltsverzeichnis&lt;/strong&gt;&lt;/a&gt;    &lt;ol&gt;
      &lt;li&gt;&lt;a href=&quot;#1-einleitung--warum-legacy-systeme-uns-noch-lange-begleiten-werden-und-warum-das-spannend-ist&quot; id=&quot;markdown-toc-1-einleitung--warum-legacy-systeme-uns-noch-lange-begleiten-werden-und-warum-das-spannend-ist&quot;&gt;&lt;strong&gt;1. Einleitung – Warum Legacy-Systeme uns noch lange begleiten werden (und warum das spannend ist)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#2-spurensuche-was-tut-das-system--und-warum&quot; id=&quot;markdown-toc-2-spurensuche-was-tut-das-system--und-warum&quot;&gt;&lt;strong&gt;2. Spurensuche: Was tut das System – und warum?&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#historische-und-fachliche-hintergründe-verstehen&quot; id=&quot;markdown-toc-historische-und-fachliche-hintergründe-verstehen&quot;&gt;&lt;strong&gt;Historische und fachliche Hintergründe verstehen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#technische-abhängigkeiten-analysieren&quot; id=&quot;markdown-toc-technische-abhängigkeiten-analysieren&quot;&gt;&lt;strong&gt;Technische Abhängigkeiten analysieren&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#3-die-jagd-nach-dokumentation--was-ist-noch-auffindbar&quot; id=&quot;markdown-toc-3-die-jagd-nach-dokumentation--was-ist-noch-auffindbar&quot;&gt;&lt;strong&gt;3. Die Jagd nach Dokumentation – Was ist noch auffindbar?&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#alte-handbücher-kommentare-im-code-und-versteckte-schätze&quot; id=&quot;markdown-toc-alte-handbücher-kommentare-im-code-und-versteckte-schätze&quot;&gt;&lt;strong&gt;Alte Handbücher, Kommentare im Code und versteckte Schätze&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#reverse-engineering-als-letzte-rettung&quot; id=&quot;markdown-toc-reverse-engineering-als-letzte-rettung&quot;&gt;&lt;strong&gt;Reverse Engineering als letzte Rettung&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#4-wissensträger-aufspüren--wer-erinnert-sich-noch&quot; id=&quot;markdown-toc-4-wissensträger-aufspüren--wer-erinnert-sich-noch&quot;&gt;&lt;strong&gt;4. Wissensträger aufspüren – Wer erinnert sich noch?&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#ehemalige-entwicklerinnen-langjährige-mitarbeiterinnen-und-externe-expertinnen&quot; id=&quot;markdown-toc-ehemalige-entwicklerinnen-langjährige-mitarbeiterinnen-und-externe-expertinnen&quot;&gt;&lt;strong&gt;Ehemalige Entwickler:innen, langjährige Mitarbeiter:innen und externe Expert:innen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#wissen-sichern-bevor-es-verloren-geht&quot; id=&quot;markdown-toc-wissen-sichern-bevor-es-verloren-geht&quot;&gt;&lt;strong&gt;Wissen sichern, bevor es verloren geht&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#trust-nobody-warum-dazu-gibt-es-keine-doku-fast-nie-stimmt&quot; id=&quot;markdown-toc-trust-nobody-warum-dazu-gibt-es-keine-doku-fast-nie-stimmt&quot;&gt;&lt;strong&gt;Trust Nobody: Warum „Dazu gibt es keine Doku“ fast nie stimmt&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#5-vom-hohen-ross-herunterkommen--legacy-mit-respekt-begegnen&quot; id=&quot;markdown-toc-5-vom-hohen-ross-herunterkommen--legacy-mit-respekt-begegnen&quot;&gt;&lt;strong&gt;5. Vom hohen Ross herunterkommen – Legacy mit Respekt begegnen&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#die-umstände-verstehen-anstatt-vorschnell-zu-urteilen&quot; id=&quot;markdown-toc-die-umstände-verstehen-anstatt-vorschnell-zu-urteilen&quot;&gt;&lt;strong&gt;Die Umstände verstehen, anstatt vorschnell zu urteilen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#respekt-für-die-menschen-die-das-system-betreiben&quot; id=&quot;markdown-toc-respekt-für-die-menschen-die-das-system-betreiben&quot;&gt;&lt;strong&gt;Respekt für die Menschen, die das System betreiben&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#6-eigene-dokumentation-erstellen--und-verbessern&quot; id=&quot;markdown-toc-6-eigene-dokumentation-erstellen--und-verbessern&quot;&gt;&lt;strong&gt;6. Eigene Dokumentation erstellen – und verbessern&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#die-alte-doku-als-historische-referenz-erhalten&quot; id=&quot;markdown-toc-die-alte-doku-als-historische-referenz-erhalten&quot;&gt;&lt;strong&gt;Die alte Doku als historische Referenz erhalten&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#eine-neue-verlässliche-dokumentation-aufbauen&quot; id=&quot;markdown-toc-eine-neue-verlässliche-dokumentation-aufbauen&quot;&gt;&lt;strong&gt;Eine neue, verlässliche Dokumentation aufbauen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#das-wissen-aus-verschiedenen-quellen-bündeln&quot; id=&quot;markdown-toc-das-wissen-aus-verschiedenen-quellen-bündeln&quot;&gt;&lt;strong&gt;Das Wissen aus verschiedenen Quellen bündeln&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#fazit-die-vergangenheit-bewahren-die-zukunft-dokumentieren&quot; id=&quot;markdown-toc-fazit-die-vergangenheit-bewahren-die-zukunft-dokumentieren&quot;&gt;&lt;strong&gt;Fazit: Die Vergangenheit bewahren, die Zukunft dokumentieren&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#7-strategien-für-den-umgang-mit-legacy-systemen&quot; id=&quot;markdown-toc-7-strategien-für-den-umgang-mit-legacy-systemen&quot;&gt;&lt;strong&gt;7. Strategien für den Umgang mit Legacy-Systemen&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#modernisieren-das-bestehende-verbessern&quot; id=&quot;markdown-toc-modernisieren-das-bestehende-verbessern&quot;&gt;&lt;strong&gt;Modernisieren: Das Bestehende verbessern&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#migrieren-schrittweise-auf-eine-neue-plattform-überführen&quot; id=&quot;markdown-toc-migrieren-schrittweise-auf-eine-neue-plattform-überführen&quot;&gt;&lt;strong&gt;Migrieren: Schrittweise auf eine neue Plattform überführen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#ersetzen-komplette-neuentwicklung&quot; id=&quot;markdown-toc-ersetzen-komplette-neuentwicklung&quot;&gt;&lt;strong&gt;Ersetzen: Komplette Neuentwicklung&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#risiken-und-chancen-abwägen&quot; id=&quot;markdown-toc-risiken-und-chancen-abwägen&quot;&gt;&lt;strong&gt;Risiken und Chancen abwägen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#fazit-es-gibt-keinen-königsweg--nur-die-beste-entscheidung-für-deine-situation&quot; id=&quot;markdown-toc-fazit-es-gibt-keinen-königsweg--nur-die-beste-entscheidung-für-deine-situation&quot;&gt;&lt;strong&gt;Fazit: Es gibt keinen Königsweg – nur die beste Entscheidung für deine Situation&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#8-entscheidungen-gemeinsam-treffen--das-team-einbinden&quot; id=&quot;markdown-toc-8-entscheidungen-gemeinsam-treffen--das-team-einbinden&quot;&gt;&lt;strong&gt;8. Entscheidungen gemeinsam treffen – Das Team einbinden&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#die-6-hüte-methode-von-de-bono-für-fundierte-entscheidungen&quot; id=&quot;markdown-toc-die-6-hüte-methode-von-de-bono-für-fundierte-entscheidungen&quot;&gt;&lt;strong&gt;Die 6-Hüte-Methode von de Bono für fundierte Entscheidungen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#systemisches-konsensieren--die-beste-lösung-mit-geringstem-widerstand&quot; id=&quot;markdown-toc-systemisches-konsensieren--die-beste-lösung-mit-geringstem-widerstand&quot;&gt;&lt;strong&gt;Systemisches Konsensieren – Die beste Lösung mit geringstem Widerstand&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#fazit-entscheidungen-nicht-über-köpfe-hinweg-treffen&quot; id=&quot;markdown-toc-fazit-entscheidungen-nicht-über-köpfe-hinweg-treffen&quot;&gt;&lt;strong&gt;Fazit: Entscheidungen nicht über Köpfe hinweg treffen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#9-it-archäologie-als-schlüssel-zur-digitalen-zukunft&quot; id=&quot;markdown-toc-9-it-archäologie-als-schlüssel-zur-digitalen-zukunft&quot;&gt;&lt;strong&gt;9. IT-Archäologie als Schlüssel zur digitalen Zukunft&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#verstehen-bevor-man-verändert&quot; id=&quot;markdown-toc-verstehen-bevor-man-verändert&quot;&gt;&lt;strong&gt;Verstehen, bevor man verändert&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#respekt-für-das-was-funktioniert&quot; id=&quot;markdown-toc-respekt-für-das-was-funktioniert&quot;&gt;&lt;strong&gt;Respekt für das, was funktioniert&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#entscheidungen-gemeinsam-treffen&quot; id=&quot;markdown-toc-entscheidungen-gemeinsam-treffen&quot;&gt;&lt;strong&gt;Entscheidungen gemeinsam treffen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#it-archäologie-als-investition-in-die-zukunft&quot; id=&quot;markdown-toc-it-archäologie-als-investition-in-die-zukunft&quot;&gt;&lt;strong&gt;IT-Archäologie als Investition in die Zukunft&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#der-kreislauf-endet-nie--und-das-ist-okay&quot; id=&quot;markdown-toc-der-kreislauf-endet-nie--und-das-ist-okay&quot;&gt;&lt;strong&gt;Der Kreislauf endet nie – und das ist okay&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#-anhang-checkliste-für-den-umgang-mit-legacy-systemen&quot; id=&quot;markdown-toc--anhang-checkliste-für-den-umgang-mit-legacy-systemen&quot;&gt;&lt;strong&gt;📌 Anhang: Checkliste für den Umgang mit Legacy-Systemen&lt;/strong&gt;&lt;/a&gt;        &lt;ol&gt;
          &lt;li&gt;&lt;a href=&quot;#️-1-erste-analyse-was-tut-das-system-und-warum&quot; id=&quot;markdown-toc-️-1-erste-analyse-was-tut-das-system-und-warum&quot;&gt;&lt;strong&gt;🕵️ 1. Erste Analyse: Was tut das System und warum?&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-2-dokumentation-suchen-und-sichern&quot; id=&quot;markdown-toc--2-dokumentation-suchen-und-sichern&quot;&gt;&lt;strong&gt;📚 2. Dokumentation suchen und sichern&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#️-3-wissensträgerinnen-finden-und-befragen&quot; id=&quot;markdown-toc-️-3-wissensträgerinnen-finden-und-befragen&quot;&gt;&lt;strong&gt;🗣️ 3. Wissensträger:innen finden und befragen&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-4-eigene-dokumentation-erstellen-ohne-alte-doku-zu-zerstören&quot; id=&quot;markdown-toc--4-eigene-dokumentation-erstellen-ohne-alte-doku-zu-zerstören&quot;&gt;&lt;strong&gt;📝 4. Eigene Dokumentation erstellen (ohne alte Doku zu zerstören!)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-5-entscheidung-vorbereiten-was-tun-mit-dem-system&quot; id=&quot;markdown-toc--5-entscheidung-vorbereiten-was-tun-mit-dem-system&quot;&gt;&lt;strong&gt;🤔 5. Entscheidung vorbereiten: Was tun mit dem System?&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#️-6-umsetzung-der-gewählten-strategie&quot; id=&quot;markdown-toc-️-6-umsetzung-der-gewählten-strategie&quot;&gt;&lt;strong&gt;⚙️ 6. Umsetzung der gewählten Strategie&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#-7-abschluss-sicherstellen-dass-das-wissen-erhalten-bleibt&quot; id=&quot;markdown-toc--7-abschluss-sicherstellen-dass-das-wissen-erhalten-bleibt&quot;&gt;&lt;strong&gt;🎯 7. Abschluss: Sicherstellen, dass das Wissen erhalten bleibt&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#️-fazit-die-beste-strategie-ist-vorausschauendes-handeln&quot; id=&quot;markdown-toc-️-fazit-die-beste-strategie-ist-vorausschauendes-handeln&quot;&gt;&lt;strong&gt;🛠️ Fazit: Die beste Strategie ist vorausschauendes Handeln&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;1-einleitung--warum-legacy-systeme-uns-noch-lange-begleiten-werden-und-warum-das-spannend-ist&quot;&gt;&lt;strong&gt;1. Einleitung – Warum Legacy-Systeme uns noch lange begleiten werden (und warum das spannend ist)&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/indiana-cobol.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Alte Software stirbt nicht – sie wird nur durch neue ersetzt, die irgendwann selbst alt wird. Und genau hier liegt das Paradox: Sobald ein System stabil, zuverlässig und in der Praxis bewährt ist, ist es bereits auf dem Weg zum Legacy-System.&lt;/p&gt;

&lt;p&gt;Ein neues System mag moderner, sicherer oder effizienter sein, aber es kann selten von Anfang an alles, was das alte konnte. Über Jahre oder Jahrzehnte hinweg wurde das bestehende System optimiert, angepasst und von den Nutzer:innen verinnerlicht. Die Geschäftsprozesse haben sich daran ausgerichtet, Workarounds sind entstanden, und niemand denkt mehr über viele Abläufe nach – sie funktionieren einfach.&lt;/p&gt;

&lt;p&gt;Irgendwann kommen jedoch die typischen Herausforderungen: &lt;strong&gt;Der Support läuft aus, das Wissen darüber schwindet, Sicherheitslücken tauchen auf, und eine Nachfolge muss her.&lt;/strong&gt; Doch statt das als notwendiges Übel zu sehen, kann genau das der spannendste Teil der Arbeit mit Legacy-Systemen sein.&lt;/p&gt;

&lt;p&gt;Denn sich mit einem alten System zu beschäftigen, ist wie eine Mischung aus &lt;strong&gt;Detektivarbeit, Archäologie und Puzzlen&lt;/strong&gt;:&lt;br /&gt;
🕵️ &lt;strong&gt;Warum wurde etwas genau so umgesetzt?&lt;/strong&gt;&lt;br /&gt;
📜 &lt;strong&gt;Welche historischen Entscheidungen stecken in diesem Code?&lt;/strong&gt;&lt;br /&gt;
🧩 &lt;strong&gt;Wie hängen die einzelnen Teile zusammen – und was passiert, wenn man eines verändert?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wer sich darauf einlässt, entdeckt oft faszinierende Lösungen, kreative Workarounds und überraschend clevere Ansätze, die unter den damaligen Bedingungen die beste Wahl waren. Statt sich über vermeintliche Unzulänglichkeiten zu ärgern, kann es sogar Spaß machen, sich in die damalige Denkweise hineinzuversetzen und nachzuvollziehen, warum etwas genau so gebaut wurde.&lt;/p&gt;

&lt;p&gt;Und das Beste daran: &lt;strong&gt;Diese Systeme laufen nicht ohne Grund seit Jahrzehnten. Sie haben sich bewährt – und sie zu verstehen, heißt, eine kritische Grundlage der IT-Welt zu entschlüsseln.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dieser Kreislauf aus &lt;strong&gt;Verstehen, Modernisieren und Ablösen&lt;/strong&gt; wird sich nie ganz auflösen – aber wer sich mit Legacy-Systemen richtig auseinandersetzt, kann diesen Übergang bewusster und kontrollierter gestalten. In diesem Beitrag erfährst du, wie du alte Systeme analysierst, Wissen sicherst und den richtigen Umgang mit IT-Altlasten findest. Und wer weiß? Vielleicht macht es dir sogar mehr Spaß, als du denkst. 😉&lt;/p&gt;

&lt;h2 id=&quot;2-spurensuche-was-tut-das-system--und-warum&quot;&gt;&lt;strong&gt;2. Spurensuche: Was tut das System – und warum?&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/sherlock-bits.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Bevor du an einem Legacy-System etwas änderst, musst du verstehen, warum es überhaupt so funktioniert, wie es funktioniert. Ein alter Code, der auf den ersten Blick unsinnig erscheint, könnte eine tief verwurzelte fachliche Anforderung umsetzen – oder einen historischen Workaround enthalten, der essenziell für den Betrieb ist.&lt;/p&gt;

&lt;h3 id=&quot;historische-und-fachliche-hintergründe-verstehen&quot;&gt;&lt;strong&gt;Historische und fachliche Hintergründe verstehen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Legacy-Systeme sind selten das Ergebnis eines perfekten Plans. Sie sind über Jahre oder Jahrzehnte gewachsen, geprägt von Geschäftsentscheidungen, technischen Einschränkungen und pragmatischen Lösungen. Daher ist es entscheidend, sich in die Denkweise der ursprünglichen Entwickler:innen und Nutzer:innen hineinzuversetzen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fragen, die du klären solltest:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Warum wurde das System ursprünglich entwickelt?&lt;/strong&gt; War es eine interne Lösung, ein externer Standard oder ein Notbehelf, der einfach nie ersetzt wurde?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Welche Geschäftsprozesse hängen daran?&lt;/strong&gt; Welche Abteilungen und Nutzer:innen sind darauf angewiesen, und was passiert, wenn das System ausfällt?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Welche alten Anforderungen gibt es noch?&lt;/strong&gt; Oft sind Regeln und Prozesse in Software gegossen, die so nicht mehr dokumentiert sind, aber im Alltag unverzichtbar sind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eine Möglichkeit, sich dem System zu nähern, ist das Gespräch mit langjährigen Mitarbeiter:innen. Sie wissen oft nicht, wie der Code funktioniert, aber sie können erklären, warum das System so genutzt wird.&lt;/p&gt;

&lt;h3 id=&quot;technische-abhängigkeiten-analysieren&quot;&gt;&lt;strong&gt;Technische Abhängigkeiten analysieren&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Neben den fachlichen Hintergründen sind auch die technischen Abhängigkeiten kritisch. Viele Legacy-Systeme sind eng mit anderen Anwendungen oder Datenbanken verflochten, und Änderungen an einer Stelle können unerwartete Folgen haben.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wichtige Aspekte der Analyse:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Welche externen Systeme greifen auf das Legacy-System zu?&lt;/strong&gt; Gibt es Schnittstellen zu anderen Softwarelösungen oder automatisierte Prozesse, die davon abhängen?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Welche Technologien und Frameworks werden genutzt?&lt;/strong&gt; Manche alte Bibliotheken sind nicht mehr kompatibel mit modernen Umgebungen, was eine Migration erschwert.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gibt es proprietäre oder maßgeschneiderte Lösungen?&lt;/strong&gt; Selbstgeschriebene Module oder alte Hardware können die Modernisierung verkomplizieren.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hier helfen Tools zur Code-Analyse, Dependency-Scanner oder einfach detaillierte Logfiles, um nachzuvollziehen, welche Komponenten miteinander kommunizieren.&lt;/p&gt;

&lt;p&gt;Am Ende dieser Spurensuche solltest du ein klares Bild davon haben, warum das System so ist, wie es ist – und welche Risiken eine Veränderung mit sich bringt. Erst dann kannst du fundierte Entscheidungen treffen, ob eine Modernisierung, Migration oder eine schrittweise Ablösung sinnvoll ist.&lt;/p&gt;

&lt;h2 id=&quot;3-die-jagd-nach-dokumentation--was-ist-noch-auffindbar&quot;&gt;&lt;strong&gt;3. Die Jagd nach Dokumentation – Was ist noch auffindbar?&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/doku-flucht.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Eines der größten Probleme bei Legacy-Systemen: Die ursprüngliche Dokumentation ist oft unvollständig, veraltet oder schlicht nicht mehr auffindbar. Doch bevor du das System komplett auseinandernehmen musst, lohnt es sich, nach Spuren zu suchen. Manchmal gibt es versteckte Schätze – alte Handbücher, vergessene Wikis oder Kommentare im Code, die Hinweise auf die Funktionsweise geben.&lt;/p&gt;

&lt;h3 id=&quot;alte-handbücher-kommentare-im-code-und-versteckte-schätze&quot;&gt;&lt;strong&gt;Alte Handbücher, Kommentare im Code und versteckte Schätze&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/architektur-finden.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Auch wenn niemand genau weiß, wie das System funktioniert, bedeutet das nicht, dass es keine Dokumentation gibt. Du musst sie nur finden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mögliche Quellen:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Archivierte Handbücher oder interne Wikis&lt;/strong&gt; – Oft schlummern alte PDFs oder Word-Dokumente irgendwo auf Netzlaufwerken oder in E-Mail-Anhängen. Frage gezielt nach früheren Unterlagen, selbst wenn sie veraltet sind.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Kommentare im Code&lt;/strong&gt; – Manchmal sind sie Gold wert, manchmal sind sie nutzlos oder sogar irreführend. Aber sie können Hinweise auf wichtige Geschäftslogik oder frühere Probleme geben.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Alte Tickets oder Change-Logs&lt;/strong&gt; – Falls es ein Ticket-System gibt, kann es nützlich sein, alte Änderungsanfragen durchzusehen. Sie verraten oft, warum bestimmte Entscheidungen getroffen wurden.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Datenbankstrukturen und Skripte&lt;/strong&gt; – Wer keine funktionale Dokumentation hat, kann manchmal durch Datenbank-Schemata und gespeicherte Prozeduren die ursprüngliche Systemlogik rekonstruieren.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es ist wichtig, alle gefundenen Informationen kritisch zu hinterfragen. Legacy-Dokumentation ist selten fehlerfrei. Manche Infos stammen aus einer Zeit, als das System noch in einem ganz anderen Zustand war. Nutze sie als Orientierung, aber verlasse dich nicht blind darauf.&lt;/p&gt;

&lt;h3 id=&quot;reverse-engineering-als-letzte-rettung&quot;&gt;&lt;strong&gt;Reverse Engineering als letzte Rettung&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Wenn keine Dokumentation existiert – oder sie völlig unbrauchbar ist –, bleibt nur der Weg des Reverse Engineering. Das bedeutet, das System Stück für Stück auseinanderzunehmen, um herauszufinden, wie es funktioniert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Möglichkeiten des Reverse Engineering:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Code-Analyse&lt;/strong&gt; – Falls der Quellcode vorhanden ist, kann statische Code-Analyse helfen, Abhängigkeiten, kritische Funktionen und unerwartete Verknüpfungen zu identifizieren.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Logging und Monitoring&lt;/strong&gt; – Durch das gezielte Beobachten von Logs und Systemverhalten lassen sich wichtige Prozesse rekonstruieren. Welche Abfragen laufen gegen die Datenbank? Welche API-Aufrufe gibt es?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Blackbox-Testing&lt;/strong&gt; – Falls kein Zugriff auf den Code besteht, können gezielte Tests mit Eingaben und erwarteten Ausgaben helfen, verborgene Logik zu verstehen.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Alte Versionen vergleichen&lt;/strong&gt; – Falls frühere Versionen des Systems verfügbar sind, lohnt sich ein Vergleich. Welche Änderungen wurden vorgenommen? Gibt es Code, der historisch gewachsen ist und nun keine Funktion mehr hat?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reverse Engineering ist mühsam, aber es hilft, die fehlenden Puzzlestücke zusammenzusetzen. Und sobald du eine bessere Vorstellung vom System hast, solltest du unbedingt eine eigene neue Dokumentation erstellen – denn wenn du es jetzt nicht tust, wird es später noch schwieriger.&lt;/p&gt;

&lt;h2 id=&quot;4-wissensträger-aufspüren--wer-erinnert-sich-noch&quot;&gt;&lt;strong&gt;4. Wissensträger aufspüren – Wer erinnert sich noch?&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/hidden-gems.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ein Legacy-System ist mehr als nur Code – es ist das Ergebnis von jahrelanger Erfahrung, unzähligen Entscheidungen und oft auch Workarounds, die nur wenigen bekannt sind. Wenn du verstehen willst, wie es wirklich funktioniert, kommst du an den Menschen, die es gebaut, gewartet oder genutzt haben, nicht vorbei. Auch wenn das System alt ist, gibt es fast immer noch jemanden, der sich daran erinnert – du musst diese Personen nur finden.&lt;/p&gt;

&lt;h3 id=&quot;ehemalige-entwicklerinnen-langjährige-mitarbeiterinnen-und-externe-expertinnen&quot;&gt;&lt;strong&gt;Ehemalige Entwickler:innen, langjährige Mitarbeiter:innen und externe Expert:innen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Viele Legacy-Systeme wurden von Teams entwickelt, die längst nicht mehr existieren. Aber das bedeutet nicht, dass ihr Wissen verloren ist. Oft sind frühere Entwickler:innen noch im Unternehmen tätig, nur eben in anderen Abteilungen oder Projekten. Auch langjährige Mitarbeiter:innen aus der Fachabteilung sind wertvolle Quellen – sie haben das System vielleicht nie programmiert, aber sie wissen, warum bestimmte Prozesse so laufen, wie sie laufen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wen du suchen solltest:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Ehemalige Entwickler:innen und Administrator:innen&lt;/strong&gt; – Sie können erklären, warum bestimmte Design-Entscheidungen getroffen wurden.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Langjährige Nutzer:innen&lt;/strong&gt; – Sie kennen versteckte Funktionen, Abhängigkeiten und typische Fehlerbilder.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Externe Dienstleister oder Berater:innen&lt;/strong&gt; – Falls das System von einem externen Unternehmen entwickelt wurde, gibt es möglicherweise noch Ansprechpartner:innen.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mitarbeiter:innen kurz vor der Rente&lt;/strong&gt; – Oft haben genau sie das tiefste Wissen über das System, das ansonsten verloren gehen könnte.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Der Schlüssel ist, diese Personen aktiv zu befragen, bevor ihr Wissen unwiederbringlich verschwindet.&lt;/p&gt;

&lt;h3 id=&quot;wissen-sichern-bevor-es-verloren-geht&quot;&gt;&lt;strong&gt;Wissen sichern, bevor es verloren geht&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Sobald du Wissensträger:innen gefunden hast, solltest du so viel wie möglich dokumentieren. Ein lockeres Gespräch hilft dir zwar beim Verständnis, aber wenn du die Informationen nicht systematisch sicherst, sind sie bald wieder vergessen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gute Methoden zur Wissenssicherung:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Interviews führen und dokumentieren&lt;/strong&gt; – Lass dir Abläufe, Hintergründe und typische Probleme erklären und schreibe alles mit.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Alte E-Mails, Notizen oder Protokolle durchsuchen&lt;/strong&gt; – Manche Entscheidungen sind dokumentiert, nur eben nicht da, wo du sie erwartest.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Diagramme und Skizzen erstellen&lt;/strong&gt; – Viele Prozesse lassen sich besser visuell erfassen als durch lange Textbeschreibungen.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Schritt-für-Schritt-Anleitungen aus Nutzer:innen-Sicht erstellen&lt;/strong&gt; – Was heute für dich klar ist, könnte in wenigen Jahren wieder Rätsel aufgeben.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dabei ist es wichtig, Informationen aus verschiedenen Quellen zu kombinieren. Selten kennt eine einzelne Person das gesamte System – oft hat jede:r nur ein Puzzlestück.&lt;/p&gt;

&lt;h3 id=&quot;trust-nobody-warum-dazu-gibt-es-keine-doku-fast-nie-stimmt&quot;&gt;&lt;strong&gt;Trust Nobody: Warum „Dazu gibt es keine Doku“ fast nie stimmt&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Ein Satz, den du oft hören wirst: &lt;em&gt;„Dazu gibt es keine Dokumentation.“&lt;/em&gt; Oder: &lt;em&gt;„Das hat noch nie jemand dokumentiert.“&lt;/em&gt; Glaube das nicht!&lt;/p&gt;

&lt;p&gt;In den allermeisten Fällen existiert irgendwo Dokumentation – sie wurde nur vergessen, nicht gepflegt oder ist schwer auffindbar. Vielleicht steht sie in einem alten Wiki, vielleicht in einer E-Mail-Kette, vielleicht auf Papier in einem Ordner im Archiv. Manchmal steckt die Dokumentation auch im Code selbst, in Konfigurationsdateien oder in alten Ticket-Systemen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typische Irrtümer:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;„Niemand weiß, wie das funktioniert.“ → &lt;strong&gt;Jemand wusste es mal. Die Frage ist: Wer war das?&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;„Es gibt keine Dokumentation.“ → &lt;strong&gt;Es gibt wahrscheinlich Fragmente – sie müssen nur gefunden oder rekonstruiert werden.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;„Das hat noch nie jemand angefasst.“ → &lt;strong&gt;Wenn es läuft, hat es jemand irgendwann zum Laufen gebracht. Diese Person hatte eine Idee, wie es funktionieren sollte.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Der beste Ansatz ist also: Fragen, suchen und niemals akzeptieren, dass es gar keine Informationen gibt. Fast immer gibt es mehr, als es auf den ersten Blick scheint – du musst nur hartnäckig genug sein.&lt;/p&gt;

&lt;h2 id=&quot;5-vom-hohen-ross-herunterkommen--legacy-mit-respekt-begegnen&quot;&gt;&lt;strong&gt;5. Vom hohen Ross herunterkommen – Legacy mit Respekt begegnen&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Wer sich mit Legacy-Systemen beschäftigt, stolpert schnell über absurde Konstrukte, veraltete Technologien und Instabilitäten, die nach heutigen Maßstäben schwer verständlich sind. Der Reflex ist oft, sich darüber lustig zu machen: „Wie konnte man sowas jemals so umsetzen?“ oder „Das ist ja völliger Wahnsinn!“&lt;/p&gt;

&lt;p&gt;Doch dieser Blickwinkel hilft nicht weiter. Stattdessen ist es wichtig, sich in die damalige Zeit und die damaligen technologischen Möglichkeiten hineinzuversetzen. Legacy-Code ist selten das Ergebnis von Inkompetenz – vielmehr ist es ein Produkt seiner Zeit, entstanden unter bestimmten Rahmenbedingungen, wirtschaftlichen Zwängen und technischen Limits.&lt;/p&gt;

&lt;h3 id=&quot;die-umstände-verstehen-anstatt-vorschnell-zu-urteilen&quot;&gt;&lt;strong&gt;Die Umstände verstehen, anstatt vorschnell zu urteilen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Als das System entwickelt wurde, gab es andere Hardware, andere Software und andere Prioritäten. Vielleicht war Speicherplatz teuer, vielleicht war die Rechenleistung begrenzt, vielleicht gab es keine bessere Lösung als genau diese. Manchmal war ein scheinbar chaotischer Workaround die einzige Möglichkeit, um das Geschäft am Laufen zu halten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wichtige Fragen, um den historischen Kontext zu verstehen:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Welche technologischen Einschränkungen gab es damals?&lt;/strong&gt; Nicht alles, was heute trivial ist, war es damals auch. Speicherplatz, Rechenleistung und Netzwerkanbindungen waren oft extreme Engpässe.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Welche geschäftlichen Anforderungen standen im Vordergrund?&lt;/strong&gt; Manche Systeme wurden in kürzester Zeit unter immensem Druck entwickelt, um einen wichtigen Kunden zu gewinnen oder eine Marktchance nicht zu verpassen.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Welche Alternativen hätte es damals gegeben?&lt;/strong&gt; Vielleicht gab es schlicht keine besseren Lösungen – oder die aktuell beste Praxis war eine andere als heute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wer diese Fragen stellt, kann oft erkennen, dass viele der alten Entscheidungen Sinn ergaben. Sie sind nicht zufällig oder aus Unwissenheit entstanden, sondern hatten ihre Berechtigung.&lt;/p&gt;

&lt;h3 id=&quot;respekt-für-die-menschen-die-das-system-betreiben&quot;&gt;&lt;strong&gt;Respekt für die Menschen, die das System betreiben&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Nicht nur die Technologie ist alt – auch die Menschen, die das System täglich nutzen und betreiben, haben sich über Jahre daran gewöhnt. Viele von ihnen haben tiefes Wissen über Abläufe, Stolperfallen und Workarounds, das nicht einfach in eine neue Software übertragen werden kann.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wichtige Erkenntnisse für die Arbeit mit Legacy-Systemen:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Niemand ist „schuld“ am aktuellen Zustand.&lt;/strong&gt; Ein System wächst mit den Jahren, und oft gab es nie den perfekten Moment für eine vollständige Ablösung.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Der aktuelle Zustand ist nicht per se schlecht.&lt;/strong&gt; Er hat vielleicht Schwächen, aber er hält das Geschäft am Laufen und zahlt die Gehälter.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Eine schlechte neue Lösung ist schlimmer als ein stabiler alter Wust.&lt;/strong&gt; Ein altes System, das verstanden wird, ist oft wertvoller als ein modernes, das nicht zuverlässig funktioniert.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Die Menschen, die es betreiben, wissen oft mehr als du denkst.&lt;/strong&gt; Sie haben über Jahre gelernt, mit den Eigenheiten des Systems umzugehen. Ihre Erfahrung ist essenziell für jede Veränderung.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das bedeutet nicht, dass Legacy-Systeme unantastbar sind – aber es bedeutet, dass jede Veränderung mit Respekt und Verständnis angegangen werden sollte. Wer glaubt, alles besser zu wissen, wird schnell scheitern. Wer hingegen die Vergangenheit versteht und mit den aktuellen Betreiber:innen zusammenarbeitet, kann nachhaltig verbessern, ohne wertvolles Wissen und bewährte Abläufe zu zerstören.&lt;/p&gt;

&lt;h2 id=&quot;6-eigene-dokumentation-erstellen--und-verbessern&quot;&gt;&lt;strong&gt;6. Eigene Dokumentation erstellen – und verbessern&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Legacy-Systeme haben oft eine alte Dokumentation – und selbst wenn sie voller Fehler oder Lücken ist, hat sie trotzdem einen Wert. Sie einfach zu überschreiben oder zu „korrigieren“ wäre riskant, denn oft enthalten auch fehlerhafte oder unvollständige Dokumente wertvolle historische Informationen. Gleichzeitig darf es beim nächsten Mal nicht zwei widersprüchliche Versionen geben. Die Herausforderung besteht also darin, das alte Wissen zu bewahren, es aber durch eine neue, verlässliche Dokumentation zu ergänzen.&lt;/p&gt;

&lt;h3 id=&quot;die-alte-doku-als-historische-referenz-erhalten&quot;&gt;&lt;strong&gt;Die alte Doku als historische Referenz erhalten&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Grundsatz:&lt;/strong&gt; Die ursprüngliche Dokumentation bleibt unangetastet und wird nicht mit neuen Erkenntnissen „verschlimmbessert“. Statt sie zu überarbeiten, sollte sie als historische Quelle betrachtet und klar als solche gekennzeichnet werden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wie du das umsetzt:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Originale archivieren&lt;/strong&gt; – Falls möglich, eine unveränderte Kopie der alten Doku an einem sicheren Ort speichern.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Versionierung nutzen&lt;/strong&gt; – Eine neue Dokumentation sollte nicht die alte ersetzen, sondern ergänzen, etwa durch klare Versionsbezeichnungen („Legacy-Doku – Stand 2005“ vs. „System-Doku – aktualisiert 2025“).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;„Read-Only“-Modus für alte Dokus&lt;/strong&gt; – In einem Wiki oder Dokumentationssystem kann die alte Doku schreibgeschützt bereitgestellt werden, damit sie nicht versehentlich verändert wird.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hinweise einfügen&lt;/strong&gt; – Falls Fehler oder veraltete Informationen bekannt sind, können ergänzende Anmerkungen oder Warnhinweise hinzugefügt werden, aber ohne den Originaltext zu überschreiben.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;eine-neue-verlässliche-dokumentation-aufbauen&quot;&gt;&lt;strong&gt;Eine neue, verlässliche Dokumentation aufbauen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Da die alte Doku nicht verändert wird, muss die neue Dokumentation &lt;strong&gt;sauber getrennt, aber eng verknüpft&lt;/strong&gt; mit der alten existieren. Die neue Doku sollte aus verschiedenen Quellen gespeist werden und als aktuelle, zuverlässige Wissensbasis dienen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So vermeidest du widersprüchliche Versionen:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Quellen sauber kennzeichnen&lt;/strong&gt; – Falls neue Erkenntnisse aus Gesprächen mit Nutzer:innen oder aus Reverse Engineering stammen, sollte das in der neuen Doku klar gemacht werden.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Unterschiede zwischen alter und neuer Doku dokumentieren&lt;/strong&gt; – Falls es Widersprüche gibt, sollte in der neuen Doku ein Abschnitt stehen, der die Abweichungen erklärt („In der alten Doku steht X, aber in der Praxis ist es Y“).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Alte und neue Doku verlinken&lt;/strong&gt; – Damit niemand mit zwei isolierten Versionen arbeiten muss, sollte die neue Doku klar auf die alte verweisen („Historische Doku zu diesem Modul befindet sich hier: …“).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Begrenzte Verantwortlichkeit klären&lt;/strong&gt; – Wer aktualisiert die neue Dokumentation? Wer trägt die Verantwortung, dass neue Erkenntnisse sauber dokumentiert werden, ohne das alte Wissen zu überschreiben?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;das-wissen-aus-verschiedenen-quellen-bündeln&quot;&gt;&lt;strong&gt;Das Wissen aus verschiedenen Quellen bündeln&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Während die alte Doku oft nur einen Teilaspekt eines Systems abbildet, kann die neue Doku durch weitere Quellen ergänzt werden:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Code-Kommentare analysieren&lt;/strong&gt; – Gibt es versteckte Hinweise oder unerwartete Logik?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Interviews mit erfahrenen Nutzer:innen und Entwickler:innen&lt;/strong&gt; – Wo gibt es Workarounds oder mündlich überliefertes Wissen?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Beobachtungen durch Logs und Systemverhalten&lt;/strong&gt; – Welche Prozesse laufen tatsächlich ab?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reverse Engineering und Tests&lt;/strong&gt; – Welche Annahmen aus der alten Doku stimmen noch, welche nicht?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diese Erkenntnisse sollten in die neue Dokumentation einfließen – aber immer mit Quellenangaben und klarer Kennzeichnung, was wirklich belegt ist und was nur vermutet wird.&lt;/p&gt;

&lt;h3 id=&quot;fazit-die-vergangenheit-bewahren-die-zukunft-dokumentieren&quot;&gt;&lt;strong&gt;Fazit: Die Vergangenheit bewahren, die Zukunft dokumentieren&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Eine alte Dokumentation ist ein historisches Artefakt – sie mag ungenau sein, aber sie erzählt, wie das System ursprünglich gedacht war. Sie sollte nicht mit Halbwissen überschrieben werden, sondern als unveränderliche Quelle erhalten bleiben. Gleichzeitig muss es eine verlässliche neue Doku geben, die das System so beschreibt, wie es heute funktioniert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wenn du es richtig machst:&lt;/strong&gt;&lt;br /&gt;
✅ Die alte Doku bleibt erhalten und wird als Referenz genutzt.&lt;br /&gt;
✅ Die neue Doku ist klar strukturiert, aktuell und widerspricht der alten nicht einfach, sondern erklärt Abweichungen.&lt;br /&gt;
✅ Niemand muss sich mehr durch zwei konkurrierende Versionen kämpfen – alle Infos sind an einem Ort, gut verlinkt und verständlich dokumentiert.&lt;/p&gt;

&lt;p&gt;So stellst du sicher, dass beim nächsten Mal nicht wieder jemand bei null anfängt.&lt;/p&gt;

&lt;h2 id=&quot;7-strategien-für-den-umgang-mit-legacy-systemen&quot;&gt;&lt;strong&gt;7. Strategien für den Umgang mit Legacy-Systemen&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Legacy-Systeme sind unvermeidlich – die Frage ist nicht, &lt;strong&gt;ob&lt;/strong&gt; man sie modernisiert, sondern &lt;strong&gt;wie&lt;/strong&gt;. Irgendwann kommt der Punkt, an dem das alte System an seine Grenzen stößt: Hardware läuft aus dem Support, Sicherheitslücken häufen sich, und neue Anforderungen lassen sich kaum noch umsetzen. Dann stellt sich die zentrale Frage: &lt;strong&gt;Modernisieren, migrieren oder ersetzen?&lt;/strong&gt; Jede dieser Strategien hat Vor- und Nachteile, und die richtige Wahl hängt von vielen Faktoren ab.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;modernisieren-das-bestehende-verbessern&quot;&gt;&lt;strong&gt;Modernisieren: Das Bestehende verbessern&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Die sanfteste Strategie ist die &lt;strong&gt;Modernisierung&lt;/strong&gt; – also das schrittweise Anpassen und Optimieren des bestehenden Systems, ohne es vollständig abzulösen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typische Maßnahmen:&lt;/strong&gt;&lt;br /&gt;
✅ Code-Refactoring, um Wartbarkeit zu verbessern&lt;br /&gt;
✅ Austausch veralteter Komponenten (z. B. Datenbank-Updates, Schnittstellenmodernisierung)&lt;br /&gt;
✅ Virtualisierung oder Containerisierung, um alte Software stabiler laufen zu lassen&lt;br /&gt;
✅ Automatisierte Tests einführen, um Änderungen sicherer zu machen&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wann ist das sinnvoll?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Wenn das System stabil läuft und weiterhin gut genutzt wird&lt;/li&gt;
  &lt;li&gt;Wenn die Kernlogik noch funktioniert, aber technische Schulden beseitigt werden müssen&lt;/li&gt;
  &lt;li&gt;Wenn eine vollständige Ablösung zu teuer oder riskant ist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Risiken:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Der Modernisierungsaufwand kann unterschätzt werden&lt;/li&gt;
  &lt;li&gt;Es bleibt immer noch ein altes System – mit alten Problemen&lt;/li&gt;
  &lt;li&gt;Irgendwann stößt man trotzdem an eine Grenze&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modernisierung ist oft ein guter Mittelweg, wenn ein System noch längere Zeit genutzt werden soll, aber dringend eine technische Auffrischung braucht.&lt;/p&gt;

&lt;h3 id=&quot;migrieren-schrittweise-auf-eine-neue-plattform-überführen&quot;&gt;&lt;strong&gt;Migrieren: Schrittweise auf eine neue Plattform überführen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Migration bedeutet, das System in Teilen auf eine modernere Plattform oder Technologie zu überführen, ohne es komplett neu zu entwickeln.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typische Ansätze:&lt;/strong&gt;&lt;br /&gt;
✅ Schrittweiser Umzug auf eine neue Architektur (z. B. von On-Premise zu Cloud)&lt;br /&gt;
✅ Modularisierung – das alte System entkoppeln und einzelne Komponenten ersetzen&lt;br /&gt;
✅ Umschalten auf moderne Schnittstellen (z. B. APIs statt direkter Datenbankzugriffe)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wann ist das sinnvoll?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Wenn das alte System technisch nicht mehr tragbar ist, aber nicht auf einen Schlag ersetzt werden kann&lt;/li&gt;
  &lt;li&gt;Wenn bestimmte Komponenten erneuert werden müssen, aber der Rest noch funktioniert&lt;/li&gt;
  &lt;li&gt;Wenn eine sanfte Transition nötig ist, um Geschäftsrisiken zu minimieren&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Risiken:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Migrationsprojekte ziehen sich oft länger als geplant&lt;/li&gt;
  &lt;li&gt;Hybrid-Phasen (alter und neuer Code parallel) können komplex sein&lt;/li&gt;
  &lt;li&gt;Altdaten und Abhängigkeiten machen den Wechsel schwierig&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Migration kann eine clevere Strategie sein, wenn das Endziel eine neue Plattform ist, aber ein „Big Bang“-Wechsel zu riskant wäre.&lt;/p&gt;

&lt;h3 id=&quot;ersetzen-komplette-neuentwicklung&quot;&gt;&lt;strong&gt;Ersetzen: Komplette Neuentwicklung&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Die radikalste, aber oft auch nachhaltigste Lösung ist ein kompletter Neustart: Das alte System wird ersetzt, die Geschäftslogik neu gedacht, und moderne Technologien kommen zum Einsatz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wann ist das sinnvoll?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Wenn das alte System unwartbar ist und nicht mehr weiterbetrieben werden kann&lt;/li&gt;
  &lt;li&gt;Wenn Geschäftsprozesse sich so stark verändert haben, dass das alte System nicht mehr passt&lt;/li&gt;
  &lt;li&gt;Wenn eine langfristige Strategie auf eine komplett neue Technologie setzt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Risiken:&lt;/strong&gt;&lt;br /&gt;
🚨 Sehr hohe Kosten und Entwicklungsaufwand&lt;br /&gt;
🚨 Gefahr, wichtige Details aus dem alten System zu übersehen&lt;br /&gt;
🚨 Widerstand von Nutzer:innen, die mit dem alten System vertraut sind&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schlimmer als ein altes System ist ein neues, das nicht funktioniert!&lt;/strong&gt;&lt;br /&gt;
Deshalb ist es essenziell, von Anfang an die Fachabteilungen einzubinden, um sicherzustellen, dass das neue System &lt;strong&gt;wirklich&lt;/strong&gt; das kann, was gebraucht wird – und nicht nur das, was „modern“ klingt.&lt;/p&gt;

&lt;h3 id=&quot;risiken-und-chancen-abwägen&quot;&gt;&lt;strong&gt;Risiken und Chancen abwägen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Egal, welche Strategie du wählst: Jede hat ihre Fallstricke.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kritische Fragen, bevor du entscheidest:&lt;/strong&gt;&lt;br /&gt;
🔹 Wie lange soll das System noch genutzt werden?&lt;br /&gt;
🔹 Wie abhängig sind andere Systeme davon?&lt;br /&gt;
🔹 Gibt es noch Expert:innen, die das alte System verstehen?&lt;br /&gt;
🔹 Wie hoch sind die Kosten und Risiken eines kompletten Wechsels?&lt;br /&gt;
🔹 Welche Ressourcen stehen zur Verfügung?&lt;/p&gt;

&lt;p&gt;Manchmal reicht eine &lt;strong&gt;Modernisierung&lt;/strong&gt;, manchmal ist eine &lt;strong&gt;schrittweise Migration&lt;/strong&gt; die beste Lösung. Und manchmal führt kein Weg an einem &lt;strong&gt;kompletten Ersatz&lt;/strong&gt; vorbei. Entscheidend ist, nicht einfach aus einem Bauchgefühl heraus zu handeln, sondern mit einer klaren Strategie.&lt;/p&gt;

&lt;h3 id=&quot;fazit-es-gibt-keinen-königsweg--nur-die-beste-entscheidung-für-deine-situation&quot;&gt;&lt;strong&gt;Fazit: Es gibt keinen Königsweg – nur die beste Entscheidung für deine Situation&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Jedes Unternehmen, jedes System und jede Situation ist anders. Die richtige Strategie hängt von den technischen Gegebenheiten, dem Budget und den Geschäftszielen ab.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Die Kunst liegt nicht darin, Legacy-Systeme zu hassen – sondern sie zu verstehen und mit ihnen sinnvoll umzugehen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Denn egal, wie modern das neue System ist – eines Tages wird es selbst zum Legacy-System werden. 😉&lt;/p&gt;

&lt;h2 id=&quot;8-entscheidungen-gemeinsam-treffen--das-team-einbinden&quot;&gt;&lt;strong&gt;8. Entscheidungen gemeinsam treffen – Das Team einbinden&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Die Entscheidung, was mit einem Legacy-System passiert, darf nicht im Alleingang getroffen werden. Die besten Strategien scheitern, wenn das bestehende Team – die Menschen, die täglich mit dem System arbeiten – nicht eingebunden wird. Sie kennen die Schwachstellen, wissen, was im Alltag wirklich gebraucht wird, und haben oft wertvolle Erfahrung mit Workarounds, die nicht in der Dokumentation stehen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warum ist das so wichtig?&lt;/strong&gt;&lt;br /&gt;
✅ Die Entscheidung wird von denen mitgetragen, die sie umsetzen müssen.&lt;br /&gt;
✅ Kritisches Wissen über das System bleibt erhalten.&lt;br /&gt;
✅ Widerstände werden früh erkannt und können berücksichtigt werden.&lt;br /&gt;
✅ Es entstehen bessere Lösungen, weil verschiedene Perspektiven eingebracht werden.&lt;/p&gt;

&lt;h3 id=&quot;die-6-hüte-methode-von-de-bono-für-fundierte-entscheidungen&quot;&gt;&lt;strong&gt;Die 6-Hüte-Methode von de Bono für fundierte Entscheidungen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Bei komplexen Entscheidungen lohnt es sich, die &lt;strong&gt;6-Hüte-Methode&lt;/strong&gt; von &lt;strong&gt;Edward de Bono&lt;/strong&gt; anzuwenden. Diese Methode hilft, verschiedene Blickwinkel systematisch zu betrachten, anstatt vorschnelle oder emotional getriebene Entscheidungen zu treffen.&lt;/p&gt;

&lt;p&gt;👒 &lt;strong&gt;Die sechs Denk-Hüte:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Weiß&lt;/strong&gt; → Fakten, Daten und objektive Informationen&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Rot&lt;/strong&gt; → Emotionen, Bauchgefühl und Intuition&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Schwarz&lt;/strong&gt; → Risiken, Probleme und kritische Aspekte&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gelb&lt;/strong&gt; → Chancen, Vorteile und positive Aspekte&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Grün&lt;/strong&gt; → Kreative Ideen und neue Lösungsansätze&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Blau&lt;/strong&gt; → Prozesssteuerung, Struktur und Überblick behalten&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Durch diese Technik wird sichergestellt, dass &lt;strong&gt;alle Aspekte einer Entscheidung&lt;/strong&gt; durchdacht werden – nicht nur die technischen, sondern auch die menschlichen und geschäftlichen.&lt;/p&gt;

&lt;h3 id=&quot;systemisches-konsensieren--die-beste-lösung-mit-geringstem-widerstand&quot;&gt;&lt;strong&gt;Systemisches Konsensieren – Die beste Lösung mit geringstem Widerstand&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Eine weitere Methode, um tragfähige Entscheidungen zu treffen, ist &lt;strong&gt;systemisches Konsensieren&lt;/strong&gt;. Dabei geht es nicht darum, die lauteste Meinung oder die Mehrheit durchzusetzen, sondern eine Lösung zu finden, die &lt;strong&gt;den geringsten Widerstand im Team erzeugt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wie funktioniert systemisches Konsensieren?&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Alle Beteiligten schlagen Lösungen vor.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Jede:r bewertet jede Lösung – nicht nach Zustimmung, sondern nach Widerstand (Skala von 0 bis 10).&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Die Lösung mit dem geringsten Gesamt-Widerstand wird gewählt.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Warum ist das sinnvoll?&lt;/strong&gt;&lt;br /&gt;
🔹 Starke Widerstände werden sichtbar und können diskutiert werden.&lt;br /&gt;
🔹 Die Lösung ist nachhaltig, weil sie von den meisten mitgetragen wird.&lt;br /&gt;
🔹 Es wird verhindert, dass Einzelne Entscheidungen dominieren oder übergangen werden.&lt;/p&gt;

&lt;p&gt;Gerade bei Legacy-Systemen, die viele Betroffene haben, sorgt systemisches Konsensieren dafür, dass die Veränderung &lt;strong&gt;nicht als Bedrohung&lt;/strong&gt;, sondern als gemeinsame Lösung wahrgenommen wird.&lt;/p&gt;

&lt;h3 id=&quot;fazit-entscheidungen-nicht-über-köpfe-hinweg-treffen&quot;&gt;&lt;strong&gt;Fazit: Entscheidungen nicht über Köpfe hinweg treffen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Ein Legacy-System mag technisch überholt sein – aber die Menschen, die es betreiben, sind der Schlüssel zum Erfolg. Wer die &lt;strong&gt;Expert:innen vor Ort ignoriert&lt;/strong&gt;, riskiert schlechte Entscheidungen, Widerstände und teure Fehlschläge.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Eine durchdachte Strategie beginnt mit einem gemeinsamen Verständnis und endet mit einer Entscheidung, die alle mittragen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Und egal, ob modernisiert, migriert oder ersetzt wird: &lt;strong&gt;Die beste neue Lösung ist die, die funktioniert – und nicht die, die am „modernsten“ klingt.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;9-it-archäologie-als-schlüssel-zur-digitalen-zukunft&quot;&gt;&lt;strong&gt;9. IT-Archäologie als Schlüssel zur digitalen Zukunft&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Legacy-Systeme sind keine Altlasten, die einfach entsorgt werden können – sie sind das digitale Fundament, auf dem Unternehmen über Jahre oder sogar Jahrzehnte gewachsen sind. Wer sie ignoriert oder nur als Problem betrachtet, verkennt ihren Wert. IT-Archäologie bedeutet, diese Systeme mit Respekt zu analysieren, ihre Geschichte zu verstehen und den richtigen Umgang mit ihnen zu finden.&lt;/p&gt;

&lt;h3 id=&quot;verstehen-bevor-man-verändert&quot;&gt;&lt;strong&gt;Verstehen, bevor man verändert&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Eines der größten Risiken bei der Ablösung oder Modernisierung eines alten Systems ist es, nicht zu wissen, was genau geändert wird. Jede Zeile Code, jede technische Entscheidung und jede historisch gewachsene Struktur hatte einmal einen guten Grund – auch wenn er heute nicht mehr offensichtlich ist. Wer einfach loslegt, ohne diesen Kontext zu verstehen, riskiert gravierende Fehler.&lt;/p&gt;

&lt;p&gt;Deshalb ist die wichtigste Lektion: &lt;strong&gt;Bevor du entscheidest, was mit einem Legacy-System passiert, musst du verstehen, warum es so ist, wie es ist.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;respekt-für-das-was-funktioniert&quot;&gt;&lt;strong&gt;Respekt für das, was funktioniert&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Ein altes System mag aus heutiger Sicht fehleranfällig, ineffizient oder schwer wartbar sein – aber es läuft. Es hält das Geschäft am Laufen, sichert Arbeitsplätze und funktioniert oft stabiler, als viele glauben. Schlimmer als ein „Legacy-Wust“ ist eine schlecht durchdachte neue Lösung, die nicht ausgereift ist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wer Legacy-Systeme überhastet abschaltet, ohne eine stabile Alternative zu haben, riskiert Chaos und Produktivitätsverluste.&lt;/strong&gt; Deshalb sollte jede Veränderung wohlüberlegt, gut dokumentiert und mit dem bestehenden Team abgestimmt sein.&lt;/p&gt;

&lt;h3 id=&quot;entscheidungen-gemeinsam-treffen&quot;&gt;&lt;strong&gt;Entscheidungen gemeinsam treffen&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Ein IT-System ist nicht nur eine technische Struktur, sondern auch ein soziales System. Die Menschen, die es betreiben, haben sich über Jahre daran gewöhnt, wissen, wo die Stolperfallen sind, und haben Lösungen für Probleme gefunden, die nie dokumentiert wurden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wer über das Schicksal eines Legacy-Systems entscheidet, ohne die Menschen einzubeziehen, die damit arbeiten, trifft fast immer die falsche Wahl.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Methoden wie die &lt;strong&gt;6-Hüte-Methode von de Bono&lt;/strong&gt; oder &lt;strong&gt;systemisches Konsensieren&lt;/strong&gt; helfen, unterschiedliche Perspektiven in die Entscheidung einzubeziehen und Lösungen zu finden, die von allen mitgetragen werden.&lt;/p&gt;

&lt;h3 id=&quot;it-archäologie-als-investition-in-die-zukunft&quot;&gt;&lt;strong&gt;IT-Archäologie als Investition in die Zukunft&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Jedes System, das heute als modern gilt, wird irgendwann selbst zum Legacy-System. Die Art und Weise, wie wir heute mit alten Systemen umgehen, bestimmt, wie zukünftige Generationen mit unseren heutigen Lösungen arbeiten werden. Wer jetzt sorgfältig dokumentiert, Wissen sichert und nachvollziehbare Entscheidungen trifft, spart zukünftigen Teams Zeit, Geld und Frustration.&lt;/p&gt;

&lt;p&gt;IT-Archäologie ist deshalb kein nostalgischer Blick zurück – sondern eine notwendige Strategie, um die digitale Zukunft stabil und nachhaltig zu gestalten.&lt;/p&gt;

&lt;h3 id=&quot;der-kreislauf-endet-nie--und-das-ist-okay&quot;&gt;&lt;strong&gt;Der Kreislauf endet nie – und das ist okay&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Es gibt keine endgültige Lösung für das „Legacy-Problem“. Jedes neue System wird irgendwann selbst alt. Deshalb geht es nicht darum, ein für alle Mal aufzuräumen, sondern darum, &lt;strong&gt;einen bewussten und respektvollen Umgang mit IT-Geschichte zu entwickeln&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Die beste Vorbereitung auf die Zukunft ist ein kluger Umgang mit der Vergangenheit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Und vielleicht sind die Systeme, über die wir heute lächeln, in 20 Jahren das Fundament, auf dem die nächste Generation aufbaut.&lt;/p&gt;

&lt;h2 id=&quot;-anhang-checkliste-für-den-umgang-mit-legacy-systemen&quot;&gt;&lt;strong&gt;📌 Anhang: Checkliste für den Umgang mit Legacy-Systemen&lt;/strong&gt;&lt;/h2&gt;

&lt;h3 id=&quot;️-1-erste-analyse-was-tut-das-system-und-warum&quot;&gt;&lt;strong&gt;🕵️ 1. Erste Analyse: Was tut das System und warum?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ System identifizieren: &lt;strong&gt;Welche geschäftskritischen Prozesse hängen daran?&lt;/strong&gt;&lt;br /&gt;
✅ Historische Hintergründe klären: &lt;strong&gt;Warum wurde es ursprünglich entwickelt?&lt;/strong&gt;&lt;br /&gt;
✅ Technische Abhängigkeiten analysieren: &lt;strong&gt;Welche Systeme greifen darauf zu?&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Datenbankstrukturen, API-Schnittstellen und externe Verbindungen prüfen&lt;/strong&gt;&lt;br /&gt;
✅ Prüfen, ob &lt;strong&gt;noch Support oder Wartungsverträge existieren&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;-2-dokumentation-suchen-und-sichern&quot;&gt;&lt;strong&gt;📚 2. Dokumentation suchen und sichern&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ Existierende Dokumentation &lt;strong&gt;aufspüren und archivieren (nicht überschreiben!)&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Alte Handbücher, interne Wikis, Change-Logs oder Tickets durchsuchen&lt;/strong&gt;&lt;br /&gt;
✅ Code-Kommentare analysieren: &lt;strong&gt;Sind sie nützlich oder irreführend?&lt;/strong&gt;&lt;br /&gt;
✅ Reverse Engineering als letzte Rettung: &lt;strong&gt;Falls keine Doku existiert, das System aktiv beobachten und analysieren&lt;/strong&gt;&lt;br /&gt;
✅ Falls mehrere Versionen der Doku existieren: &lt;strong&gt;Versionierung klären, alte Doku unverändert archivieren&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;️-3-wissensträgerinnen-finden-und-befragen&quot;&gt;&lt;strong&gt;🗣️ 3. Wissensträger:innen finden und befragen&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Mitarbeiter:innen und Entwickler:innen befragen, die das System kennen&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Explizit auch langjährige Nutzer:innen einbeziehen&lt;/strong&gt; – oft kennen sie Workarounds und Kniffe, die nicht dokumentiert sind&lt;br /&gt;
✅ &lt;strong&gt;Ehemalige Entwickler:innen oder externe Dienstleister:innen kontaktieren&lt;/strong&gt;&lt;br /&gt;
✅ Wichtige Fragen stellen:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Welche Probleme gibt es regelmäßig?&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gibt es mündlich überliefertes Wissen, das nie dokumentiert wurde?&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Welche Funktionen sind kritisch für das Geschäft?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;-4-eigene-dokumentation-erstellen-ohne-alte-doku-zu-zerstören&quot;&gt;&lt;strong&gt;📝 4. Eigene Dokumentation erstellen (ohne alte Doku zu zerstören!)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ Alte Dokumentation &lt;strong&gt;niemals direkt überschreiben – sie bleibt als historische Referenz erhalten&lt;/strong&gt;&lt;br /&gt;
✅ Eigene Notizen in einer neuen Doku strukturieren&lt;br /&gt;
✅ &lt;strong&gt;Ergänzende Anmerkungen zur alten Doku schreiben&lt;/strong&gt; (Fehler, veraltete Annahmen, tatsächliches Verhalten)&lt;br /&gt;
✅ Diagramme oder Ablaufschemata erstellen, um Prozesse verständlicher zu machen&lt;br /&gt;
✅ &lt;strong&gt;FAQ-Sektion mit häufigen Problemen und Lösungen einfügen&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;-5-entscheidung-vorbereiten-was-tun-mit-dem-system&quot;&gt;&lt;strong&gt;🤔 5. Entscheidung vorbereiten: Was tun mit dem System?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Ziel definieren:&lt;/strong&gt; Soll das System modernisiert, migriert oder ersetzt werden?&lt;br /&gt;
✅ Alle &lt;strong&gt;technischen, wirtschaftlichen und personellen Faktoren abwägen&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Verschiedene Lösungen durchspielen und Risiken analysieren&lt;/strong&gt;&lt;br /&gt;
✅ Team einbinden: &lt;strong&gt;Entscheidung nicht über die Köpfe der Betroffenen hinweg treffen!&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;6-Hüte-Methode von de Bono nutzen, um verschiedene Perspektiven zu berücksichtigen&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Systemisches Konsensieren anwenden, um eine tragfähige Lösung mit geringstem Widerstand zu finden&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;️-6-umsetzung-der-gewählten-strategie&quot;&gt;&lt;strong&gt;⚙️ 6. Umsetzung der gewählten Strategie&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🔹 Wenn das System modernisiert wird:&lt;/strong&gt;&lt;br /&gt;
✅ Code-Refactoring planen und schrittweise umsetzen&lt;br /&gt;
✅ Technische Schulden beseitigen, ohne das System instabil zu machen&lt;br /&gt;
✅ &lt;strong&gt;Virtualisierung oder Containerisierung prüfen, um alte Umgebung stabil zu halten&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 Wenn das System migriert wird:&lt;/strong&gt;&lt;br /&gt;
✅ Migrationsstrategie definieren: &lt;strong&gt;Parallelbetrieb oder schrittweiser Wechsel?&lt;/strong&gt;&lt;br /&gt;
✅ Datenmigration sicherstellen: &lt;strong&gt;Wie werden Altdaten ins neue System überführt?&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Automatisierte Tests und Staging-Umgebung aufsetzen, um Fehler frühzeitig zu erkennen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 Wenn das System ersetzt wird:&lt;/strong&gt;&lt;br /&gt;
✅ Sicherstellen, dass &lt;strong&gt;alle kritischen Funktionen auch im neuen System vorhanden sind&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Pilotbetrieb oder schrittweise Einführung planen&lt;/strong&gt;, um Risiken zu minimieren&lt;br /&gt;
✅ Schulung der Nutzer:innen: &lt;strong&gt;Sind alle mit der neuen Lösung vertraut?&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Legacy-System nicht sofort abschalten – eine Übergangsphase einplanen!&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;-7-abschluss-sicherstellen-dass-das-wissen-erhalten-bleibt&quot;&gt;&lt;strong&gt;🎯 7. Abschluss: Sicherstellen, dass das Wissen erhalten bleibt&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Finale Dokumentation erstellen – verständlich und aktuell&lt;/strong&gt;&lt;br /&gt;
✅ Wissensträger:innen zur Überprüfung einbinden&lt;br /&gt;
✅ Altsystem entweder &lt;strong&gt;geordnet archivieren oder sauber abschalten&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Lessons Learned dokumentieren:&lt;/strong&gt; Welche Fehler können in Zukunft vermieden werden?&lt;br /&gt;
✅ Sicherstellen, dass &lt;strong&gt;die neue Dokumentation gepflegt wird, damit das neue System nicht auch zum unverständlichen Legacy-Problem wird&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;️-fazit-die-beste-strategie-ist-vorausschauendes-handeln&quot;&gt;&lt;strong&gt;🛠️ Fazit: Die beste Strategie ist vorausschauendes Handeln&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;💡 &lt;strong&gt;Legacy-Systeme sind nicht einfach nur „Altlasten“ – sie sind bewährte Werkzeuge, die mit Bedacht behandelt werden müssen.&lt;/strong&gt; Diese Checkliste hilft dir, einen klaren und strukturierten Umgang mit ihnen zu finden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Und vergiss nicht: Das neue System von heute wird irgendwann selbst zum Legacy-System von morgen. Die Entscheidungen, die du jetzt triffst, bestimmen, wie leicht oder schwer es künftigen Teams fallen wird, damit umzugehen.&lt;/strong&gt; 😉&lt;/p&gt;

</content>
  </entry>
  <entry>
    <title>Produktionsreife Software Entwicklung</title>
    <link href="https://it-consulting-hahn.de/produktionsreife-software-entwicklung/" rel="alternate" type="text/html"/>
    <id>https://it-consulting-hahn.de/produktionsreife-software-entwicklung/</id>
    <published>2024-11-09T00:00:00+01:00</published>
    <updated>2024-11-09T00:00:00+01:00</updated>
    <category term="Blog"/>
    <summary type="html">Software wird entwickelt und irgendwann läuft diese in produktiven Verhältnissen. Doch was heißt es wirklich produktionsreif Software zu entwickeln. Was, wenn man Software Entwicklung nicht angeht wie der erste Mensch der das Rad entwickelt, sondern auf dem Wissen und der Erfahrung der letzten 60 Jahre aufbaut.</summary>
    <content type="html">&lt;p&gt;&lt;img src=&quot;/assets/images/haus.png&quot; alt=&quot;Image&quot; width=&quot;150px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Software wird entwickelt und irgendwann läuft diese in produktiven Verhältnissen. Doch
was heißt es wirklich produktionsreif Software zu entwickeln. Was, wenn man Software
Entwicklung nicht angeht wie der erste Mensch der das Rad entwickelt, sondern auf dem
Wissen und der Erfahrung der letzten 60 Jahre aufbaut.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;produktionsreife-software-entwicklung&quot;&gt;Produktionsreife Software Entwicklung&lt;/h2&gt;

&lt;p&gt;Software ist nicht produktionsreif, der gesamte Entwicklungsprozess muss produktionsreif
sein, inklusive dem Betrieb und allem drum herum. Software ist kein Stuhl der gebaut
wird und dann klaglos seinen Dienst tut. Software ist ein ständig lebendes Produkt, welches
kontinuierlich weiterentwickelt werden muss (mindestens Bugfixes und Security Upgrades).&lt;/p&gt;

&lt;p&gt;Ein Stillstand der Weiterentwicklung bedeutet das langsame Sterben der Software. Entsprechend
muss die Software nicht zu einem bestimmten Zeitpunkt gewisse Kriterien erfüllen. Der
gesamte Entwicklungsprozess muss diese Kriterien erfüllen und dauerhaft erhalten.&lt;/p&gt;

&lt;h2 id=&quot;indikatoren-produktiven-denkens&quot;&gt;Indikatoren produktiven Denkens&lt;/h2&gt;

&lt;h3 id=&quot;respekt-vor-den-nutzerinnen-und-den-kosten-von-ausfällen&quot;&gt;Respekt vor den Nutzer:innen und den Kosten von Ausfällen&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/respekt.png&quot; alt=&quot;Image&quot; width=&quot;150px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Wenn man länger in der Branche tätig ist, ist es oft überraschend und schockierend mit
welcher Nonchalance Entwickler:innen und Systemadministrator:innen bereit sind Ausfälle
in Kauf zu nehmen. Deployments werden ohne Ankündigung rausgehauen. Tests werden nicht
geschrieben und beim ersten Rollout zerbröselt das neue Feature zwischen den Fingern.
Bestehende Funktionalität wird im neuen Release kaputt gemacht. Hauptsache das 
Scrum-Ziel wurde mit Ach-und-Krach noch erreicht. Vorwärts immer, rückwärts nimmer. Dabei
ist es unerheblich ob 20 oder 200 Leute betroffen sind, ob ein Ausfall 50.000€ oder
5 Millionen kostet. Es ist extrem schwer ein Bewusstsein hierfür zu schaffen, ich war
in Firmen in denen Angestellte die Aussage brachten “XYZ ist ja eh nicht so
wichtig, das ist ja das alte System”. Leider war das alte System die Basis der gesamten
Firma und für 100% des Umsatzes verantwortlich. Ohne das “unwichtige” System hätte die
Firma innerhalb weniger Tage zu machen können.&lt;/p&gt;

&lt;p&gt;Oder, verantwortlich für die Business Intelligence Plattform der gesamten Firma:
“Wir sind ja nicht das Hauptprodukt und “nur” BI, ist ja nicht so wichtig”. Die
Live Optimierung welche auf der BI Landschaft basierte verbesserte das Firmenergebnis
um ca. 20%. Die Ziele der 300 Mitarbeiter:innen waren stark an die Zahlen aus dem
BI Tool gekoppelt. Die Geschäftsführung traf ihre Entscheidungen anhand der Zahlen
der BI Statistiken.&lt;/p&gt;

&lt;h4 id=&quot;der-ständige-kampf-gegen-unwissen-und-ignoranz&quot;&gt;Der ständige Kampf gegen Unwissen und Ignoranz&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/smug.png&quot; alt=&quot;Image&quot; width=&quot;150px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Es ist eine ständige Sisyphus-Arbeit das Bewusstsein zu schaffen für die Auswirkungen
von Ausfällen, die Wichtigkeit von Systemen und Geschäftsprozessen. Jedes Jahr gehen
Angestellte und kommen neue hinzu, externe Mitarbeiter:innen verstärken Projekte. Teams
werden umstrukturiert. Bestehende Mitarbeiter:innen werden nachlässig oder waren es
schon immer.&lt;/p&gt;

&lt;p&gt;Was kann man tun?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Verständnis aufbauen für die zentralen Geschäftsprozesse der Firma und die Auswirkungen
von Ausfällen&lt;/li&gt;
  &lt;li&gt;Bei Ausfällen dieses Verständnis immer wieder mit dem Team teilen - nicht als Vorwurf,
sondern als reine Fakten und mit starkem Appell, dass Maßnahmen geschaffen werden müssen,
diese Art von Ausfällen zukünftig zu verhindern&lt;/li&gt;
  &lt;li&gt;Immer wieder das aktuelle Verständnis in Präsentationen und Folien einbauen&lt;/li&gt;
  &lt;li&gt;Direkten Kontakt mit den “Opfern” herstellen - beim gemütlichen Feierabend-Bier, etc.
wer live mitbekommt, dass Menschen nicht arbeiten können handelt verantwortungsbewusster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/deployed.png&quot; alt=&quot;Image&quot; width=&quot;150px&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;berücksichtigung-des-dreisatzes-dev-staging-produktion&quot;&gt;Berücksichtigung des “Dreisatzes” Dev, Staging, Produktion&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/babies.png&quot; alt=&quot;Image&quot; width=&quot;150px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Auch hier bin ich jedes Mal wieder überrascht wie hemdsärmelig teilweise Teams in
Firmen agieren die schon Jahrzehnte im Geschäft sind. Da wird die Software das erste
Mal richtig in Produktion getestet - von Hand. Dann gibt es noch alle möglichen
Zwischenlösungen. So wird zum Beispiel eine Staging Umgebung eingerichtet, jedoch keine
Dev-Umgebung. Daher ist die Staging-Umgebung zu instabil um vernünftige Integrationstests
zu fahren und faktisch wird wieder auf Prod getestet. Oder es gibt zwar alle drei
Umgebungen, aber die Daten der unterschiedlichen Services sind auf Dev und Staging so
unzureichend, dass ein Test wieder nicht möglich ist.&lt;/p&gt;

&lt;p&gt;In einer Firma hatten wir den Galgenhumor Spruch: “Straight to PROD. Why not!”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/traenen.png&quot; alt=&quot;Image&quot; width=&quot;150px&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;ein-vernünftiger-rollout-prozess&quot;&gt;Ein vernünftiger Rollout Prozess&lt;/h3&gt;

&lt;p&gt;Gehen wir davon aus, dass es gelungen ist die drei Umgebungen Dev, Staging und Produktion
alle und sinnvoll aufzusetzen. Rollt man Änderungen nun gleichzeitig auf allen 3 Umgebungen
aus hat man - wer hats erraten - nichts gewonnen.&lt;/p&gt;

&lt;h4 id=&quot;wie-wirds-gemacht&quot;&gt;Wie wirds gemacht&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Features werden lokal und auf der Dev-Umgebung entwickelt&lt;/li&gt;
  &lt;li&gt;Sobald alles funktioniert und der Branch in Main gemerged wurde und Main stabil
auf Dev läuft wird ein git-Tag erstellt&lt;/li&gt;
  &lt;li&gt;Diese getaggte Version wird nun auf Staging ausgerollt und getestet&lt;/li&gt;
  &lt;li&gt;Nach Erfolg wird exakt dieser Tag auf Produktion ausgerollt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;fehler-sind-unvermeidlich&quot;&gt;Fehler sind unvermeidlich&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/matrix.png&quot; alt=&quot;Image&quot; width=&quot;350px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Teils wird so getan als ob man Fehler vermeiden könnte, oder Fehler optional sind und
durch “sauberes” Arbeiten verhindert werden könnten. Dies ist eine Illusion.
Standard-Software ist durchzogen von einer unglaublichen Menge an Bugs. Selbst Software
im Hochsicherheitsumfeld (Flugzeuge, Raumfahrt, etc.) hat Bugs trotz des unglaublichen Aufwandes
der hier getrieben wird diese zu verhindern.
Ebenso beim Rollout, etc. Fehler passieren die ganze Zeit und es ist keine Frage ob
diese passieren sondern nur wann. Meist wenn man es am wenigsten braucht.
Also braucht man Prozesse die diese Fehler frühzeitig sichtbar machen und eine Behebung
möglich machen.
Beim Rollout müssen alle Betroffenen gewarnt sein: Stichwort Wartungsfenster mit
Ankündigung.&lt;/p&gt;

&lt;h4 id=&quot;lösungen&quot;&gt;Lösungen&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Feste Prozesse sorgen dafür, dass Fehler frühzeitig gefunden werden&lt;/li&gt;
  &lt;li&gt;Die Dev und Staging Umgebungen müssen es ermöglichen realistische Tests zu fahren&lt;/li&gt;
  &lt;li&gt;Deployments - auch auf Staging - werden angekündigt, sodass alle Nutzer:innen sich
darauf einstellen können&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;hohe-deploymentgeschwindigkeit-trotz-sauberer-prozesse&quot;&gt;Hohe Deploymentgeschwindigkeit trotz sauberer Prozesse&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/uhr_speed.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Das Wort “Prozess” klingt unglaublich träge und verstaubt. Das ist was die großen
Firmen tun die in der Vergangenheit feststecken denkt man sich, man denkt mit Schrecken
an 3 wöchige CAP (Change Advisory Board) Meetings, die außer heißer Luft nichts
produzieren. Ein Prozess ist einfach ein definiertes Vorgehen, welches einmalig festgelegt
wird, damit Fehler reduziert werden. Ein Abweichen vom Prozess darf nur erfolgen
durch Modifikation des Prozesses. Dies verhindert, dass Mitarbeiter:innen in einem
Anflug von Selbstüberschätzung Dinge kaputt machen.&lt;/p&gt;

&lt;p&gt;Das heißt nicht, dass man ITIL oder anderen existierenden Frameworks folgen muss. Es gibt
auch sehr einfache Prozesse die extrem schnell sind.&lt;/p&gt;

&lt;h4 id=&quot;beispiel-für-einen-einfachen-prozess&quot;&gt;Beispiel für einen einfachen Prozess&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Entwickelt wird auf Dev in einem Featurebranch&lt;/li&gt;
  &lt;li&gt;Nach erfolgreichem Review (alternativ: freies mergen nach eigenem Ermessen der Entwickler:in) wird
in den main-Branch integriert&lt;/li&gt;
  &lt;li&gt;Auf Staging werden keine Featurebranches deployt, ausschließlich Tags des main-Branches&lt;/li&gt;
  &lt;li&gt;Das Deployment auf Staging wird angekündigt (z.B. automatisiert durch die Deployment-Pipeline)&lt;/li&gt;
  &lt;li&gt;Auf Staging erfolgt eine Abnahme - welcher Art auch immer - durch die Endnutzer:innen&lt;/li&gt;
  &lt;li&gt;Das Deployment auf Production wird angekündigt (z.B. automatisiert durch die Deployment-Pipeline,
besser jedoch mit mehr Vorlauf)&lt;/li&gt;
  &lt;li&gt;Auf der Produktionsumgebung werden ausschließlich Tags deployt welche auf Staging entsprechend
von Nutzer:innen abgenommen wurden&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;mögliche-einwände&quot;&gt;Mögliche Einwände&lt;/h4&gt;

&lt;p&gt;Hier nur ein paar Beispiele für übliche Einwände. Die Antworten sollen zeigen, dass
zwar die Symptome real sind, die Lösung jedoch nicht ist den Prozess aufzuweichen, sondern
dafür zu sorgen, dass der Prozess funktioniert. Wenn man mit dieser Perspektive an die
Probleme ran geht, dann findet man andere Lösungen, als wenn es nur darum geht
“Ausnahmen” zu genehmigen.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Auf Dev kann ich nicht vernünftig testen, mein Feature-Branch muss auf Staging laufen
–&amp;gt; Die Dev Umgebung muss so verändert werden, dass die Tests auf Dev aussagekräftig
    sind.&lt;/li&gt;
  &lt;li&gt;Dann muss ich ja dauernd in main mergen und Tags bauen, wenn ich noch Bugs finde.
–&amp;gt; Die Testabdeckung im Code muss verbessert werden, sodass Fehler nicht erst auf
    Staging bemerkt werden, die Dev Umgebung muss so verändert werden, dass die
    Tests auf Dev aussagekräftig sind.&lt;/li&gt;
  &lt;li&gt;Wenn ich auf die Endnutzer:innen Tests warte komme ich nicht weiter
–&amp;gt; in gewissen Rahmen kann der Test auch auchs Endnutzer:innen Perspektive von den
    Entwickler:innen durchgeführt werden.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;betrieb-wird-mit-betrachtet&quot;&gt;Betrieb wird mit betrachtet&lt;/h3&gt;

&lt;p&gt;Oft liegt der Fokus ausschließlich auf der Entwicklung. Features werden am laufenden
Band produziert, doch wer kümmert sich darum, dass die Software auch läuft und
wirklich den geplanten Mehrwert liefern kann?&lt;/p&gt;

&lt;p&gt;Es braucht ein Betriebskonzept welches die wichtigsten Fragen beantwortet:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Wie stellt man fest, dass etwas nicht funktioniert (Best-Case: Monitoring, Worst-Case: Leute beschweren sich)&lt;/li&gt;
  &lt;li&gt;Wer kümmert sich darum Bugs nachzuverfolgen/nachzustellen&lt;/li&gt;
  &lt;li&gt;Gibt es einen Vertretungsplan, wenn diese Person ausfällt&lt;/li&gt;
  &lt;li&gt;Es werden dauerhaft Ressourcen durch Betrieb gebunden, das muss beachtet und eingeplant
werden&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;monitoring--alerting&quot;&gt;Monitoring &amp;amp; Alerting&lt;/h3&gt;

&lt;p&gt;Um einen reibungslosen Betrieb zu gewährleisten ist ein Monitoring der wichtigsten
Applikations-Kennzahlen und System-Kennwerte unerlässlich.&lt;/p&gt;

&lt;p&gt;Bei außerplanmäßigen Abweichungen soll alarmiert werden, damit das Betriebsteam proaktiv
reagieren kann.&lt;/p&gt;

&lt;h3 id=&quot;backup&quot;&gt;Backup&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/fire_burn.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Der Service schnurrt, die User sind zufrieden, es könnte nicht schöner sein. Dann
brennt das Rechenzentrum ab ( &lt;a href=&quot;https://www.faz.net/pro/digitalwirtschaft/frankreich-feuer-bei-groesstem-cloud-anbieter-europas-ausgebrochen-17237695.html&quot;&gt;Feuer bei OVH&lt;/a&gt; ).&lt;/p&gt;

&lt;p&gt;Wie bei Fehlern sind auch Ausfälle und kompletter Datenverlust unvermeidlich. Es wird
passieren, entweder technisch, durch Mitarbeiter:innen oder externe Angreifer:innen.&lt;/p&gt;

&lt;p&gt;Je größer der Mehrwert, desto größer der Schaden im Worst-Case Szenario. Wenn eine
Applikation kein Backup benötigt ist sie sinnlos - oder nur Erfüllungsgehilf:in für
eine andere Applikation, welche dann aber entsprechendes Backup benötigt.&lt;/p&gt;

&lt;p&gt;Bewusstsein schaffen für:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Was sind unsere wichtigsten Daten und Abläufe&lt;/li&gt;
  &lt;li&gt;Wie können wir im Fehlerfall den Schaden gering halten&lt;/li&gt;
  &lt;li&gt;Regelmäßiges Durchspielen des Ernstfalls. Der Klassiker: wir haben ein Backup, aber
wir haben noch nie versucht den Restore durchzuführen. Ein Freund von mir meinte mal:
“Niemand will ein Backup … die Leute wollen den Restore!”. Oder anders formuliert:
Ohne erfolgreichen Restore ist ein Backup absolut wertlos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;wert-und-ständige-kommunikation&quot;&gt;Wert und ständige Kommunikation&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/feedback.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Die Wertschöpfung einer Applikation und die positiven Effekte sollten beständig und
transparent nach innen und außen kommuniziert werden. Hier geht es nicht darum
Fake-News zu verbreiten und Luft-Schlösser zu bauen, sondern klar und realistisch
die Wertschöpfung zu kommunizieren.&lt;/p&gt;

&lt;p&gt;Es ist wichtig in ständigem Kontakt mit den Nutzer:innen und Profiteur:innen der Applikation
zu bleiben. Durch direkte Kontakte, regelmäßige - bevorzugt auch lockere und entspannte - Treffen,
Chat-Rooms und Ticket-Systeme. Es muss klar sein, wenn der gewünschte Mehrwert nicht
mehr der Realität entspricht. Wenn die Nutzer:innen unzufrieden werden.&lt;/p&gt;

&lt;h3 id=&quot;neutralität-der-sache&quot;&gt;Neutralität der Sache&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/neutral.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Wir sind Menschen und keine Vulkanier &lt;em&gt;(siehe Star Trek, Mr. Spock)&lt;/em&gt; wir handeln und
verhalten uns nicht rein rational. Wenn jemand Fragen stellt, sich beschwert, Vorgänge
kritisiert so haben viele Menschen instinktiv das Bedürfnis sich zu verteidigen und
die vorgebrachten Themen kleinzureden, zu ignorieren oder wegzudiskutieren.&lt;/p&gt;

&lt;p&gt;Wir sollten versuchen zuzuhören und versuchen neutral zu bewerten ob eine Wahrheit
in den Beschwerden oder Vorschlägen steckt. Die Diskussionen gehen um eine Sache und
die Realität lässt sich nicht leugnen.&lt;/p&gt;

&lt;p&gt;Wir können erklären warum wir die Realität nicht ändern können, oder wir können mehr
Ressourcen aufwenden um eine Änderung möglich zu machen - mit potentiell negativen
Konsequenzen für andere Projekte/Features da Zeit gebunden wird.&lt;/p&gt;

&lt;p&gt;Letztlich ist es am Ende eine reine Sache der Priorisierung.&lt;/p&gt;

&lt;p&gt;Statt:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Statt “Ich habe keine Zeit es dir zu erklären, mach es einfach so wie ich dir sage”: Wir haben
das aus Grund XYZ so gemacht, hier findest du Informationen. Das war der einfachste
Weg, falls du eine bessere Lösung findest, gib gerne Bescheid, damit wir das neu
evaluieren können.&lt;/li&gt;
  &lt;li&gt;Statt “Das muss so sein”: Aus Gründen XYZ ist die Situation gerade so. Wenn wir Feature ABC
zurückstellen können wir versuchen die Situation zu verbessern.&lt;/li&gt;
  &lt;li&gt;Statt “Warum stellst du so Fragen”: Weiß ich gerade nicht aus dem Kopf, ich schicke dir
später die Informationen (und dann auch wirklich schicken!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wir wollen alle das Gleiche: Einen Mehrwert schaffen für andere Leute und hierbei das
Beste Ergebnis erzielen, was für uns möglich ist.&lt;/p&gt;

&lt;h2 id=&quot;keine-lust&quot;&gt;Keine Lust!&lt;/h2&gt;

&lt;p&gt;Ich bin sicher, bei den Wörtern “Prozess” und “Backup + Restore” hat die Hälfte die den Artikel
liest innerlich bereits gekotzt. Die Etablierung von Prozessen und das einrichten von
Backups und regelmäßiges testen von Restores ist ungefähr so spannend und beliebt wie
die Reinigung einer Latrine.&lt;/p&gt;

&lt;p&gt;Das muss jedoch nicht so sein. Es ist eine Freude eine Applikation und Systeme zu sehen
die wie ein Kätzchen schnurren. Es ist toll, wenn die Nutzer:innen zufrieden sind und
einem immer wieder sagen wie schön es ist sich endlich auf ein System verlassen zu
können. Wenn man den direkten positiven Mehrwert der eigenen Arbeit erlebt. Es ist 
befriedigend zu wissen, dass man im Katastrophenfall die Anwendung innerhalb von ein
paar Stunden from-scratch wieder hochziehen kann. Nicht theoretisch, vielleicht, sondern
sicher. Weil man es ausprobiert hat. Viele Male.&lt;/p&gt;

&lt;p&gt;Das Management kann hier viel beitragen, indem saubere Vorgänge nicht als Feature-Bremsen
gesehen werden, sondern als essentieller Bestandteil den geschafften Wert
anderen Menschen zugänglich zu machen und dauerhaft zu erhalten.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/smiley.png&quot; alt=&quot;Image&quot; width=&quot;300px&quot; /&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Testing und Test-Driven-Development (TDD)</title>
    <link href="https://it-consulting-hahn.de/blog-testing/" rel="alternate" type="text/html"/>
    <id>https://it-consulting-hahn.de/blog-testing/</id>
    <published>2024-10-17T00:00:00+02:00</published>
    <updated>2024-10-17T00:00:00+02:00</updated>
    <category term="Blog"/>
    <summary type="html">In der Theorie sind Tests sehr wichtig für funktionierenden Code. Warum werden diese dann oft nur widerwillig geschrieben und was für Praktiken erleichtern das schreiben von Tests? Wir schauen uns die Hintergründe für die Unlust am Testen an und versuchen Hürden zu identifizieren und abzubauen. Ich stelle die Methode vor die für mich persönlich am Besten funktioniert und wir sehen uns Code-Beispiele an.</summary>
    <content type="html">&lt;p&gt;&lt;img src=&quot;/assets/images/tdd.png&quot; alt=&quot;Image&quot; width=&quot;150px&quot; style=&quot;float: left; margin-right: 20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In der Theorie sind Tests sehr wichtig für funktionierenden Code. Warum werden diese dann oft
nur widerwillig geschrieben und was für Praktiken erleichtern das schreiben von Tests?&lt;/p&gt;

&lt;p&gt;Wir schauen uns die Hintergründe für die Unlust am Testen an und versuchen Hürden
zu identifizieren und abzubauen.&lt;/p&gt;

&lt;p&gt;Ich stelle die Methode vor die für mich persönlich am Besten funktioniert und wir
sehen uns Code-Beispiele an.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;warum-testing&quot;&gt;Warum Testing?&lt;/h2&gt;

&lt;p&gt;Jedem der schonmal Software geschrieben hat muss man nicht erklären warum man nach dem Programmieren
nochmal ausprobieren muss ob denn alles auch so funktioniert wie geplant.&lt;/p&gt;

&lt;p&gt;Software hat Fehler, unser Wissen ist begrenzt, wir wollen wissen “tut es”.&lt;/p&gt;

&lt;p&gt;Dieses “Durchklicken” oder “Ausprobieren” (z.B. Rest-API Calls abfeuern, etc.) ist schon der Kern des
Testing und absolut natürlich.&lt;/p&gt;

&lt;p&gt;Wir haben eine gewisse Erwartung was passieren soll (Testfall) und probieren aus ob
unsere Erwartung erfüllt wird.&lt;/p&gt;

&lt;h2 id=&quot;automatisiertes-testen-der-nächst-logische-schritt&quot;&gt;Automatisiertes Testen, der nächst logische Schritt&lt;/h2&gt;

&lt;p&gt;Sehr schnell wird es sehr aufwändig alle Tests manuell durchzuführen. Es wird unübersichtlich
man wird unaufmerksam und macht Fehler. Nicht mehr alle Tests werden jedes Mal durchgeführt.&lt;/p&gt;

&lt;p&gt;Eigentlich wollen wir nach &lt;strong&gt;jeder&lt;/strong&gt; Änderung am Code wissen ob dieser noch funktioniert.
Die einzig nachhaltige Lösung: Wir müssen die Tests automatisieren.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/automatisierung.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;von-der-theorie-zur-praxis&quot;&gt;Von der Theorie zur Praxis&lt;/h2&gt;

&lt;p&gt;In der Theorie gehen in der Regel die meisten noch mit: Ja klar brauchen wir Tests. In
der Praxis wird es dann schnell dünn. Tests schreiben ist eine Qual. Hektisch werden
von den Entwickler:innen noch schnell ein paar Tests dazu gebaut, damit die
Definition of Done erfüllt ist und die Build-Metriken besser aussehen.&lt;/p&gt;

&lt;p&gt;Doch warum ist das so?&lt;/p&gt;

&lt;h2 id=&quot;tests-schreiben-ist-schwer&quot;&gt;Tests schreiben ist schwer&lt;/h2&gt;

&lt;p&gt;Gute Tests zu schreiben ist schwer. Test-Code ist den gleichen Regeln unterworfen wie
funktionaler Code, man braucht viele Jahre Erfahrung um einfach und schnell Tests zu
schreiben. Zusätzlich erfordert das Schreiben von Tests jedoch noch ein tiefes
Verständnis von Abläufen und Abhängigkeiten und oftmals offenbart das Schreiben 
der Tests größere Baustellen in der Architektur.
Dies ist zwar ein sehr positiver Nebeneffekt von Tests, viele Entwickler:innen sind
jedoch davon überfordert.
Nun müssen auch noch Entscheidungen über Architektur-Refactorings getroffen werden.
Dabei wollte man nur kurz … . Wird das Refactoring aber nicht durchgeführt kann oft
der Test nur schwer geschrieben werden oder ist in der Ausführung unzuverlässig.&lt;/p&gt;

&lt;h2 id=&quot;so-much-to-do-so-little-time-funktionalität-vs-zuverlässigkeit&quot;&gt;&lt;em&gt;So much to do, so little time:&lt;/em&gt; Funktionalität vs. Zuverlässigkeit&lt;/h2&gt;

&lt;p&gt;Beim Schreiben von Software ist der Tag eigentlich immer randvoll gepackt mit Aufgaben.
Die Feature-Liste ist lang, der Druck diese zeitnah zu implementieren groß.
Tests sind unsichtbar, der neue Button in der UI, der neue REST-API Endpunkt sind
sichtbar. Für Außenstehende ist die Qualität der geschriebenen Tests nicht nachvollziehbar.
Die des Codes auch nicht, aber zumindest gibt es einen Interaktionspunkt und man kann
sagen: es tut was es soll, oder es tut nicht, was es soll.&lt;/p&gt;

&lt;p&gt;Durch jahrzehnte lange Praxis an unzureichenden Tests und schlechtem Code sind die
Fachbereiche und das Management abgestumpft. Es ist völlig “normal”, dass Software am
Anfang nicht das tut was von ihr erwartet wird. Selbst in Bereichen mit unverhandelbaren
völlig klaren Spezifikationen ist die Experimentalinformatik an der Tagesordung.&lt;/p&gt;

&lt;p&gt;Keine Maurer:in würde sich dazu hetzen lassen zu wenig Mörtel zu verwenden und die
Mauer schief zu bauen. In der Software-Entwicklung ist das an der Tagesordnung. Die
Folge ist eine Bug-Dichte auf peinlichstem Niveau.&lt;/p&gt;

&lt;h2 id=&quot;die-gratwanderung-fast-prototyping-vs-schlampige-arbeit&quot;&gt;Die Gratwanderung: Fast-Prototyping vs. schlampige Arbeit&lt;/h2&gt;

&lt;p&gt;Im letzten Absatz habe ich von Experimentalinformatik im negativen Kontext gesprochen,
doch diese gibt es auch im positiven Kontext. Oft sind die fachlichen Anforderungen
anfangs noch unklar, ebenso wie die Code Architektur. In diesem Zustand bereits Tests
zu schreiben verlangsamt den Entwicklungsprozess extrem, größere Umbauten erfordern
auch größere Änderungen am Test-Code.&lt;/p&gt;

&lt;p&gt;Ich finde es völlig nachvollziehbar, dass man anfangs ohne Tests startet bis sich eine
Struktur herauskristallisiert hat die man verfolgen möchte. Spätestens wenn ein Stück
Software in den produktiven Betrieb geht müssen jedoch Tests existieren.&lt;/p&gt;

&lt;p&gt;Man braucht keine große Fantasie um sich vorzustellen, dass hier gern eine Abkürzung
genommen wird.&lt;/p&gt;

&lt;p&gt;Der Code wird schlecht oder gar nicht automatisiert getestet in Produktion abgeliefert.&lt;/p&gt;

&lt;h2 id=&quot;test-driven-development&quot;&gt;Test Driven Development&lt;/h2&gt;

&lt;p&gt;Es gibt eine Bewegung, die diesem Problem durch eine radikale Lösung entgegen tritt.
Test Driven Development beschreibt den Ansatz zuerst einen Test zu schreiben der die
fachliche Spezifikation in Test-Code gießt und erst danach die Spezifikation als
funktionalen Code zu implementieren.&lt;/p&gt;

&lt;p&gt;Durch dieses Vorgehen werden mehrere Fliegen mit einer Klappe geschlagen:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tests existieren von Anfang an und können am Ende nicht einfach weggelassen werden&lt;/li&gt;
  &lt;li&gt;Dadurch, dass zum Zeitpunkt des Test schreibens der funktionale Code noch nicht
existiert reduziert sich das Risiko Details der technischen Implementierung im
Test-Code abzuprüfen. Stattdessen beschränkt man sich auf die fachliche Anforderung
was die Test-Cases klarer zu lesen und robuster gegen Veränderung macht&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das klingt doch alles toll, warum wird es nicht mehr gemacht. Meine persönliche
Erfahrung mit Test Driven Development war folgende:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Befinde ich mich noch in der “Selbstfindungsphase” der Software, wo die Funktionalität
und Architektur noch unklar ist verlangsamt das Schreiben der Tests die Entwicklung
extrem und bringt wenig Mehrwert&lt;/li&gt;
  &lt;li&gt;Sobald die Architektur und Funktionalität klar ist bringt Test Driven Development
einen großen Vorteil und deckt oft auch Fehler links und rechts des eigentlich
neuen Codes auf&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;test-coverage&quot;&gt;Test Coverage&lt;/h2&gt;

&lt;p&gt;Ein vieldiskutiertes Thema ist das Thema Test Coverage. In jedem Projekt werden ein
paar Stunden mit der Diskussion verschwendet welche Art von Test-Coverage Metrik man denn
nun meine. Wenn ich von Test-Coverage spreche geht es immer um Line-Coverage.&lt;/p&gt;

&lt;p&gt;Ich möchte wissen ob all der Code den ich geschrieben habe mindestens von einem Test
durchlaufen wird.&lt;/p&gt;

&lt;p&gt;Wichtig zu verstehen ist, dass die Test Coverage keinerlei Aussage über die Qualität
von Tests geben kann und auch kein Maß für Vollständigkeit ist.&lt;/p&gt;

&lt;p&gt;Auf Grund einer schnell quasi unendlich großen Möglichkeit an Kombinationen durch
verschiedene Eingabewerte und Infrastruktur-Abhängigkeiten ist es nicht möglich Code
vollständig zu testen.&lt;/p&gt;

&lt;p&gt;Die Test-Coverage beschreibt jedoch eine andere Metrik. Es ist eine Mindestanforderung.&lt;/p&gt;

&lt;p&gt;Nun kann man sich überlegen: Wieviel Prozent des Codes der geschrieben wurde soll von
einem Test durchlaufen werden (durchlaufen! nicht unbedingt getestet). Die Antwort ist
klar: 100%. Jeder Code der geschrieben wurde sollte mindestens 1 mal während dem
Abfahren der Tests “besucht” werden.&lt;/p&gt;

&lt;p&gt;100% Testabdeckung klingt gigantisch und so als ob man etwas großes erreicht hätte.
In Wahrheit ist es eine Mindestanforderung.&lt;/p&gt;

&lt;p&gt;Warum haben dann viele Teams die Tools zur automatischen Code Analyse verwenden
wie Sonar ein Coverage Target von 85% oder 90%?&lt;/p&gt;

&lt;p&gt;Dies liegt vorwiegend am nächsten Punkt.&lt;/p&gt;

&lt;h2 id=&quot;infrastruktur-abhängigkeiten-sind-teuer-und-komplex-aber-notwendig&quot;&gt;Infrastruktur-Abhängigkeiten sind teuer und komplex (aber notwendig)&lt;/h2&gt;

&lt;p&gt;Man stelle sich vor einen Test für diese Funktion zu schreiben. Easy.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#088;font-weight:bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#088;font-weight:bold&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;int&lt;/span&gt; add(&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;int&lt;/span&gt; a, &lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;int&lt;/span&gt; b) {
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; a + b;
}
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Nun stelle man sich vor einen Test für die selbe Funktion zu schreiben, jedoch
kommen die Input Werte aus einer Kafka-Message und man möchte explizit den
Infrastruktur Teil der Software mit testen. Horror.&lt;/p&gt;

&lt;p&gt;Es gibt verschiedene Grade des Schmerzes. Man kann verschiedene Mock-Szenarien
erstellen, oder gleich einen oder mehrere Test-Container mit Kafka (+ Zookeeper)
hochfahren. Zu testen gilt auch was passiert in Fällen von fehlerhaften Messages,
etc. . Zwischen jedem Test muss evtl. der Kafka Container komplett abgerissen und
neu aufgesetzt werden.&lt;/p&gt;

&lt;p&gt;Die Tests werden langsam, ressourcen-intensiv und fehleranfällig.&lt;/p&gt;

&lt;p&gt;In der Realität ist man leider dazu gezwungen diese Tests trotzdem zu schreiben.
Viele Bugs hängen mit der Infrastruktur zusammen und gerade eine korrekte
Fehlerbehandlung ist extrem wichtig. Manche Funktionalität lässt sich nur extrem
schwer mocken, auch in diesen Fällen braucht man die originale Infrastruktur.
z.B. via Test-Containers.&lt;/p&gt;

&lt;h2 id=&quot;behavior-driven-development---bdd---die-fachliche-logik-als-first-class-citizen&quot;&gt;Behavior Driven Development - BDD - Die fachliche Logik als “First Class Citizen”&lt;/h2&gt;

&lt;p&gt;Eine andere interessante Bewegung die mein Verständnis von Testing komplett verändert
hat ist BDD (Behavior Driven Development).&lt;/p&gt;

&lt;p&gt;Bei BDD stehen die fachlichen Anforderungen im Vordergrund, die fachliche Beschreibung
wird ohne jeglichen Code erstellt und kann auch für sich selbst stehen.&lt;/p&gt;

&lt;p&gt;Automatisierte Tests testen dann die fachliche Beschreibung ab.&lt;/p&gt;

&lt;p&gt;Bekannt ist der für BDD typische Dreisatz GIVEN - WHEN - THEN.&lt;/p&gt;

&lt;p&gt;GIVEN beschreibt das Grundsetup was man benötigt um das Verhalten abzuprüfen.
WHEN -&amp;gt; THEN beschreibt das erwartete Verhalten.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt;
&lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt;
&lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt;
&lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt;
&lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt;
&lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt;
&lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt;
&lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt;
&lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#007&quot;&gt;@Test&lt;/span&gt;
&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;void&lt;/span&gt; SHOULD_increase_deposit_balance_WHEN_positive_amount_is_deposited() {
    &lt;span style=&quot;color:#777&quot;&gt;// Given: a bank account with an initial balance of $100&lt;/span&gt;
    BankAccount account = &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;new&lt;/span&gt; BankAccount(&lt;span style=&quot;color:#00D&quot;&gt;100&lt;/span&gt;);

    &lt;span style=&quot;color:#777&quot;&gt;// When: a deposit of $50 is made&lt;/span&gt;
    &lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;int&lt;/span&gt; depositAmount = &lt;span style=&quot;color:#00D&quot;&gt;50&lt;/span&gt;;
    account.deposit(depositAmount);

    &lt;span style=&quot;color:#777&quot;&gt;// Then: the balance should be increased by $50, resulting in $150&lt;/span&gt;
    assertEquals(&lt;span style=&quot;color:#00D&quot;&gt;150&lt;/span&gt;, account.getBalance());
}
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Schaut man sich jetzt alleine die Kommentare an ist dies eine für Business Analysten
verständliche Beschreibung des Testcases.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#777&quot;&gt;// Given: a bank account with an initial balance of $100&lt;/span&gt;
&lt;span style=&quot;color:#777&quot;&gt;// When: a deposit of $50 is made&lt;/span&gt;
&lt;span style=&quot;color:#777&quot;&gt;// Then: the balance should be increased by $50, resulting in $150&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Es gibt Tools with z.B. Fitnesse die diese Informationen in einer Wiki Form darstellbar
machen.&lt;/p&gt;

&lt;h2 id=&quot;naming-der-tests&quot;&gt;Naming der Tests&lt;/h2&gt;

&lt;p&gt;Hier gibt es viele Konventionen, mir persönlich ist nur wichtig, dass man eine Idee
davon bekommt was im Test passiert, ich habe mich für die &lt;code&gt;Should ... When&lt;/code&gt; Konvention
entschieden.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt;
&lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt;
&lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt;
&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;shouldThrowExceptionWhenInputIsNull()
shouldReturnDefaultValueWhenSettingIsMissing()
shouldSendEmailNotificationToAllUsersWhenSystemReachesThresholdLimit()
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;h2 id=&quot;meine-persönlicher-testing-workflow-und-bewusste-trade-offs-die-ich-eingehe&quot;&gt;Meine persönlicher Testing Workflow und bewusste Trade-Offs die ich eingehe&lt;/h2&gt;

&lt;h3 id=&quot;wenig-tooling&quot;&gt;Wenig Tooling&lt;/h3&gt;

&lt;p&gt;Als ich angefangen habe mich mit Testing zu beschäftigen wollte ich alles richtig machen,
BDD Frameworks, Cucumber, etc. . Hat man hier keine Routine hält man sich stark auf,
neue Frameworks oder Techniken in existierende Codebases oder Teams einzuführen ist
ein langwieriger Prozess.&lt;/p&gt;

&lt;p&gt;Ich bin dazu übergegangen kein oder wenig existierendes Tooling zu verwenden. Die
wichtigsten Themen wie BDD, Test-Naming und Coverage Metriken kann man einfach im
Code durch Kommentare und Funktionen der IDE (Coverage) abdecken.&lt;/p&gt;

&lt;h3 id=&quot;mit-gutem-beispiel-voran-gehen&quot;&gt;Mit gutem Beispiel voran gehen&lt;/h3&gt;

&lt;p&gt;Eigentlich alle Entwickler:innen mit denen ich gesprochen habe wollen Tests schreiben.
Oft sind es die äußeren Umstände die dies verhindern und fehlende Praxis.&lt;/p&gt;

&lt;p&gt;Hier kann man einfach mit gutem Beispiel voran gehen und selbst nach bestem Wissen
und Gewissen gute Arbeit abliefern. So gibt es in der Codebase immer mehr Beispiele
die es anderen leichter machen sich daran zu orientieren und dann ebenfalls Tests
zu schreiben.&lt;/p&gt;

&lt;p&gt;Wenn man dann noch diese Arbeit gelegentlich vorstellt, Pair-Programmings macht und
das Team-Management dabei unterstützt Tests nicht als separaten Teil eines Features
(Feature + Test), sondern als Teil des Features zu kommunizieren, dann ist bereits
viel gewonnen.&lt;/p&gt;

&lt;p&gt;So wie die Maurer:in nicht eine Mauer baut die umfallen kann und danach schaut ob
sie gerade ist und steht. Genauso bauen wir keine Software und schauen danach ob sie
funktioniert. Tests sind unvermeidlicher Teil der Entwicklung und die Konsequenz sie
nicht zu haben ist fehlerhafter und unwartbarer Code.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/maurerin.png&quot; alt=&quot;Image&quot; width=&quot;250px&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;100-testabdeckung--im-business-code&quot;&gt;100% Testabdeckung … im Business Code&lt;/h3&gt;

&lt;p&gt;Ich versuche eine Testabdeckung von 100% im Business Teil der Software zu erreichen.
Wenn dieser sauber geschnitten ist hat er keine Abhängigkeiten zu Infrastrukturkomponenten,
und entsprechend ist es einfach und sogar erforderlich hier 100% zu erreichen um
die fachlichen Anforderungen zu erfüllen.&lt;/p&gt;

&lt;p&gt;Im Anschluss versuche ich 100% Testabdeckung im Infrastruktur “Glue-Code” zu erreichen.
Komme ich an Punkte die einen großen Arbeitsaufwand bedeuten überspringe ich diese
Parts und verschiebe sie auf später.&lt;/p&gt;

&lt;p&gt;Solche größeren Blöcke können dann vernünftig in der Zeitplanung eingeplant werden.&lt;/p&gt;

&lt;p&gt;Durch diesen gemischten Ansatz erreicht man ein sehr großes Vertrauen in die
Codebase der Business-Logik, bei gleichzeitig überschaubarem Zeitaufwand.&lt;/p&gt;

&lt;p&gt;Angenehmer Nebeneffekt: Man wird nicht frustriert durch kompliziertes Test-Setup
der Infrastruktur-Tests.&lt;/p&gt;

&lt;h3 id=&quot;bug-test-driven-development&quot;&gt;Bug Test Driven Development&lt;/h3&gt;

&lt;p&gt;Während es schwierig ist von Anfang an Test-Driven zu arbeiten habe ich mir angewöhnt
ausnahmslos bei Bugs test-driven zu arbeiten.&lt;/p&gt;

&lt;p&gt;Einen Bug muss man sowieso reproduzieren. Erst reproduziere ich ihn aus User-Sicht.
Dann reproduziere ich ihn aus Code-Sicht via das Schreiben eines Tests.&lt;/p&gt;

&lt;p&gt;Dabei lerne ich bereits sehr viel über den internen Aufbau des Codes, sprich 80%
der Zeit hätte ich sowieso reinstecken müssen um mir den Code anzusehen um den Bug
zu fixen.&lt;/p&gt;

&lt;p&gt;Der Bugfix selbst ist dann oft relativ schnell erledigt. Der Vorteil: ab jetzt kann
dieser Bug nie wieder unbemerkt auftreten. Ein weiterer Vorteil: langsam aber stetig
steigt die Test-Coverage in der gesamten Codebase.&lt;/p&gt;

&lt;h3 id=&quot;todo-liste-von-offenen-themen&quot;&gt;Todo-Liste von offenen Themen&lt;/h3&gt;

&lt;p&gt;Ich führe eine kurze Todoliste von Themen die aktuell noch nicht angegangen werden können
aber wichtig sind und versuche regelmäßig Punkte davon abzuarbeiten.
z.B.:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Kafka Integrationtest mit Test Containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;konsequentes-bdd-und-benennung-von-tests&quot;&gt;Konsequentes BDD und Benennung von Tests&lt;/h3&gt;

&lt;p&gt;Ich versuche, wo möglich, High-Level Tests aus Business Perspektive zu schreiben.
Das heißt die Tests sollten auf Business-Service Ebene Business Cases abfragen
und nicht nur auf technische Ebene die Funktionalität einzelner Funktionen.&lt;/p&gt;

&lt;p&gt;Das hat den Vorteil, dass diese Tests die Anforderungen des Fachbereichs sicherstellen
und auch nach starken Refactorings noch weiter funktionieren ohne umgebaut werden
zu müssen.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Architektur, Entwicklung und Deployment einer IoT Cloud-Infrastruktur</title>
    <link href="https://it-consulting-hahn.de/referenz-iot-cloud/" rel="alternate" type="text/html"/>
    <id>https://it-consulting-hahn.de/referenz-iot-cloud/</id>
    <published>2023-09-01T00:00:00+02:00</published>
    <updated>2023-09-01T00:00:00+02:00</updated>
    <category term="Referenzen"/>
    <summary type="html">Für einen Kunden, der Optimierungs-Dienstleistungen für Windparks anbietet, entwarf ich eine maßgeschneiderte IoT-Cloudlösung. Dabei entwickelte ich alle Cloud-Komponenten, von der Auswahl der Hardware der Edge-Geräte über die sichere Übertragung der Daten in die Cloud bis zur Anreicherung und Verarbeitung der Rohdaten im Cloud-Produkt.</summary>
    <content type="html">&lt;p&gt;Für einen Kunden, der Optimierungs-Dienstleistungen für Windparks anbietet, entwarf ich eine
maßgeschneiderte IoT-Cloudlösung. Dabei entwickelte ich alle Cloud-Komponenten, von der Auswahl der
Hardware der Edge-Geräte über die sichere Übertragung der Daten in die Cloud bis zur
Anreicherung und Verarbeitung der Rohdaten im Cloud-Produkt.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;/assets/windpark.jpg&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;übersicht-über-das-projekt&quot;&gt;Übersicht über das Projekt&lt;/h3&gt;

&lt;p&gt;In mehreren Terminen erarbeitete ich mit dem Kunden sowie externen Dienstleistungsfirmen des Kunden
die Kernanforderungen der Lösung:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Auslesen der Rohdaten aus den Endsystemen (Windkraftanlagen, Externe Sensor-Arrays)&lt;/li&gt;
  &lt;li&gt;Einfache Wartung und Update der Agent-Software&lt;/li&gt;
  &lt;li&gt;Sichere Datenübertragung in die Cloud&lt;/li&gt;
  &lt;li&gt;Prüfen und Sicherstellen der Datenintegrität mit Option fehlerhafte Daten zu reprozessieren&lt;/li&gt;
  &lt;li&gt;Anreicherung der Rohdaten mit zusätzlichen Datenquellen&lt;/li&gt;
  &lt;li&gt;Ansteuerung der Windkraftanlagen mit optimierten Leistungsparametern&lt;/li&gt;
  &lt;li&gt;Skalierbar von PoC auf beliebig viele Windparks in Deutschland&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;meine-leistungen&quot;&gt;Meine Leistungen&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Klärung der Anforderung und der Definition des Umfangs des Proof-of-Concept (PoC)&lt;/li&gt;
  &lt;li&gt;Auswahl und Zusammenbau der Hardware-Komponenten&lt;/li&gt;
  &lt;li&gt;Cloud Architektur und Dokumentation der einzelnen Komponenten&lt;/li&gt;
  &lt;li&gt;Entwicklung der einzelnen Cloud-Komponenten (Python Microservices)&lt;/li&gt;
  &lt;li&gt;Setup der Infrastruktur-Komponenten (VPN, MQTT, Kafka, Kubernetes, Terraform)&lt;/li&gt;
  &lt;li&gt;Schulung der Angestellten des Kunden&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;features&quot;&gt;Features&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Echtzeit-Datenverarbeitung:&lt;/strong&gt; Mit Kafka’s Stream-Processing-Fähigkeiten werden Daten von den Sensoren der Windkraftanlagen in Echtzeit erfasst und verarbeitet.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Skalierbarkeit:&lt;/strong&gt; Die Architektur ermöglicht es, problemlos von einem einzigen Windrad bis zu einem ganzen Windpark mit Hunderten von Turbinen zu skalieren, ohne Leistungseinbußen.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Fehlererkennung:&lt;/strong&gt; Automatische Erkennung von Anomalien in den Eingangsdaten.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Optimierte Energieerzeugung:&lt;/strong&gt; Die Datenanalyse ermöglicht die Optimierung des Betriebs, um die Stromerzeugung zu maximieren.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Sicherheit:&lt;/strong&gt; Erweiterte Sicherheitsprotokolle sorgen für den Schutz der Datenübertragung und Speicherung.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Integration mit anderen Systemen:&lt;/strong&gt; Die IoT-Cloud kann einfach mit anderen Systemen, Wettervorhersage-Tools und Energiemanagement-Plattformen integriert werden.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dank dieser Features ermöglicht die IoT-Cloud für Windparks eine robuste und zuverlässige Überwachung, Verwaltung
und Optimierung von Windenergieanlagen. Es handelt sich um ein unverzichtbares Tool für moderne Windparkbetreiber,
die Technologie nutzen möchten, um die Effizienz und Produktivität ihrer Anlagen zu steigern.&lt;/p&gt;

&lt;h3 id=&quot;technologien&quot;&gt;Technologien&lt;/h3&gt;

&lt;p&gt;Django, Pandas, Terraform, Ansible, Docker, Hetzner Cloud&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Echtzeit Datenbank für Business Intelligence</title>
    <link href="https://it-consulting-hahn.de/referenz-data-analytics-platform/" rel="alternate" type="text/html"/>
    <id>https://it-consulting-hahn.de/referenz-data-analytics-platform/</id>
    <published>2023-08-30T00:00:00+02:00</published>
    <updated>2023-08-30T00:00:00+02:00</updated>
    <category term="Referenzen"/>
    <summary type="html">Der Kunde - einer der größten Digital Publisher in Deutschland - betreibt seit vielen Jahren eine Echtzeit-Datenbank in welcher eine Vielzahl an Geschäftskennzahlen und Statistiken, wie zum Beispiel das Echtzeit-Tracking der aufgerufenen Artikel und Seiten gespeichert werden. Im Lauf der Zeit wurde die Datenbank langsamer und die Anzahl der Ausfälle häufte sich. Monitoring war nur rudimentär über das System der Hersteller-Firma vorhanden. Ich habe eine individuelle Monitoring-Lösung für den Kunden entwickelt und konsequent alle auftretenden Probleme behandelt. Durch die Schulung der Angestellten des Unternehmens konnte die Lösung erfolgreich dauerhaft etabliert werden.</summary>
    <content type="html">&lt;p&gt;Der Kunde - einer der größten Digital Publisher in Deutschland - betreibt seit vielen Jahren eine
Echtzeit-Datenbank in welcher eine Vielzahl an Geschäftskennzahlen und Statistiken, wie zum Beispiel
das Echtzeit-Tracking der aufgerufenen Artikel und Seiten gespeichert werden. Im Lauf der Zeit wurde
die Datenbank langsamer und die Anzahl der Ausfälle häufte sich. Monitoring war nur rudimentär über
das System der Hersteller-Firma vorhanden. Ich habe eine individuelle Monitoring-Lösung für den
Kunden entwickelt und konsequent alle auftretenden Probleme behandelt. Durch die Schulung der Angestellten
des Unternehmens konnte die Lösung erfolgreich dauerhaft etabliert werden.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;/assets/news.jpg&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;übersicht-über-das-projekt&quot;&gt;Übersicht über das Projekt&lt;/h3&gt;

&lt;p&gt;Der Kunde betreibt einen Druid Cluster mit 40 Nodes, 26 TB an Daten, 500 Reports und 150 Dashboards. Immer wieder
treten den Produktionsbetrieb gefährdende Ausfälle auf. Teils melden die Nutzenden der Dashboards lange Ladezeiten
und abbrechende Queries.&lt;/p&gt;

&lt;p&gt;Der Hersteller der Datenbank bietet ein rudimentäres Monitoring an, was detailliert Daten erfasst, jedoch nicht
an das Monitoring und Alerting des Kunden angebunden ist.&lt;/p&gt;

&lt;h3 id=&quot;meine-leistungen&quot;&gt;Meine Leistungen&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Entwicklung eines Prometheus Monitoring Exporters
    &lt;ul&gt;
      &lt;li&gt;Hauptaufgabe war Design und die Entwicklung eines Prometheus Exporters, welcher speziell die für
die Kundenumgebung relevanten Metriken via Druid-REST-Api ausliest und Prometheus zur Verfügung stellt&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Entwicklung von Grafana Dashboards und Alerts
    &lt;ul&gt;
      &lt;li&gt;Die Erstellung speziell angepasster Grafana-Dashboards und Feintuning der Alerts war eine weitere wichtige
Aufgabe&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Apache Druid – Operations (Erweiterung des Clusters, Debugging von Fehlern, Housekeeping/Maintenance)
    &lt;ul&gt;
      &lt;li&gt;Übernahme von Betriebsaufgaben für den Cluster, von der Erweiterung über die Fehleranalyse bis zur Wartung&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Entwicklung von Imply Druid Ingestions und Pivot Dashboards
    &lt;ul&gt;
      &lt;li&gt;Umsetzung von Druid Ingestions und Pivot Dashboards, die zugleich ein tieferes Verständnis der fachlichen
Besonderheiten für das Monitoring lieferten&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Schulung der Angestellten
    &lt;ul&gt;
      &lt;li&gt;Um Monitoring Systeme effektiv zu nutzen ist es essentiell, dass alle Angestellten das System kennen und
Alarme so schnell wie möglich behandeln. Durch wiederholte Schulungen habe ich sichergestellt, dass der
maximale Nutzen aus dem System gezogen werden konnte.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;verbesserungen&quot;&gt;Verbesserungen&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Reduktion der Ausfälle:&lt;/strong&gt; Die Ausfälle konnten annähernd auf 0 reduziert werden. Bei vereinzelt auftretenden Beeinträchtigungen
der Leistung konnte dank dem Monitoring System schnell die Ursache ausfindig gemacht werden.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Right-Sizing:&lt;/strong&gt; Durch die erhobenen Metriken konnte die Ressourcen-Nutzung der Plattform auf den optimalen Wert
angepasst werden.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Klare Kommunikation:&lt;/strong&gt; Durch speziell eingerichtete Kommunikationskanäle werden die End-Anwendenden zeitnah
über Wartungsmaßnahmen und Ausfälle informiert.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;technologien&quot;&gt;Technologien&lt;/h3&gt;

&lt;p&gt;Imply Druid, Apache Kafka, Java, Gradle, Spring Boot, Kubernetes, Imply Pivot, Grafana, Prometheus&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Data Services Real-Time Stream Processing (Apache Kafka)</title>
    <link href="https://it-consulting-hahn.de/referenz-stream-processing/" rel="alternate" type="text/html"/>
    <id>https://it-consulting-hahn.de/referenz-stream-processing/</id>
    <published>2023-08-29T00:00:00+02:00</published>
    <updated>2023-08-29T00:00:00+02:00</updated>
    <category term="Referenzen"/>
    <summary type="html">Der Kunde betreibt eine Real-Time Streaming Plattform basierend auf Apache Kafka, um die Eingangs-Daten in Echtzeit mit zusätzlichen Informationen anzureichern. Bei mehreren laufenden Stream Prozessoren gab es Probleme mit der Qualität der Daten der Drittanbieter. Ich analysierte und überarbeitete die existierenden Prozessoren und entwickelte neue Prozessoren.</summary>
    <content type="html">&lt;p&gt;Der Kunde betreibt eine Real-Time Streaming Plattform basierend auf Apache Kafka, um die Eingangs-Daten
in Echtzeit mit zusätzlichen Informationen anzureichern. Bei mehreren laufenden Stream Prozessoren gab es
Probleme mit der Qualität der Daten der Drittanbieter. Ich analysierte und überarbeitete die existierenden Prozessoren und
entwickelte neue Prozessoren.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;/assets/pipes.jpg&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;übersicht-über-das-projekt&quot;&gt;Übersicht über das Projekt&lt;/h3&gt;

&lt;p&gt;Der Kunde betreibt mehrere auf Java, Spring Boot und Kafka Streams basierende Stream Prozessoren. Einige
lieferten von der Quelle abweichende Daten, andere mussten um neue Features erweitert werden.&lt;/p&gt;

&lt;h3 id=&quot;meine-leistungen&quot;&gt;Meine Leistungen&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Entwicklung und Erweiterung von API Crawlern basierend auf Spring Boot und Kafka (Google, Facebook, IVW)
    &lt;ul&gt;
      &lt;li&gt;Debugging der Abweichung zwischen Quelle und Daten in den Kunden-Systemen&lt;/li&gt;
      &lt;li&gt;Anpassung/Erstellung von Crawlern/neuen Features nach den Kundenanforderungen&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Echtzeit-Stream-Verarbeitung und -Transformation mit Kafka-Streams&lt;/li&gt;
  &lt;li&gt;Erstellen und Aktualisierung der Dokumentation, Hinzufügen von Tests
    &lt;ul&gt;
      &lt;li&gt;Die existierenden Crawler und Stream Prozessoren waren nur rudimentär oder gar nicht dokumentiert.
Ich erstellte oder erweiterte die Dokumentation, sodass die Angestellten des Kunden jederzeit in
der Lage sind selbstständig Änderungen an den Projekten vorzunehmen.&lt;/li&gt;
      &lt;li&gt;Ebenso erweiterte ich die Test-Cases der Projekte um eine robustere Entwicklung zu ermöglichen.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;verbesserungen&quot;&gt;Verbesserungen&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wiederherstellung der Datenintegrität:&lt;/strong&gt; Die Ursache für die Unterschiede zwischen Quelle und
Kundensystemen konnte ausfindig gemacht und behoben werden.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Einbau lang benötigter Features:&lt;/strong&gt; Durch Protokoll-Erweiterungen standen zusätzliche Informationen
zur Verfügung, welche ich nutzbar gemacht habe.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Umfassende Dokumentation:&lt;/strong&gt; Durch die umfassende neu erstellte und ergänzte Dokumentation ist sichergestellt,
dass die Services auch in Zukunft wartbar bleiben.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;technologien&quot;&gt;Technologien&lt;/h3&gt;

&lt;p&gt;Apache Kafka, Java, Gradle, Spring Boot, Kubernetes, Imply Druid, Imply Pivot, Grafana, Prometheus&lt;/p&gt;
</content>
  </entry>
</feed>
