Einige Entwickler / Manager sehen daher einen Nutzen darin, weniger Code zu schreiben, um die Dinge zu erledigen, sodass weniger Code zu warten ist
Hier geht es darum, das eigentliche Ziel aus den Augen zu verlieren.
Was zählt, ist die Verkürzung der Entwicklungsstunden . Das wird in Zeit (oder gleichwertigem Aufwand) gemessen, nicht in Codezeilen.
Dies ist so, als würde man sagen, dass die Autohersteller ihre Autos mit weniger Schrauben bauen sollten, da das Einschrauben einer Schraube nicht null Zeit kostet. Das ist zwar pedantisch korrekt, der Marktwert eines Autos wird jedoch nicht durch die Anzahl der Schrauben definiert oder nicht. Ein Auto muss vor allem leistungsfähig, sicher und wartungsfreundlich sein.
Der Rest der Antwort ist ein Beispiel dafür, wie sauberer Code zu Zeitgewinnen führen kann.
Protokollierung
Nimm eine Anwendung (A) ohne Protokollierung. Erstellen Sie nun die Anwendung B, die dieselbe Anwendung A ist, jedoch mit Protokollierung. B wird immer mehr Codezeilen haben, und daher müssen Sie mehr Code schreiben.
Aber viel Zeit wird darauf verwendet, Probleme und Fehler zu untersuchen und herauszufinden, was schief gelaufen ist.
Bei Anwendung A können Entwickler den Code nicht mehr lesen und müssen das Problem fortlaufend reproduzieren und den Code schrittweise durchgehen, um die Ursache des Problems zu ermitteln. Dies bedeutet, dass der Entwickler von Beginn der Ausführung bis zum Ende in jeder verwendeten Ebene testen und jede verwendete Logik beobachten muss.
Vielleicht hat er das Glück, es sofort zu finden, aber vielleicht wird die Antwort an der letzten Stelle sein, die er sich vorstellt.
Bei Anwendung B kann ein Entwickler unter der Annahme einer perfekten Protokollierung die Protokolle beobachten, die fehlerhafte Komponente sofort identifizieren und weiß nun, wo er suchen muss.
Dies kann eine Frage von Minuten, Stunden oder Tagen sein; abhängig von der Größe und Komplexität der Codebasis.
Regressionen
Nehmen Sie die Anwendung A, die überhaupt nicht trocken ist.
Nehmen Sie die Anwendung B, die DRY ist, aber aufgrund der zusätzlichen Abstraktionen mehr Zeilen benötigt.
Es wird eine Änderungsanforderung eingereicht, die eine Änderung der Logik erfordert.
Für Anwendung B ändert der Entwickler die (eindeutige, gemeinsam genutzte) Logik entsprechend der Änderungsanforderung.
Für Anwendung A muss der Entwickler alle Instanzen dieser Logik ändern, in denen er sich daran erinnert, dass sie verwendet wird.
- Wenn es ihm gelingt, sich alle Instanzen zu merken, muss er dieselbe Änderung dennoch mehrmals implementieren.
- Wenn er sich nicht alle Instanzen merken kann, haben Sie es jetzt mit einer inkonsistenten Codebasis zu tun, die sich selbst widerspricht. Wenn der Entwickler einen selten verwendeten Code vergessen hat, wird dieser Fehler möglicherweise erst in der Zukunft für den Endbenutzer sichtbar. Werden die Endbenutzer zu diesem Zeitpunkt die Ursache des Problems ermitteln? Auch wenn dies der Fall ist, kann sich der Entwickler möglicherweise nicht erinnern, was die Änderung mit sich gebracht hat, und muss herausfinden, wie diese vergessene Logik geändert werden kann. Vielleicht arbeitet der Entwickler bis dahin noch nicht einmal in der Firma, und dann muss jetzt jemand anderes alles von Grund auf neu herausfinden.
Dies kann zu einer enormen Zeitverschwendung führen. Nicht nur in der Entwicklung, sondern auch beim Jagen und Finden des Fehlers. Die Anwendung kann sich auf eine Weise unregelmäßig verhalten, die Entwickler nicht leicht nachvollziehen können. Dies führt zu längeren Debugsitzungen.
Entwickleraustauschbarkeit
Entwickler Eine erstellte Anwendung A. Der Code ist weder sauber noch lesbar, funktioniert jedoch wie ein Zauber und wurde in der Produktion ausgeführt. Es überrascht auch nicht, dass es keine Dokumentation gibt.
Entwickler A fehlt wegen Feiertagen für einen Monat. Ein Notfalländerungsantrag wird gestellt. Es kann nicht länger als drei Wochen dauern, bis Dev A zurückkommt.
Entwickler B muss diese Änderung durchführen. Er muss nun die gesamte Codebasis lesen, verstehen, wie alles funktioniert, warum es funktioniert und was es zu erreichen versucht. Das dauert ewig, aber sagen wir mal, er schafft es in drei Wochen.
Zur gleichen Zeit hat die Anwendung B (die Entwickler B erstellt hat) einen Notfall. Dev B ist belegt, aber Dev C ist verfügbar, obwohl er die Codebasis nicht kennt. Was machen wir?
- Wenn wir B an A arbeiten lassen und C an B arbeiten lassen, haben wir zwei Entwickler, die nicht wissen, was sie tun, und die Arbeit wird suboptimal ausgeführt.
- Wenn wir B von A abziehen und ihn B ausführen lassen und jetzt C auf A setzen, wird möglicherweise die gesamte Arbeit von Entwickler B (oder ein erheblicher Teil davon) verworfen. Dies ist möglicherweise tage- / wochenlanger Arbeitsaufwand.
Dev A kommt aus seinem Urlaub zurück und stellt fest, dass B den Code nicht verstanden und ihn daher schlecht implementiert hat. Es ist nicht B's Schuld, weil er alle verfügbaren Ressourcen genutzt hat, der Quellcode war einfach nicht ausreichend lesbar. Muss A nun Zeit damit verbringen, die Lesbarkeit des Codes zu verbessern?
All diese und viele andere Probleme verschwenden Zeit . Ja, kurzfristig erfordert sauberer Code jetzt mehr Aufwand , aber es wird sich in Zukunft auszahlen, wenn unvermeidliche Fehler / Änderungen behoben werden müssen.
Das Management muss verstehen, dass eine kurze Aufgabe in Zukunft mehrere lange Aufgaben erspart. Zu versagen zu planen ist planen zu versagen.
Wenn ja, mit welchen Argumenten kann ich die Tatsache rechtfertigen, dass mehr LOC geschrieben wurden?
Meine goto Erklärung fragt das Management, was es bevorzugen würde: eine Anwendung mit einer 100KLOC-Codebasis, die in drei Monaten entwickelt werden kann, oder eine 50KLOC-Codebasis, die in sechs Monaten entwickelt werden kann.
Sie werden offensichtlich die kürzere Entwicklungszeit wählen, weil sich das Management nicht um KLOC kümmert . Manager, die sich auf KLOC konzentrieren, sind Mikromanager, während sie nicht wissen, was sie zu verwalten versuchen.