Eine der schlimmsten Krankenheiten, wenn nicht gar Geschwüre unter Programmierern ist der Satz „Aber es funktioniert doch!“, wenn man sie darauf hinweist, dass ihre Software fehlerhaft implementiert ist. Unabhängig davon, was wirklich falsch ist, oder wie groß die nötige Änderung ist. So aus Prinzip halt.
Ach was? Noch nie mitbekommen? Machen wir doch einfach einen einfachen Test: Man nehme die OpenSource-Sparte eines beliebigen Programmiererforums oder einen Bekannten, der gerade sein erstes eigenes Programm erfolgreich fertiggestellt hat. Man schaue sich dieses nun an und wird – meist relativ zügig – eine Reihe von Fehlern feststellen, was angesichts des Wissensstandes und der Tatsache, dass keiner perfekt ist, durchaus Okay ist. Wer bei diesem Test nicht lange nach Sicherheitslücken suchen möchte, nehme sich ein PHP-Forum und die darin anzutreffenden Code-Schnipsel vor. Gut, wir haben unseren Fehler? Wenn nicht, schlage ich mal einen (typischen) aus so ziemlich JEDEM Anfänger-Tutorial für PHP vor:
echo "Hallo " . $_GET['name'];
Gehen wir also jetzt zu unserem Testsubjekt, welches diesen Fehler in seinem Programm verbaut hat und schlagen vor, zur Verbesserung der Sicherheit seines Programms, stattdessen eine vernünftige Filterung der Ausgaben zu realisieren:
echo "Hallo " . htmlspecialchars($_GET['name']);
Nur eine winzige Änderung, die aber bei größeren Quelltexten durchaus etwas Aufwand in ihrer Umsetzung bedeuten kann. Je nach dem, ob unser Testsubjekt aber bereits einmal ordentlich mit solch einem Fehler auf die Fresse geflogen ist, wird sich aber bereits jetzt die Reaktion stark unterscheiden. Einsichtige und Lernwillige werden an dieser Stelle vermutlich den Fehler beheben, genauso wie auch Leute mit entsprechenden negativen Erfahrungen. Pupil Average, wie er häufig in Foren angemeldet ist, um seine Hausaufgaben zu erledigen lassen strauchelt hier aber oftmals bereits, weil „es doch funktioniert“. Na klar doch: Little Bobby Tables wird sicherlich erfreut sein, dem Nutzer unkontrolliert Nachrichten zuzusenden, oder sich eine Steuersenkung zu gönnen. War bestimmt beabsichtigte Programmfunktionalität!
Nun können solche Fehler auch dem erfahrensten Programmierer durchaus passieren. Was in der Software-Entwicklung immer wieder zu beobachten ist, ist nun eben dieses unbekümmerte Herangehen, dass Fehler bei einem Computer schon nie auftreten werden. Computer sind fehlerfrei! Und so dumm, im oben erwähnten Script, was anderes als einen Namen zu übergeben ist doch keiner! Dass der Dumme bei solch einer Annahme der Programmautor ist, ist dabei das eigentliche Problem. Denn wer gezielt Sonderfälle oder ungültige Eingaben ausprobiert und damit einen Computer dazu brachte, etwas zu tun, was er eigentlich nicht tun sollte, galt früher als Hacker und wurde als Gott behandelt.
Zugegeben: In jeder Situation immer genau zu wissen, was eine gültige Eingabe für ein Programm ist und was nicht, ist in komplexen Systemen eine große Herausforderung, zu deren Bewältigung sich aber im Laufe der Zeit teils informelle, teils formelle Regeln gebildet haben. Einer Variablen also mehr als einen von 26 möglichen Buchstaben zu ihrer Identifikation zuzuweisen ist da nur einer der vielen Vertreter informeller Hilfestellungen; dass man in Java Ausnahmesituationen entweder selbst behandeln oder aber für den Aufrufer kenntlich machen muss, eine der formellen.
Begibt man sich wiederum auf die Suche, findet man bereits nach kurzer Suche sehr gute Beispiele, die die Notwendigkeit für genau diese Regeln eindrucksvoll beweisen. Zugegeben: Das Tippen von 80-Zeichen-Bezeichnern kann ohne passende IDE extrem nervig werden, wer aber bereits einmal ein Dissambler-Listing lesen musste, wird aber auch die Vorzüge von Bezeichnern jenseits von var1 bis var539 zu schätzen wissen.
Diese Regeln, so nervig sie manchmal sein mögen und so arbeitsaufwändig sie oftmals in ihrer Umsetzung auch sind, sparen sie einem im Zweifelsfalle eine Menge Zeit und Arbeit bei der Suche nach Fehlern. Und sei es dadurch, dass das oftmals als unnötiges Rauschen wahrgenommene Geschriebsel zwischen den Code-Zeilen vielleicht doch einmal den entscheidenden Hinweis enthält, warum die aufgerufene Funktion für die übergebenen Werte, die Festplatte formatiert, statt die Antwort auf das Leben, das Universum und den ganzen Rest zu berechnen.
Zugegeben, ich bin auch kein Freund von Dokumentation. Wenn etwas Dokumentation benötigt, steht das an entsprechender Stelle im Quelltext. Also nicht als plakatfüllender Kommentar oberhalb einer einzelnen Anweisung (java.lang.Integer.value lässt grüßen), sondern skaliert auf den Nutzen. Statt also einzelne Prozeduren zu elaborieren, kann es durcchaus vorkommen, dass auf einer gesamten Bildschirmseite nur ein einziger Kommentar steht, der im Wesentlichen beschreibt, was eine Zeile drunter für den Compiler verständlich eh noch mal steht.
Womit wir auch den Punkt der Einfachheit hätten: Keiner öffnet auf der Autobahn zum Bremsen die Fahrertür, um mit ausgestrecktem Bein und der Haftkraft der eigenen Schuhsohle ausreichend kinetische in thermische Energie zu verwandeln – schaut man sich aber viele Programme an, so ist gerade dies die wohl beliebteste Vorgehensweise zum Lösen alltäglicher Probleme in der Software-Entwicklung. Sicherlich: Ich kann zwei Zahlen unter Verwendung eines Computer-Algebra-Systems addieren lassen; alternativ könnte ich mir diese aber auch einfach ordentlich typisiert geben lassen, um dann einfach eine einfache Addition zu programmieren.
Hmmm, ich glaub, ich übertreib grad etwas. Die 8GB RAM und 16 Kerne mit Hyperthreading wollen ja schließlich ausgelastet werden. Wäre doch sonst auch schade drum. Schließlich wartet ja noch ein 200 Watt-Gehäuse-Heizer mit HDMI-Anschluss auf Aufgaben. Wie hat man nur vor 10 Jahren überhaupt mit Computern arbeiten können?
Sicherlich, keiner ist ein Profi, aber dennoch sollte man an sich den Anspruch haben, wenn man etwas tut, dies richtig zu tun. Wenn in einem Kochbuch steht, geben Sie Salz hinzu, bedarf es einfach keiner Tagesproduktion der nahegelegenen Meerwasserentsalzungsanlage; schaut man aber auf heutige Software, so wird die Meerwasserentsalzungsanlage bereits mitgeliefert, damit man das Essen täglich neu in Eigenregie kochen kann. Leute: Computer sind nicht leistungsfähiger geworden, damit Ihr die Resourcen verschwenden könnt: Sie sind leistungsfähiger geworden, weil der technische Fortschritt neue Möglichkeiten eröffnet hat, die für die Bewältigung zusätzlicher genutzt werden könnten.
Und so schön ich Java und .NET in ihrer Grundidee finde, ein Framework von Algorithmen und Funktionen zu haben, die mir meine Arbeit als Programmierer erleichtern: Wirklich wohl fühle ich mich mit diesen Monstern nicht. Zuviel Bloat, zuviel Magie, zu wenig Optimierung.
Ja, es funktioniert. Aber es könnte viel besser!