Folge 21

Der Preis der Geschwindigkeit

"Das Rennen läuft. Bremsen sind optional."
10 Min. Lesezeit
Woche vom 22. - 26. Juni 2026

Mit dem Start von Q3 steigt der Druck auf das Team, das Turniersystem zu liefern. Anton drückt auf eine schnelle, unsaubere Umsetzung der Matchmaking-UI und behauptet, TDD bremse nur. Mariana hält dagegen. Als in der neuen Staging-Umgebung ein kritischer Bug hochgeht, wird klar: Wer Tests überspringt, spart keine Zeit, sondern verschiebt sie als teure Schuld in die Zukunft.

Zuvor: „Die Q3-Planungskrise“ — Lukas forderte ambitionierte Q3-Ziele, ohne die Infrastruktur-Lücken zu schließen, die beim Sommer-Event fast zum Kollaps geführt hätten. Katja und Stefan zwangen die Konfrontation mit Latenzdaten und Abhängigkeitsgraphen. Der Vorstand gab sechs Wochen „Operational Realism Initiative“ frei. Ein kurzer Vorsprung. Nicht mehr.

Montag, 09:30 — Der Druck der Uhr

Anton Petrov tippt hektisch an zwei Monitoren, während Mariana Santos mit verschränkten Armen zusieht und Stefan Richter mit einem Kaffeebecher danebensteht.

Antons Finger hämmerten über die mechanische Tastatur, das laute Klack-klack-klack der blauen Switches wie ein kleines Maschinengewehr auf der ruhigen Montagmorgenfläche.

„Ich brauche dafür keinen Test, Mariana“, sagte Anton, ohne aufzusehen. „Das ist ein UI-Controller. Button-Klick rein, State-Machine auf ‚Searching‘, Matchmaking-API triggern. Dreißig Zeilen. Fünf Minuten.“

„Und woher weißt du, dass die State Machine sauber wechselt, wenn die API langsam ist?“, fragte Mariana mit flacher Stimme. „Oder wenn ein Spieler zweimal klickt?“

„Weil ich den Button beim Klick deaktiviere“, sagte Anton und schob die Brille hoch. „matchmakingButton.interactable = false; in Zeile zwölf. Doppelklick ist unmöglich.“

„Und wenn der API-Call fehlschlägt und der Button für immer aus bleibt?“, fragte Stefan und nahm einen Schluck Kaffee. „Dann hängt der Spieler in einem toten UI-Zustand und kann nur noch force-quitten.“

Anton stöhnte. „Ihr seid ein Tag-Team des Untergangs. Es ist Montagmorgen. Lukas will bis zum Mittwochssync einen funktionierenden Prototyp der Turnier-Lobby sehen. Wenn ich heute Unit-Tests für Unity-UI schreibe – was wegen Lifecycle ohnehin nervt –, habe ich ihm nichts zu zeigen.“

„Lukas will sichtbaren Fortschritt“, sagte Mariana. „Aber Fortschritt auf Annahmen ist nur ein Kredit, den wir nächste Woche mit Zinsen zurückzahlen. Wir haben Q2 damit verbracht, deine Kredite zu bedienen, Anton.“

„Das war Backend“, konterte Anton und drehte sich wieder zur Tastatur. „UI ist anders. Das ist visuell. Wenn es richtig aussieht, ist es zu 90 Prozent richtig. Ich schreibe die Tests später. Versprochen. Erst mal den Flow zum Laufen bringen.“

Stefan sah zu, wie Anton wieder tippte. Die klassische Falle: das Gefühl von Geschwindigkeit. Ohne Tests fühlt sich Entwicklung produktiv an. Zeilen wachsen schnell. Übergänge sehen lokal weich aus.

Nur war die Reibung nicht weg. Sie war nur vertagt. Und sie wartete in der neuen Staging-Umgebung, wo das Netzwerk nicht lokal war, die Datenbank nicht leer und die Latenz nicht null.

„Sechs Wochen Vernunft“, murmelte Mariana zu Stefan, als sie zurück zu den Backend-Schreibtischen gingen. „Und Anton versucht sie am ersten Tag auf Abkürzungen zu setzen.“

„Er steht unter Druck“, sagte Stefan. „Und fairerweise: Unit-Tests für Unity-UI-Controller sind wirklich nervig. Aber er lernt. Manche Lektionen versteht man nicht am Whiteboard. Man muss sie fühlen.“

Dienstag, 14:15 — Der Staging-Paritätstest

Hassan Al-Rashid zeigt auf Staging-Deploy-Logs, während Anton angespannt danebensteht und Mariana und Sofia aus kurzer Distanz zusehen.

„Staging-Deployment fertig“, sagte Hassan, lehnte sich zurück und rieb sich die Augen. „Multi-Region-Replicas laufen in EU-West, US-East und AP-East. Staging spiegelt jetzt das Produktions-Scaling. Anton, deploy deine UI.“

Anton grinste. „Aufgepasst, Backend-Team. Die Turnier-Lobby geht auf Staging live.“

Er startete das Deployment-Script. Auf dem zweiten Monitor kompilierte der Unity-Editor den Build und schob ihn auf den Staging-Server. Zwei Minuten später erschien die Lobby auf seinem Testgerät.

„Lobby offen“, sagte Anton. „Ich gehe in die Queue. Sofia, du als Nächste.“

Sofia tippte. „Drin.“

„Und Mariana.“

„Drin“, sagte sie, den Blick auf ihr Tablet fixiert.

Ein paar Sekunden liefen die Spinner synchron. Dann blinkte Antons Bildschirm rot. Pop-up: Matchmaking failed. Connection lost.

„Was?“ Anton runzelte die Stirn. „Das darf nicht passieren. Die API läuft.“

„Ich bin noch in der Queue“, sagte Sofia und hielt ihr Gerät hoch.

„Ich bin raus“, sagte Mariana. „Meine App ist gerade abgestürzt.“

Hassan zog die Staging-Logs auf den Hauptmonitor. „Wir sehen eine Flut von Datenbank-Exceptions aus dem Matchmaking-Service. Transaction aborted due to concurrent update.

„Replikationsverzug“, sagte Sofia und öffnete die DB-Metriken. „EU-West hat Antons Join registriert, aber bevor der State nach US-East repliziert war, kam Marianas Anfrage rein. State Machine desynct.“

„Aber ich habe den Button deaktiviert!“, sagte Anton, jetzt laut. „UI-State war ‚Searching‘. Wie soll das desyncen?“

„Weil dein UI-Controller Netzwerklatenz nicht behandelt“, sagte Mariana und drehte ihm ihr Tablet zu. „Lokal hast du 5 ms. Staging hat 120 ms zwischen Regionen. Deine UI hat angenommen, der Übergang ist sofort. Request raus, Button-Disable aber asynchron. In dem 120-ms-Fenster konnte man tatsächlich zweimal tippen. Und genau das ist passiert.“

Anton starrte auf den roten Fehlerdialog, als hätte ihn jemand persönlich beleidigt.

„Ich habe Staging gebaut, um genau diese Lücken zu zeigen“, sagte Hassan ruhig. „Lokal hat dein Rechner dich belogen. Jetzt siehst du die Wahrheit.“

Anton sah zu Stefan.

„Nicht zu mir schauen“, sagte Stefan mit kleinem Lächeln. „Ich bin nur der Anwalt. Die Daten sprechen.“

Mittwoch, 11:00 — Die Debugging-Schleife

Anton starrt auf wiederholte Debug-Ausgaben, während Mariana auf eine Codezeile zeigt und Stefan hinter ihnen beobachtet.

Bis Mittwochmorgen steckte Anton fast zwanzig Stunden in derselben Schleife: ändern, kompilieren, nach Staging deployen, mit drei Geräten manuell testen, scheitern sehen, mehr Print-Statements setzen, wiederholen.

Auf seinem Tisch standen leere Club-Mate-Flaschen und zerknüllte Notizzettel.

„Ich verstehe es nicht“, murmelte Anton in Richtung Terminal. „Ich habe Debounce eingebaut. Netzwerk-State-Check eingebaut. Sogar try-catch um den kompletten Übergang gelegt. Es crasht trotzdem in 30 Prozent der Läufe mit drei Regionen.“

„Weil du einen Race Condition durch Raten reparierst“, sagte Mariana sanft und zog ihren Stuhl näher. „Du behandelst Symptome. Pflaster auf UI. Nicht die Logik der State Machine.“

„Die State Machine ist okay!“, sagte Anton. „Es ist nur Timing.“

„Eine State Machine, die am Timing zerbricht, ist nicht okay“, sagte Stefan von der Trennwand. „Sie ist fragil. Robust wird sie nur, wenn du Timing von Logik trennst.“

Anton ließ sich in den Stuhl fallen. „Wie? Ich kann Multi-Region-Replikationsverzug nicht in einem Unit-Test simulieren.“

„Musst du nicht“, sagte Mariana. „Du mockst die Netzwerk-Schnittstelle. Du injizierst eine verzögerte Antwort und prüfst, was passiert, wenn ein zweiter Request reinkommt, bevor der erste fertig ist.“

Sie tippte auf seine Tastatur. „Wir schreiben einen Characterization-Test. Einen einzigen. Wir beschreiben den Fehler.“

Anton sah erst auf die Tastatur, dann zu Mariana. Er war müde. Die manuelle Testschleife fraß ihn auf, und bis zum Sync mit Lukas waren es noch drei Stunden.

„Okay“, sagte er schließlich. „Zeig’s mir.“

Mariana lächelte, ohne Triumph. Sie öffnete die IDE, legte eine neue Testdatei an und begann zu tippen.

„Erst definieren wir das gewünschte Verhalten“, sagte sie. „Wenn ein Request in Flight ist, ignoriert der Matchmaking-Controller weitere Join-Requests. Egal, ob der Button gerade klickbar ist oder nicht.“

Sie schrieb den Testnamen: Should_Ignore_Join_Request_When_Request_Is_In_Flight.

„Jetzt“, sagte sie und schob ihm die Tastatur hin, „das Setup. Netzwerk-Service so mocken, dass der Task erst nach 500 Millisekunden fertig ist. JoinMatchmaking zweimal schnell hintereinander aufrufen. Dann asserten, dass der Netzwerk-Service genau einmal aufgerufen wurde.“

Anton nahm die Tastatur. Erst langsam, dann wieder mit Rhythmus. Das Klackern wurde gleichmäßiger, weniger panisch.

Zum ersten Mal in dieser Woche schrieb er Code nicht, um ein Feature zu zeigen. Er schrieb Code, um eine Frage zu beantworten.

Donnerstag, 15:30 — Der Durchbruch

Anton zeigt mit breitem Grinsen auf einen Bildschirm mit grünen Test-Häkchen, während Mariana neben ihm lächelt und Stefan zustimmend nickt.

„Er ist grün“, flüsterte Anton.

Er sah auf den grünen Haken, als wäre er ein Wunder.

„Natürlich ist er grün“, sagte Mariana und lachte. „Wir haben den Bug behoben.“

Sobald der Test stand, dauerte es genau zehn Minuten, die Race Condition zu finden. Beim ersten Lauf schlug der Test sofort fehl und zeigte, dass die State Machine auf „Searching“ sprang, bevor bestätigt war, dass der Server den Request akzeptiert hatte.

Sie entkoppelten UI-State und Netzwerk-State, zogen die Übergangslogik sauber und synchron auf, und die Race Condition war weg.

„Ich habe zwei Tage manuell daran herumgetestet“, sagte Anton und schüttelte den Kopf. „Zwei Tage kompilieren, deployen, drei Tablets gleichzeitig antippen wie ein Irrer. Und der Test mit dreißig Zeilen hat’s in zehn Minuten gezeigt.“

„Das ist der Preis der Geschwindigkeit“, sagte Stefan. „Wenn du den Test überspringst, um Zeit zu sparen, leihst du Stunden von deinem Zukunfts-Ich zu 500 Prozent Zinsen. Montag fühlst du dich schnell, Mittwoch bist du insolvent.“

Anton starrte wieder auf den grünen Haken. „Es ist … tatsächlich befriedigend. Wenn nächsten Monat jemand die Button-Logik ändert, fängt der Test das sofort ab. Ich muss nicht hoffen, dass es still kaputtgeht.“

„Das ist der eigentliche Wert von TDD“, sagte Mariana und klappte den Laptop zu. „Nicht Reinheit. Nicht Religion. Es ist Ruhe im Kopf. Du weißt, dass der Code korrekt ist, weil du einen belastbaren Zeugen hast.“

Anton drehte sich zu Stefan. „Okay, Anwalt. Du gewinnst. Es ist keine Theologie. Es ist einfach … sehr gute Entwicklung.“

„Nehme ich“, sagte Stefan und lächelte. „Aber bedank dich bei Mariana. Sie hat sich mit dir hingesetzt.“

Anton sah zu Mariana. „Danke. Und … sorry für die Theologie-Sprüche.“

„Schon gut“, sagte Mariana auf dem Weg zurück zu ihrem Platz. „Schreib nur die Tests für die Turnier-Lobby vor dem Demo morgen. Lukas rechnet damit.“

„Bin schon dran“, sagte Anton. Und diesmal klang das Klackern seiner Tastatur nicht nach Flucht, sondern nach Richtung.

Freitag, 16:45 — Die Lehre der Schleife

Lukas und Katja prüfen auf einem Tablet eine stabile Turnier-Lobby-Demo, während Stefan am Fenster des Konferenzraums in die Berliner Abendstimmung schaut.

Lukas tippte auf das Tablet und sah zu, wie die Queue sauber lief, wechselte und schließlich in ein simuliertes Multi-Region-Match verband.

„Stabil“, sagte Lukas, hörbar überrascht. „Heute Nachmittag fünfzig simulierte Matches über drei Regionen. Kein einziger Datenbank-Crash, kein UI-Freeze. Wie habt ihr das Replikationsproblem so schnell gelöst?“

„Wir haben den Replikationsverzug nicht gelöst“, sagte Katja und lehnte sich zurück. „Replikationsverzug ist Physik in globalen Netzen. Den beseitigst du nicht. Du designst um ihn herum.“

Lukas blinzelte. „Und warum funktioniert es dann jetzt?“

„Weil die Software den Verzug erwartet“, sagte Katja. „Anton und Mariana haben Tests geschrieben, die Verzögerung simulieren, und die State Machine darauf ausgelegt, sauber damit umzugehen. Die UI nimmt keine sofortige Datenbank mehr an. Sie wartet auf Bestätigung.“

Lukas sah zu Stefan. „Also hat die Staging-Umgebung wirklich geliefert?“

„Sie hat genau getan, wofür sie da ist“, sagte Stefan. „Sie hat falsche Annahmen früh sichtbar gemacht, bevor echte Spieler den Preis zahlen. Ohne Staging-Parität hätten wir dieses Feature in Produktion gebracht und das Wochenende in Notfall-Meetings verbracht.“

Lukas nickte langsam. „Und der Zeitplan? September-Launch noch realistisch?“

„Ja“, sagte Katja. „Gerade weil wir nicht mehr in manuellen Debugging-Schleifen hängen. Das Team schreibt Tests beim Bauen. Fühlt sich am ersten Tag langsamer an, ist am fünften Tag schneller, weil wir Software liefern statt Hotfixes.“

Lukas stand auf und klappte den Laptop zu. „Ich gebe es ungern zu, Katja. Als du sechs Wochen ‚operativen Realismus‘ wolltest, dachte ich, du kaufst nur Zeit. Aber das hier ist das erste Demo seit Monaten, das nicht mit Klebeband zusammengehalten wirkt.“

„Weil es das nicht ist“, sagte Katja.

Sie ging mit ihm aus dem Raum, das Gespräch wechselte bereits zur Q3-Marketingabstimmung.

Stefan blieb noch kurz am Fenster. Berlin war warm und golden, Lichter spiegelten sich im Kanal.

Draußen auf der Fläche packte Anton seine Tasche. Kein gehetzter Blick mehr, kein ständiges Über-die-Schulter-zum-Monitor. Er sprach mit Sofia, lachte, gestikulierte ruhig.

Die Körperhaltung war anders.

Das Team wurde nicht mehr gejagt. Es begann, das System zu besitzen. Test für Test.

Navigator — Katja Müller — 26. Juni 2026, 18:12

Erste Woche der Operational Realism Initiative.

Der Lieferdruck ist nicht verschwunden, nur weil der Vorstand das Budget freigegeben hat. Anton wollte am Montag abkürzen und Tests überspringen, um die Turnier-Matchmaking-UI schneller zu bauen.

Die neue Staging-Umgebung hat genau geliefert, was wir brauchten: Sie hat seine Annahmen sofort aufgedeckt. Multi-Region-Replikas brachten Latenz ins Spiel, die lokal unsichtbar war, und die UI brach unter konkurrierenden Join-Requests.

Der Wendepunkt war Mittwoch, als Mariana sich mit ihm hinsetzte und einen Characterization-Test schrieb, der die Race Condition isolierte. Mit dem Test stand der Fix in zehn Minuten.

Antons Haltung zu TDD hat sich von „Theologie“ zu „guter Entwicklung“ gedreht. Er hat am eigenen Code gesehen, dass Test-Skips keine Zeit sparen, sondern Reibung in eine teurere Phase verschieben.

Navigator-Signale dieser Woche:

  • Das Unity-Repository hat seine ersten automatisierten UI-Unit-Tests bekommen.
  • Die Stabilität der Staging-Umgebung lag unter simulierter Last bei 99,8%.
  • Zum zweiten Mal in Folge wurde für kein Entwicklerprofil Wochenendarbeit geloggt.
  • Die Zahl der Pairing-Sessions zwischen Backend und Unity stieg um 40%.

Wir bauen wieder auf tragfähigem Boden. Die Strecke wird asphaltiert, und das Team lernt, darauf zu fahren.

Nächste Woche starten die Lasttests mit 150.000 simulierten Nutzerprofilen. Dann beginnt die eigentliche Prüfung der Replikas.

Nächste Folge: "Die Lasttest-Abrechnung" Das Team fährt den ersten massiven Lasttest gegen die neue Multi-Region-Staging-Umgebung. Als sich die Replikas unter 150.000 simulierten Spielerprofilen desynchronisieren, müssen Hassan und Sofia einen Weg finden, mit Eventual Consistency zu leben, ohne die Player Experience zu zerbrechen.
×
×