Ich habe versucht, Dinge im Voraus zu planen, aber ich kann anscheinend nicht alles vorhersehen, bis ich anfange, Code auszuarbeiten.
Es ist verlockend zu glauben, dass eine perfekte Planung ein perfektes Software-Design / eine perfekte Architektur ergibt. Es stellt sich jedoch heraus, dass dies kategorisch falsch ist. Das hat zwei große Probleme. Erstens stimmen "auf dem Papier" und "der Code" selten überein, und der Grund dafür ist, dass es einfach zu sagen ist, wie es getan werden soll, anstatt es tatsächlich zu tun . Zweitens werden unvorhergesehene Änderungen der Anforderungen erst spät im Entwicklungsprozess sichtbar, über die von Anfang an nicht nachgedacht werden konnte.
Haben Sie von der Agile-Bewegung gehört? Es ist eine Denkweise, bei der wir Wert darauf legen, "auf Veränderungen zu reagieren" und nicht (unter anderem) "einem Plan zu folgen". Hier ist das Manifest (es ist eine kurze Lektüre). Sie können sich auch über Big Design Up Front (BDUF) und die Gefahren informieren.
Leider handelt es sich bei der Unternehmensversion von "Agile" um eine Reihe von Fälschungen (zertifizierte Scrum-Master, schwerer Prozess im Namen von "Agile", Erzwingen von Scrum, Erzwingen einer 100-prozentigen Codeabdeckung usw.), die in der Regel nur zu Änderungen der Prozesse führen, weil Manager denke, Agile ist ein Prozess und eine Silberkugel (von denen es keine ist). Lesen Sie das Agile-Manifest, hören Sie Leuten zu , die diese Bewegung ins Leben gerufen haben, wie Onkel Bob und Martin Fowler, und lassen Sie sich nicht von der unsinnigen Version von "Corporate Agile" verführen.
Insbesondere können Sie in der Regel mit TDD (Test Driven Development) auf wissenschaftlichem Code davonkommen , und es besteht eine gute Chance, dass Ihr Softwareprojekt ziemlich gut ausfällt. Der Grund dafür ist, dass erfolgreicher wissenschaftlicher Code meistens über benutzerfreundliche Schnittstellen verfügt, wobei die Leistung eine untergeordnete (und manchmal konkurrierende) Rolle spielt, sodass Sie mit einem "gierigeren" Design davonkommen können. TDD erzwingt, dass Ihre Software extrem benutzerfreundlich ist , da Sie schreiben, wie die Dinge (im Idealfall) heißen sollen, bevor Sie sie tatsächlich implementieren. Es erzwingt auch kleine Funktionen mit kleinen Schnittstellen , die schnell auf einfache Weise "Eingabe" / "Ausgabe" aufgerufen werden können, und versetzt Sie in eine gute Position für die Umgestaltung falls sich die Anforderungen ändern.
Ich denke, wir sind uns alle einig, dass numpy
es sich um erfolgreiche Software für wissenschaftliches Rechnen handelt. Ihre Schnittstellen sind klein, super brauchbar und alles spielt gut zusammen. Beachten Sie, dass numpy
das Referenzhandbuch TDD ausdrücklich empfiehlt: https://docs.scipy.org/doc/numpy-1.15.1/reference/testing.html . Ich habe TDD in der Vergangenheit für SAR-Bildgebungssoftware (Synthetic Aperature Radar) verwendet und kann auch behaupten, dass es für diese bestimmte Domäne sehr gut funktioniert.
Vorsichtsmaßnahme: Der Designteil von TDD funktioniert weniger gut in Systemen, in denen ein grundlegendes Refactoring (z. B. die Entscheidung, dass Ihre Software in hohem Maße gleichzeitig ausgeführt werden muss) schwierig ist, wie in einem verteilten System. Zum Beispiel, wenn Sie so etwas wie Facebook zu entwerfen haben , wo man Millionen von gleichzeitigen Benutzern hat, TDD tun (zu fahren Ihr Design) wäre ein Fehler (noch in Ordnung zu verwenden , nachdem Sie haben vorläufiges Design und tun nur „test erste Entwicklungs "). Es ist wichtig, über die Ressourcen und die Struktur Ihrer Anwendung nachzudenken, bevor Sie in den Code springen. TDD wird Sie niemals zu einem hochverfügbaren, verteilten System führen.
Wie kann ich vermeiden, das Gefühl zu haben, dass ich mein Programm viel besser machen würde, wenn ich es komplett von Grund auf neu erstellt hätte?
In Anbetracht des oben Gesagten sollte es offensichtlich sein, dass ein perfektes Design eigentlich unmöglich zu erreichen ist. Die Jagd nach einem perfekten Design ist also ein Narrenspiel. Man kann sich wirklich nur annähern. Auch wenn Sie denken, Sie können von Grund auf neu gestalten, gibt es wahrscheinlich noch versteckte Anforderungen, die sich nicht gezeigt haben. Darüber hinaus dauert das Umschreiben mindestens so lange , bis der ursprüngliche Code entwickelt ist. Es wird mit ziemlicher Sicherheit nicht kürzer sein, da das neue Design wahrscheinlich eigene unvorhergesehene Probleme hat und Sie alle Funktionen des alten Systems neu implementieren müssen.
Eine weitere zu berücksichtigende Sache ist, dass Ihr Design nur dann wirklich wichtig ist, wenn sich die Anforderungen ändern .Es spielt keine Rolle, wie schlecht das Design ist, wenn sich nichts ändert (vorausgesetzt, es ist für die aktuellen Anwendungsfälle voll funktionsfähig). Ich arbeitete an einer Basislinie mit einer 22.000-Zeilen-Umschaltanweisung (die Funktion war sogar noch länger). War es schreckliches Design? Verdammt ja, es war schrecklich. Haben wir das behoben? Nein, es funktionierte so wie es war und dieser Teil des Systems verursachte nie wirklich Abstürze oder Fehler. Es wurde in den zwei Jahren, in denen ich an dem Projekt beteiligt war, nur einmal berührt, und jemand, Sie haben es erraten, hat einen weiteren Fall in den Schalter eingefügt. Aber es lohnt sich nicht, sich die Zeit zu nehmen, um etwas zu reparieren, das so selten berührt wird, dass dies einfach nicht der Fall ist. Lassen Sie das unvollkommene Design so sein, wie es ist, und wenn es nicht kaputt ist (oder ständig bricht), reparieren Sie es nicht. Vielleicht könnten Sie es besser machen ... aber wäre es eine umschreibung wert? Was wirst du gewinnen?
HTH.