Legacy ist jeder Code, den Sie lieber ersetzen als damit arbeiten möchten. In Anbetracht der Einstellung der meisten Programmierer zu den meisten vorhandenen Codes beinhaltet dies normalerweise fast alles außer dem, was Sie gerade aktiv schreiben (und bei einem großen Projekt, bei dem Sie zu einem eingefrorenen Design codieren müssen, auch das, was Sie gerade schreiben) Moment kann auch einbezogen werden).
- Die Betonung "eher" soll vermitteln, dass Legacy-Code auch bedeutet, dass Sie nicht mehr daran arbeiten können, obwohl Sie dies lieber nicht möchten. Ich bin mir nicht sicher, ob die Betonung ausreichend war. Gründe dafür können variieren. Einige sind einfach zu groß und komplex, um sie zu ersetzen. Andere sind Schnittstellen zu anderen Systemen. Wieder andere sind von Politik und Persönlichkeiten getrieben (zum Beispiel ist der Code schrecklich, aber das Standbaby war unglaublich).
- Ein weiterer Punkt , den ich kann nicht genug betont haben , ist , dass , während die Qualität des Codes kann ein Faktor sein, es ist selten (wenn überhaupt) der einzige Faktor - und oft nicht einmal ein besonders wichtiges.
- Ich denke, die Leute, die Unit-Tests als einzigen bestimmenden Faktor durchführen, sind wie der Typ, der unter der Straßenlaterne nach dem Ohrring sucht, den seine Frau einen Block entfernt abgelegt hat. Das Licht ist vielleicht besser, aber Sie schauen immer noch am falschen Ort. Denken Sie nach , bevor Sie die Kool-Aid trinken .
- (Eine Folge zu 3.) Es scheint mir, dass einige Leute mehr darüber sprechen, wie sie sich Dinge wünschen, als wie sie wirklich sind. Wenn John Conways " Game of Life für einen Apple IIc plus nicht Erbe ist, dann ist es , weil es ausreichend klein und einfach ist , dass es einfach ist , von Grund auf neu zu implementieren. Der perfekteste Komponententest, der jemals geschrieben wurde, ändert nichts an diesem einen Jota .
Der letzte Punkt führt zu zwei weiteren Punkten, von denen ich denke, dass sie oft zutreffen.
Erstens wird Code häufig als Erbe beibehalten, auch wenn dies eigentlich nicht der Fall sein sollte. Übergeordnete Manager gehen im Allgemeinen davon aus, dass die Neuimplementierung eines Systems genauso viel oder mehr kostet als die ursprüngliche Implementierung, was selten der Fall ist.
Zweitens sind Unit-Tests ein zweischneidiges Schwert. Sie machen es allzu leicht zu denken, dass lokalisierte Änderungen in der Implementierung wirklich wichtig sind. Um signifikante Verbesserungen in einem größeren System zu erzielen, müssen Sie häufig (normalerweise?) Genug am Gesamtdesign ändern, dass viele (wenn nicht die meisten) Komponententests irrelevant werden. Leider können die vorhandenen Unit-Tests und die Einstellung, die sie hervorrufen, es allzu leicht machen, die wirklich notwendigen Änderungen zu ignorieren.
Vielleicht hilft ein Beispiel: Nehmen wir an, ein Programm verfügt über eine UI- Bibliothek mit hervorragenden Komponententests und mehrere Programme, die diese Bibliothek verwenden. Jemand aus der oberen Führungsebene ist davon überzeugt, dass "web enabled" wichtig ist (und nehmen wir in diesem Fall aus Gründen der Argumentation an, dass er tatsächlich Recht hat). Nach sorgfältiger Prüfung stellen die mittleren Manager fest, dass ihre aktuellen Komponententests ausreichen, um von einer Benutzeroberfläche, die über die Fensterfunktion des lokalen Betriebssystems angezeigt wird, zu einer Remoteanzeige über HTML / CSS / AJAX zu wechseln, wobei die ursprüngliche Eingabevalidierung beibehalten wird.
Das ist toll, nicht wahr? Es zeigt, wie nützlich Unit-Tests sein können. Wir haben die gesamte Implementierung der gesamten Benutzeroberfläche ausgetauscht, aber sichergestellt, dass das Erscheinungsbild und die Funktionalität praktisch konsistent bleiben und alle Benutzereingaben überprüft werden, um die Datenintegrität sicherzustellen. Unit-Tests haben den Tag gerettet!
Oder nicht! Diese großartige, hochflexible, sorgfältig auf Unit-Tests getestete UI-Bibliothek hat allen Beteiligten vor Augen geführt, dass für dieses Programm auf dem Markt für seine Benutzer eine webbasierte UI absolut falsch ist. Was wirklich benötigt wird, ist ein Webservice mit einer REST-fähigen Schnittstelle und überhaupt keiner eigenen Benutzeroberfläche.
Nun ist es sicherlich wahr, dass Unit-Tests nicht an sich die Fähigkeit der Menschen beeinträchtigen, ihren Markt zu verstehen oder zu erkennen, dass dies wirklich notwendig ist. Gleichzeitig fällt einem die alte Linie um Hämmer und Nägel geradezu ein. Es kann noch schlimmer sein , wenn Sie nicht nur haben einen Hammer, aber eine haben viel Erfahrung mit diesem Hammer, und wissen , es ist ein wirklich ein qualitativ hochwertiges Hammer, unglaublich gut in vielen verschiedenen Situationen funktioniert. Die Tatsache, dass es in so vielen Situationen so gut ist, macht es noch schwieriger zu erkennen, ob es sich um das völlig falsche Werkzeug für den jeweiligen Job handelt.