Faragiri

Programmiergrundlagen lernenProgrammieren

41 von 6.400 Firmen standen am Ende der Fahrerliste statt an ihrem Platz, und gemeldet hat es nichts. Acht Themen, die alle nach dem Preis fragen.

6Abschnitte
7Min. Lesezeit
2Tiefe

Acht Cluster, eine Frage

Keines davon kommt zuerst, und alle handeln vom Preis

Der Rahmenlehrplan legt sie in eine Reihenfolge und prüft sie einzeln ab. In der Arbeit stellen sie dieselbe Frage, und zwar gleichzeitig.

Was kostet das, wenn es mehr wird
  • Codeausführung
  • Bausteine
  • Datenstrukturen
  • Algorithmen
  • Objektorientierung
  • Entwurfsmuster
  • Codequalität
  • Fehlersuche
  • 01CodeausführungHier entsteht die Zahl. Ohne sie bleibt jeder Preis weiter oben eine Vokabel aus dem Lernfeld.
  • 02BausteineFünf Konstrukte, in jeder Sprache anders geschrieben, und der Preis sitzt im eingerückten.
  • 03DatenstrukturenEine Wette darauf, welchen Zugriff Sie am häufigsten brauchen werden.
  • 04AlgorithmenBenannte Wege, die billiger sind. Der Name steht in der Prüfung, der Weg im Programm.
  • 05ObjektorientierungDieselbe Abwägung eine Größenordnung höher: ein Programm statt einer Schleife.
  • 06EntwurfsmusterVor dem zweiten Auftreten des Problems gelesen, kosten sie sechs Dateien statt einer.
  • 07CodequalitätDer Preis der zweiten Person, die die Datei öffnet, und meistens sind Sie das selbst.
  • 08FehlersucheDie Rechnung für alles, was in den anderen sieben geraten wurde.

Nicht abgebildet ist der Rahmenlehrplan. Er verteilt diese acht auf drei Jahre und auf zwei Gebäude, und keines der acht gehört ganz in eines davon.

Jonas Reinke ist im zweiten Lehrjahr, Fachinformatiker für Anwendungsentwicklung bei einem Sanitärgroßhandel in Osnabrück, und seine erste eigene Aufgabe war die Tourenliste. Der Export der Warenwirtschaft enthält 6.400 Kundenadressen, und die Fahrer bekommen sie alphabetisch nach Firmenname aufs Tablet. Sechs Zeilen Python, ein sorted(), fertig vor der Mittagspause.

Hinter Zwickau standen dann 41 Adressen, die dort nicht hingehören: das Ärztehaus am Westerberg, die Bäckerei Übach, der Ölhandel Osterkamp. Jede Firma mit einem Umlaut vorn war ans Ende gerutscht. Gemeldet hat das nichts, weil nichts kaputt war, und zwei Wochen lang hat ein Fahrer geblättert.

sorted() vergleicht Codepunkte, und Ä steht dort hinter Z. Das große A ist 65, das große Z ist 90, das kleine z ist 122, und Ä ist 196. Diese Reihenfolge ist keine Eigenschaft von Python. Sie ist die Voreinstellung fast jeder Sprache, und sie ist eine Entscheidung, die jemand getroffen hat, bevor Sie die Datei geöffnet haben.

Deshalb steht dieses Thema über den Programmiersprachen und nicht in einer davon.

Ä liegt hinter Z

Die Zeichentabelle kennt kein Alphabet, sondern Zahlen. Die alphabetische Ordnung einer Sprache wird darübergelegt, und für das Deutsche steht sie zweimal in der DIN 5007, weil das Deutsche zwei Ordnungen hat. DIN 5007 Teil 1 sortiert ä wie a, Teil 2 sortiert ä wie ae. Teil 1 ist die Wörterbuchordnung, nach der ein Wort im Duden zu finden ist. Teil 2 ist die Namensordnung, und dort steht Müller bei Mue statt bei Mu.

Die Tourenliste ist ein Namensverzeichnis. Das Modul locale aus der Standardbibliothek liefert Teil 1:

  • import locale
  • locale.setlocale(locale.LC_COLLATE, "de_DE.UTF-8")
  • tour.sort(key=locale.strxfrm)

Damit steht das Ärztehaus wieder hinter Abel und die Bäckerei Übach vor Zabel. locale.strxfrm sortiert nach der eingestellten Sprache statt nach der Zeichentabelle, und für eine Fahrerliste ist Teil 1 nah genug an Teil 2, dass niemand blättert. Wer Teil 2 wirklich braucht, etwa für ein Verzeichnis, das gegen ein amtliches abgeglichen wird, kommt mit der Standardbibliothek nicht hin.

Dass es überhaupt zwei richtige Antworten gibt, ist der Punkt. Im Schwedischen gehören å, ä und ö tatsächlich hinter das z, im Deutschen nicht, und selbst dort hilft die Tabelle nicht: Sie führt ä vor å, das schwedische Alphabet umgekehrt. Ein Vergleich ist eine Entscheidung, und wer keine trifft, übernimmt die der Zeichentabelle.

Daran hängt noch etwas, das erst im Betrieb auffällt: setlocale braucht die Sprachdaten auf dem Rechner, auf dem das Programm läuft. Auf einem nackten Server fehlen sie oft, und dann sortiert dasselbe Programm wieder nach der Tabelle. Woher diese Umgebung kommt, steht unter Softwareauslieferung.

Suchen oder nachschlagen

Die zweite Aufgabe war die Dublettenprüfung: Welche Kunden stehen zweimal drin, unter leicht verschiedener Schreibweise? Jonas hat jede Adresse mit jeder verglichen. Das sind bei 6.400 Zeilen 20.476.800 Paare, und im September 2026 dauerte das auf einem Laptop 4,7 Sekunden.

Dieselbe Frage, nachgeschlagen statt gesucht, braucht 6.400 Zugriffe und 0,0019 Sekunden. Ein Zugriff im Dictionary kostet bei zehn Einträgen so viel wie bei zehn Millionen, eine Suche in einer Liste wird mit jedem Eintrag länger.

  • seen = {}
  • for row in rows:
  • key = row.address.lower().strip() # Schreibweise angleichen
  • if key in seen: print(row.number, seen[key])
  • seen[key] = row.number

Die Bezeichner stehen wie im Betrieb üblich auf Englisch, der Kommentar auf Deutsch.

Interessant sind aber weder 4,7 noch 0,0019 Sekunden. Interessant ist, was beim Wachsen passiert. Zwei ineinander verschachtelte Schleifen über eine Liste sind quadratisch: Übernimmt der Großhandel einen Wettbewerber und steht der Kundenstamm bei 25.600 Adressen, sind es 327.667.200 Paare und hochgerechnet gut fünfundsiebzig Sekunden, während der Nachschlag unter einer Hundertstelsekunde bleibt.

Das ist der Satz, der diesem Thema seinen Namen gibt. Nicht, wie schnell etwas ist, sondern was passiert, wenn es mehr wird. Datenstrukturen sind genau diese Wette, einmal ausgeschrieben, und dieselbe Wette noch einmal eine Größenordnung höher heißt Index und steht unter Datenbanken.

Ein Name ist kein Kasten

Der dritte Preis hat mit Geschwindigkeit nichts zu tun und erzeugt die merkwürdigsten Fehler. Jonas wollte die abgearbeiteten Stopps mitschreiben und begann mit delivered = tour. Beim ersten Streichen verschwand der Stopp auch aus tour.

Dieselbe Liste unter zwei Namen ist eine Liste mit zwei Namen. Ein Name ist ein Schild, das an einem Objekt hängt, und kein Kasten, in dem eine Kopie liegt. Die Zeile, die die zweite Liste wirklich herstellt, heißt delivered = list(tour).

In der Berufsschule heißt das Call by Reference und steht als Begriffspaar an der Tafel. Im Betrieb heißt es, dass die Tourenliste am Freitagnachmittag leer ist. Denselben Unterschied noch einmal, für Daten und die Funktionen darauf zusammen, behandelt die Objektorientierung.

Die Reihenfolge

Jede Stufe macht die nächste erst verständlich

Angefangen wird fast immer auf der dritten, weil sie die einzige ist, die sich schriftlich abfragen lässt.

  1. 01Die eigene Liste falsch sortiert sehenDeutsche Daten, ein Umlaut vorn, keine Fehlermeldung. Ohne diesen Nachmittag landet nichts darüber.
  2. 02Den Preis messen, bevor er heißtEine Liste wird durchlaufen, ein Dictionary wird adressiert. Erst die Zahl, dann das Wort.
  3. 03Den Begriff aus dem Lernfeld danebenlegenJetzt trägt die O-Notation etwas. Vorher ist sie eine richtige Antwort auf einem Blatt.
  4. 04Die eigene Datei nach acht Monaten öffnenErst hier leuchtet ein, wofür die Gewohnheiten der Codequalität gedacht waren.

Die Prüfung fragt Stufe drei ab und kann die anderen drei nicht abfragen. Das ist kein Vorwurf an die Prüfung, sondern der Grund, sich die drei selbst zu besorgen.

Die Reihenfolge, die der Rahmenlehrplan umdreht

Der Rahmenlehrplan ordnet dieses Thema in Lernfelder, und er gibt darin zuerst den Namen. Die O-Notation ist ein Tafelbild und in Teil 1 der gestreckten Abschlussprüfung eine Aufgabe mit einer richtigen Antwort. Wer sie dort hinschreiben kann, hat den Namen. Die Zahl dazu hat er meistens nie gesehen.

Andersherum trägt es. Erst die eigene Liste, die falsch sortiert oder zu lange läuft, dann der gemessene Preis, dann der Begriff aus dem Lernfeld daneben, und zuletzt die eigene Datei nach acht Monaten wieder geöffnet. Wer das Wort vor der Zahl bekommt, greift unter Druck trotzdem zur verschachtelten Schleife und weiß hinterher nicht, warum das Programm langsam war.

Die zweite verkehrte Reihenfolge sind Entwurfsmuster, gelesen bevor das Problem zum zweiten Mal aufgetreten ist. Ein Muster ohne den Fehler dahinter ist eine Lösung auf der Suche nach einem Problem, und sie kostet sechs Dateien, wo eine gereicht hätte. Codequalität steht aus demselben Grund am Ende: Diese Gewohnheiten leuchten erst ein, wenn jemand den eigenen Code nach acht Monaten nicht mehr versteht.

Der Stillstand: zwei Jahre ohne Last

Hier bleibt diese Ausbildung stehen: an dem Punkt, an dem jemand die Laufzeitklasse hinschreiben kann und sie noch nie gesehen hat. In der Berufsschule läuft kein Programm unter Last, weil dreißig Leute an derselben Beispieldatei mit zwölf Zeilen sitzen. Im Betrieb ist die Datenmenge zwei Jahre lang so klein, dass jede Lösung gleich schnell aussieht.

Dann kommt der Nachmittag, an dem beides zum ersten Mal zusammentrifft, und die häufigste Schlussfolgerung daraus ist falsch. Nicht die Person ist schlecht im Programmieren. Sie hat zwei Jahre lang nur Datenmengen gesehen, bei denen es egal war, welche Form sie genommen hat.

Deshalb kommt die Fehlersuche zuletzt an und wird zuerst gebraucht. Ein Programm, das mit einer Meldung stehen bleibt, druckt die Kette der offenen Aufrufe. Ein Stapelrahmen ist eine angehaltene Funktion, die darauf wartet, dass die von ihr aufgerufene zurückkommt, und die brauchbare Zeile ist fast immer die unterste, die eine Datei nennt, die Sie selbst geschrieben haben. Warum diese Kette so aussieht, wie sie aussieht, steht unter Codeausführung, und welche fünf Konstrukte überhaupt darin vorkommen, unter Bausteine.

Werkzeuge: drei, die schon da sind

Auf dem Rechner im Betrieb dürfen Sie in aller Regel nichts installieren, und ein Ticket bei der IT dauert länger als die Aufgabe. Die drei nützlichsten Werkzeuge für dieses Thema bringt deshalb die Standardbibliothek mit.

timeit beantwortet die Kostenfrage in zehn Sekunden und ersetzt die Stoppuhr um das ganze Skript, die den Start des Interpreters mitmisst. locale beantwortet die Sortierfrage und ersetzt die selbst geschriebene Ersetzungstabelle für ä, ö, ü und ß, die fast jeder gewachsene Betrieb einmal in seiner Geschichte hat. pdb beantwortet die Frage, warum etwas stehen geblieben ist: python3 -m pdb -c continue skript.py setzt Sie in den abgebrochenen Rahmen, mit allen Werten noch im Speicher. Alle drei gehören seit über zwanzig Jahren zur Standardbibliothek, im September 2026 zur Fassung Python 3.14, und keines braucht eine Freigabe.

Ein Assistent im Editor schreibt die Nachschlag-Fassung sofort richtig hin, weil sie eine häufige Form ist. Für die Tourenliste schlägt er sorted(customers) vor und sagt kein Wort über den Umlaut, weil seine Beispiele englisch sind und ein englischer Firmenname ohne Umlaute auskommt. Daraus folgt die brauchbarste Regel für dieses Werkzeug: Es ist stark bei dem, was oft dasteht, und still bei dem, was nur in Ihrer Sprache vorkommt.

Bleibt die Frage, welche Form man nimmt, wenn das Problem kein Nachschlagen ist, sondern der kürzeste Weg durch 890 Stopps. Dafür gibt es benannte Antworten, die man erkennt statt sie neu zu erfinden, unter Algorithmen. Wie diese acht Themen im Rest von Programmieren liegen, entscheidet dagegen nicht der Preis, sondern der Ort, an dem der Code am Ende laufen muss.

Daneben

Darüber