Meine Oma fragte mich: „Jung', womit verdienst du eigentlich dein Geld?“
„Ich bin Programmierer, Oma.“
„Programmierer? Was genau machst du denn da? Das hab ich nie verstanden…“
Ok, wie erkläre ich meiner Oma, was "Programmieren" ist. Das wird nicht einfach. Ich hab eine Weile drüber nachgedacht, und diese Metapher für Sie gebaut.
Die Metapher mit dem Amt
Stell dir vor, der Bürgermeister will ein neues Amt gründen. Dieses Amt soll Menschen helfen, wenn ihre Miete zu teuer wird. Sie können dann einen Antrag auf Miet-Unterstützung stellen und bekommen einmalig einen Zuschuss. Du bist der neue Amtsleiter und sollst dieses Amt aufbauen. Du bekommst einen Raum, drei Beamte und diese ganz grobe Beschreibung:
"Jeder Bürger, der mehr als 50% seines Einkommens für Miete ausgeben muss, bekommt einmalig eine Monatsmiete als Zuschuss."
Das ist die Aufgabe des Amtes. Und damit das funktioniert, musst Du dir als Amtsleiter jetzt einen Prozess ausdenken. Du lernst deine drei Beamten kennen und stellst fest: Sie scheinen sehr gewissenhaft und sehr fleißig zu sein. Aber leider scheinen sie nicht sonderlich schlau zu sein. Keiner von ihnen denkt viel nach.
Ok, das heißt, damit aber alles korrekt abläuft, brauchen diese Beamten ganz klare Regeln, klare Aufgaben, keinen Interpretationsspielraum, keine Eigenverantwortung. Dann müssen Sie nicht nachdenken, sondern nur exakt das machen, was auf ihrem Ablaufplan steht. Passend dazu musst Du noch ein Formular entwerfen, damit die Bürger den Zuschuss beantragen können. Die Beamten können diese Formulare nach den Regeln bearbeiten.
Das heißt, deine Aufgabe als Amtsleiter ist:
- Teile die Aufgabe des Amtes so auf, dass sie von drei Beamten erledigt werden kann.
- Schreibe die nötigen Tätigkeiten so auf, dass jeder Beamte einen klaren Aufgaben-Ablauf-Plan bekommt
- Entwerfe ein Formular, wo alle Informationen eingetragen werden können, die für die Zuschuss-Bewilligung, die Zuschuss-Auszahlung und die internen Abläufe gebraucht werden.
Also startest Du, die Aufgaben für die Beamten aufzuschreiben. Vielleicht so:
Die Aufgaben der Beamten
Beamter 1 – Der Eingangsprüfer
- Morgens holt er neue Anträge aus dem Briefkasten.
- Zwischendurch nimmt er Anträge entgegen von Leuten, die persönlich vorbeikommen.
- Er prüft jeden Antrag:
- Ist der Antrag vollständig ausgefüllt? Sind alle Felder lesbar?
- Wenn ja, macht er ein Häkchen: „Form OK“
- Dann legt er den Antrag auf den Schreibtisch des zweiten Beamten.
Beamter 2 – Der Förder-Prüfer
Er hat eine etwas größere Aufgabe:
- Er schaut sich den Antrag auf seinem Tisch an.
- Dann prüft die Angaben: Er rechnet aus, ob die Miete und das Einkommen im Formular dazu berechtigen, dass der Antragsteller die Unterstützung bekommt.
- Wenn das passt, schaut er nach, ob die Person schon mal Unterstützung bekommen hat. Dazu sucht er in den Aktenordnern mit den bewilligten Anträgen nach dem Namen.
- Wenn beides passt macht er ein Häkchen: „Auszahlung bewilligt“
- Und dann legt er den Antrag auf den Schreibtisch vom Auszahlungs-Beamten.
Beamter 3 – Der Auszahler
Der ist einfach gestrickt.
- Er nimmt einen Antrag von seinem Tisch.
- Wenn da das Häkchen „Auszahlung bewilligt“ gesetzt ist, zahlt er Geld aus.
- Dann heftet er den Antrag in die Aktenordner mit den bewilligten Anträgen.
Damit müsste die Aufgabe erfüllt sein, und die Arbeit einigermaßen gerecht auf die drei Beamten verteilt sein. Und weil alles so klar aufgeschrieben ist, kann man auch einen der Beamten einfach vertreten, wenn mal jemand krank sein sollte. Du als Amtsleiter gehst den Ablauf für alle drei Beamten einige Male im Kopf durch und entscheidest dann: Das ist gut so, so können wir starten. Dann gibst Du jedem Beamten seinen Aufgaben-Plan und lässt die Dinge erstmal laufen.
Die ersten Fehler
Nach drei Tagen gehst Du zu den Beamten, und guckst wie es läuft.
„Und Oma, jetzt stell dir vor, plötzlich stapeln sich beim Auszahlungs-Beamten meterhohe Papierberge!“
„Ach du meine Güte, was für ein Chaos!“, sagt Oma lachend.
Du fragst ihn, was mit den Formularen ist, warum er sie nicht bearbeitet.
Er sagt: "Die sind bearbeitet."
Du nimmst dir ein paar davon und schaust Sie dir an. Sie sind alle abgelehnt. Du rechnest einige davon nach, und stellst fest: Die sind zurecht abgelehnt. "Warum liegen die noch hier", fragst Du den Beamten. Er zuckt nur mit den Schultern. Du liest dir seine Aufgabenbeschreibung durch und stellst fest: Da steht nicht, was er mit abgelehnten Anträgen machen soll. Also hat er nichts mit ihnen getan, und sie liegen lassen. Ok, dein Prozess hat also Lücken, Du solltest ihn nachbessern. Soll er abgelehnte Anträge wegschmeißen, oder in einen "Abgelehnt"-Ordner heften? Das musst Du entscheiden.
Nach einigen Wochen läuft alles einigermaßen rund. Deine Beamten wissen jetzt sogar, was sie machen sollen wenn ein Aktenordner voll ist, und wie man Anträge nach Alphabet abheftet über mehrere Aktenordner hinweg.
Und genau das ist Programmieren: Du entwirfst Regeln, für eine Maschine, die nicht nachdenkt, nicht mitdenkt, kein Vorwissen hat und keine Annahmen trifft. Dann überprüfst Du sie auf Lücken („Bugs“), schließt sie und verbesserst deinen Ablauf immer wieder. Denn jede Schwachstelle, die du übersiehst, nutzt irgendwann jemand aus.“
Der erste Hacker
Und dann passiert etwas, womit Du nicht gerechnet hast. Es kommt ein sehr schlauer Antragsteller, der eigentlich zu viel verdient, um einen Mietzuschuss zu bekommen.
Er weiß:
- Beamter 2 prüft einen Antrag ganz genau, in zwei Schritten.
- Aber er macht nur ein einziges Häkchen, wenn beide Prüfungen bestanden sind.
- Die zweite Prüfung dauert länger, und dafür lässt er den Antrag auf seinem Tisch liegen.
Er schmiedet einen Plan, und der geht so:
- Antrag A einreichen, mit gefälschten Daten. Förderbar, aber gelogen
- Beamter 1 prüft: Form OK und legt Antrag A auf den Tisch von Beamter 2.
- Beamter 2 nimmt Antrag A, prüft: Förderbar? Ja.
- Dann wälzt er die Aktenordner, um die Historie zu prüfen.
- Während er den richtigen Aktenordner sucht, kommt der Antragsteller nochmal persönlich vorbei, und reicht Antrag B ein. Mit seinen echten Daten – nicht förderwürdig.
- Beamter 1 prüft: Form OK → legt Antrag B auch auf den Tisch von Beamter 2.
- Beamter 2 kommt von der Historie-Prüfung zurück.
- Jetzt liegt auf seinem Tisch Antrag B ganz oben. Der Name stimmt überein mit dem, was er gerade prüft, also denkt er: „Alles geprüft. Alles passt. Jetzt nur noch Häkchen setzen.“
- Und zack: er setzt das Häkchen bei „Auszahlung bewilligt“ auf Antrag B. Den Antrag, den er gar nicht geprüft hat.
Und das Ergebnis: Beamter 3 sieht das Häkchen und zahlt aus.
Antrag B wird ausgezahlt. Obwohl Antrag B nicht förderwürdig war.
Weil Beamter 2 dachte, er hätte ihn geprüft – aber er hat nur Antrag A geprüft.
Es war einfach ein kleiner Trick – ein Moment, in dem das System blind war.
Ist der Antragsteller jetzt ein Betrüger? Ja und Nein. Sicher hat er das System ausgetrickst, aber er hat nichts verbotenes getan. Es war der Fehler des Amtes, den Antrag zu bewilligen, obwohl die korrekten Daten darin es verboten hätten.
Hat einer der Beamten falsch gearbeitet? Nein, jeder hat genau seine Aufgaben gemacht.
Das Problem ist, Du hast einen Fehler in deinem ausgedachten Prozess. Eine Lücke, oder ein "Bug" in der Programmierer-Sprache.
In der Informatik nennt man das eine ‚Race Condition‘, also einen Fehler, der auftritt, weil zwei Dinge gleichzeitig passieren und sich dabei gegenseitig stören.
Probleme über Probleme
Ok, also musst Du den Prozess wohl nochmal nachschärfen...
Und Du wirst ihn auch danach noch einige Male nachschärfen müssen. Zum Beispiel für den fiesen Bürger, der zwei Anträge direkt hintereinander stellt.
Warum das ein Problem ist?
Weil zu viel Zeit vergeht zwischen "Check ob schonmal gefördert wurde" und "Ablage, dass gefördert wurde". Mit zwei förderfähigen Anträgen direkt hintereinander kann jemand doppelt gefördert werden, obwohl die Förderbedingungen das verbieten. Auch das ist eine Lücke im System.
Deshalb ist Programmieren vor allem eins, Oma: Sich vorher genau überlegen, was passieren könnte, und Regeln so aufzuschreiben, dass nichts schiefgehen kann. Leider gelingt das nicht immer beim ersten Mal. Deshalb arbeiten Programmierer ständig daran, Fehler aufzuspüren und ihre Programme zu verbessern.
Das ist mein Job, und ich mache ihn gerne!