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.
Antworten:
Sie sollten ein besseres Design wählen, wenn:
Sie werden einen großen Teil der zukünftigen Codierung übernehmen
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:
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?
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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 !
quelle
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.
quelle
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.
quelle