Katrin Ostermann schult in Kassel um, zweites Jahr auf einem Bildungsgutschein, davor vierzehn Jahre Buchhaltung. Ihr Betrieb baut Auftragsverwaltung für Handwerksbetriebe, und ihre Aufgabe war die Rechnung: Seit dem 1. Januar 2025 muss jedes deutsche Unternehmen im Geschäftsverkehr mit anderen Unternehmen eine E-Rechnung empfangen können, also ein PDF mit eingebetteten strukturierten Daten. Sie hat vier Zeilen in die Projektdatei geschrieben, uv sync getippt, und am Freitag lag die Rechnung im richtigen Format vor.
Am Montag fragte der Teamleiter im Review, unter welcher Lizenz das laufe. Die Projektdatei nennt vier Pakete. Auf dem Rechner liegen einunddreißig.
Die Syntax einer Sprache kostet ein Wochenende. Was Katrin zwei Tage gekostet hat, ist keine Syntax, und es ist in jeder Sprache dieses Themas dieselbe Sache: wie ein Projekt aufschreibt, wovon es abhängt, und wer für diese Liste geradesteht.
Drei Namen, ein Werkzeug
Ein Kurs behandelt Schleifen, Funktionen und die Schreibweise für eine Liste. Das ist die kleine Hälfte. Darunter liegen ein Paketmanager, eine Lockdatei, ein Bauschritt, ein Testlauf, eine Formatierung und ein Weg, das Ergebnis zu veröffentlichen, und keines davon steht im Kurs, weil keines davon die Sprache ist.
Die gute Nachricht ist, dass die Form darunter überall dieselbe ist. uv, npm und cargo sind dasselbe Werkzeug unter drei Namen: Jedes liest eine Datei, in der steht, was das Projekt braucht, löst das in genaue Versionen auf und schreibt diese Versionen fest. Wer die Form einmal hat, zahlt für die zweite Sprache einen Bruchteil, und deshalb entscheidet Die erste Sprache weniger als der Aufwand, den man mit dem Aussuchen verbringt.
Für einen Betrieb hat das eine Folge, die im Kurs nicht vorkommt: Diese Datei ist keine Notiz, sondern die Stückliste des Produkts.
Zwei Punkte, drei Zusagen
Der Grund, warum dieselben vier Zeilen auf zwei Rechnern zwei verschiedene Stände ergeben können, steht in drei Zeichen Interpunktion.
In 2.4.1 ist 2 die Hauptversion, 4 die Nebenversion und 1 der Korrekturstand. Wer veröffentlicht, sagt damit zu: Ein Korrekturstand repariert etwas, eine Nebenversion legt etwas dazu, ohne Vorhandenes zu brechen, und nur eine neue Hauptversion darf brechen. Die Zahl ist also keine Verzierung, sondern eine Zusage darüber, was mit Ihrem Code passiert, wenn Sie den nächsten Stand annehmen.
In der Projektdatei steht meistens kein Stand, sondern eine Spanne, und die Interpunktion trägt die Spanne. Das Caret in ^2.4.1 nimmt 2.9.0 an und weist 3.0.0 zurück. Das ist die richtige Voreinstellung, weil sie Korrekturen mitnimmt und auf der Seite der Zusage bleibt. Sie bedeutet aber auch, dass eine Installation am Dienstag und eine am Donnerstag zwei verschiedene Bibliotheken ergeben können.
Aufgelöst wird das in der zweiten Datei, der, die niemand liest. Die Lockdatei hält die Versionen fest, damit ein zweiter Rechner dieselben bekommt. Sie wird erzeugt und nicht geschrieben, sie gehört ins Repository, und ihre ganze Aufgabe ist es, die Auflösung jeder Spanne zu einem Zeitpunkt festzuhalten.
uv add reportlabschreibt die Spanne in die Projektdatei und den genauen Stand in die Lockdateiuv syncinstalliert auf dem zweiten Rechner aus der Lockdatei, statt noch einmal aufzulösengit add uv.lockist der Schritt, den fast alle vergessen
In Katrins Betrieb hat diese Datei eine zweite Aufgabe. Sie ist die einzige Stelle, an der steht, was am 12. August tatsächlich ausgeliefert wurde, und das ist die Frage, die ein Kunde stellt, wenn eine Schwachstelle bekannt wird.
Vier Zeilen, einunddreißig Pakete
Wie viel eine Sprache mitbringt und wie viel man zusammensetzt, ist zählbar. Derselbe kleine Server, der eine Zeile Text zurückgibt, installiert in Go 0 Pakete, weil der Server in der Standardbibliothek steht. In Python sind es 2, in Rust 4, und in JavaScript 49. Keine dieser Zahlen ist ein Urteil. Sie sagen vorher, wie sich die erste Woche anfühlt und worüber die Werkzeugstreitigkeiten in diesem Ökosystem gehen werden.
uv tree druckt den ganzen Abhängigkeitsbaum auf einen Bildschirm, und dort hat Katrin gesehen, was sie erklärt hat und was daran hängt. Vier erklärte Abhängigkeiten können einunddreißig Pakete installieren, weil die vier ihre eigenen mitbringen. Die vier sind keine Nachlässigkeit: Das Einbetten strukturierter Daten in ein PDF nach dem vorgeschriebenen Format schreibt niemand selbst, der eine Auftragsverwaltung baut.
Eine Sprache wie Go beantwortet dieselbe Aufgabe mit einem sehr viel kürzeren Baum, Rust mit einem mittleren, und PHP und Java haben beide ihre eigene Fassung derselben Rechnung.
Die Lizenz im Paketbaum
In Deutschland liest sich dieser Baum noch anders, und das ist der Teil, den ein Kurs aus einem anderen Markt nicht mitbringt. Jedes Paket darin kommt mit einer Lizenz, und die Lizenz gilt für das Produkt, das ausgeliefert wird, nicht für den Nachmittag, an dem es installiert wurde.
Die Unterschiede sind konkret. MIT und Apache 2.0 verlangen im Wesentlichen, den Lizenztext mitzuliefern. Die GPL verlangt den Quelltext für den, der das Programm bekommt. Die AGPL verlangt den Quelltext auch dann, wenn die Software nur über das Netz läuft, und genau dieser Fall ist eine Auftragsverwaltung, die im Browser des Handwerkers läuft. Ein einziges Paket in der vierten Ebene des Baums entscheidet also mit, ob der Quelltext des Produkts herausgegeben werden muss.
Ferne Theorie ist das nicht: Die erste Gerichtsentscheidung weltweit, die die Wirksamkeit der GPL bestätigt hat, ist ein Beschluss des Landgerichts München I aus dem Jahr 2004. Dazu kommt eine Verordnung, die den Baum von der Kür zur Pflicht macht. Der Cyber Resilience Act, die Verordnung (EU) 2024/2847, ist seit Dezember 2024 in Kraft; ab dem 11. September 2026 gelten die Meldepflichten für aktiv ausgenutzte Schwachstellen, ab dem 11. Dezember 2027 der Rest. Für Katrins Übungsprojekt gilt davon nichts, für das Produkt alles, und deshalb steht die Stückliste plötzlich im Lastenheft.
Die Antwort auf die Frage des Teamleiters ist deshalb weder ja noch nein, sondern eine Liste, die aus der Lockdatei erzeugt wird. Wer sie erzeugen kann, beantwortet im zweiten Jahr eine Frage, die im Betrieb sonst niemand beantwortet.
Der Stillstand: der erste Befehl im Firmennetz
Hier bleibt fast jeder stehen, der zum ersten Mal an einem Rechner im Betrieb sitzt, und es passiert am ersten Tag. Der Befehl aus dem Kurs, uv add oder npm install, endet nicht mit einer Fehlermeldung über das Paket, sondern mit einer über ein Zertifikat. Der Grund steht in keinem Kurs: Der Datenverkehr wird am Firmen-Proxy aufgebrochen und mit einem eigenen Zertifikat wieder verschlossen, und die Pakete kommen ohnehin nicht aus dem öffentlichen Verzeichnis, sondern aus einem Spiegel im Haus.
Wer das nicht weiß, sucht den Fehler im Paket und findet ihn nie. Wer es weiß, stellt eine Frage von neun Wörtern an die IT und hat in zehn Minuten eine Adresse und eine Zertifikatsdatei.
Der zweite Stillstand ist leiser und dauert länger. In der Berufsschule steht eine Sprache, im Betrieb steht oft eine andere, und daraus wird der Schluss gezogen, eine der beiden sei verschwendet. Das stimmt nicht, und es stimmt auch andersherum nicht: Zwei Sprachen zu können und in keiner ein Projekt aufsetzen zu können, das auf einem zweiten Rechner läuft, ist die häufigste Form, sich für weiter zu halten, als man ist. Übertragbar ist nicht die Syntax, sondern die Form darunter.
Werkzeuge, und was 2026 gilt
Für Python ist uv die aktuelle Antwort. Es hat pip, virtualenv und pyenv abgelöst, vorher drei Werkzeuge für eine Aufgabe, es ist frei und quelloffen, und es schreibt die Lockdatei, um die es hier geht. Für JavaScript kommt npm mit Node mit und ist die Voreinstellung geblieben; abgelöst hat es die Gewohnheit, einen Ordner mit Bibliotheken von Hand ins Projekt zu kopieren. Für Rust kommt cargo mit der Sprache, und es hat nie eine zweite Möglichkeit gegeben.
Im deutschen Betrieb kommt zu allen dreien dieselbe Zeile hinzu, und sie steht in keiner Anleitung: die Adresse des hauseigenen Spiegels. Bei uv heißt sie UV_INDEX_URL, bei npm steht sie in der .npmrc, und ohne sie ist jede Anleitung aus dem Netz auf diesem Rechner falsch.
Ein Assistent im Editor schreibt richtigen Code in einer Sprache, die Sie nie geöffnet haben, und er ist genau dort am selbstsichersten, wo sich das Ökosystem von dem unterscheidet, das Sie kennen. Dass die Lockdatei nicht eingecheckt wurde, sagt er nicht, und eine Lizenz nennt er nach seinem Trainingsstand statt nach dem Baum auf dem Rechner.
Bleibt die Frage, wo dieser Code am Ende laufen soll, denn davon hängt mehr ab als von der Sprache. Webentwicklung und Softwareauslieferung machen aus diesen Zeilen etwas, das jemand anderes öffnen kann, und ohne Programmiergrundlagen bleibt die zweite Sprache eine zweite Schreibweise für dasselbe.