Ist es ein schlechtes Zeichen, dass ich bei der Entwicklung eines Projekts häufig eine Neugestaltung vornehme?

39

Als ich anfing zu programmieren, ging ich davon aus, dass ich eines Tages an den Punkt kommen würde, an dem ich ein Projekt starten würde, indem ich mich hinsetze und ein UML-Diagramm aller Klassen skizziere, und mich dann so ziemlich daran halte. Ich programmiere jetzt seit ein paar Jahren und es stellt sich nicht so heraus. Während ich ein Projekt durcharbeite, sage ich oft

  • „Hey, ich brauche eine Klasse zu tun _ _. Ich vorher nicht daran gedacht hätte.“
  • "Warten Sie, diese Funktion sollte wirklich in dieser Klasse statt in dieser sein. Ich werde sie verschieben."
  • "Das sollten eigentlich zwei statt einer Klasse sein. Ich werde es aufteilen."
  • "Ich sollte diese drei eigenständigen Klassen alle von einer abstrakten Klasse erben lassen."
  • Usw. usw.

Ist es ein schlechtes Zeichen, dass ich währenddessen oft so umgestalte? Bedeutet das, dass ich ein schlechter Programmierer bin oder ist das normal?

saftig lucy
quelle

Antworten:

41

Dies ist ein normaler Teil der Entwicklung. Zwei der Grundprinzipien von Continuous Design sind:

  1. Sie sind nicht allwissend, Sie können nicht das gesamte System von Anfang bis Ende kennen, bevor Sie beginnen.
  2. Design ist nicht statisch. Dies ist häufiger der Fall, wenn ein Projekt schon lange verwendet wird und die Probleme, die es jetzt löst, nicht die Probleme sind, die es beim ersten Schreiben gelöst hat.

Mein persönlicher Standpunkt zu diesem Thema ist, dass Sie eine gute Vorstellung vom Makrodesign haben sollten , aber die Entwicklung des Mikrodesigns zulassen sollten . Eine andere Möglichkeit, dies auszudrücken, besteht darin, dass das High-Level-Design (soweit ich es mit UML- / Modellierungswerkzeugen verstehe) höchstwahrscheinlich über die gesamte Laufzeit eines Projekts hinweg ziemlich statisch bleibt. Der detaillierte Entwurf, welche Methoden was tun, und die Klassenhierarchie müssen frei sein, um formbar zu sein.

Wenn Sie wirklich nicht viel über das Problem wissen, das Sie lösen, werden Sie viel mehr anfängliche Fehlschritte machen. Nachdem Sie jedoch lange genug damit gearbeitet haben, setzt sich das gesamte Design ab und die Refactorings, über die Sie sprechen, sind alles, was erforderlich ist, um den Code sauber zu halten.

Berin Loritsch
quelle
3
+1, aus diesem Grund erschaudere ich immer, wenn Leute davon sprechen, Objekte in einer Datenbank zu serialisieren -> und wenn Ihre Klasse morgen in mehrere Teile zerlegt wurde, wie deserialisieren Sie, ohne den alten Code zu behalten? Ich bevorzuge die Protobuf-Alternative (dedizierte Klassen für Speicher / Nachrichtenaustausch), bei der Ihre Kernklassen frei entwickelt werden können und Sie nur die Serialisierungs- / Deserialisierungsschicht anpassen müssen.
Matthieu M.
@Matthieu - Sie schreiben eine Datenbankmigration. Das Schreiben und Testen dauert selten länger als eine Stunde. Ruby on Rails bietet eine sehr gute Möglichkeit für Datenbankmigrationen.
Kevin Cline
1
@kevin: Ich denke, wir haben nicht die gleichen Datenbanken, meine enthalten ein paar Hundert Millionen Zeilen. Migration ist keine Option.
Matthieu M.
+1 - zu stolz / stur zu sein, um zuzugeben, dass Sie einen Fehler begangen haben, ist keine gute Sache. Einige Leute sehen es als ein Zeichen der Unachtsamkeit an, Ihre Fehler zuzugeben, aber die meisten werden Sie wahrscheinlich dafür respektieren, und wenn Ihre Strategie zur Bewältigung eines schwerwiegenden Fehlers darin besteht, zu leugnen, dass es sich um einen Fehler handelt, ist dieser zweite Fehler sehr wahrscheinlich tödlich.
Steve314
12

Was Sie tun, wird im Volksmund als "Refactoring" bezeichnet. Wenn Sie jemals damit aufhören, dann stecken Sie in Schwierigkeiten.

Tatsache ist, dass der meiste Code komplex ist und Menschen, auch ziemlich kluge, nicht alles auf einmal herausfinden können.

ElGringoGrande
quelle
5

Das ist vollkommen in Ordnung (es sei denn, diese Neukonstruktionen sind immer größere Überholungen oder Neukonstruktionen von Grund auf). Mach dir keine Sorgen. Es kann gut sein, zu Beginn des Projekts mit einem UML-Diagramm zu beginnen, aber schneiden Sie es nicht in Stein, da Sie fast immer feststellen werden, dass sich die Dinge während der Arbeit ändern. Sie können neue Techniken erlernen, die Sie zu Beginn nicht kannten, und einige Funktionen auf eine Weise verbessern, die Sie beim ersten Entwurf nicht kennen. Die Geschäftsanforderungen ändern sich. Manchmal gibt es beim ersten Entwurf Unbekanntes, das nur möglich ist später abgerechnet werden, etc ...

Was ist wichtig zu gehen und diese anfänglichen UML - Dokumente zu aktualisieren , so dass sie keine wesentlichen Änderungen in Design, sonst zukünftige Entwickler (einschließlich sich selbst) reflektieren könnte sehr verwirrt enden. Dies kann schwierig sein und erfordert oft gute Disziplin (und Zeit).

Es ist sehr sehr sehr selten mit einem Design zu starten, und es 100% bis zur Umsetzung haften. Ich persönlich habe noch nie so etwas gesehen, außer bei sehr kleinen und trivialen Programmen.

FrustratedWithFormsDesigner
quelle
6
Schritt 1: UML-Diagramm erstellen. Schritt 2: Code schreiben. Schritt 3: Werfen Sie das UML-Diagramm weg, damit niemand es jemals sieht und sich darüber im Klaren ist, wie der Code tatsächlich funktioniert.
Kubi
4

Was Sie tun, ist völlig normal (vorausgesetzt, Sie fangen nicht jedes Mal von vorne an). Ich bin seit über zwanzig Jahren dabei und es ist immer noch ein iterativer Prozess.

Das einzige Mal, dass Sie in der Lage sein werden, alles von vornherein zu entwerfen und sich daran zu halten, ist, dass Sie genau dasselbe Problem lösen, das Sie zuletzt gelöst haben, und selbst dann können Sie wahrscheinlich Raum für Verbesserungen finden.

John Bode
quelle
2

Ich bin keineswegs ein sehr erfahrener Entwickler, aber ich mache das auch. In den letzten Jahren hat sich meine Fähigkeit, die notwendige Architektur mental zu konstruieren, stark verbessert. Während ich jedoch ein Stück Software schreibe, gibt es immer Orte, die ein bisschen neu gestaltet werden müssen, egal wie viel Planung ich tue. Stellen, von denen ich nicht wusste, dass ich mich wiederholen würde, bis der Code tatsächlich geschrieben wird.

Mein Punkt in diesem Beitrag ist, zu sagen, dass ich alles in Ihrer Liste mache und nicht das Gefühl habe, dass diese Dinge notwendigerweise schlecht sind, es sei denn, sie passieren ständig und haben einen echten negativen Einfluss auf Ihre Produktivität.

Piper Merriam
quelle
0

Das nennt man iterativen Prozess und es ist ein Grundkonzept in allen modernen Softwareentwicklungstechniken.

vartec
quelle