Das typische Vorgehen zur Entwicklung von komplexen Programmen gliedert sich in fünf Phasen. Diese werden im folgenden kurz erläutert. Um klar zu machen, was gemeint ist, wird das folgende Problem gelöst:
Der Hamster soll seine fünf gesammelten Körner in seinem Lager ablegen.
In der Problemanalyse werden alle Fragen geklärt und Probleme analysiert, die mit dem Programm gelöst werden sollen. Bezogen auf den Hamstersimulator könnten das z.B. folgende Fragen sein:
Diese Fragen und deren Antworten werden in einem Anforderungsheft festgehalten. Somit kann in den späteren Phasen darauf zurückgegriffen werden.
Im Beispiel ergeben sich folgende Antworten:
In der Entwurfs-Phase wird versucht, die Fragen schon so zu gruppieren oder zu zerlegen, dass sie für die spätere Implementierung sinnvoll zusammengestellt sind. Hierfür kann man eines der beiden folgenden Prinzipien verwenden:
Außerdem können Lösungsideen oder -ansätze gesammelt werden, die für die Implementierung hilfreich sein können. Auch diese Phase wird im Anforderungsheft dokumentiert.
Für das Beispiel kann man sich für einen der beiden Wege entscheiden.
Erst in der dritten Phase fängt man an, zu programmieren. Die Ideen aus der Entwurfs-Phase werden implementiert, indem das ausgewählte Prinzip weiter verfolgt wird:
Die Ergebnisse dieser Phase werden in der Regel nicht im Anforderungsheft, sondern direkt im Quellcode mit Hilfe von Kommentaren dokumentiert.
Für das Beispiel könnten die einzelnen Lösungen so aussehen:
void main() { vor(); vor(); vor(); }
void main() { vor(); vor(); vor(); linksUm(); linksUm(); linksUm(); }
void main() { vor(); vor(); vor(); linksUm(); linksUm(); linksUm(); vor(); }
void main() { vor(); vor(); vor(); linksUm(); linksUm(); linksUm(); vor(); gib(); gib(); gib(); gib(); gib(); }
void vorBisWand() { while (vornFrei()) { vor(); } }
void rechtsUm() { linksUm(); linksUm(); linksUm(); }
void gibAlle() { while (!maulLeer()) { gib(); } }
void main() { vorBisWand(); rechtsUm(); vorBisWand(); gibAlle(); }
Die Phase des Testens ist sehr wichtig, z.B. um zu überprüfen, ob das Problem tatsächlich gelöst wurde.
Hier kann es passieren, dass man feststellt, dass es noch Probleme gibt. In diesem Fall muss man zurück in die Entwurfs- oder Implementierungsphase, um sicher zu stellen, dass alle möglichen Situationen vom Programm sicher behandelt werden. Dann beginnt der Kreislauf von neuem.
Im Beispiel könnte man beim Testen bemerken, dass bei der Lösung mit dem Prinzip der schrittweisen Verfeinerung nur ein bestimmter Anwendungsfall abgedeckt wird, nämlich wenn der Weg genau vier Kacheln lang ist und der Hamster genau fünf Körner im Maul hat. Hier sollte man noch nachbessern, indem den Programmcode so anpasst, dass man Schleifen verwendet. Die Lösung mit dem Prinzip der Aufteilung in Teilprobleme passt hier schon besser.
Die Phase der Dokumentation läuft parallel zu den anderen Phasen. Um Nachvollziehbarkeit zu gewährleisten, müssen alle Arbeitsschritte dokumentiert werden. Außerdem muss der Programmcode mit Kommentaren oder selbsterklärenden Methoden lesbar gemacht werden!