Nach Karl Valentin |
Er: |
Wos is na des im Kucha drinna?
San des Fliagn? |
Sie: |
Naa, des san doch koa Fliagn.
Des san Sultaninen. |
Er: |
Woos? Sultaninen?
Da san mir ja Fliagn no liaba. |
|
Kochen ist eine Kunst, und Rezepte erleichtern die Arbeit, diese Kunst zu
erlernen. Wie in der Küche, so gibt es auch in der Informatik Zutaten,
Gewürze und Kräuter, die besser nicht gemeinsam verwendet werden
sollten und kulinarische Entgleisungen hervorbringen, die
gelegentlich nicht einmal dem Koch schmecken (ich denke da an so
naheliegende Dinge wie "Erdbeeren in Knoblauchsoße auf roher Seehundhaut")
Ein paar praxiserprobte Rezepte und Vorgehensweisen sollen deshalb nicht
fehlen:
Das Flußdiagramm erfreut sich in vielen Bereichen der Datenverarbeitung
immer noch großer Verbreitung. Insbesondere bei Nicht-Informatikern
ist diese Art der Aufschreibung einer Befehlsfolge sehr bekannt und zum Teil
auch beliebt, bietet sie doch einen deutlichen Blick auf die Abläufe
im Programm oder in einer Funktion. Wirklich? Ich gebe hier das klassische
Rezept für Spaghetti computese".
-
Man nehme: eine Aufgabe, die programmtechnisch zu lösen ist, Bleistift,
Radiergummi und eine ausreichende Menge Schreibpapier.
-
Ein erster Blick zeigt, daß die Lösung der Aufgabe aus einer Eingabe,
ein paar Verarbeitungsschritten und einer Ausgabe besteht. Die ersten
Kästchen werden gezeichnet.
-
Während des Zeichnens des dritten Kästchens (=zweiten
Verarbeitungsschrittes) fällt beim Entwerfen des Flußdiagramms
auf, daß manche Eingaben besser nicht verarbeitet werden sollten, da
sie von vornherein fehlerhaft sind. Es wird folglich eine Raute zwische Eingabe
und ersten Verarbeitungsschritt gemalt. Prüfen der Eingabe, Verzweigung
im Fehlerfall mittels Rückwärtspfeil zur Eingabe.
-
Endlich wieder zu den Verabeitungsschritten zurückgekehrt, stellt sich
heraus, daß der dritte Verarbeitungsschritt in 10 Durchgängen
gleicher Bauart erfolgen muß. Flugs wird die Vereinbarung einer Variablen
namens i vorgenommen. Eine weitere Raute prüft, ob i schon einen bestimmten
Wert erreicht hat, in diesem Falle 10. Wenn ja, dann geht es weiter zu Ausgabe,
wenn nein, dann muß nochmal der Schritt 3 durchlaufen werden.
-
Oha! Eigentlich sollte i in jedem der Schritte auch um 1 erhöht werden.
Schnell noch ein Kistchen vor die Raute.
-
Auf dem Zeichenblatt wirds langsam eng. Besser jetzt alles in der Mitte
aufteilen, auf zwei Blättern je einen halben Ablauf neu zeichnen und
mittels vier numerierten Verbindungskringeln (Konnektoren") logisch
aneinanderfügen.
-
Gedankenblitz! Die Variable i sollte vorsorglich mit 1 belegt werden. Also
noch eine Schachtel hineinquetschen. Unversehens gerät diese Box an
die Stelle zwischen dem Rücksprung und der Prüfung.
-
Manche der berechneten Ergebnisse sind im Sinne der Aufgabenstellung nicht
brauchbar; besser ist es, auch eine Prüfung der Ausgabe vorzunehmen
und ggf. einen Fehler zu melden. Raute und zwei Pfeile. Bei Fehlern sollte
dem Anwender des Programms die Chance gegeben werden, noch einmal den Ablauf
zu benutzen. Also Linie nach oben, neuer Konnektor - und weiter auf dem vorigen
Blatt. Verbindung zum ersten Verarbeitungsschritt.
-
Das Kästchen mit dem Zuweisen des Wertes 1 an die Variable i wirkt irgendwie
deplaziert. Warum eigentlich wird i mit 1 belegt, wenn sie danach ohnehin
um 1 erhöht wird? Besser, wir fassen das zusammen und machen eine Anweisung
daraus, die i gleich den Wert 2 zuweist.
-
Eigentlich wäre es ja sinnvoll, dem Anwender nicht zu zwingen, den Ablauf
nochmal zu nutzen, vielleicht sollte ja vorher gefragt werden, obs
nochmal gewünscht ist. Also schleunigst auf Blatt 2 eine Ausgabe machen,
die Antwort einlesen und danach mit einer weiteren Verzweigung entscheiden,
ob, oder ob nicht. Ein Pfeil nach unten, einer nach oben und der nächste
Konnektor ist fällig. Erstes Blatt, vor die Eingabe.
-
Moment mal, hätte das vorhin nicht auch im Fehlerfall sinnvoll stattfinden
sollen? Nur welcher Konnektor war dafür zuständig?
-
Wozu diente i denn gleich wieder? Achso ja, 10 Schleifendurchläufe.
Hmm, 10-2 = 8. Besser, der Endewert wird auf 12 erhöht, denn 12-2 =10.
-
Vor die Eingabe sollte höflicherweise eine Ausgabe gesetzt werden, die
den Anwender des Programms freundlich um eine Eingabe bittet. Dasselbe sollte
auch bei fehlerhaften Eingaben geschehen. (Noch ein letzter Schritt... Ich
bestreite, daß ich unter Triakaidekaphobie leide!)
-
Das mit den 12-2=10 kann doch nicht stimmen! Beim Schleifenende wird erst
nach der Verarbeitung geprüft. Die Schleife läuft also einmal zu
oft. Der Wert 12 wird durch 11 ersetzt.
Das ist das Basisrezept für Spaghetti computese". Zur Erinnerung:
es sollte nur die einfache Verarbeitung einer Eingabe und ein, zwei elementare
Fehlerprüfungen stattfinden.
Das Flußdiagramm gibt sehr genau die stolpernde Evolution der
Gedankengänge des Programmkochs wieder, stellt aber weder ein Mittel
zur Unterstützung eines strukturierten Gedankenflusses dar, noch
schützt es vor wildesten Fehlern.Vielleicht erahnen Sie, warum ich seit
über zwanzig Jahren eine tiefverwurzelte Abneigung gegen Flußdiagramme
habe.
P.S. Haben Sies gemerkt? Die Schleife aus dem Rezept ist eine
Endlosschleife.
Goldene Regeln für den
Softwareentwurf
Nichts ist einfacher, als Software zu entwickeln. Aber selbst bei solch banalen
Arbeiten treten gelegentlich Fehler auf oder Neulinge fühlen sich grundlos
unsicher. Die "Goldenen Regeln" sollen hier eine helfende Hand reichen.
-
Verwenden Sie Arrays zum Speichern von Daten, egal welcher Art! Nur blutige
Anfänger benutzen Typkonzepte und die sogenannten strukturierten"
Datentypen. Objektorientierte Programmierung und andere dubiose Moderscheinungen
aus dem akademischen Umfeld sollten Sie links liegen lassen!
-
Programmieren Sie Basisfunktionen und Teilabläufe, bevor Sie
mit der Spezifikation beginnen! Wenn die meisten Funktionen schon bekannt
sind, gibt es das einen schönen Baukasten, aus dem Sie dann schöpfen
können. Schließlich muß der Erfolg der LEGO-Steine irgendwo
herkommen.
-
Machen Sie Ihren Kunden, Auftraggebern und sich selbst klar, daß jedes
Programm viel Speicher braucht, sehr langsam ist und einen schnelleren Rechner
benötigt.
-
Machen Sie Fehler! Jedes Programm, das gut ist, muß eine Anzahl Fehler
enthalten. Wie anders könnten Sie die Benutzer des Programms davon
überzeugen, daß Sie hier eine schwierige Aufgabe lösen
mußten? Abgesehen davon, wäre es doch schade, wenn Sie nicht nur
die Erwartungshaltung der User enttäuschten, sondern sich
darüberhinaus auch noch den Weg in die Zukunft verbauen. Kein Mensch
kauft die Nachfolgeversion Ihrer Software, wenn keine Fehler zu beheben sind.
Was Billy Gates kann, können Sie schon lange!
-
Verwenden Sie Flußdiagramme! Die sehen beeindruckend aus und zeigen
jedem Auftraggeber, daß Sie das Thema im Detail durchdrungen haben.
-
Lassen Sie Ihre Software organisch wachsen! Nutzen Sie jede Chance, Abläufe
vielfältig verzweigen zu lassen und Ihre User mit immer neuen Features
zu beglücken. Gute Software zeichnet sich durch stetige Jahresringe
aus, die den Stamm des "Baumes" dicker werden lassen. Jeder bewundert
tausendjährige knorrige Eichen, keiner den Weihnachtsbaum vom letzten
Jahr.
-
Datensicherung und Versionsverwaltung sind Dinge, die dem wahren Entwickler
nicht gut zu Gesicht stehen. Profis beherrschen ihre Software! Wenn
wirklich mal was schiefgeht, ist die Sache eh' gleich neu programmiert.
-
Verzichten Sie auf Kommentare! Nur Warmduscher schreiben Kommentare. Wer
kommentiert, weiß sowieso nicht, wie sein Programm funktioniert. Kommentare
sind Zeitverschwendung. Der Auftraggeber zahlt für Code, aber nicht
für Romane!
-
Verweigern Sie den Gehorsam, falls Ihnen Programmierrichtlinien aufgedrückt
werden sollen! Programmierrichtlinien behindern die Kreativität und
stellen unnütze Einschränkungen dar - Im Vertrauen gefragt: Wer
hält sich schon an Programmierrichtlinien? (Eben! Sag ich
doch!)
-
Wirkliche Könner benutzen zur Ablaufsteuerung in weit entfernten Funktionen
globale Variablen. Globale Variablen sind das A und O raffinierter
Programmierung. Selbst wenn mal was nicht läuft, wie Sie wollten, gehen
Sie der Sache nach! Mit großer Wahrscheinlichkeit haben Sie einen neuen
Algorithmus gefunden. Macht nichts, wenn keiner weiß, wofür er
gut ist. Aber wenn Sie die Lösung haben, läßt sich ein geeignetes
Problem sicher finden. Vielleicht läßt sich sogar Ihre
ursprüngliche Aufgabenstellung passend modifizieren? Die Chancen stehen
gut, daß dann der Algorithmus nach Ihnen benannt wird und Sie berühmt
werden.
Ausnahmsweise ernst gemeint: Es gibt wenige Dinge in unserem Fachgebiet,
die mir spontan die Galle übergehen lassen. Hier die idiotischsten
Bemerkungen:
-
"Wieso Softwarebeschreibung? Du hast doch den Quellcode!" Der Quellcode
ist schlicht gesagt keinen Schuß Pulver wert, wenn dahinter keine saubere
Software-Architektur und ein gutes Design stehen. Der Quellcode ist sogar
weniger wert als ein Flußdiagramm, denn das täuscht wenigstens
noch etwas Logik vor, doch der Code ohne Dokumentation ist ein geistiges
Armutszeugnis - besonders für jene, die ihn für einen
Spezifikationsersatz halten.
-
"Wenn die Schleife nicht richtig zählt, dann erhöhen/erniedrigen
wir den Wert der Ende-Bedingung." Schluß! Stecker raus! Wer so
argumentiert, hat von den elementarsten Dingen der Programmierung keinen
Dunst. So eine Äußerung sollte Anlaß für eine fristlose
Kündigung sein.
-
"Kaufen Sie halt einen schnelleren Rechner!" Nein. Ich suche mir einen
besseren Softwareentwickler. Wer so redet, hat das Wesen der Algorithmik
nicht verstanden. Nicht jedes Vorbild, selbst wenn es gewisse wirtschaftlich
erfolgreiche Unternehmen sein mögen, rechtfertigt die Übertragung
derer Beschränktheit auf die eigenen Programme.
-
"Software-Architektur? Ja, das ist Java!" Quatsch! Java ist keine
Architektur, sondern eine Programmiersprache wie andere auch. Selbst ein
reichhaltiger Fundus an Bibliotheken ist kein Ersatz für die Gestaltung
einer sauberen Software-Architektur. Wer so redet, sollte sich sein Lehrgeld
an der Werkskasse auszahlen lassen und schleunigst das Weite suchen, umsatteln
und Kartoffeln pflanzen. Die werden ganz sicher dick.