1. Programmierer
Programmierer sind (trotz anderslautender Gerüchte): Menschen, die zu nachtschlafender Zeit mit völlig untauglichen Entwicklungspaketen für nicht zusammenpassende Konglomerate fehlerverseuchter Hardware versuchen, im Auftrag von unfähigen Bedienern deren einander widersprechende Anforderungen in Programme umzusetzen, die am Schluss niemand verwendet.
Programmierer zerfallen in zwei Kategorien. Die eine Sorte versagt bei dem Versuch, für viel zuwenig Geld mit viel zuviel Aufwand die logischen Irrtümer von Programmiersprachen, die Fehler von Compilern und die in Silizium gegossenen Ungereimtheiten der Hardwareentwickler so gegebeinander auszuspielen, daß das Computersystem am Schluß wenigstens hin und wieder das tut, was man von ihm erwartet. Die andere Sorte tut dieses ganz umsonst.
Generell ist das Denken eines Programmierers logisch (»IF 1=2 CALL Mainprogram«), stets strukturiert (»ON Hunger GOSUB Aldi ELSE RETURN«) und von keinerlei Vorurteilen beeinträchtigt. Obwohl es einzelne Vertreter dieses Berufszweigs geben soll, die dem Vorurteil nachhängen, daß ein Computer dazu geschaffen wurde, dem Menschen zu dienen. Anstatt umgekehrt.
Oder wie es der berühmte angloamerikanische Schriftsteller Wilhelm D. Base Shakespeare sagte: 2b .or. .not. 2b.
Obwohl es schwierig ist, Murphys Computergesetz aus der Sicht des Programmierers zu schildern (schließlich ist ein Programmierer das im Grunde völlig überflüssige Glied der Kette Marketingabteilung – Werbeabteilung – Programmierer – Vertriebsabteilung – Anwender – Supportabteilung – Updateabteilung), soll auf den folgenden Seiten der Versuch dazu unternommen werden. Auch wenn sich Softwarehäuser und Anwender seit Jahren darüber einig sind, daß ihr Leben ohne die überbezahlten Programmierer und deren Einwände über die Machbarkeit bestimmter Programmanforderungen sehr viel leichter wäre.
Namhafte Hersteller sind deswegen mit wachsendem Erfolg seit geraumer Zeit dazu übergegangen, ihre Software mittels »CASE« (»Computer Aided Software Engineering«) direkt entwickeln zu lassen, weil letztendlich nur ein Computer Programme so schreiben kann, daß andere Computer sie auch in der richtigen Art mißverstehen können.
Lükes Grundlage der Programmierung:
Es wird nicht funktionieren.
Erste Ableitung:
Funktioniert es doch, dann hat es jemand anderes geschrieben.
Zweite Ableitung:
Fluchen ist die einzige Sprache, die alle Programmierer perfekt beherrschen.
Schlußfolgerung:
Ein Computer wird das tun, was Du programmierst – nicht das, was Du willst.
Doppelregel für Hobbyprogrammierer:
-
Führst Du ein selbstprogrammiertes Programm vor, dann stößt Du beim ersten Mal auf einen offensichtlichen Fehler.
-
Gravierende Fehler sind von Dir nicht reproduzierbar. Sie werden allerdings von jedem bemerkt, der außer Dir Dein Programm startet.
Axels Erkenntnis vom Debugging:
Nichts verbessert ein Programm so sehr wie das Fehlen von Kontrollroutinen.
Axels erweiterte Erkenntnis:
Wenn Debugging der Vorgang ist, Fehler aus einem Programm auszubauen, dann ist Programmieren der Vorgang, Fehler einzubauen.
Axels Folgerung:
Wenn Du nicht weißt, was Du tust – mach es ele-gant.
Erster Grundsatz der EDV-Spezialisierung:
Jeder Entwickler, der von außerhalb der Stadt kommt, ist ein Fachmann.
Zweiter Grundsatz der EDV-Spezialisierung:
Ein Fachmann ist jemand, der immer mehr über immer weniger weiß, bis er zum Schluß absolut alles über gar nichts weiß.
Clarkes Reihenfolge der Softwareentwicklung:
-
Es ist unmöglich – ich verschwende doch nicht meine Zeit.
-
Es ist möglich, aber nichts wert.
-
Ich sage ja, daß diese Idee von mir großartig ist.
-
Kann mir mal jemand sagen, warum die Konkurrenz schon wieder schneller war?
Maxners Speicheraxiom:
Programmcode neigt dazu, den kompletten, zur Verfügung stehenden Speicher auszufüllen und zu überschreiben.
Die Zerberus-Erweiterung:
Wenn Du sämtliche Kommentarzeilen löscht und umständliche Programmroutinen neu und kürzer programmierst, wird das Programm hinterher länger sein, mehr Speicherplatz benötigen, zu groß für den Compiler sein und darüber hinaus nicht mehr funktionieren.
Gesetze vom Arbeitszimmer:
-
Alle horizontalen Flächen werden in kurzer Zeit von Gerümpel bedeckt.
-
Die Disketten liegen darunter.
-
Das dringend benötigte Pflichtenheft ist nirgends.
-
Zigarettenasche und Kaffee befinden sich irgendwo dazwischen.
Der Katastrophenschutz:
Wer lächelt, wenn etwas schiefgeht, weiß einen, den er dafür verantwortlich machen kann.
Die acht ehernen Kundengesetze:
-
Es kommt einem Kunden nie darauf an, was ein Projekt kostet, sondern wieviel er dabei einspart.
-
Wenn Du ein Programm erfolgreich ergänzt hast, wird es der Kunde nicht mehr haben wollen.
-
Kein Kunde weiß, was er eigentlich will.
-
Jeder Kunde weiß, was er nicht will.
-
Kein Kunde will das, was Du bereits fertiggestellt hast.
-
Er weiß auch nicht, was er statt dessen möchte.
-
Der Kunde, der am wenigsten zahlt, meckert am meisten.
-
Größere Änderungen wird der Kunde immer dann verlangen, wenn ein Produkt eben ausgeliefert wurde.
Merksatz vom zeitverzögerten Bug:
-
Du wirst den entscheidenden Fehler erst dann entdecken, wenn das Programm sechs Monate lang fehlerfrei lief.
-
Dieser Fehler wird die Daten verfälscht oder vernichtet haben, die nicht wiederherstellbar sind und auf die es bei dem Programm in erster Linie ankam.
-
Der Quellcode ist inzwischen unauffindbar.
Peters Gesetz vom Spaghetticode:
Die Programmverwicklung wächst so lange, bis sie die Fähigkeiten des Programmierers übertrifft, der es weiterentwickeln muß.
Die Erweiterung von Peters Gesetz:
Die Vorarbeit wurde immer von Personen ausgeführt, die dabei sind, die höchste Stufe ihrer Unfähigkeit zu erreichen.
Das Analyse-Axiom:
Nach sorgfältiger Analyse der Programmstruktur und mühevollem Aufwand wird festgestellt werden, daß es das falsche Programm ist und bei der zu lösenden Aufgabe nicht verwendet werden kann.
Prämisse vom unveränderlichen Streß:
Anstrengung mal Zeit = konstant.
Erste Ableitung der Streßprämisse:
Wenn Du noch viel Zeit hast, wirst Du wenig Anstrengung investieren.
Zweite Ableitung der Streßprämisse:
Nähert sich die zur Verfügung stehende Zeit dem Wert Null, wächst die Anstrengung ins Unendliche.
Dritte Ableitung der Streßprämisse:
Ohne die »letzte Minute« würdest Du nie irgendetwas erledigen.
Allgemeine Konzeptionsgesetze:
-
Du hast niemals Zeit, es richtig zu machen, aber beliebig viel Zeit, es nochmals zu machen.
-
Alles was an dem Pflichtenheft eines Programms änderbar ist, wird so lange geändert, bis es zu spät ist, noch irgend etwas am Programm selbst zu ändern.
Rüdigers Gesetze vom Debugging:
-
In jedem Programm neigen Fehler dazu, am entgegengesetzten Ende Deiner Fehlersuche aufzutreten.
-
Wenn ein Listing Fehler aufweist, sieht es fehlerfrei aus.
-
Wenn ein Fehler entdeckt und korrigiert wurde, stellt sich heraus, daß es schon zu spät ist.
-
War es nicht zu spät, war die Korrektur falsch und der ursprüngliche Text richtig.
Folgerung 1:
Nachdem die Korrektur falsch war, wird es unmöglich sein, den Anfangszustand wiederherzustellen.
Folgerung 2:
Von zwei möglichen schlechten Ereignissen wird nur das tatsächlich eintreten, bei dem der Fehler auf Dich zurückzuführen ist.
Das Qualitätssyndrom:
Jedes Programm, das gut beginnt, endet schlecht. Ein Projekt, dessen Programmierung schlecht beginnt, endet furchtbar.
Folgerung 1:
Was einfach aussieht ist schwierig. Was schwierig aussieht, ist unmöglich. Was unmöglich aussieht, kann sogar die Putzfrau ohne Computer lösen.
Folgerung 2:
Eine Grenze dafür, wie schlimm es noch werden kann, gibt es nicht.
Folgerung 3:
Die Putzfrau hat längst bei der Konkurrenz als Systemprogrammiererin angefangen.
Wulfs Prinzip der geringsten Verwunderung:
Wenn etwas an einer Stelle auf eine Art realisiert wurde, dann muß es immer und überall so realisiert werden.
Die Softwareteam-Ableitung:
Zur Lösung von Programmierproblemen hat jeder im Softwareteam mindestens einen Plan, der nicht funktioniert.
Das Routinengesetz:
-
Jede Programmroutine, in die sich ein Fehler einschleichen kann, wird auch einen enthalten.
-
Auch in Routinen, die fehlerlos sein müssen, sind Fehler.
Erste Folgerung:
Jeder Fehler wird dort sitzen, wo er am spätesten entdeckt wird und den größtmöglichen Schaden anrichtet.
Zweite Folgerung:
Jeder Fehler tritt erst dann auf, wenn das Gesamtprogramm die letzte Kontrolle durchlaufen hat.
Dritte Folgerung:
Wird der Fehler früher bemerkt, ist die Ursache nicht zu finden.
Gesetz vom Schluß:
Die Fertigstellung eines Programms braucht immer doppelt so lang wie geplant. Wird dieses Gesetz beim Zeitplan berücksichtigt, so gilt der Satz der Rekursion.
Der Adaptionslehrsatz:
Die Anpassung eines Programms auf ein anderes Computersystem bewirkt, daß es auf dem Rechner, für das es ursprünglich geschrieben wurde, nicht mehr lauffähig ist. Der Versuch der anpassung an den ersten Rechner bewirkt, daß das Programm auf keinem der beiden Rechner läuft.
Die Multiplikationstheorie:
Die Zahl der Personen in einem Programmierteam neigt zur Zunahme ohne Rücksicht auf die Menge der anfallenden Arbeit.
Ergänzung:
Tust Du jemandem einen Gefallen, dann bist Du ab sofort auf die Dauer dafür verantwortlich.
Robbins Grenzwertbestimmung:
Die Minimalanforderungen im Programmpflichtenheft sind zugleich das Maximum an Leistung, das auf dem geforderten Computertyp realisierbar ist.
Hartz' Unsicherheitsfaktor:
Unklarheit ist eine unveränderliche Größe,
Gesetz über die Programmänderung:
Je einfacher eine Änderung zu sein scheint, um so größere Kreise zieht sie und um so mehr Routinen müssen neu geschrieben werden.
Vereinfachende Ableitungen:
-
Wo ein Wille ist, ist auch ein »geht nicht«.
-
Nichts ist so einfach, daß man es nicht falsch machen kann.
Die Abfangregel:
Wenn Du eine Routine entwickelst, die offensichtliche Fehler vor der Ausgabe abfängt, wird es Anwender geben, die sich diese fehlerhaften Daten schon zuvor, unter Umgehung dieser Abfangroutine, besorgen können.
Axiom von der Recherche:
Die Information, die am dringendsten benötigt wird, ist am wenigsten erreichbar.
Gesetz von der Findigkeit des Anwenders:
Wenn man feststellt, daß es vier verschiedene Möglichkeiten gibt, ein Programm zum Absturz zu bringen, und man schaltet diese vier aus, findet der erste Anwender eine fünfte.
Verallgemeinerung:
Du kannst jedes Programm narrensicher machen, aber keines verdammt narrensicher.
Das Dokumentationsgesetz:
Ein Handbuch wird nicht gelesen.
Ausnahmen:
-
Schlechte Handbücher werden von Testredakteuren gelesen.
-
Es werden nur die Abschnitte im Handbuch gelesen, die einen Anwender dazu veranlassen, das falsche zu tun.
-
Jedes Handbuch ist bei Drucklegung veraltet.
Axiom von der Relation Handbuch/Programm:
Wenn Du etwas so genau erklärst, daß es nicht mißverstanden werden kann, wird es irgendwer doch tun.
Vogels Zusammenhang zwischen Testbericht und Handbuch:
-
Machst Du ein gutes Handbuch, ist es dem Testredakteur nicht ausführlich genug.
-
Machst Du ein gutes und ausführliches Handbuch, werden Handbücher beim Test nicht bewertet.
-
Machst Du ein schlechtes Handbuch, ist es das ausschlaggebende Kriterium für die Testberichte in allen Computerzeitschriften.
Daniels Gesetze über Testberichte:
-
Dein Programm wird von Computerzeitschriften so lange nicht getestet, bis Konkurrenzprodukte auf den Markt gebracht werden, die besser sind.
-
Trifft Satz 1 nicht zu, wird der Testredakteur behaupten, daß die herausragenden Features Deines Programms keiner braucht.
-
Treffen Satz 1 und Satz 2 nicht zu, hat der Testredakteur die herausragenden Features Deines Programms nicht bemerkt.
Daniels Ableitungen:
-
Dein Programm schneidet immer am schlechtesten ab.
-
Das beste Testergebnis bekommt immer Dein härtester Konkurrent.
-
Die Wertung ist um so katastophaler, je wichtiger die testende Zeitschrift für die anvisierte Zielgruppe ist.
Dogma vom hinterlistigen Algorithmus:
Wenn ein Programm funktoniert, ist vorher etwas schiefgegangen.
Folgerungen aus dem Dogma vom hinterlistigen Algorithmus:
-
Ganz egal, was schiefgeht, es wird richtig aussehen.
-
Derjenige, den Du um Hilfe bittest, wird den Fehler nicht bemerken.
-
Derjenige, der mit unerbetenen Ratschlägen dazukommt, wird ihn sofort entdecken.
-
Egal, was schiefgeht, immer ist jemand da, der es schon vorher wußte.
-
Glaube nicht an Wunder – verlaß Dich auf sie.
Die Tempelmann-Erkenntnis vom eleganten Programmieren:
Komplexe Probleme haben einfache, leicht umzusetzende, aber falsche Lösungen.
Verallgemeinerung:
Die Abkürzung ist die längste Entfernung zwischen zwei Punkten.
Positive Ausnahme:
Eine gute Lösung kann praktisch auf jedes Problem angewendet werden. Dabei werden sich jedoch sowohl Problem als auch Lösung zu ihrem Nachteil verändern.
Allgemeine Algorithmentheorie:
-
Jede Formel und jede Konstante muß als Variable betrachtet werden.
-
Die wesentliche Dimension eines Algorithmus hat die größte Chance, weggelassen und/oder vergessenen zu werden.
-
Sobald ein Programm-Modul perfekt funktioniert, wird es mit den anderen Modulen nicht zusammenarbeiten.
-
Nichts endet jemals so wie geplant.
-
In einer gegebenen Aufgabe, die n Gleichungen enthält, werden sich mit Sicherheit n+1 Unbekannte verstecken.
Theoretisches Gesetz der Programmiersprachen-Kompatibilität (unter dem Namen »Turbo-... / Quick-... Axiom« weltberühmt geworden):
-
Prämise: Selbst wenn es gelänge, alle Programmiersprachen der Welt durch eine einzige einheitliche Programmiersprache zu ersetzen – es wird auch dann noch genug Hersteller geben, die diese einzige, einheitliche Programmiersprache in einer eigenen Spezialentwicklung auf den Markt bringen.
-
Folgerung: Diese Spezialentwicklung wird zu nichts kompatibel sein außer zu sich selbst.
-
Einschränkung: Die Inkompatibilität erstreckt sich aber selbstverständlich auch auf verschiedene Versionsnummern derselben Spezialentwicklung.
Praktische Anwendung Programmiersprachen-Kompatibilität:
-
Da es keine einzige, einheitliche Programmiersprache gibt, ist das Wirrwarr total.
-
Du darfst es ausbaden.
Die 90-90-10-Regelung des Programmierprojekts:
-
Die ersten 90 Prozent des Programms brauchen 10 Prozent der verfügbaren Zeit.
-
Die restlichen 10 Prozent des Programms brauchen 90 Prozent der verfügbaren Zeit.
-
Du fängst immer mit diesen restlichen 10 Prozent an.
Konsequente Kunden-Ableitung aus der 90-90-10-Regelung:
Die 10 Prozent, mit denen Du angefangen hast, gehören zu der Programmroutine, die der Kunde zu guter Letzt wieder entfernt haben will.
Grays Programmiergesetz:
Für n+1 unwichtige Aufgaben wird die gleiche Zeit zur Durchführung erwartet wie für n Aufgaben.
Die erweiterte Epstein-Heisenberg-Unschärferelation:
Von den Parametern Zeit, Geld und Aufgabe lassen sich immer nur zwei zur gleichen Zeit exakt berechnen:
-
Wenn die Aufgabe bekannt ist und die zur Verfügung stehende Zeit, ist es unmöglich zu berechnen, wie teuer das Ganze wird.
-
Wenn die zur Verfügung stehende Zeit und der Etat bekannt sind, wird niemand wissen, welcher Teil der Aufgabe zu lösen ist.
-
Wenn die Aufgabe bekannt ist und auch der zur Verfügung stehende Etat, dann wird keiner wissen, ob und wann das Ziel erreicht wird.
-
Wer alle drei Parameter bestimmen kann, befaßt sich nicht mit dem Bereich der Aufgabenstellung.
Postulat vom Pflichtenheft:
-
Ausnahmen sind grundsätzlich zahlreicher als Regeln.
-
Von allen anerkannten Ausnahmen gibt es Ausnahmen.
-
Wenn man die Ausnahmen endlich im Griff hat, erinnert sich keiner mehr an die Regeln, für die sie gelten sollen.
Gesetz des Ärgers:
Sobald Du eine Datei löschst, weil Du sicher bist, daß Du sie nie wieder brauchst, wirst Du sie sofort benötigen.
Das Compiler-Strukturgesetz:
Je mehr Strukturbefehle Du in Deinem Programm verwendest, um so weniger wird Dein Compiler übersetzen.
Ergänzung zum Compiler-Strukturgesetz:
Übersetzt werden nur die fehlerhaften Strukturen.
Erste Erweiterung des Compiler-Strukturgesetzes:
Wenn der Compiler ein Programm beim ersten Durchlauf ohne Fehler akzeptiert, wird das fertige Programm nicht den erwünschten Output liefern.
Zweite Erweiterung des Compiler-Strukturgesetzes:
Verzichtest Du auf strukturierte Programmierung, wird der Computer unverständliche Fehlermeldungen produzieren. Die dazugehörigen Fehler wirst Du in Deinem Spaghetticode nicht finden.
Das Zeichenkonvertierungsgesetz:
- Du kannst Groß- nach Kleinbuchstaben und Klein- nach Großbuchstaben wandeln. Als Ergebnis wirst Du aber stets einen Text erhalten, bei dem die Hälfte aller Kleinbuchstaben groß und Großbuchstaben klein geschrieben sind.
- Du kannst den Anfangszustand nicht wieder herstellen.
- Richtig geschrieben bekommst Du den Text nur per Hand.
- Am Ende ist es weniger Arbeit, den ganzen Text neu einzutippen.
Frankes Blumenerkenntnis:
Egal, womit man die Blumen gießt: die Hälfte davon läuft immer über die Listings.
Helmuts Befehlsaxiom:
Ein Kommando kann gar nicht so kurz sein, als daß man nicht mindestens dreimal einen Tippfehler einbauen kann.
Ergänzung zu Helmuts Befehlsaxiom (auch das Entweder »<« oder »#« Gesetz genannt):
Tippst Du den Befehl fehlerfrei, wirst Du zwischen Befehl und abschließendem Return wahlweise ein »<«, ein »#« oder ein »+« schieben.
Erkenntnis des Anwendungsprogrammierers:
Grundsatz: Ein Anwender macht immer das Falsche:
-
Schreibst Du »Tippe (J) oder (N)«, tippt er »(J) oder (N)«.
-
Schreibst Du »Drücke [RETURN]« tippt er »[RETURN]«.
-
Schreibst Du »Drücke irgendeine Taste«, drückt er auf SHIFT oder betätigt die NUMLOCK-Taste.
Mulls Registererkenntnis:
-
Speicherst Du etwas in einem Register und merkst Dir genau, was Du dort gespeichert hast, vergißt Du das Register.
-
Merkst Du Dir das Register, dann wirst Du den Inhalt nicht mehr benötigen.
Die Freitag-Montag-Regel:
Ein Programm, das Du freitags ablieferst, siehst Du montags wieder.
Die drei grundlegenden Softwarehaus-Irrtümer:
-
Je größer das Programmiervorhaben, um so später werden grundlegende Ablauffehler entdeckt.
-
Wenn ein Problem verschwunden ist, gibt es immer noch Leute, die an einer Lösung arbeiten.
-
Mehr Leute für ein überfälliges Programmierprojekt abzustellen, verzögert die Fertigstellung.
Die Softwarehaus-Erkenntnis:
Dringlichkeit ist der Wichtigkeit umgekehrt proportional.
Grundsatz des Software-Engineerings:
Zeit ißt Geld.
Trepplins Stoßseufzer:
Es gibt zwei Methoden, fehlerfreie Programme zu schreiben. Aber nur die dritte funktioniert.