Bei komplexen Projekten reicht theoretische Planung allein oft nicht aus:

Erst Kreativität gibt Programmen die Würze

12.08.1988

Komplexe Computerprogramme zu entwerfen, ist aufwendig. Das Trial-and-Error-Verfahren könnte die praktische Entwicklung der Algorithmen vereinfachen, meint Friedrich-Wilhelm Bruns von der Universität Bremen. Hiermit sei nicht blindes Probieren gemeint, sondern der Verzicht auf eine allzu theoretische Vorausplanung.

In der heutigen Informatik ist die Meinung sehr verbreitet, ein Softwareprodukt müsse in den Schritten:

- klares Konzept (Was soll gemacht werden?)

- klarer Algorithmus (Wie soll es erfolgen?)

- Kodierung des Programms (Programmierung)

erstellt werden. Dieser Ansatz soll relativiert werden; in Anlehnung an Heinrich von Kleist "Über die allmähliche Verfertigung der Gedanken beim Reden" kann die These vertreten werden, daß auch der umgekehrte Weg sinnvoll sein kann, und sich erst beim Programmieren, - als kreativem Akt, - das genaue Konzept herausbildet.

Die strukturierte Software-Entwicklung kann mit dem Vorgehen eines Koches oder Komponisten verglichen werden, der sich ein geplantes Werk bis in alle Feinheiten theoretisch vorstellt, ein Handlungskonzept aufstellt und dies dann in das reale Produkt umsetzt oder umsetzen läßt.

Es mag einige große Köche und Komponisten geben, die ihre Werkzeuge so genau kennen, daß sie sich von vornherein alle Varianten vorstellen können. Meist wird das Werk (Gerichte oder Musik) jedoch interaktiv erzeugt. Von einer groben Vorstellung als Ausgangspunkt ergeben sich die Details aus dem Zusammenwirken der verfügbaren Mittel (Gewürze und Speisen) und der Intuition. Auf diese Weise können völlig neue Gerichte und Geschmacksrichtungen entstehen. Ähnlich kann ein kreativer Programmierer vorgehen.

Diese Individualisierung der Programmerstellung führt bei der schnellen Entwicklung von Hardware, Programmiersprachen und Strukturierungstechniken jedoch zu relativ teuren Programmen. Oft kann beim Wechsel von einer Computergeneration oder einer Anwendung auf die nächste wenig von dem bereits Entwickelten übernommen werden.

Den Entwicklungsprozeß zu objektivieren, ihn also von Programmierern, Anwendungen und der Interaktion Programmierer/Benutzer unabhängig zu machen, ist ein Hauptziel der Software-Technik.

Hier läßt sich eine Parallele feststellen zu der Entwicklung vom Handwerk zur industriellen Produktion. Softwaretechnik ist der Versuch, industrielle Produktionsverfahren auf die Software-Entwicklung zu übertragen, um damit Massensoftware billiger und Großsoftware handhabbar zu machen. Ähnlich wie bei der Fabrikfertigung besteht die Gefahr, daß die Produkte an Originalität verlieren.

Ein komplexes Programm ist nur schwer in allen Einzelheiten vorher zu planen. Vielmehr ergeben sich gerade beim Handeln spontan neue Ideen. Der Vorgang des Kodierens und Testens, als der konkretesten Stufe der Programmierung birgt Möglichkeiten zur Kreativität, wie sie beim Entwurf von Struktogrammen nicht bestehen.

Interaktives Programmieren, wie es mit Hilfe von Interpreten möglich ist, ist kreativ und chaotisch. Wird nachträglich strukturiert und dokumentiert (siehe die häufige Praxis guter Programmierer in Software-Entwicklungsumgebungen), so ist das Programm dann auch für Dritte verständlich.

Für den ersten eigenen Entwurf kann die spontane, nur grob vorgeplante Programmierung hilfreich sein; um das entwickelte Produkt anderen Programmierern und Benutzern verfügbar zu machen, ist eine Strukturierung und Dokumentation notwendig. Dementsprechend gibt es neben den Codegeneratoren, die aus einer strukturellen Beschreibung einen Programmcode erzeugen, Strukturgeneratoren, die aus einem Code eine Strukturbeschreibung erstellen.

Die Dynamik der Grafikhardware und Basissoftware erlaubt es dem heutigen Systementwick]er nicht, alle Funktionen des Systems vorher im Detail kennenzulernen um sie dann in einem Programm einzusetzen. Eine wesentliche Komponente des Entwicklungsprozesses ist der Umgang mit Systemfehlern und System-Reaktionen, die anders sind als in den Handbüchern beschrieben.

Ein zu detailliertes Design kann einen unnötigen Anwendungsaufwand verursachen. Darüber hinaus ergeben sich gerade durch Fehler im Programm oder in den Basisfunktionen Erkenntnisse über den Einsatz von Funktionen. Fehler und Irrtümer sind auch beim Programmieren ergiebige Quellen fürs Lernen und Entdecken.