Liebe Leserinnen, liebe Leser,
heute möchte ich meine neueste Erfahrung teilen, die ich während des Schreibens eines kleinen Lernprogramms gesammelt habe. Aber, dieses Projekt hat sich leider als eine große Katastrophe herausgestellt (Interessanten können den Quellcode hier)) herunterladen. Lasst uns am Anfang starten: Der Hauptgrund des Schreibens dieses Programms war meine Interesse an Maus- und Tastaturereignisse der OpenCV-Bibliothek, und deswegen war der ursprüngliche Code nicht großer als ein main-Funktion plus ein paar zusätzliche Hilffunktionen. Weil ich den Code über diese Größe (ursprünglich) nicht erweitern wollte, habe ich gedacht, dass Unit-Tests nicht erforderlich sind (obwohl es eine gute Gelegenheit für ein bisschen Übung wäre). Das war Fehler #1.
Nach diesem Punkt habe ich gedacht, dass die Hinzufügung von ein paar Features toll wäre, weil ich dadurch noch mehr Funktionen der OpenCV-Bibliothek mithilfe eines einzigen Programms ausprobieren könnte. Das war Fehler #2. Der Fehler war nicht der Bedarf an neue Features, sondern die Tatsache, dass die Erweiterung nicht von Anfang an geplant war, und deswegen lief die Geschichte nach eine unvermeidbare Richtung. Weil es keine Planung gab, startete ich neue Funktion je nach Bedarf hinzuzufügen, und als die Komplexität des Programms nahm zu, starteten die neue Funktionen globale Variablen für Kommunikation zu brauchen. Nachdem etliche globalen Variablen aufgestapelt wurden, musste einige der Funktionen und globale Variablen in eine gesonderte Klasse umgezogen werden. Leider wurde die Klasse zu groß, und sie musste in zwei, drei, usw. Teile gespaltet werden. Eine Klassenstruktur war bald nötig, um die Klassen irgendwie zu organisieren und einen Zusammenhang im Programm zu etablieren.
Aber der Bedarf an neuen Funktionalitäten endete hier nicht, weil ich mich entschieden habe, ein funktionierbares Programm namens oCVPaint zu bauen, das völlig auf OpenCV basiert würde (Fehler #3). Mal wieder, der Fehler war nicht der Versuch, ein Programm zu schreiben, sondern (mal wieder) die grundsätzlich veränderte Absicht. Das ist auch erwähnenswert, dass ursprünglich der Zweck des Programms der Test der Ereignisbehandlug war, und später hat dieses Testprogramm in ein kleines Spielprogramm für die Tests der zusätzlichen OpenCV Funktionalitäten gewachsen. Am letzten Schritt versuchte das Programm in ein völlig ausgearbeitetes Programm zu werden. Natürlich habe ich es nicht geplant, ein nutzbares Programm für das Publikum zu machen, aber wer weiß, was mir später einfallen lassen könnte.
Sowieso, neue Absicht braucht neue Funktionalität, also eine einfache Klassenstruktur reichte nicht mehr. Der vorhandene Code musste irgendwie auf einen Art von GUI-Bibliothek umgewandelt werden, um die neue Anforderungen erfüllen zu können. Weil diese Klassen ad hoc entwickelt wurden (Fehler #4), war Refactoring eine große Bemühung. Ich konnte nicht aufhören zu denken, dass dieser Code ein treuer Beispiel für Spaghetticode war, das von neuer Funktionalität sehr schwierig erweitert werden konnte. In Kürze habe ich das begriffen, dass ich mit Refactoring viel mehr Zeit als mit dem Schreiben von neuen Code verbracht habe. Tatsächlich gab es Fälle, wo ich eine ganze Programmiersitzung mit dem Refactoring verbringen musste, um die Gelegenheit für die Hinzufügung von etwas Neues zu haben.
Natürlich, das abschließende Urteil war die Aufgabe des Projekts, weil produktive Zeit sich (aus dem Gesichtspunkt des Lernens) zu schnell um Null verringert hat. Was würde ich dann nächstes Mal anders machen? Falls ich mich wieder entschieden hätte, ein Lernprojekt zu erweitern, würde ich die ganze Sache von Grund auf neustarten, und ich würde die Notwengiglkeit der zukünftigen Erweiterungen auch überlegen. Ich würde Unit-Tests von Anfang an auch schreiben, weil die Tests zusätzlich zu den offensichtlichen Vorteilen eine Art von Leitlinie für den Entwurf des Programms sind (darüber ist in diesem Buch mehr zu finden).
Lohnt es sich die Zeit damit zu verbringen? Zweifellos. Würde ich das gleichermaßen machen? Nein. Das ist dennoch der Zweck dieser Erlebnis, und hoffentlich werde ich in der Zukunft ähnliche Probleme begegnen, weil ich dieses Projekt für etwas sehr Lehrreiches halte.
Wie immer, vielen Dank fürs Lesen.