Es gibt ein übergeordnetes Prinzip, das die Notwendigkeit einer Umgestaltung und Optimierung sowohl im Wasserfall als auch in Agile regelt: YAGNI (Sie werden es nicht brauchen). Ein zweites Prinzip ist die Folge des ersten: "Vorzeitige Optimierung ist die Wurzel allen Übels", das Kodierungsäquivalent des allgemeinen Sprichworts "Der Feind der Exzellenz ist Perfektion".
Nehmen wir die Prinzipien und wenden sie an. Sie müssen einen ETL-Algorithmus erstellen, der eine Datei eines bestimmten Typs verwendet, deren Informationen extrahiert und diese Informationen dann in eine Datenbank einfügt. Ihr Ziel für diese Woche (für unsere Zwecke spielt es keine Rolle, ob Sie sich in einem Agile- oder SDLC-Shop befinden) ist es, dies zu erreichen.
Sie sind ein kluger Kerl, und Sie haben einen Einblick in das Gesamtbild erhalten. Sie wissen, dass dies nicht der einzige Dateityp ist, für den das Projekt eine ETL benötigt. Sie sollten diesen ETL-Algorithmus so implementieren, dass er auch für einen anderen Dateityp funktioniert, der nur geringfügige Unterschiede aufweist. Dies würde YAGNI verletzen. Ihre Aufgabe ist es nicht, den Algorithmus für diese andere Datei zu entwickeln. Es soll der Algorithmus für die eine Datei entwickelt werden, die bis Ende der Woche benötigt wird. Um dieses Ziel zu erreichen und die Abnahmetests zu bestehen, müssen Sie diesen Algorithmus entwickeln und ordnungsgemäß funktionieren lassen. Sie werden den zusätzlichen Code "nicht brauchen", damit er mit der anderen Datei funktioniert. Sie denken vielleicht, es spart Ihnen Zeit, es jetzt zu integrieren, und Sie haben vielleicht Recht, aber Sie könnten auch furchtbar falsch liegen. Der Algorithmus für die andere Datei muss möglicherweise in einem Bereich des Systems verwendet werden, in dem Ihr Code nicht verwendet werden kann, oder die Anforderungen für die neue Datei unterscheiden sich möglicherweise von denen für Ihre in einer Weise, die Sie nicht kennen (in Agile diese) Anforderungen existieren möglicherweise noch nicht). In der Zwischenzeit haben Sie Zeit verschwendet und die Komplexität Ihres Algorithmus unnötig erhöht.
Jetzt ist es nächste Woche, und als zweifelhafte Belohnung für Ihre hervorragende Arbeit am ersten Algorithmus wurde Ihnen die Aufgabe übertragen, die Algorithmen für zwei neue Dateitypen zu erstellen. Jetzt benötigen Sie zusätzlichen Code, damit Ihr Algorithmus mit mehr Dateien funktioniert. Sie können Ihren vorhandenen Algorithmus mithilfe eines Vorlagenmethodenmusters erweitern, das ein Grundmuster mit dateispezifischen Einzelschritten verwendet, oder Sie können einfach eine gemeinsame Schnittstelle aus Ihrem vorhandenen Algorithmus ableiten, zwei neue entwickeln, die der Schnittstelle folgen, und sie anschließen Ein Objekt, das auswählen kann, welcher Algorithmus verwendet werden soll.
Während der Entwicklung wissen Sie, dass das System 10 KB Rohdaten pro Sekunde verarbeiten muss. Sie führen einen Auslastungstest durch und stellen fest, dass Ihr anfänglicher Entwurfsalgorithmus 8 KB / s verarbeitet. Nun, das wird die AATs nicht bestehen. Sie werfen einen Blick darauf und sehen, dass Ihr Algorithmus eine O (mein Gott) -Komplexitätsschleifenstruktur enthält. Sie rationalisieren es und erhalten 12 KB / s. "Ziemlich gut", denken Sie, "aber wenn ich eine so schlechte Schleife im Code hätte, was kann ich sonst noch rasieren?". Buzz Sie haben gerade die Regel "Vorzeitige Optimierung" verletzt. Ihr Code funktioniert und erfüllt alle Anforderungen. Sie sind "fertig", bis die Anforderungen auf 15 KB / s aktualisiert werden. In diesem Fall ziehen Sie den Code zurück und suchen nach Verbesserungsmöglichkeiten.
Befolgen Sie diesen einfachen Prozess während der Entwicklung, ob in Agile oder in herkömmlichen SDLCs: "Lassen Sie es beim ersten Durchgang funktionieren. Machen Sie es beim zweiten Durchgang hübsch. Beim dritten Durchgang machen Sie es SOLID." Wenn Sie zum ersten Mal eine Codezeile erstellen, müssen Sie dafür sorgen, dass dieser Code seine Aufgabe korrekt und fehlerfrei erledigt. Achten Sie jedoch nicht zu sehr auf die Entwurfsregeln in diesem Code, wie Sie alles wissen, was Sie gerade wissen. ' Ich werde diesen Bereich nie wieder berühren. Wenn Sie das nächste Mal diese Codezeile besuchen, haben Sie sich einfach als falsch erwiesen. Es ist kein einmaliges Teil des Systems mehr. Refactor es für Lesbarkeit, Prägnanz des Codes und / oder DRY-Prinzipien (Sie haben möglicherweise einen Code kopiert, um etwas fünfmal zu tun; Refactor das in eine Schleife und / oder einen Methodenaufruf). Wenn Sie zum dritten Mal in oder um diese Codezeile arbeiten,
O(my God)-complexity
wenn nichts anderes, brachte mich zum Lachen!