{"id":751,"date":"2011-07-12T15:31:26","date_gmt":"2011-07-12T13:31:26","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=751"},"modified":"2011-07-12T15:31:26","modified_gmt":"2011-07-12T13:31:26","slug":"es-funktioniert-doch","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=751","title":{"rendered":"Es funktioniert doch!"},"content":{"rendered":"<p>Eine der schlimmsten Krankenheiten, wenn nicht gar Geschw\u00fcre unter Programmierern ist der Satz &#8222;Aber es funktioniert doch!&#8220;, wenn man sie darauf hinweist, dass ihre Software fehlerhaft implementiert ist. Unabh\u00e4ngig davon, was wirklich falsch ist, oder wie gro\u00df die n\u00f6tige \u00c4nderung ist. So aus Prinzip halt.<!--more--><\/p>\n<p>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 &#8211; meist relativ z\u00fcgig &#8211; 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\u00fccken suchen m\u00f6chte, 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\u00e4nger-Tutorial f\u00fcr PHP vor:<\/p>\n<pre lang=\"php\">echo \"Hallo \" . $_GET['name'];<\/pre>\n<p>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\u00fcnftige Filterung der Ausgaben zu realisieren:<\/p>\n<pre lang=\"php\">echo \"Hallo \" . htmlspecialchars($_GET['name']);<\/pre>\n<p>Nur eine winzige \u00c4nderung, die aber bei gr\u00f6\u00dferen 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\u00e4ufig in Foren angemeldet ist, um seine Hausaufgaben zu erledigen lassen strauchelt hier aber oftmals bereits, weil &#8222;es doch funktioniert&#8220;. Na klar doch: <a href=\"http:\/\/xkcd.com\/327\/\">Little Bobby Tables<\/a> wird sicherlich erfreut sein, dem Nutzer unkontrolliert Nachrichten zuzusenden, oder sich <a href=\"http:\/\/blog.fefe.de\/?ts=b70df7a4\">eine Steuersenkung<\/a> zu g\u00f6nnen. War bestimmt beabsichtigte Programmfunktionalit\u00e4t!<\/p>\n<p>Nun k\u00f6nnen solche Fehler auch dem erfahrensten Programmierer durchaus passieren. Was in der Software-Entwicklung immer wieder zu beobachten ist, ist nun eben dieses unbek\u00fcmmerte Herangehen, dass Fehler bei einem Computer schon nie auftreten werden. Computer sind fehlerfrei! Und so dumm, im oben erw\u00e4hnten Script, was anderes als einen Namen zu \u00fcbergeben ist doch keiner! Dass der Dumme bei solch einer Annahme der Programmautor ist, ist dabei das eigentliche Problem. Denn wer gezielt Sonderf\u00e4lle oder ung\u00fcltige Eingaben ausprobiert und damit einen Computer dazu brachte, etwas zu tun, was er eigentlich nicht tun sollte, galt fr\u00fcher als Hacker und wurde als Gott behandelt.<\/p>\n<p>Zugegeben: In jeder Situation immer genau zu wissen, was eine g\u00fcltige Eingabe f\u00fcr ein Programm ist und was nicht, ist in komplexen Systemen eine gro\u00dfe Herausforderung, zu deren Bew\u00e4ltigung sich aber im Laufe der Zeit teils informelle, teils formelle Regeln gebildet haben. Einer Variablen also mehr als einen von 26 m\u00f6glichen 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\u00fcr den Aufrufer kenntlich machen muss, eine der formellen.<\/p>\n<p>Begibt man sich wiederum auf die Suche, findet man bereits nach kurzer Suche sehr gute Beispiele, die die Notwendigkeit f\u00fcr 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\u00fcge von Bezeichnern jenseits von var1 bis var539 zu sch\u00e4tzen wissen.<\/p>\n<p>Diese Regeln, so nervig sie manchmal sein m\u00f6gen und so arbeitsaufw\u00e4ndig 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\u00f6tiges Rauschen wahrgenommene Geschriebsel zwischen den Code-Zeilen vielleicht doch einmal den entscheidenden Hinweis enth\u00e4lt, warum die aufgerufene Funktion f\u00fcr die \u00fcbergebenen Werte, die Festplatte formatiert, statt die Antwort auf das Leben, das Universum und den ganzen Rest zu berechnen.<\/p>\n<p>Zugegeben, ich bin auch kein Freund von Dokumentation. Wenn etwas Dokumentation ben\u00f6tigt, steht das an entsprechender Stelle im Quelltext. Also nicht als plakatf\u00fcllender Kommentar oberhalb einer einzelnen Anweisung (java.lang.Integer.value l\u00e4sst gr\u00fc\u00dfen), 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\u00fcr den Compiler verst\u00e4ndlich eh noch mal steht.<\/p>\n<p>Womit wir auch den Punkt der Einfachheit h\u00e4tten: Keiner \u00f6ffnet auf der Autobahn zum Bremsen die Fahrert\u00fcr, um mit ausgestrecktem Bein und der Haftkraft der eigenen Schuhsohle ausreichend kinetische in thermische Energie zu verwandeln &#8211; schaut man sich aber viele Programme an, so ist gerade dies die wohl beliebteste Vorgehensweise zum L\u00f6sen allt\u00e4glicher Probleme in der Software-Entwicklung. Sicherlich: Ich kann zwei Zahlen unter Verwendung eines Computer-Algebra-Systems addieren lassen; alternativ k\u00f6nnte ich mir diese aber auch einfach ordentlich typisiert geben lassen, um dann einfach eine einfache Addition zu programmieren.<\/p>\n<p>Hmmm, ich glaub, ich \u00fcbertreib grad etwas. Die 8GB RAM und 16 Kerne mit Hyperthreading wollen ja schlie\u00dflich ausgelastet werden. W\u00e4re doch sonst auch schade drum. Schlie\u00dflich wartet ja noch ein 200 Watt-Geh\u00e4use-Heizer mit HDMI-Anschluss auf Aufgaben. Wie hat man nur vor 10 Jahren \u00fcberhaupt mit Computern arbeiten k\u00f6nnen?<\/p>\n<p>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\u00e4glich neu in Eigenregie kochen kann. Leute: Computer sind nicht leistungsf\u00e4higer geworden, damit Ihr die Resourcen verschwenden k\u00f6nnt: Sie sind leistungsf\u00e4higer geworden, weil der technische Fortschritt neue M\u00f6glichkeiten er\u00f6ffnet hat, die f\u00fcr die Bew\u00e4ltigung zus\u00e4tzlicher genutzt werden k\u00f6nnten.<\/p>\n<p>Und so sch\u00f6n 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\u00fchle ich mich mit diesen Monstern nicht. Zuviel Bloat, zuviel Magie, zu wenig Optimierung.<\/p>\n<p>Ja, es funktioniert. Aber es k\u00f6nnte viel besser!<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=751&amp;md5=e1506b8bbc1eac4bb537aa6f6b965537\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Eine der schlimmsten Krankenheiten, wenn nicht gar Geschw\u00fcre unter Programmierern ist der Satz &#8222;Aber es funktioniert doch!&#8220;, wenn man sie darauf hinweist, dass ihre Software fehlerhaft implementiert ist. Unabh\u00e4ngig davon, was wirklich falsch ist, oder wie gro\u00df die n\u00f6tige \u00c4nderung ist. So aus Prinzip halt.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[29],"tags":[14,98,22,95,69,128,21,35],"class_list":["post-751","post","type-post","status-publish","format-standard","hentry","category-software","tag-bugs","tag-developement","tag-fefe","tag-gesellschaft","tag-internet","tag-meinung","tag-php","tag-xkcd"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/751","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=751"}],"version-history":[{"count":2,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/751\/revisions"}],"predecessor-version":[{"id":1071,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/751\/revisions\/1071"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}