Ist es besser, vorhandene schlechte Praktiken oder gute Praktiken zu verwenden, die nicht gut mit altem Code übereinstimmen?


25

Ich habe darüber nachgedacht, weil ich versucht habe, eine Erweiterung für eine vorhandene Software von Drittanbietern zu schreiben, und deren Datenbank schrecklich denormalisiert ist. Ich musste die vorhandenen Tabellen verwenden und eine Reihe neuer Felder hinzufügen.

Ich hatte die Möglichkeit, entweder neue Tabellen in ihrem Entwurfsstil zu erstellen (der darin besteht, dass fast alle Eigenschaften in einer großen Tabelle enthalten sind), oder eine neue Gruppe von Tabellen zusammen zu erstellen und zusätzliche Elemente wie Trigger zu verwenden, um Daten zwischen dem neuen und dem neuen zu synchronisieren alte Tische.

Am Ende hatte ich die erste Möglichkeit, den vorhandenen schlechten Designstil zu verwenden, aber ich hatte die Frage: Ist es besser, mit vorbestehenden schlechten Praktiken umzugehen oder bewährte Praktiken zu implementieren, die mit vorhandenem Code nicht gut funktionieren? Gibt es Situationen, in denen ich eine der anderen vorziehen sollte?

HINWEIS: Viele Antworten haben bisher damit zu tun, den fehlerhaften Code langsam umzugestalten, aber das kann ich nicht. Der Code gehört nicht uns und wird häufig vom Hersteller aktualisiert. Darauf kann ich nur aufbauen.



Danke Peter, habe diese Frage nicht gesehen. Es ist dem, was ich frage, sehr ähnlich, mit der Ausnahme, dass die Antworten anscheinend mit der Umgestaltung des vorhandenen Codes zusammenhängen und nicht dem vorhandenen fehlerhaften Code hinzugefügt werden. Ich kann den vorhandenen Code nicht überarbeiten, sondern nur darauf aufbauen.
Rachel

Hängt davon ab, wie lange Sie bei Ihrem derzeitigen Arbeitgeber bleiben möchten;)
Job

Antworten:


21

Sie sollten ein besseres Design wählen, wenn:

  1. Sie werden einen großen Teil der zukünftigen Codierung übernehmen

  2. Besseres Design ist auf lange Sicht für den Kunden nicht teurer. Zum Beispiel habe ich mehrmonatige "Refactorings" für Projekte erlebt, die zum Jahresende eingestellt wurden.

Sie sollten "gleichen schlechten Stil" wählen, wenn:

  1. Du hilfst nur. Es ist unrealistisch zu glauben, dass Sie eine vorhandene Gruppe übernehmen können, um höhere Designstandards zu erreichen, wenn Sie nur eine Teilzeitbeschäftigung für das Projekt haben. Besseres Design ist subjektiv und hat fast immer eine Lernkurve. Wenn das neue Design nicht vom Rest des Teams gelernt wird, endet das Projekt mit einer Mischung aus Stilen, und Ihr besser gestalteter Code wird möglicherweise in einem Haufen von Dingen landen, die niemand ändert, weil er nicht versteht es. Was passiert in Ihrem obigen Beispiel, wenn Updates für die Software von Drittanbietern vorliegen?

  2. Wenn Sie auf "besseres" Design verzichten, erhalten Sie einen konkreten Geschäftsvorteil. Wenn Sie beispielsweise Feature X hinzufügen, erhalten Sie einen großen Vertrag, aber wenn Sie die Frist nicht einhalten, erhalten Sie nichts. Hier kommt der historische Konflikt zwischen mgmt und dem technischen Team ins Spiel. Wie bei der Renovierung eines Hauses muss sich jemand entscheiden, wann er bezahlen soll. Sie können die Schulden anfänglich abbezahlen, indem Sie ein Jahr lang ohne Strom oder Klempner arbeiten. Oder Sie können das Dreifache des Betrags mit dem Vorteil dieser Dienstprogramme bezahlen.


Tolle Beispiele dafür, wann man mit gutem Design über schlechtes Design und umgekehrt entscheiden sollte, danke :)
Rachel

11

Auf lange Sicht ist es besser, gute Praktiken anzuwenden. Dies spart Zeit und Mühe, da die Implementierung von Änderungen weniger Zeit in Anspruch nimmt.

Wenn möglich, führen Sie kleine Schritte durch, um eine Umgestaltung auf bewährte Methoden vorzunehmen (z. B. in SQL, bei der denoramlierte Tabellen in normalisierte Tabellen umgewandelt und Ansichten mit den alten Tabellennamen verwendet werden).

Sie werden bemerken, dass ich auf lange Sicht gesagt habe - das Dreieck "Qualität, Zeit, Geld" gilt auch hier (dh - wählen Sie zwei). Wenn Sie nicht die Zeit haben, können Sie mit alten Praktiken fortfahren. Dies bedeutet jedoch, dass Sie das Problem noch verstärken und Ihr Design ebenfalls repariert werden muss.

Wenn Sie weiterarbeiten und Code mit schlechtem Design hinzufügen, erhalten Sie niemals eine Codebasis, die gutes Design verwendet. Versuchen Sie so viel wie möglich, gutes Design zu verwenden und gutes Design umzugestalten.


Ich habe nie über diese Lösung für die SQL-Daten nachgedacht. Leider darf ich ihre Codebasis nicht bearbeiten, da sie immer noch regelmäßige Updates veröffentlichen. Alles, was ich hinzufüge, muss vollständig getrennt sein.
Rachel

1
@ Rachel - Wenn Sie die Kontrolle über die neuen Tabellen haben, verwenden Sie ein gutes Design für sie (ich gehe davon aus, dass Aktualisierungen des alten Designs keine Auswirkungen auf die neuen Tabellen haben). Wenn Sie Ihren Code ändern müssen, sind Ihre Wartungskosten niedriger.
Oded

Aktualisierungen der Softwarefrequenz umfassen Datenbankaktualisierungen und neue Felder. Das Löschen vorhandener Tabellen und deren Neuschreiben als Ansichten ist daher für mich keine praktikable Option. Benutzer verwenden weiterhin den vorhandenen Teil der Software, der diese Tabellen verwendet. Sie benötigen lediglich eine Erweiterung. Wenn dies unser Code anstelle des Codes eines Drittanbieters wäre, würde ich dies sofort implementieren :) Insgesamt eine gute Sichtweise für meine ursprüngliche Frage.
Rachel

1

Nun, ich denke, es hängt sehr von jedem Fall ab. Wenn es die Leistung und das Design zulassen, ist es besser, bewährte Methoden zu verwenden. Wenn diese Tabelle beispielsweise eine Tabelle mit hohem Zugriff ist, kann sich das Erstellen eines Auslösers für die Sincronisierung negativ auf die Leistung auswirken.

Jetzt wird Ihr Kunde nicht sehen, dass Sie ein besseres Design verwendet haben, sondern nur, dass Ihre Lösung sein System langsamer gemacht hat. Diese Art der Entscheidung sollte von Fall zu Fall getroffen werden, und Sie sollten Ihre Erfahrungen und Kriterien verwenden, um zu entscheiden.

Ich denke, Sie haben wahrscheinlich die richtige Wahl getroffen.


1

Sie sollten Ihren Anwendungscode so weit wie möglich vom schlechten Datenentwurf isolieren.

Aktualisieren Sie ihre Tabellen? Wenn nicht, erstellen Sie SQL-Ansichten, um diese Tabellen in einer für Ihre Anwendung geeigneten Weise darzustellen. SQL-Ansichten sind relativ einfach zu schreiben und viel einfacher zu testen als Anwendungscode.

Wenn Sie die alten Tabellen aktualisieren müssen, sollten Sie gespeicherte Prozeduren schreiben, um die Aktualisierungen zu verwalten. Sie sind etwas komplexer zu schreiben, können aber sofort getestet werden.


1

Um den alten Code synchron zu halten, wenn Sie eine Datenbank mit Triggern normalisieren, ist dies u. A. Eine gute Lösung, wenn es sich um einen temporären Code handelt. Das Ziel sollte sein, den alten Code zu ändern, aber wenn es sich um einen Dritten handelt, funktioniert das möglicherweise nicht. Sie müssen über die Schemaänderungen auf dem Laufenden bleiben.

Wenn immer mehr Funktionen auf den fehlerhaften Code gestapelt werden, entstehen fortlaufend Probleme. Workarounds werden zur Norm. Benutzer werden frustriert, da Änderungen zu lange dauern und möglicherweise andere Fehler oder Einschränkungen verursachen. Wer möchte der Programmierer sein, der sagt, wir können das nicht, anstatt wir sollten das nicht tun?

Einige Codes können alleine gelassen werden. Diesen Luxus haben wir nicht immer.


-1

Sie haben es hier mit technischen Schulden zu tun. Kurz gesagt, technische Schulden bedeuten Zinsen, die Sie im Laufe der Zeit zahlen müssen, und irgendwann müssen Sie sie erstatten.

Die Zeit von Develloper kostet Geld, so dass die technische Verschuldung genau wie die echte Verschuldung gesehen werden kann und echtes Geld kostet.

Grundsätzlich gibt es zwei Hauptlösungen und viele dazwischen. Sie können entscheiden, dass Sie diese Schulden jetzt nicht erstatten möchten, und weiterhin Zinsen zahlen. Natürlich wird dies auf lange Sicht mehr kosten, aber Sie können jetzt sofort Ergebnisse erzielen. Sie können sich auch dafür entscheiden, diese Schulden zu erstatten, sodass Sie nicht mehr vorgehen, solange Sie sie nicht erstatten. Am Ende sind Sie jedoch zinsfrei.

Normalerweise haben Sie Lieferfristen, und die Nichteinhaltung einer Lieferfrist führt zu Misstrauen gegenüber Ihrem Kunden und schließlich zu deren Verlust. Dies könnte ein triftiger Grund sein, technische Schulden zu graben: Sie sind der Meinung, dass das, was Sie mit dem Kunden erzielen, den Mehraufwand für technische Schulden wert ist.

Sie wissen, dass Sie am Ende die neue Methodik anwenden müssen, andernfalls werden Sie immer mehr Schulden haben und schließlich bankrott gehen (Sie jetzt, wenn die Leute sich entscheiden, wieder von vorne anzufangen, oder wenn das Projekt scheitert).

Sie müssen planen, wie Sie die vorhandene Codebasis ändern und im Laufe der Zeit auf eine neue Praxis umstellen und die Änderung Stück für Stück auf täglicher Basis verteilen. Wenn diese Umgestaltung zu anderen Verlusten führt, überlegen Sie sich, welcher Verlust am schlimmsten ist, und entscheiden Sie sich für den besten.

Die Kosten für das Nicht-Refactoring werden im Laufe der Zeit steigen (dies sind die Interessen der technischen Schulden). Dies wird also letztendlich die teuerste Wahl sein.

Stellen Sie sicher, dass Ihr Chef das Konzept der technischen Verschuldung versteht. Trotz aller Vorsicht werden Sie technische Schulden machen. Irgendwann wird Geld verwendet, um es zu erstatten. Wenn Sie absichtlich eine technische Verschuldung erstellen, MÜSSEN Sie einen gültigen Grund dafür haben und die Verschuldung als Investition betrachten (genau wie eine echte Verschuldung). In allen anderen Fällen tun Sie einfach NICHT absichtlich technische Schulden.

Möglicherweise interessieren Sie sich für Methoden zur Weiterentwicklung der Datenbank und zur Bereitstellung dieser Weiterentwicklungen: http://richarddingwall.name/2011/02/09/the-road-to-automated-database-deployment

Übrigens, das ist eine schwierige Aufgabe, also viel Glück. Es lohnt sich !


-1

Dies ist ein typisches Problem von: "Muss ich jetzt oder später von den Vorteilen meiner Arbeit profitieren?" und ich glaube nicht, dass es jemals eine generische Lösung für diese Antwort geben kann. Nur Sie kennen alle Faktoren (technisch und menschlich), die an einer solchen Entscheidung beteiligt sind.

Ihr Problem wirft jedoch eine interessante Frage auf:

Erzielt das automatische Code-Refactoring ausreichende Fortschritte, sodass die Code-Uniformität höher bewertet werden sollte?

Letztendlich sollte sich schlechtes Design ändern oder sterben. Sonst ist es kein schlechtes Design. Die eigentliche Frage ist hier über die Kosten für das Refactoring. Aus Ihrer Frage geht eindeutig hervor, dass Sie (oder Ihr Arbeitgeber) nicht bereit sind, den Preis jetzt zu zahlen, und dies nach dem derzeitigen Stand der Technik wahrscheinlich nie möchten.

Die Automatisierung der Code-Umgestaltung macht jedoch einige Fortschritte. Wenn Compiler Binärdateien heute optimieren können, wer sagt dann, dass sie Code morgen nicht optimieren würden? Irgendwann wird ein Tool auf den Markt kommen, mit dem Entwickler und Designer ihren Code sehr einfach umgestalten können, um sich an neuere Anforderungen anzupassen. Immerhin ist der Umgang mit altem Code eine der größten Herausforderungen der heutigen Zeit.

Sollte es jemals ein solches Tool geben (ich wäre nicht überrascht, dass dies bereits der Fall ist), wäre es gut, dies bei einer solchen Entscheidung zu berücksichtigen.


-2

Gute Praktiken sind immer besser als schlechte. Wenn Ihre Codebasis mit falschem Code übersät ist, sollten Sie Ihre eigenen Sachen nicht einfach auf die gleiche Weise frachtkultivieren, sondern den Code richtig schreiben und dann versuchen, alle anderen auf die richtige Art und Weise zu unterrichten.


Als Entwickler sollten Sie die Gefahr absoluter Aussagen kennen.
Whatsisname

Ich kenne auch die Gefahr, mit schlechten Praktiken umzugehen und Code falsch zu schreiben, und IMO ist die schlimmste Gefahr von allen.
Wayne Molina
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.