Projekt ist fast fertig, aber prozeduraler Spaghetti-Code. Schreibe ich um oder versuche ich einfach weiter, es zu versenden? [geschlossen]


242

Ich bin ein Anfänger Webentwickler (ein Jahr Erfahrung).

Ein paar Wochen nach Abschluss des Studiums wurde mir angeboten, eine Webanwendung für ein Unternehmen zu erstellen, dessen Inhaber kein großer Techniker ist. Er hat mich angeworben, um den Diebstahl seiner Idee, die hohen Entwicklungskosten eines Dienstleistungsunternehmens und die langfristige Betreuung des Projekts durch jemanden zu verhindern, dem er vertrauen kann ).

Als ich damals großspurig war und ein Diplom in Informatik hatte, nahm ich das Angebot an und dachte, ich könne alles bauen.

Ich habe das Sagen gehabt. Nach einigen Recherchen entschied ich mich für PHP und begann mit einfachem PHP, ohne Objekte, nur hässlichem prozeduralem Code. Zwei Monate später wurde alles unordentlich und es war schwierig, Fortschritte zu erzielen. Die Webanwendung ist riesig. Also entschied ich mich, ein MVC-Framework auszuprobieren, das mir das Leben leichter machen würde. Dort bin ich auf das coole Kind in der PHP-Community gestoßen: Laravel. Ich habe es geliebt, es war leicht zu lernen und ich fing sofort an zu programmieren. Mein Code sah sauberer und übersichtlicher aus. Es sah sehr gut aus.

Aber auch hier war die Webanwendung riesig. Das Unternehmen setzte mich unter Druck, die erste Version zu liefern, die sie offensichtlich bereitstellen wollten, und Kunden zu suchen.

Weil es Spaß machte, mit Laravel zu arbeiten, erinnerte ich mich daran, warum ich mich überhaupt für diese Branche entschieden hatte - etwas, das ich vergessen hatte, als ich im beschissenen Bildungssystem steckte.

Also begann ich nachts an kleinen Projekten zu arbeiten und las über Methoden und bewährte Praktiken. Ich besuchte OOP erneut, wechselte zu objektorientiertem Design und Analyse und las Onkel Bobs Buch Clean Code .

Dadurch wurde mir klar, dass ich wirklich nichts wusste. Ich wusste nicht, wie man Software THE RIGHT WAY erstellt. Aber zu diesem Zeitpunkt war es zu spät und jetzt bin ich fast fertig. Mein Code ist überhaupt nicht sauber, nur Spaghetti-Code, ein echtes Problem, um einen Fehler zu beheben, die gesamte Logik steckt in den Controllern, und es gibt wenig objektorientiertes Design.

Ich habe den anhaltenden Gedanken, dass ich das ganze Projekt neu schreiben muss. Ich kann es jedoch nicht tun ... Sie fragen immer wieder, wann alles erledigt sein wird.

Ich kann mir nicht vorstellen, dass dieser Code auf einem Server bereitgestellt wird. Außerdem weiß ich immer noch nichts über die Codeeffizienz und die Leistung der Webanwendung.

Einerseits wartet das Unternehmen auf das Produkt und kann nicht mehr warten. Auf der anderen Seite kann ich mir nicht vorstellen, mit dem eigentlichen Code weiterzumachen. Ich könnte fertig sein, es einpacken und bereitstellen, aber Gott weiß nur, was passieren könnte, wenn Leute anfangen, es zu benutzen.

Schreibe ich um oder versuche ich einfach weiter zu versenden, oder gibt es eine andere Option, die ich verpasst habe?


142
Beenden Sie den Vorgang so wie Sie begonnen haben und bereinigen Sie die technischen Schulden in der nächsten Version (falls vorhanden). Ihr Chef wird den Unterschied nicht kennen. Stellen Sie sicher, dass Sie es gut testen.
Robert Harvey

45
"Aber Gott weiß nur, was passieren kann, wenn die Leute damit anfangen" ... das ist der Spaß an der Softwareentwicklung. Besser daran gewöhnen;)
Linac

144
Dies wird jedes einzelne System sein, das Sie jemals gebaut haben.
Entlassung

57
Die Software ist nie fertig und sobald Sie sich nähern, haben Sie immer einen Einblick, der Sie dazu bringt, die gesamte Codebasis aus dem Fenster zu werfen. Nicht. Liefern Sie ein funktionierendes Produkt und beherrschen Sie dann die Kunst des Refactorings. Was eine wertvolle Lektion sein wird.
Pieter B

14
Mein Vater sagte mir immer: "Manchmal muss man die Ingenieure erschießen und das Schiff."
CorsiKa

Antworten:


253

Sie sind auf der Achillesferse der meisten CS-Ausbildungen gestolpert: Sie bringen Ihnen die Werkzeuge und Techniken bei, aber nicht das Handwerk. Das Erstellen von Software ist ein Handwerk, das Sie nur durch jahrelange Übung und die Erfahrung mit der Verwendung Ihrer Software erwerben (Benutzer sind viel härtere Kritiker als Lehrer). Das Erstellen von Software ist auch häufig ein Geschäft, bei dem die Geschäftsziele die technischen Ambitionen außer Kraft setzen können.

Zunächst Schiff. Wenn Sie dem Geschäftsinhaber die Software zeigen und dieser das Gefühl hat, dass sie versandbereit ist, versenden Sie sie. Wenn es nicht so weit ist, aber zu Ende ist, beenden Sie es. Die einzige Software, die zählt, ist die tatsächlich verwendete. Das einzige Software-Geschäft, das Geld verdient, ist eines, das ein Produkt hat.

Zweitens haben Sie viele wertvolle Dinge gelernt, und Sie sollten die Erfahrung für das schätzen, was sie Ihnen beigebracht hat :

  1. Slinging Code ohne Plan oder Architektur ist ein Rezept für eine Katastrophe
  2. Programmierung ist viel mehr als das Schreiben von Code
  3. Nicht-technische Geschäftsinhaber verstehen oft nicht, welche Auswirkungen technische Entscheidungen haben (z. B., wen sie einstellen müssen), und es liegt an den Entwicklern, ihnen die Dinge zu erklären.
  4. Die meisten Probleme werden in bestehenden Frameworks bereits viel besser gelöst, als Sie es tun würden. Es lohnt sich, die vorhandenen Frameworks zu kennen und wann man sie verwendet.
  5. Schulabgänger, die einem großen Projekt mit wenig Anleitung zugewiesen sind, neigen dazu, eine Schüssel Spaghetti-Code zu produzieren. Das ist normal.

Hier finden Sie weitere Ratschläge zur weiteren Vorgehensweise:

  1. Kommunizieren, kommunizieren, kommunizieren. Sie müssen sehr offen und offen über den Stand des Projekts und Ihre Ideen zum weiteren Vorgehen sein, auch wenn Sie sich nicht sicher sind und mehrere Wege sehen. Dies lässt dem Geschäftsinhaber die Wahl, was zu tun ist. Wenn Sie das Wissen für sich behalten, berauben Sie sie der Wahl.
  2. Widerstehen Sie der Versuchung des vollständigen Umschreibens. Während Sie umschreiben, hat das Unternehmen kein Produkt. Außerdem ist eine Neuschreibung selten so gut, wie Sie es sich vorgestellt haben. Wählen Sie stattdessen eine Architektur und migrieren Sie die Codebasis schrittweise darauf. Sogar eine schreckliche Codebasis kann auf diese Weise gerettet werden. Lesen Sie Bücher über Refactoring, um Ihnen weiterzuhelfen.
  3. Erfahren Sie mehr über automatisierte Tests / Unit-Tests . Sie müssen Vertrauen in den Code aufbauen, und dazu müssen Sie ihn mit automatisierten Tests abdecken. Dies geht Hand in Hand mit dem Refactoring. Solange Sie die Tests nicht haben, testen Sie sie manuell und umfassend (versuchen Sie, Ihren Code zu knacken, da dies Ihre Benutzer tun werden). Protokollieren Sie alle gefundenen Fehler, damit Sie Prioritäten setzen und sie beheben können (Sie haben keine Zeit, alle Fehler zu beheben, da in der realen Welt keine Software fehlerfrei ausgeliefert wird).
  4. Erfahren Sie, wie Sie eine Webanwendung bereitstellen und am Laufen halten. Das Buch Web Operations: Daten immer auf dem neuesten Stand halten ist ein guter Anfang.

4
Nicht-technische Geschäftsleute haben ihre Gedanken und verstehen sowieso nichts von technischen Dingen. Es liegt an den Entwicklern, ihnen die technisch realisierbaren Optionen mit Kosten und Nutzen vorzustellen (was so notorisch schwierige und allgemein verhasste Dinge wie das Lernen, wie lange Aufgaben voraussichtlich dauern werden, mit sich bringt).
Jan Hudec

1
Dies ist die eine Situation, in der das vollständige Umschreiben angemessen sein könnte - wenn er im Grunde die erste Version als Trainingstool verwendet, wird die zweite Version die "sein, die er hätte schreiben sollen". Ich denke in allen anderen Fällen ist das Umschreiben ein schlechter Rat, aber nicht hier. Nicht für jemanden, der den Code geschrieben hat und nicht wirklich weiß, was er tut. Wohlgemerkt, es sollte eine weitere hervorragende Trainingsmöglichkeit sein!
Gbjbaanb

2
Ich habe eine Arbeitstheorie, nach der "jeder Teil des Produktionscodes mindestens einmal umgeschrieben wird". Soweit ich beruflich Erfahrung habe, trifft dies sowohl auf Makro- (Architektur-) als auch auf Mikro- (Methoden-) Ebene zu. Der Trick ist zu lernen, wann diese Refaktoren angemessen sind.
Zourtney

11
+1 für den ersten Punkt allein. Denken Sie daran, dass auch der Versand eine Funktion ist .
Thegrinner

5
Wenn Ihre Boos die Seite mögen, ist es geschafft. Ihr Chef hat billig gearbeitet und einen neuen College-Absolventen eingestellt. Entweder wusste er, was er bekommen würde, oder er verdient eine Ausbildung. Ihre Software hat Fehler. Lebe damit. Das machen wir alle. Du bist schlauer als vor einem Jahr. Bitten Sie um eine Gehaltserhöhung oder suchen Sie einen neuen Job (beides ist gut). Wenn Sie nach einem neuen Job suchen, sollten Sie einen Arbeitgeber mit einem Team auswählen, von dem Sie gute Gewohnheiten lernen können.
SeattleCplusplus

114

Das hört sich an wie jedes andere System, das auf mich geworfen wurde, um es zu reparieren.

Entspannen Sie sich, das passiert vielen Menschen. Ein Junior ohne Erfahrung, der keine Hilfe, keine Unterstützung und keine Anleitung hat, ist nicht gerade ein Erfolgsrezept. Von einem Junior-Programmierer zu erwarten, dass er ein brandneues System von Grund auf erstellt, das gut funktioniert, eine gute Leistung erbringt und gewartet werden kann, ist überhaupt nicht realistisch. Verdammt, Sie haben Glück, wenn das alles mit einem erfahrenen Programmierer passiert.

Meiner Meinung nach muss man sauber kommen. Das wird kein Spaß. Sagen Sie ihnen, dass Sie Ihr Bestes gegeben haben, es funktioniert (meistens), aber Sie befürchten, dass es nicht gut funktioniert und dass es viele Fehler geben wird (es gibt immer Fehler). Es muss von einem erfahrenen Programmierer überprüft werden, und er sollte in der Lage sein, offensichtliche Leistungs- / Sicherheitsprobleme ziemlich schnell zu beheben. Oder sie können es einsetzen und die Daumen drücken. Es wird entweder in Ordnung gehen oder in Rauch aufgehen. Vielleicht können Sie Probleme beheben, wenn sie auftreten. Wenn Sie eine große Anwenderbasis haben, ist dies möglicherweise nicht der Fall.

Oder Sie könnten das tun, was die meisten Menschen in dieser Situation tun: Nehmen Sie das Geld, verschwinden Sie und lassen Sie es von ihnen sortieren. Ich überlasse es Ihnen, die ethische Entscheidung zu treffen.

Bearbeiten (da diese Frage viele Stimmen hat, kann ich auch noch mehr Inhalte hinzufügen)

Ein Teil der Freude daran, Programmierer zu sein, ist, dass nicht-technische Leute (wahrscheinlich Ihr Manager, definitiv der Rest des Geschäfts) keine Ahnung haben, was Sie tun. Das ist sowohl gut als auch schlecht. Das Schlimme ist, dass Sie ständig erklären müssen, wie Softwareentwicklungsprojekte funktionieren. Planung, Anforderungen, Codeüberprüfung, Testen, Bereitstellen und Beheben von Fehlern. Es ist Ihre Aufgabe , die Wichtigkeit des Testens zu erläutern und Zeit zum Testen einzuräumen. Hier muss man sich behaupten. Die Leute werden die Wichtigkeit nicht verstehen ( "Können wir nicht einfach damit anfangen?") Aber sobald sie mit dem Testen beginnen (nicht in der Live-Umgebung!), werden sie die Vorteile schnell verstehen. Einer der Gründe, warum sie Sie eingestellt haben, ist, dass sie nichts über Softwareentwicklung wissen. Es liegt also an Ihnen, sie zu unterrichten. Sie müssen die Wichtigkeit des Testens und Behebens von Fehlern hervorheben - denken Sie daran, dass sie keine Programmierer sind und den Unterschied zwischen einer Division durch Null und einem kaputten HTML-Tag nicht kennen.

Oft sind viele der Probleme, die auftauchen, nicht wirklich Fehler. Dies sind Usability-Probleme, fehlende Anforderungen, geänderte Anforderungen, Benutzererwartungen (warum kann ich das nicht auf meinem Handy verwenden?) Und dann die tatsächlichen tatsächlichen Fehler. Sie müssen diese bügeln, bevor Sie live gehen - oft können viele Fehler behoben oder ein paar Tage später behoben werden. Wenn die Leute ein perfektes System erwarten, werden sie große Schmerzen haben. Wenn sie Bugs erwarten, wird Ihr Leben in den nächsten Wochen viel einfacher.

Verwechseln Sie Benutzertests nicht mit Komponententests oder Systemtests.

  • Unit Testing - Gibt meine Codefunktion den richtigen Wert zurück
  • System Testing - Gibt es einen Fehler aus, wenn ich auf X klicke?
  • User Acceptance Testing (UAT) - Entspricht das Programm den Anforderungen? Tut es das, worum sie dich gebeten haben? Kann es live gehen?

Wenn Sie nicht die Anforderungen aufgeschrieben haben, nach denen Sie gefragt wurden, wird UAT sehr viel schwieriger. Hier fallen viele Menschen um. Wenn Sie das, was das System tun sollte, auf Papier schreiben, wird dies Ihr Leben erheblich erleichtern. Sie werden sagen "Warum macht es kein X?" und du kannst sagen "Du hast mir gesagt, ich soll es machen, Y". Wenn das Programm falsch ist, beheben Sie es. Wenn die Anforderungen nicht stimmen, korrigieren Sie das Dokument, fordern Sie ein oder zwei zusätzliche Tage an (nein, bestehen Sie darauf), nehmen Sie die Änderung vor, aktualisieren Sie die Dokumentation und wiederholen Sie den Test.

Wenn Sie diesen Prozess ein paar Mal durchlaufen haben, können Sie anfangen, sich mit Agile zu befassen. Aber das ist eine andere Welt :)

TL; DR- Tests sind gut


7
Richtig und typisch. Ich würde sagen, es ist ausgesprochen ethisch, das Unternehmen zu verlassen. Es ist nicht die Aufgabe der Junior-Newcomer, die Belegschaft des Projekts zu managen. Deshalb würde ich absolut verstehen, wenn jemand aus diesem Grund das Unternehmen verlässt.
CsBalazsHungary

1
+1 für das Eingestehen, dass die meisten Leute das Geld nehmen und verschwinden würden. Das ist es, was Berater in der Arbeit hält.
James_pic

Nicht sehr gute Testdefinitionen hier. Unit-Tests überprüfen die technischen Spezifikationen einer Unit, Integrationstests überprüfen die technischen Spezifikationen des End-to-End-Systems, Akzeptanztests (mit oder ohne "Benutzer") überprüfen die Geschäftsspezifikationen eines Produkts. "Systemtests" können fast alles andere als Unit-Tests bedeuten. Die Überprüfung der Rückgabewerte ist in einem Komponententest nicht immer erforderlich oder hilfreich. In den seltensten Fällen schlägt ein guter automatisierter UI-Test nur fehl, wenn das System einen "Fehler" ausgibt.
Aaronaught

"Es ist Ihre Aufgabe, die Wichtigkeit des Testens zu erläutern und Zeit für das Testen vorzusehen." Ich bin kein "richtiger" Programmierer, aber ich kann es am besten erklären, wenn ein Drehmaschinenbediener keine Messschieber an seiner Maschine hat. Der einzige Weg, wie er wissen würde, dass er etwas Schlimmes getan hat, ist, wenn QC es überprüft und ihm sagt, dass es falsch ist. Wenn Sie keine Qualitätskontrolle haben und keine Komponententests durchführen, wird ein Teil blind bearbeitet und zur Tür hinausgeschickt. Genau wie in jeder anderen Branche - Wenn Sie Ihr Produkt nicht testen können, können Sie nicht wissen, ob der Versand überhaupt funktioniert.
user2785724

@ user2785724 - Wenn Sie Code schreiben, sind Sie ein echter Programmierer. Vielleicht haben Sie weniger Erfahrung, aber das macht Sie nicht weniger zum Programmierer.
Rocklan

61

Immer wenn Sie bei Null anfangen, werden Sie aufgrund des Second System Syndromme mit ziemlicher Sicherheit die gleiche Menge an Fehlern oder mehr machen . Ihre neuen Fehler werden anders ausfallen, aber der Zeitaufwand für das Debuggen wird ähnlich sein, und Sie werden verzweifelt darüber sein, dass dies nicht gut passt. Wenn die erste Version bereitgestellt wird, verzögert sich auch die Bereitstellung in der Produktion oder die Bereitstellung neuer Funktionen, was für das Unternehmen ernsthafte Probleme mit sich bringt . Joel Spolsky nennt es den "schlimmsten strategischen Fehler" , den ein Unternehmen oder Entwickler machen kann.

Der empfohlene Ansatz besteht stattdessen darin, das anfängliche Durcheinander während der Wartung Stück für Stück zu beseitigen. Und versuchen Sie nicht einmal, es nur deswegen umzugestalten. Außerdem sehen Manager dies normalerweise als Geldverschwendung an (was häufig der Fall ist) und es birgt das unnötige Risiko, neue Fehler einzuführen. Sobald Sie den Code schmerzhaft getestet haben, ist er möglicherweise nicht mehr schön, aber er wird funktionieren. Lassen Sie es so lange sein, bis Sie es aus anderen Gründen anfassen müssen (sei es eine Fehlerbehebung, eine neue Funktion oder nur eine Änderung, die vom Marketing angefordert wird). Reinigen Sie dann die Teile, die am schwierigsten einzustellen sind. Dies wird oft als Pfadfinderregel bezeichnet .

Und an diesem Punkt müssen Sie sich nicht mit dem Manager streiten. Nehmen Sie einfach das minimal gewünschte Refactoring in den Kostenvoranschlag für die Anfrage auf. Sie werden durch Erfahrung lernen, wann Sie es sich leisten können, ein bisschen zu verdienen, weil das Unternehmen wirklich in der Klemme ist und wann Sie in Zukunft keine Probleme mehr schaffen wollen und einfach keine Möglichkeit zugeben, es schnell zu hacken.

Zum Schluss noch eine kleine Lektüreempfehlung: der Big Ball of Mud .


1
+ long.MaxValue für c2.com/cgi/wiki Ich liebe diese Seite, obwohl sie irgendwie tot erscheint.
AnotherUser

4
Ich hatte noch nie von Joel Spolsky gehört, aber ich habe nur eine gute Stunde damit verbracht, einige seiner Blog-Beiträge zu lesen. Er ist absolut witzig und offensichtlich sehr kenntnisreich.
Adam Johns

9
@AdamJohns: Aber du benutzt seine Software. Jetzt sofort. Er ist der Hauptdarsteller hinter dieser Seite.
Jan Hudec

1
@ JanHudec Er und Atwood.
jpmc26

5
Endlich jemand anderes, der noch nie von Spolsky gehört hat, bevor er diese Seite besucht hat. Wenn man hier liest, würde man denken, dass er der zweite ist, der kommt.
MDMoore313

29

Ich habe vergessen, wo ich es zuerst gelesen habe, aber ich wollte nur etwas eindringlicher wiederholen, was andere Leute gesagt haben:

Der Versand ist ein Feature.

Es gibt nichts Schlimmeres als diesen einen Typ, der bestehenden (möglicherweise hässlichen, hässlichen, schmutzigen) Code "aufräumt", der perfekt funktioniert , neue Bugs einführt usw. Was in der realen Welt zählt , ist, dass Sie Ihre Arbeit erledigen. Du hast das getan. Schiff. Verlieren Sie sich nicht in Neugestaltungen eines Projekts, das perfekt funktioniert, auch wenn es unter der Haube hässlich ist. Wenn Sie das Problem beheben, gehen Sie schrittweise vor und erstellen Sie eine gute Testsuite, damit Sie so wenig Regressionen wie möglich haben.


Ich bin nicht sicher, ob es sich um das Original handelt, aber dieser Artikel erscheint als erster Google-Hit. Natürlich von Joel (er hat ziemlich viel über das Thema geschrieben und es ziemlich gut geschrieben).
Jan Hudec

24

Jedes Projekt macht Sie schlauer als je zuvor. Nach jedem Projekt haben Sie mehr Erfahrung gesammelt, was von Anfang an sehr praktisch gewesen wäre. Ich weiß, dass es schwierig ist, nicht alles noch einmal zu wiederholen und das Gelernte anzuwenden. Aber erinnere dich:

Perfekt ist der Feind des Guten.

Für den Kunden ist es immer besser, eine gute Software zu haben, als eine perfekte Software, die niemals veröffentlicht wird.

Dies war nur Ihr erstes Projekt. In Zukunft wird es noch viele weitere Projekte geben, in denen Sie alles anwenden können, was Sie von Anfang an gelernt haben.


15

Ich habe [...] Onkels Bob-Code gelesen.

Ich habe den anhaltenden Gedanken, dass ich das ganze Projekt neu schreiben muss.

Dieses Buch hat einen Abschnitt mit dem passenden Namen "The Grand Redesign in the Sky".

Versuchen Sie nicht, alles neu zu schreiben, da Sie in dem unwahrscheinlichen Fall, dass Sie die Zeit dazu haben, ohnehin mit den gleichen Problemen konfrontiert sind. Wenn Sie das Redesign abgeschlossen haben, haben Sie neue Dinge gelernt und werden feststellen, dass die ersten Teile davon sehr unprofessionell sind, so dass Sie es erneut schreiben möchten.

Redesign und Rewriting sind gut, aber nur, wenn sie auf einem funktionierenden System inkrementell durchgeführt werden. Befolgen Sie, wie ein anderer Benutzer ausführte, die Pfadfinder-Regel und überarbeiten Sie Ihren Code nach und nach, während Sie daran arbeiten.


6
Ziemlich wahr. Ich habe ein Jahrzehnt lang das Design der gleichen Codebasis wiederholt, und ich denke immer noch, dass die Architektur dessen, was ich letztes Jahr gemacht habe, Mist ist. Du hörst nie auf zu lernen.
Joeri Sebrechts

1
Und nur um zu verdeutlichen, was die inkrementellen Verbesserungen möglich macht, ist, dass Sie über eine Reihe von Tests verfügen, die Ihnen die Gewissheit geben, dass Sie die vorhandene Funktionalität nicht beeinträchtigen. Wenn Sie denken "Ich kann das nicht ändern", haben Sie gerade einen Ort identifiziert, der eine Testabdeckung benötigt.
PhilDin

9

Du machst es gut.

Sie sagen, dass Ihr Code funktioniert und fast versandbereit ist, oder? Und Sie spüren, dass Ihr Code möglicherweise erheblich verbessert wird. Gut.

Ihr Dilemma erinnert mich sehr an meine ersten Erfahrungen mit freiberuflichen Tätigkeiten (als ich im zweiten Jahr an der Uni angestellt wurde, um ein mehrsprachiges POS-System zu entwickeln). Ich habe endlose Fragen gestellt, da ich mit dem Code nie zufrieden war, Skalierbarkeit wollte, bessere Räder neu erfinden wollte ... Aber ich habe das Projekt nur verzögert (ungefähr um 12 Monate) und ... was? Sobald Sie das Ding bereitgestellt haben, muss es noch viel geprüft, getestet, gepatcht usw. werden.

Haben Sie Erfahrung im Umgang mit professionellen Code-Basen? Viele Code-Basen sind voll von schrulligem, schwer zu pflegendem Code. Eine Alternative, um die Komplexität von Software zu entdecken, indem Sie versuchen, ein großes Programm selbst zu erstellen, wäre das Verwalten / Erweitern von ebenso unordentlichem Code, der von anderen Leuten geschrieben wurde.

Die einzigen Fälle, in denen ich gesehen habe, dass vollständige Umschreibungen viel Gutes bewirken, waren die Fälle, in denen das Team gleichzeitig eine neue Toolchain / ein neues Framework einführte.

Wenn die zugrunde liegende Logik (was das Programm tut, nicht wie es als Funktionen, Klassen usw. ausgelegt ist) solide ist, funktioniert sie genauso gut. Sie denken also, dass es sich um einen Spaghetti-Code handelt, der dies nicht bedeutet sollte nicht eingesetzt werden.

Sie müssen Ihren Kunden etwas zur Verfügung stellen, das sie verwenden können. Wenn Sie dann gefragt werden, ob Sie die Funktion verbessern oder erweitern möchten, entscheiden Sie, ob ein Refaktor erforderlich ist, und Sie können Ihren Kunden mitteilen, dass "einige technische Arbeiten erforderlich sind, um die neue Funktion zu integrieren". Womit sie verstehen, dass es sie mehr Geld kosten wird und sie länger warten müssen. Und sie werden verstehen (oder Sie können sich zurückziehen).

Eine bessere Zeit, um alles neu zu schreiben, wäre, wenn ein anderer Kunde Sie bittet, etwas Ähnliches zu erstellen.

Kurz gesagt: Wenn Sie nicht nachweisen können, dass das Ganze im Falle einer Bereitstellung allen in die Quere kommt, ist eine Verzögerung der Bereitstellung unprofessionell und kommt weder Ihnen noch Ihren Kunden zugute. Wenn Sie lernen, kleine Änderungen vorzunehmen, während Sie Fehler beheben oder neue Funktionen hinzufügen, ist dies eine wertvolle Erfahrung für Sie.


7

Das meiste, was ich als Antwort auf Ihre Frage sagen würde, wurde von anderen gesagt. Lesen Sie "Dinge, die Sie niemals tun sollten, Teil I" von Joel Spolsky (zusammen mit einigen seiner anderen Posts über "Architektur-Astronauten"). Denken Sie daran, dass "das Vollkommene der Feind des Guten ist". Lernen Sie, schrittweise umzugestalten. Versand ist wichtig, etc.

Was ich hinzufügen möchte, ist Folgendes: Sie wurden mit etwas beauftragt, das von einem einzelnen Absolventen, der mit einem kleinen Startbudget / Zeitrahmen arbeitet, als machbar angesehen wurde. Sie sollten nichts Anspruchsvolleres brauchen als eine gute, strukturierte, prozedurale Programmierung. (Und, zu Ihrer Information, "prozedurale Programmierung" ist kein schlechtes Wort. Es ist in den meisten Fällen auf einer bestimmten Ebene eine Notwendigkeit und für viele ganze Projekte völlig ausreichend.)

Stellen Sie nur sicher, dass Sie eine strukturierte prozedurale Programmierung durchführen. Die Wiederholung in Ihrem Code ist nicht unbedingt ein Zeichen dafür, dass Sie große, polymorphe Strukturen benötigen. Es könnte einfach ein Zeichen sein, dass Sie den wiederholten Code nehmen und in eine Unterroutine einfügen müssen. "Spaghetti" -Kontrollfluss kann einfach eine Gelegenheit sein, ein globales Problem loszuwerden.

Wenn es Aspekte des Projekts gibt, die zu Recht Polymorphismus, Vererbung der Implementierung usw. erfordern, würde ich vorschlagen, dass die Größe des Projekts möglicherweise unterschätzt wurde.


4
Ich möchte hinzufügen, dass der Spaghetti-Code nicht auf den Verfahrenscode beschränkt ist. Eine falsche Verwendung von Polymorphismus und Vererbung kann zu einem Chaos führen, das viel schlechter zu verstehen ist als viele verworrene prozedurale Teile. Es spielt keine Rolle, ob der Kontrollfluss durch schlecht definierte Prozeduren oder durch Vererbung in einer verschachtelten Klassenhierarchie überallhin springt. es springt immer noch überall herum und ist schwer zu verfolgen.
Jan Hudec

4

Wenn Sie wirklich an dem Dilemma interessiert sind, das Sie haben, sollten Sie auch "Lean Startup" lesen. Viele der Ratschläge, die Ihnen hier gegeben werden, werden Sie mehr ansprechen, wenn Sie dieses Buch lesen. Grundsätzlich ist die Ressourcenverbrennungsrate Ihr schlimmster Feind und nichts ist für Sie und Ihr Unternehmen wertvoller als das Feedback von Endbenutzern und Kunden. Bringen Sie Ihr Produkt in einen funktionsfähigen Zustand (das Minimum Viable Product - oder MVP) und versenden Sie es dann aus der Tür (unabhängig davon, wie der Code tatsächlich aussieht). Lassen Sie Ihre Kunden Ihre zukünftigen Änderungssätze und Versionen bestimmen, nicht umgekehrt. Wenn Sie sich auf diesen Ansatz konzentrieren, werden Sie und Ihr Chef auf lange Sicht glücklicher sein.


4

Aus Gründen, die andere gründlich erklärt haben, ist es Zeit, das Projekt zu beenden und es zu versenden, so schmerzhaft das auch sein mag.

Ich möchte nur betonen, dass das Testen der App auch Teil der "Fertigstellung" ist. Wenn wichtige Funktionen nicht gründlich ausgeführt wurden und die korrekten Ergebnisse nicht bestätigt wurden, haben Sie zu Recht Bedenken, dass diese App bei der Bereitstellung Probleme verursachen wird.

Unit-Tests und automatisierte Tests auf höherer Ebene sind großartig und sollten so weit wie möglich vorhanden sein, bevor Sie versuchen, diese Anwendung umzugestalten (oder neu zu schreiben). Aber im Moment müssen Sie es hauptsächlich testen , auch wenn Sie jeden Test "von Hand" ausführen und die korrekte Funktion "von Auge" bestätigen müssen. Wenn Sie später herausfinden können, wie Sie diese Tests automatisieren können, ist dies hilfreich, wenn Sie mit der Arbeit an der nächsten Version des Produkts beginnen müssen.

Einige Leute haben ein Händchen dafür, sich als Alpha-Test-Benutzer vor ein neues Software-Projekt zu setzen und Fehler zu machen. Das heißt, sie sind gut darin, Dinge zu zerbrechen. Wenn Sie das Glück haben, dass eine so talentierte Person mit Ihnen zusammenarbeitet, lassen Sie sie zuerst die App ausprobieren, damit Sie die Chance haben, offensichtliche Fehler frühzeitig zu beheben. Wenn Sie diese Aufgabe selbst erledigen müssen, dann:

  • Sei methodisch.
  • Probieren Sie alle Funktionen aus.
  • Stellen Sie sich als Benutzer vor, der mit Ihrer Anwendung unerfahren ist. Machen Sie dumme Fehler und sehen Sie, wie die Software damit umgeht.
  • Schreiben Sie auf, was Sie tun, damit Sie es erneut versuchen können, nachdem Sie glauben, die Probleme behoben zu haben.

Dem stimme ich voll und ganz zu. Vergessen Sie nicht, auch in der Produktion manuell zu testen. Unabhängig davon, wie viele Tests Sie in der Entwicklungsumgebung durchgeführt haben, müssen Sie immer nach jeder Bereitstellung einen Funktionstest in der Live-Umgebung durchführen. Sie können Ihre Kollegen bitten, dabei zu helfen.
Will Sheppard

1

Ihre Frage lautet: "Falsch gestartet, sollte ich von vorne beginnen", während der zusätzliche Text tatsächlich "Fertiges Projekt, aber falsch gemacht, sollte ich von vorne beginnen" lautet. Nur für die Überschrift der Frage: Wenn der Programmieraufwand im Vergleich zum Gesamtaufwand gering ist, ist es sinnvoll, von vorne zu beginnen. Das passiert oft, wenn das Problem komplex und schlecht verstanden ist und einige Zeit damit verbracht wird, herauszufinden, was das Problem tatsächlich ist. Es macht keinen Sinn, mit einem schlechten Start fortzufahren. Wenn Sie ihn wegwerfen und von vorne beginnen, bedeutet dies, dass Sie mit einem guten Verständnis des Problems tatsächlich schneller fertig werden.


0

Das würde ich persönlich machen:

  1. Kündigen Sie, entschuldigen Sie sich und geben Sie auf (Sie können sogar einen Teil Ihres Gehalts zurückgeben, damit Sie nicht schlecht aussehen)
  2. Bereinigen Sie Ihren Code so weit wie möglich
  3. Machen Sie Unterlagen über alle guten Teile Ihrer Arbeit wie Ihr gutes Design, gute Ideen, etc ...

Warum schlage ich Ihnen all dies vor?

Weil an die Zukunft denken. Es wird in Zukunft eine Zeit geben, in der bestimmte Personen Zugriff auf diesen Code erhalten. Sie werden alle möglichen Annahmen und Urteile über Sie und Ihre Fähigkeiten fällen. Es ist ihnen egal, wann du es geschrieben hast, es ist ihnen egal, unter welchen Umständen. Sie wollen nur sehen, was sie sehen wollen, um zu bestätigen, was sie bestätigen wollen.

Sie werden als was auch immer schlechter Name gebrandmarkt, Begriff, den sie finden können, um Sie negativ zu beeinflussen. Und obwohl Sie in Zukunft in Bezug auf technische Fähigkeiten, Fähigkeiten, Kenntnisse, Stil und die Situation völlig anders sein könnten, wird dieser Code auf jede mögliche Weise gegen Sie verwendet. Es ist wie bei einem Gericht, wo sie all die schlechten Dinge über Sie und Ihren Code und Ihr Design sagen können und Sie sich dessen nicht einmal bewusst sind, so dass Sie sich selbst erklären und verteidigen können. (und Sie werden oft feststellen, dass sie wiederholt zutiefst falsch liegen.) Tun Sie es also nicht. Gib auf.

Vertrauen Sie mir, es gibt Leute, die viele Annahmen über Sie gemacht haben, weil Sie zu irgendeinem Zweck und zu irgendeinem Zeitpunkt etwas getan haben. Wenn Ihnen dies in Situation A gefallen hat, werden Sie es in Situation B tun. Sie denken sehr einfach.


0

Zwei weitere Vorschläge, ich wette, mindestens einer davon hast du noch nicht gemacht.

1) Setzen Sie einen Bug-Tracker ein und bringen Sie Ihrem Chef den Umgang damit bei. Dies kann Teil des Gesprächs darüber sein, wie Sie es vermasselt haben, besser gelernt haben und es auf geplante Weise beheben werden

2) Starten Sie die Versionskontrolle, obwohl Sie dies hoffentlich bereits tun.

Es gibt unzählige gehostete Systeme, die beides kostenlos für kleine Konten anbieten. Ich mag FogBugz besonders, da es auch ein hervorragendes Bewertungs- und Aufgabenerfüllungssystem gibt, das Ihrem Chef noch mehr Sicherheit gibt, dass Sie die Dinge auf eine gut gemanagte Art und Weise angehen.

bearbeiten

Wow, jemand mochte das wirklich nicht - eine Ablehnung UND eine Lösch-Flagge? Warum?

Ich habe über dreißig Jahre lang Software entwickelt, einschließlich viel Beratungsarbeit und der Vererbung des Codes anderer Leute. Eine große Anzahl der Problemsysteme, die ich gesehen habe, war dort, wo Leute eine Grube gegraben haben und keine detaillierten Notizen darüber hatten, wie sie dorthin gekommen sind, und sie hatten keine Versionskontrolle.


-2

Um Ihre Frage zu beantworten: Wie so viele andere gesagt haben, nein. Versende es und räum es Stück für Stück auf, während du Fehler behebst.

Auch wenn books / StackExchange / webforums gute Lernressourcen sind, werden Sie wahrscheinlich feststellen, dass nichts mit dem übereinstimmt, was Sie durch die Arbeit mit anderen Programmierern (oder auch nur durch Diskussionen über die Arbeit) erhalten. Eine lokale Gruppe für eine Technologie zu finden und zu besuchen, die Sie verwenden oder lernen möchten, ist eine wunderbare Investition Ihrer Zeit. Neben dem zu erwerbenden technischen Wissen ist dies eine einfache Möglichkeit, sich zu vernetzen, die von unschätzbarem Wert ist, wenn Sie sich auf zukünftige Auftritte freuen.


-2

Ihr Chef war sich Ihrer Erfahrung bewusst, als er Sie anstellte. Bringen Sie einfach Ihre Bedenken zum Ausdruck und lassen Sie ihn wissen, dass Sie darüber nervös sind. Lassen Sie ihn auch wissen, wie viel Sie gelernt haben und wie viel besser Sie das nächste Projekt durchführen können.


-2

Sie sind ein beginnender Webentwickler, und kein guter Entwickler ist anwesend, um Sie zu beraten. Ihr Chef hat Sie beauftragt, dies zu wissen. Ich denke, du machst es genauso gut, wie es von dir erwartet wird. Tatsächlich bedeutet die Tatsache, dass Sie die Einsicht haben, dass der Job besser hätte sein können und dass Sie tatsächlich Dinge gelernt haben, mit denen Sie es besser machen können, dass Sie es besser machen als die meisten anderen. Denken Sie zu Ihrer eigenen Sicherheit daran, dass es die Version von Ihnen, die den Job begonnen hat, nicht besser hätte machen können. Jemand, der mehr Erfahrung hat (und daher besser bezahlt wird), oder Sie, der über ein Projekt verfügt, hätten es besser machen können.

Was jetzt zu tun ist : Seien Sie froh, dass Sie ein besserer Entwickler sind als vor einem Jahr. Das nächste Projekt werden Sie besser machen (und am Ende werden Sie wieder erfahrener und nicht zufrieden mit dem, was Sie getan haben; das ist normal). Wenn Sie das letzte Projekt ändern oder umschreiben, hat das Unternehmen nur einen geringen Nutzen für die Kosten. Sie können fehlerhaften Code durch guten Code ersetzen, wenn Sie ohnehin Änderungen vornehmen müssen. Das ist sinnvoll, da das Ändern von schlecht wartbarem Code schwieriger sein kann als das Ersetzen durch guten Code. Und wenn Sie einen neuen unerfahrenen Entwickler um Hilfe bitten, teilen Sie ihm mit, dass dieser Code kein Beispiel ist, das er kopieren sollte.

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.