Faragiri

Softwareauslieferung lernenProgrammieren

Freitag 16:40 Uhr überschrieben, Samstag 5 Uhr nichts gelaufen, und niemand war verpflichtet zu antworten. Warum das den Entwurf ändert und nicht die Moral.

6Abschnitte
6Min. Lesezeit
2Tiefe

Das Fach, das niemand angekündigt hat

Keines dreht sich allein, und deshalb scheitert das Lernen nacheinander

Ein erstes gibt es hier nicht. Jedes ist ohne die anderen beiden fast nutzlos, und darum kommt das ganze Fach auf einmal an und fühlt sich wie eine Wand an.

  • Die Geschichte
  • Der Bau aus dem Nichts
  • Die Nachweise
  • Die GeschichteCommits und Branches. Ohne sie gibt es keine vorherige Fassung, zu der man zurückkann.
  • Der Bau aus dem NichtsEine erklärte Umgebung. Ohne sie hält die Geschichte Code fest, der nur auf einem Laptop läuft.
  • Die NachweiseTests. Ohne sie bewegen sich die anderen beiden schnell, und niemand kann sagen, ob noch etwas geht.

Die Zähne sind gleich groß, weil keines der drei das große Rad ist. Nicht gezeichnet ist, dass sie meistens in der falschen Reihenfolge übernommen werden und die Automatisierung vor allen dreien angebaut wird.

Kai Brenner betreut in Kiel den Dienst, der für eine Großwäscherei die Sortierlisten erzeugt: elf Hotels, jeden Morgen um 5 Uhr ein Lauf. Ausgeliefert hat er ihn acht Monate lang, indem er einen Ordner über SSH kopiert hat, und acht Monate lang ging das gut.

An einem Freitag um 16:40 Uhr kopierte er eine Fassung, die die Wäschedatei der Vorwoche nicht mehr lesen konnte. Am Samstag um 5 Uhr lief nichts, und die vorherige Fassung gab es nirgends mehr. Er hatte sie überschrieben.

An dieser Geschichte ist nichts das Schreiben von Code, und alles daran ist dieses Thema. Ausliefern ist die Menge der Gewohnheiten, die eine Änderung umkehrbar, wiederholbar und für jemand anderen nachvollziehbar machen.

Zuerst umkehrbar

Was Kais Wochenende gerettet hätte, sind weder Tests noch Container. Es ist ein Satz über den Weg zurück: ein Rollback ist ein Deployment der vorherigen Fassung und muss genauso leicht sein. Ist der Weg zurück ein anderes Verfahren als der Weg vorwärts, wird er im schlechtesten Augenblick von der am meisten erschrockenen Person improvisiert. Sauber ausgeliefert heißt: ein Umschalten zwischen zwei Fassungen, die beide noch da sind.

Derselbe Gedanke eine Ebene tiefer ist der Grund, warum überhaupt eine Geschichte geführt wird. Zwei Befehle machen etwas rückgängig und sind nicht austauschbar: git revert legt einen neuen Commit an, git reset verschiebt den Branch. Revert ist der sichere auf allem, was jemand anderes schon hat, weil er eine Änderung hinzufügt, die eine Änderung aufhebt, und den Nachweis beider stehen lässt. Reset schreibt um, worauf der Branch zeigt, und das ist auf ungesehener Arbeit richtig und auf gesehener eine zerstörte Nachmittagsarbeit einer Kollegin. Der praktische Teil davon steht unter Versionsverwaltung.

Elf Stunden, und niemand muss abheben

In deutschen Texten über dieses Thema fehlt regelmäßig der Satz, der die Umkehrbarkeit von einer Tugend zu einer Notwendigkeit macht. Nach Feierabend verlangt das Arbeitszeitgesetz elf Stunden ununterbrochene Ruhezeit. Wer freitags um 18 Uhr Feierabend gemacht hat, darf regulär erst am Samstag um 5 Uhr wieder anfangen, und für Sonntage steht in demselben Gesetz noch einmal etwas Eigenes.

Dazu kommt der zweite Satz, den Anleitungen aus anderen Märkten nicht kennen: Wer keine Rufbereitschaft vereinbart hat, hat niemanden, der abheben muss. Rufbereitschaft ist eine Vereinbarung, sie wird vergütet, und in einem Betrieb mit Betriebsrat wird sie mitbestimmt. Ein Anruf in der Rufbereitschaft unterbricht die Ruhezeit, und sie beginnt von vorn. Ein Einsatz um 22 Uhr kostet also nicht nur die Stunde, sondern verschiebt den nächsten regulären Arbeitsbeginn.

Daraus folgt der Entwurf und nicht die Moral. Ein Verfahren, das darauf baut, dass abends jemand erreichbar ist, baut in Deutschland auf etwas, das rechtlich nicht vorausgesetzt werden darf. Ein Rollback, den auch die diensthabende Person am Empfang auslösen könnte, ist deshalb kein Komfort. Er ist die einzige Fassung des Verfahrens, die ohne eine Vereinbarung auskommt.

Kai hatte keine Rufbereitschaft, und niemand hat etwas falsch gemacht, als am Samstag niemand ans Telefon ging.

Die Maschine, die nichts hat

Kais Auslieferung funktionierte, weil sein Laptop acht Monate kleiner Anpassungen angesammelt hatte: eine einmal installierte Bibliothek, eine Umgebungsvariable in einem Startskript, ein Ordner, den es zufällig gab. Nichts davon war aufgeschrieben, und nichts davon lag auf dem Server der Wäscherei, bis er es von Hand hingebracht hatte.

Die Pipeline läuft auf einer Maschine, die nichts hat, und das macht sie ehrlich. Ein Bauserver fängt jedes Mal mit einer leeren Kiste an, also muss alles, was das Projekt braucht, irgendwo erklärt sein, wo eine Datei es festhalten kann. Das ist der eigentliche Wert von CI und CD, und er ist mehr wert als die Automatisierung: eine dauernde, unnachgiebige Prüfung, ob das Projekt von jemandem gebaut werden kann, der es nicht geschrieben hat.

Einen Schritt weiter entsteht daraus das Abbild. Ein Container-Image ist Abhängigkeiten, Laufzeit und Code in einer Datei, einmal gebaut und überall gleich ausgeführt. Damit fällt die ganze Sorte Fehler weg, bei der der Server eine andere Fassung von etwas hat als der Laptop, und darum geht es unter Container. Was nicht wegfällt, ist die Pflicht zu wissen, was in das Abbild hineingegangen ist: Ein Abbild auf einer nicht festgenagelten Grundlage ist dieselbe unerklärte Abhängigkeit wie vorher, versiegelt und mit mehr Zuversicht verschickt.

Freitagnachmittag

Was jede Schicht aufhält, und was sie ungehindert durchlässt

Vier Schichten zwischen einer Änderung und einer Wäscherei, die am Samstag ohne Liste sortiert, und jede ist durchsichtig für den Fehler, den die nächste fängt.

  1. Die TestmengeVerhalten, das vorher ging und jetzt nicht mehrAlles, was niemand beschrieben hat, und jeden Unterschied der Umgebung
  2. Der Bau aus dem NichtsDie unerklärte Bibliothek und die Variable aus einem StartskriptCode, der falsch ist und sich dabei einwandfrei bauen lässt
  3. Das Container-AbbildServer und Laptop, die sich über eine Fassung uneinig sindEine schlechte Änderung, getreu und überall gleich
  4. Die aufgehobene VorfassungAlles, was die anderen drei durchgelassen haben, so lange, bis es jemand merktNichts, und sie ist die Schicht, die für Plattenplatz gelöscht wird
Eine Änderung, die hinausgeht

Der Verschluss ist das Merken, und es ist hier keine Schicht. Alle vier setzen voraus, dass jemand es erfährt, und in Deutschland setzt jede Antwort darauf zusätzlich voraus, dass jemand antworten darf.

Nachweise, und wofür sie wirklich da sind

Das Argument für Tests, das überzeugt, ist nicht, dass sie Fehler finden, denn ein Anfänger merkt zu Recht, dass sie meistens die Fehler finden, an die die schreibende Person ohnehin gedacht hat. Das Argument, das trägt, ist ein anderes: Tests machen eine Änderung sicher. Kai kann den Leser für die Wäschedatei an einem Dienstag umschreiben, und zwar so zuversichtlich, wie viel von seinem Verhalten aufgeschrieben ist als etwas, das eine Maschine prüft.

Deshalb ist Testen um das Überleben herum formuliert und nicht um die Richtigkeit. Eine Testmenge ist eine Beschreibung dessen, was das Programm tun soll, in einer Form, die sich beschwert, sobald die Beschreibung nicht mehr stimmt, und ihr Wert kommt Monate später an, an dem Tag, an dem jemand eine Datei ändert, die er nicht ganz versteht.

Der nützliche erste Test ist kein Modultest. Es ist der, der den ganzen Lauf auf der Wäschedatei der Vorwoche ausführt und die Summe prüft, weil genau das der Fehler war, den Kai hatte, und weil ein Test gegen eine echte vergangene Eingabe keine Theorie darüber braucht, was die Einheiten sind.

Die Reihenfolge, und der Stillstand

Die Reihenfolge, die trägt, ist Versionsverwaltung, dann ein Weg, die Sache aus dem Nichts laufen zu lassen, dann Tests, dann die Freigabe automatisieren. Keiner dieser vier Schritte ist die Sprache, und genau deshalb steht dieses Thema in Programmieren und nicht daneben.

Deutsche Lernende bleiben an einer eigenen Stelle stehen, und sie liegt am Ende statt am Anfang. Verfahren sind hier nämlich das, was ohnehin sitzt: Wer eine Ausbildung oder eine Umschulung hinter sich hat, weiß, was eine Freigabe ist, was ein Vier-Augen-Prinzip ist und wie eine Verfahrensanweisung aussieht. Genau deshalb wird der vierte Schritt zuerst gebaut. Der Stillstand ist der Punkt, an dem eine saubere, dokumentierte, freigegebene Pipeline eine Auslieferung automatisiert, die niemand rückgängig machen kann, und an dem das Ergebnis nach Ordnung aussieht und keine ist.

Die Prüfung dafür ist eine Frage und dauert zehn Sekunden: Wie lautet der Befehl, der die vorherige Fassung zurückholt, und wer außer Ihnen darf ihn ausführen? Gibt es darauf keine Antwort, ist die Reihenfolge verkehrt herum, egal wie gut das Verfahren beschrieben ist.

Werkzeuge, und was 2026 gilt

Git ist nicht wahlfrei und ist es seit der Ablösung von Subversion in den 2010er Jahren nicht mehr. Es ist frei, und die wertvollste Stunde dieses Themas ist die, in der jemand versteht, dass ein Commit eine Momentaufnahme und ein Branch ein Zeiger darauf ist. Danach löst sich der meiste Nebel von selbst auf.

GitHub Actions ist die Voreinstellung für Projekte, die ohnehin dort liegen, für öffentliche Repositories kostenlos, und hat für die meisten kleinen Teams Jenkins abgelöst, das Anleitungen vor ungefähr 2019 noch voraussetzen. In deutschen Betrieben liegt das Repository allerdings oft auf einem selbst betriebenen GitLab, und der Grund ist derselbe wie bei den Datenbanken: der Ort. Die Datei heißt dann anders und beschreibt dieselben Schritte, und alles auf dieser Seite gilt unverändert.

Docker ist weiterhin der Weg, auf dem Abbilder gebaut werden, und für den einzelnen Gebrauch kostenlos. Für den letzten Schritt unter Deployment haben die Plattformen, die ein Repository beim Push ausliefern, das Kopieren des Ordners abgelöst, und abgelöst haben sie es gerade dadurch, dass sie die vorherige Fassung aufheben.

Ein Assistent im Editor schreibt eine brauchbare Pipelinedatei sofort hin und irrt sich mit voller Überzeugung bei Zugangsdaten und Berechtigungen, also an der Stelle, an der ein Irrtum teuer und nicht bloß lästig ist. Für eine öffentlich erreichbare Anwendung kommen zu diesen Schichten noch die Fragen der Webentwicklung hinzu, und was das Ganze überhaupt kostet, wenn es mehr wird, steht in Programmiergrundlagen. Bleibt die Frage, was nach der Auslieferung passiert, wenn die Sache läuft und jemand merken muss, dass sie stehen geblieben ist. Merken ist keine Schicht in dieser Kette, und Kai hat es gemerkt, weil am Samstagmorgen eine Wäscherei angerufen hat.

Daneben

Darüber