Faragiri

Programmiersprachen lernenProgrammieren

Die Syntax ist ein Wochenende. Bezahlt wird für den Paketmanager, die Lockdatei und die Frage, welche Lizenz mit ausgeliefert wird.

6Abschnitte
7Min. Lesezeit
2Tiefe

Eine Sprache, aufgeschnitten

Die Prüfung fragt den Kern ab, bezahlt wird in den äußeren Ringen

Gelernt wird von innen nach außen. Am ersten Tag im Betrieb scheitert der Befehl in den beiden äußeren Ringen, und die stehen in keinem Lernfeld.

  1. die Sprache selbstDie SyntaxSchleifen, Funktionen und die Schreibweise für eine Liste. Ein Wochenende, und das, was alle mit einer Sprache meinen.
  2. 02Die StandardbibliothekWird nachgeschlagen statt gelernt, und das ist richtig so.
  3. 03Der PaketmanagerEiner je Sprache, alle dieselbe Form, und im Firmennetz mit einer Adresse, die niemand aufschreibt.
  4. 04Die Lockdatei und die LaufzeitversionDie beiden Dinge, die sich zwischen zwei Rechnern mit gleichem Code unterscheiden.
  5. 05Bauen, Prüfen und AusliefernHier hört das Projekt auf, eine Datei zu sein, und wird zu etwas mit einer Stückliste.

Über Schwierigkeit sagt der Schnitt nichts. Die äußeren Ringe sind nicht schwerer als der Kern, sie werden nur nirgends unterrichtet und in der Abschlussprüfung nicht abgefragt.

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 reportlab schreibt die Spanne in die Projektdatei und den genauen Stand in die Lockdatei
  • uv sync installiert auf dem zweiten Rechner aus der Lockdatei, statt noch einmal aufzulösen
  • git add uv.lock ist 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.

Ein Server, eine Zeile Text

Wie viele Pakete eine Sprache braucht, bevor sie eine Anfrage beantworten kann

Dasselbe kleine Programm in vier Sprachen, gezählt wird alles Installierte und nicht alles Erklärte.

Direkt und indirekt installierte Pakete für einen Server, der eine Zeile Text zurückgibt. An einem Nachmittag gezählt, richtungsweisend und nicht amtlich.

  1. JavaScriptFast nichts kommt mit, und das Verzeichnis liefert den Rest nach49
  2. RustCargo gehört zur Sprache, die Hälfte für das Netz nicht4
  3. PythonGroße Standardbibliothek, und ein kleines Gerüst darauf2
  4. GoDer Server steht in der Standardbibliothek, das Projekt erklärt nichts0

Eine hohe Zahl ist keine Schwäche, sondern eine andere Stückliste. In Deutschland ist genau diese Stückliste das, was ein Kunde im Lastenheft verlangt und was der Cyber Resilience Act ab Dezember 2027 voraussetzt.

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.

Daneben

Darüber