Die bedauerlichste Design- oder Programmierentscheidung, die Sie getroffen haben? [geschlossen]


57

Ich würde gerne hören, welche Art von Designentscheidungen Sie getroffen haben und wie sie fehlgeschlagen sind. Aufgrund einer schlechten Designentscheidung musste ich diese schlechte Entscheidung für immer unterstützen (ich hatte auch einen Teil daran). Dadurch wurde mir klar, dass ein einziger Designfehler Sie für immer verfolgen kann. Ich möchte von den erfahreneren Leuten lernen, welche Art von Fehlern sie erlebt haben und was sie von ihnen gelernt haben.

Ich bin mir sicher, dass dies für andere Programmierer eine große Hilfe sein wird, indem sie ihnen helfen, diese Entscheidungen nicht zu wiederholen.

Vielen Dank für Ihre Erfahrung.


19
verbringe zu viel Zeit mit SO !! ;)
Mitch Wheat

6
@ George: Anscheinend handelt es sich bei Ihrem ersten Link um eine Überentwicklung, die tangential mit diesem Thread in Verbindung gebracht werden kann, aber kein Duplikat ist. Der zweite und der letzte Link betreffen Codierungsfehler und Verwaltungsfehler, von denen keiner Duplikate dieses Threads sind.
Juliet

1
Dies sollte wahrscheinlich zu einem Community-Wiki gemacht werden (es gibt ein Kästchen, wenn Sie den Beitrag bearbeiten).

3
Ich wünschte, es gäbe eine Möglichkeit, gegen den Schluss zu stimmen. Downvote eine enge?
Kieveli

5
Was ist los mit all den geschlossenen Wählern? Was ist, wenn es kein CW ist? Lassen Sie den Fragesteller ein paar Stimmen für die Beantwortung der Frage erhalten. Ich interessiere mich wirklich für dieses Thema. Lassen Sie sich von CW nicht von guten subjektiven Fragen abhalten. Meine Güte, SO ist voll von "CW THIS" -Schreien.
Syaz

Antworten:


73

YAGNI immer wieder ignorieren ...


22
Wahr für die meisten, aber es gibt auch Leute, die ein bisschen weniger YAGNI gebrauchen könnten. Kein Extrem ist der beste Ort, um zu sein.
80 x

56

"Ich mache es später"
"Später" kommt nie.


8
Später kommt nie mehr.

Das tut es nie.

Es wurde gesagt: Wenn Sie gerade keine Zeit haben, dies zu tun, warum denken Sie dann, dass Sie Zeit haben, es später zu beheben?

4
Wir nennen dies "Iteration nie"
NotMe

10
Nichts ist so dauerhaft wie eine vorübergehende Lösung.
Dietbuddha


44

Die Konfigurierbarkeit in einer Anwendung ist nett. Zu viel Konfigurierbarkeit ist ein Albtraum, der zu verwenden und zu warten ist.


2
Ja. Wahr. Es ist ideal, alles konfigurierbar zu machen und Boss mitzuteilen, dass wir nie wieder eine einzige Codezeile ändern müssen.

1
Da ich der unglückliche Benutzer war, der mit einem dieser unendlich konfigurierbaren Systeme für unser Projektmanagement feststeckte, kann ich nur sagen, dass ich Sie millionenfach unterstützen würde, wenn ich könnte.
HLGEM

Überflexibilität bei der Konfiguration ist normalerweise darauf zurückzuführen, dass Sie zur Laufzeit keinen beliebigen Code ausführen können und daher alles vorwegnehmen müssen.

Dies nennt man "Spoftcoding" im Gegensatz zu "Hardcoding"
deadalnix

42

Aus einem meiner Fehler habe ich gelernt, dass die DB-Normalisierung nicht blind verfolgt werden sollte. Sie können und in einigen Situationen MÜSSEN Sie Ihre Tabellen verflachen.

Am Ende habe ich eine Menge Tabellen (über Modelle) verwaltet, und die Leistung war nicht so gut wie bei einer kleinen Reduzierung der Tabellen.


5
Ich könnte nicht mehr zustimmen ... Ich bin ein Software-Ingenieur und wir sollen immer normalisieren. Was für ein Scheißkerl. Das lag nur daran, dass die Lehrer nicht versucht hatten, mit wirklich komplexen und leistungsabhängigen DBs zu arbeiten.

8
Ich möchte hinzufügen, dass die Normalisierung natürlich auch sehr positiv sein kann.

12
Ich denke, Programmierer sind aus unangemessenen Gründen zu schnell zum Denormalisieren, aber ja, die sklavische Einhaltung der Normalisierungsregeln ist ein großer Fehler. Im Allgemeinen ist eine meiner größten Frustrationen in der Softwareentwicklung, wenn jemand sagt, "Wir müssen X machen", und wenn ich auf alle Probleme hinweise, die dies verursachen wird, antwortet er: "Das ist irrelevant. Alle Experten sind sich einig, dass X gut ist. Deshalb müssen wir X immer ohne Ausnahmen machen. "

4
Mein Ansatz zur Normalisierung ist immer direkt. Ich normalisiere immer, ABER wenn ich einen möglichen Leistungsschub bei geringer Reduzierung sehe, teste und vergleiche ich immer und in den meisten Fällen zahlt es sich aus, zu reduzieren.
Eimantas

7
Aber Normalisierung macht SPASS! :) Ich meine es ernst, ich genieße es, Datenstrukturen zu entwerfen. Was ich sagen würde, ist, dass es zwar leicht ist, ein normalisiertes Schema zu de-normalisieren, das Gegenteil jedoch NICHT der Fall ist. Sie müssen die Regeln kennen, bevor Sie sie brechen.

36

Verwenden eines einzelnen Zeichens in Datenbanken für Status usw. Es macht überhaupt keinen Sinn, dass der Aufwand für die Verwendung eines längeren Zeichens () oder von nvarchar2 () im Vergleich zum Netzwerk und zum Parsen, die bei jedem SQL-Aufruf anfallen, winzig ist. Die Zeichen enden jedoch immer up eher verschleiert oder knapp (nicht für Status, aber andere Dinge). Es ist weitaus besser, nur die für Menschen lesbare Version einzutragen und in Ihrem Java-Modell (in meinem Fall) eine Aufzählung mit übereinstimmenden Werten zu haben.

Ich denke, dies ist eine Form der vorzeitigen, unnötigen und blinden Optimierung. Als ob die Verwendung eines einzigen Zeichens heutzutage die Welt retten würde. Abgesehen von J / N Booleschen Werten in Datenbanken, die keine Booleschen Werte / Bits unterstützen.


+1 Wir haben uns gerade zu diesem Thema getroffen. Wir sind zu dem gleichen Schluss gekommen.
APC

Was ist, wenn Ihr Kunde mit solchen Abkürzungen arbeitet und diese nicht aufgeben möchte?

Für vorhandene Systeme müssen Sie kompatibel sein (ich würde immer noch eine Java-Enumeration mit geeigneten Werten erstellen, natürlich mit einer <code> MyEnum fromChar (char c) </ code> -Methode). Gehen Sie für neue Designs einfach nicht dorthin!

Einige Datenbanken unterstützen Aufzählungen, die sowohl kompakt als auch lesbar sind und unerwartete Werte verbieten. Wenn du kannst, benutze diese.
Karl Bartel,

2
Fast genauso schlecht: Verwenden Sie den BIT-Typ in MS SQL Server, bevor Sie feststellen, dass er nicht Teil eines Index sein kann.
1.

32

Ich entwickle keine richtige Datenzugriffsebene und habe SQL überall in meinem Code, nur um etwas "Schnelles" zum Laufen zu bringen. Später, als das Projekt expandierte und sich die Anforderungen änderten, wurde es zu einem Albtraum. Ich wusste nicht, was ein DAL zu der Zeit war.

Ich bin froh, dass ich das hinter mir habe, obwohl ich immer noch Programmierer mit mehr als 20 Jahren "Erfahrung" sehe, die dies tun.


16
Ich kann mich nicht erinnern, wo ich es gelesen habe, aber es gibt einen Unterschied zwischen 20 Jahren Erfahrung und einem Jahr Erfahrung, die 19 Mal wiederholt wurde.
CaffGeek

@Chad: Es war irgendwo in den Schriften von Joel Spolsky.

+1: Ja. Und versuchen Sie, die gesamte Logik, die in diesem SQL-Code enthalten ist, umzugestalten. [Yup - Ich habe keine Angst vor diesem heiligen Krieg.]
Jim G.

26

Ich denke, ich könnte Architekt, Entwickler und PM in einem Projekt sein.

2 Monate Schlaf, 3 Stunden pro Nacht, haben mir beigebracht, dass du es einfach nicht kannst.


15
Also hör auf so viel zu schlafen! oh, warte ... du meinst das ist NICHT normal ... ?? Hmm, ich muss noch ein paar andere Leute für dieses Projekt gewinnen ...
AviD

Klingt wie die PM-Sie brauchen etwas Training mit Schätzungen :)

21

Auswählen von Microsoft Foundation Classes (MFC) zum Schreiben einer Java-IDE.


3
Owwww. Das würde mein Gehirn verletzen.
Greg D

2
Das war 1999 keine schlechte Entscheidung. AWT war damals hässlich und langsam.
1.

finnw - na, zumindest ist es immer noch hässlich!
Niklas H

20

Es war nicht meine Entscheidung (ich trat etwas später in die Firma ein), aber irgendwo, wo ich arbeitete, ging es ein bisschen zu weit, einschließlich der Übersetzung aller ihrer Protokollnachrichten.

Ergebnisse:

  • Schmerzhafter, neue Protokollierung hinzuzufügen
  • Mehr Kosten für die Übersetzung
  • Protokolle sind danach schwerer zu lesen

Hoppla.


Ich mache hier ein paar Schritte und versuche herauszufinden, was an den Benutzer geht und was in die Protokolle geht. Ich möchte alle benutzerbezogenen Ausgaben lokalisieren, aber ich möchte, dass die Protokolle gleich bleiben. Dabei muss ich mehr herausfinden, wo eine Ausnahme auftritt, als ich mag.
David Thornley

1
Lass mich raten, dein Amerikaner? Und wenn nicht, sprechen Sie nur Englisch? Verwenden Sie die Internationalisierung, wenn neue Protokolleinträge in Englisch vorhanden sind. Wenn eine andere Sprache verfügbar ist, wird die Benutzersprache angezeigt. TIPP: Die Verwendung von Fehlercodes hilft hier, da Sie immer Grep- / Scan-Protokolle erstellen können, unabhängig von der Sprache.

2
@Jacob: Ich bin Engländer, spreche aber nur Englisch. Dies war jedoch für ein Unternehmen der Fall, bei dem sich die gesamte technische Basis in England befand. Protokolldateien (die zu Diagnosezwecken und nicht für den Benutzer sichtbare Informationen sind) in anderen Sprachen wären also reine Ressourcenverschwendung. Ich bin damit einverstanden, dass die Verwendung von Fehlercodes anstelle von Text eine sofortige Übersetzung ermöglicht - aber es ist immer noch mehr Arbeit, als zunächst nur eine einzige Sprache zu verwenden. Es geht darum, die Arbeit zu reduzieren, indem herausgefunden wird, wo etwas, das sich nützlich anhört , tatsächlich keinen signifikanten Wert liefert.
Jon Skeet

10
Ich bin Schwede. Ich müsste für jeden Mittelalter werden, der sogar vorschlägt, dass Code / Kommentare / Protokolle in einer anderen Sprache als Englisch verfasst sein sollten. Englisch ist DIE Sprache, die für alle außer Benutzeroberflächen verwendet wird. Alles andere macht Code nur schwer zu lesen und zu diskutieren. Die Verwendung einer Muttersprache ist lächerlich, da alle anderen verwendeten Frameworks / Bibliotheken auf Englisch sind.
jgauffin

1
+1 Englisch ist die Verkehrssprache der Programmierung. Wenn Sie es übersetzen lassen, fügen Sie einfach eine zusätzliche Ebene ein, in der Sie so wenige Ebenen und so viel Klarheit wie möglich benötigen.


19

Zu viel designen . Viele UML-Diagramme erstellen, insbesondere Sequenzdiagramme für jede einzelne Operation, von denen sich am Ende viele als nutzlos herausstellten. Am Ende stellte sich heraus, dass viel Zeit gespart werden konnte, indem unnötig detaillierte Entwürfe / Diagramme übersprungen und direkt mit dem Codieren begonnen wurde.


Wenn die Frage lautete: "Was ist die bedauerlichste Design- oder Programmierentscheidung, die Sie jemals getroffen haben?" Im Gegensatz zu Fehlern, die wir selbst gemacht hatten, hatte ich "UML" ganz oben auf meiner Liste. Direkt unter "der Windows-Registrierung".

2
UML ist gut, um zwischen Mitgliedern eines Teams zu diskutieren, aber wenn es um das Design geht, das dann entsprechend dem Design implementiert wird, endet es immer schlecht. Dies ist eine Art Traum einiger Unternehmen, aber wirklich, Software-Schreiben funktioniert definitiv nicht so. +1!
Deadalnix

17

Glauben, dass Kunden wissen, was sie wollen, und dann zu viel tun, bevor sie sich an sie wenden.


15

Meine schlimmste Designentscheidung? In den 1980er Jahren arbeitete ich an einem Projekt, in dem wir die gute Idee hatten, eine Art Vorlage für unsere Dateneingabebildschirme zu erstellen, die zur Laufzeit interpretiert werden sollte. Keine schlechte Entscheidung: Eingabebildschirme waren einfach zu gestalten. Erstellen Sie einfach eine Datei, die dem Dateneingabebildschirm ähnelt, mit einigen speziellen Codes, um zu identifizieren, was eine Bezeichnung war, und was ein Eingabefeld war, und um zu identifizieren, ob Eingabefelder alphanumerisch oder numerisch waren. Dann habe ich beschlossen, diesen Dateien einige weitere spezielle Codes hinzuzufügen, um zu bestimmen, welche Überprüfungen durchgeführt werden sollten. Dann fügte ich weitere Codes hinzu, um die bedingte Erstellung des Bildschirms zu ermöglichen, Feld X nur, wenn eine Bedingung erfüllt war, usw. Dann fügte ich weitere Codes hinzu, um eine einfache Verarbeitung der Eingaben durchzuführen. Usw. usw. Schließlich hatten wir unsere Bildschirmschablone in eine neue Programmiersprache umgewandelt, die Ausdrücke, Kontrollstrukturen und eine E / A-Bibliothek enthielt. Und wofür? Wir haben eine Menge Arbeit geleistet, um FORTRAN neu zu erfinden. Wir hatten ein Regal voller Compiler für Sprachen, die besser entworfen und besser getestet wurden. Wenn wir uns so viel Mühe gegeben hätten, um Produkte zu bauen, bei denen wir tatsächlich über Fachwissen verfügten, könnte dieses Unternehmen heute noch im Geschäft sein.


Das ist sowohl lustig als auch tragisch :)

Das Traurige ist, dass dieser Ansatz manchmal der beste Weg ist. Der Kunde kann entweder "Bildschirm kann jederzeit gewechselt werden" oder "Bildschirm macht alles, einschließlich Tee zubereiten", aber nicht beides!

3
Ich habe nichts gegen die Verwendung von Vorlagen oder anderen generischen Code. Der Fehler bestand darin, einen Teil des generischen Codes in eine Sprache in einer Sprache zu verwandeln.

Genau das habe ich gesehen ... im Jahr 2004! Die gesamte Geschäftslogik ist auf rund fünfzehn Konfigurationstabellen verteilt, in die mehrere halbherzige Versuche mit dynamischen "Sprachen" eingeworfen wurden (siehe Greenspuns Zehnte Regel)!

1
Meinen Sie nicht eher COBOL als FORTRAN?
1.

15

Übereifrige Anwendung von YAGNI ( Design by Enumeration in Fallstricken objektorientierter Entwicklung ) in einer Umgebung, in der jeder vernünftige Mensch erkennen konnte, dass sich die Anforderungen definitiv ändern würden. Und immer wieder ändern.

Wenn Sie alles genau auf die aktuellen Anforderungen (fest-) programmiert haben - und dabei jeden niedergeschlagen haben, der sagt, " Könnte das nicht allgemeiner sein?" mit Ihrem YAGNI-Schläger - und dann ändern sich die Anforderungen drastisch (aber auf eine Weise, die vernünftigerweise hätte vorweggenommen werden können), dann kann dies der Unterschied zwischen einer Anpassungszeit von 2 Wochen und einer Anpassungszeit von 20 Minuten sein.

UPDATE: Zur Verdeutlichung hier ein fiktives Beispiel, das nicht allzu weit von dem entfernt ist, was passiert ist. Der Stapelüberlauf wurde entwickelt, um Abzeichen zu unterstützen. Angenommen, sie konnten zunächst nur vier Abzeichen erkennen. Nur vier, eine so kleine Zahl, so dass sie genau vier Ausweise in der gesamten Logik der Site fest codieren . In der Datenbank, in den Benutzerinformationen, im gesamten Anzeigecode. Weil "Du wirst keine Abzeichen brauchen", an die du nicht denken kannst, oder? Nehmen wir dann an, die Site geht in Betrieb und die Leute schlagen neue Abzeichen vor. Jedes AbzeichenDas Hinzufügen dauert bis zu zwei Wochen, da es so viel Hardcoding gibt, das man überall anpassen kann. "Du wirst aber nicht mehr Abzeichen als die heutige Liste brauchen", daher gibt es keine Umgestaltung, um eine generische Sammlung von Abzeichen zu unterstützen. Hätte eine solche generische Sammlung von vornherein mehr Zeit in Anspruch genommen? Nicht viel, wenn überhaupt.

YAGNI ist ein wertvolles Prinzip, aber es sollte nicht (ab) verwendet werden, um schlechtes Design und ungeeignete Hardcodierung zu entschuldigen. Es gibt ein Gleichgewicht, und mit der Erfahrung glaube ich, dass ich mich dem annähere.


1
Ja und nein, können Sie vorhersagen, in welche Richtung sich das ändern wird? Ich habe Erfahrung mit schmerzhaft komplexen Systemen, die sich für die erste Wiederverwendung als völlig unzureichend erwiesen haben und nicht in die vorhergesagte Generizität passten ...
Benjol

^ yep, ich würde mich lieber mit YAGNI befassen als mit diesem Mist.

Du denkst also, du hättest die 2 Wochen im Voraus verbringen sollen?
1.

4
Dieses Beispiel ist überhaupt nicht YAGNI. DRY ist ein Teil von YAGNI, und ohne es können Sie nicht auf Veränderungen reagieren.

3
Stephan, das Beispiel zeigt einen kleinen Fehler und einen unangemessenen Missbrauch des Schlagworts, worum es mir ging. DRY (mit seiner Variante OAOO) ist ebenfalls ein gutes Prinzip, aber ziemlich getrennt: c2.com/cgi/wiki?OaooBalancesYagni . Ich kann jedoch nirgendwo etwas finden , das Ihre Behauptung stützt, dass "DRY ein Teil von YAGNI ist". Senf passt gut zu Hotdogs, aber das bedeutet nicht, dass Senf ein Teil von Hotdogs ist. Wenn Sie vielleicht mit Referenzen klarstellen könnten, werde ich vielleicht verstehen.
80 x 24 Konsole

15

Inkompetente personelle Ressourcen

Der Versuch, mit falschen Leuten etwas richtig und großartig zu machen!
Auch wenn sie die Rolle eines überflüssigen Ego-PMs spielen (was besonders in großen Unternehmen, in denen ihre Inkompetenz längere Zeit andauern kann, eher zu häufig ist).


1
Ich verstehe deine Schmerzen :(

13

Jedes Mal, wenn ich technische Schulden mache, Verfahrenscodes schreibe, Schreibtests überspringe usw., weil ich mich beeile. Es ist fast unvermeidlich, dass mir das später weh tut.


13

Verwenden von SQL Server Intergration Services (SSIS).

Ich wünsche es meinem schlimmsten Feind nicht.

Nachdem ich in den letzten zwei Monaten mehrere SSIS-Pakete erstellt hatte, musste ich feststellen, dass die von mir entwickelten Pakete nicht verteilbar und nicht einsetzbar sind. Insbesondere in einer Umgebung ohne Web- oder SQL Server-Lizenz.

Es ist eine sehr schlechte Situation, wenn Sie weniger als 48 Stunden Zeit haben, um Ihre SSIS-Pakete in reinem .NET POCO-Code neu zu schreiben oder Ihre festgelegte Frist zu verpassen.

Es erstaunt mich, dass ich drei SSIS-Pakete (für das Testen und Entwickeln habe ich zwei Monate gebraucht) innerhalb von 12 Stunden in reinem .NET-Code mit OLEDB-Adaptern und SQL-Adapatern umschreiben konnte.

SSIS ist nicht verteilbar und führt keine Pakete von einem Clientcomputer aus, auf dem keine SQL Server-Lizenz installiert ist (insbesondere DTSPipeline.dll). Das wäre großartig, wenn man es vorher wüsste. Ich sehe den Haftungsausschluss jetzt (im Kleingedruckten) auf MSDN. Das nützt nichts, wenn Sie im gesamten Internet Beispielcode verwenden, der ausschließlich SQL-LICENSED-Code enthält. Grundsätzlich müssen Sie einen Webdienst erstellen, der mit Ihrem SQL-Server kommuniziert, um Ihre SSIS-Pakete programmgesteuert ausführen zu können. Sie können sie nicht aus reinem .NET-Code ausführen, es sei denn, Sie haben eine SQL-Lizenz auf dem ausführenden Computer installiert. Wie unrealistisch ist das? Erwartet Microsoft wirklich, dass SSIS auf Computern verwendet wird, auf denen SQL Server installiert werden muss? Was für eine reine Verschwendung von zwei Monaten.

Mein Unternehmen wird SSIS aufgrund dieses Kleingedruckten "gotcha" nie wieder verwenden.


Vielleicht sollten Sie die Verwendung von "Kleingedruckter" Software ganz vermeiden! Talend ist zum Beispiel eine Open-Source-ETL-IDE.

+1: Ja. Die SSIS-Entwicklungserfahrung ist auch ein Albtraum. Es gibt wahrscheinlich mindestens ein halbes Dutzend bessere Möglichkeiten, ETL durchzuführen.
Jim G.

11

Den Bereitstellungsmechanismus / das Bereitstellungsmodell nicht so früh wie möglich definieren.


10

Wirf ein paar "lustige" Ostereier in einen Code, den ich geschrieben habe, bevor ich 2 Wochen in den Urlaub ging. Ich dachte, ich wäre die einzige Person, die es liest, wenn ich zurückkomme. Es würde mich zum Kichern bringen und bereit machen, es neu zu codieren.

Es erübrigt sich zu erwähnen, dass mein Chef nicht beeindruckt war, als er es mir während meiner Abwesenheit ansah, und noch weniger beeindruckt war er, als eines der „Ostereier“ sein Gesicht betraf, das lustig in ASCII gezeichnet war.

Mmmmmm ...


1
IMO, das ist "Gute Arbeit, Sir!"

18
Vor kurzem wurde ich von meinem Team verspottet, weil ich Nachrichten wie "Addin 'Th'value (P) T'yer Table!" Ich sagte, schau, sie haben mich dazu gebracht, an Talk Like A Pirate Day zu arbeiten. Sie haben verdient, was sie bekommen.

3
Arr, deine Logs suchen nach einem Keel'haulin!

10

Verwenden von ASP.Net-Designs, wenn nur ein normaler alter CSS-Ordner funktioniert hätte.


Lol schon, ja!

1
Diese Antwort könnte auf "Verwenden von ASP.NET"
abgekürzt werden

Skins sind nützlich, um die Standard-CSS-Klasse einzurichten.
Min

8

Nehmen Sie den schnellen Weg, um einen Code zum Laufen zu bringen, und nicht den richtigen (ein bisschen allgemein, aber wir nennen es eine Abstraktion und daher eine "richtige" Antwort).


7

In meinem Unternehmen gibt es ein wasserfallartiges Entwicklungsmodell, in dem unsere Geschäftsanwender und Geschäftsanalysten Anforderungen für Projekte definieren. Bei einem unserer "großen" Projekte haben wir einen Stapel von Anforderungen erhalten, und ich habe festgestellt, dass einige Anforderungen Implementierungsdetails enthalten , insbesondere Informationen zu unserem Datenbankschema, das von unserem Buchhaltungssystem verwendet wird.

Ich habe den Geschäftsbenutzern gesagt, dass die Implementierung meine Domäne ist und nicht in den Anforderungen enthalten sein sollte. Sie wollten ihre Anforderungen nicht ändern, weil sie schließlich DAS GESCHÄFT sind, und es ist nur für Buchhalter sinnvoll, Buchhaltungssoftware zu entwerfen. Als bescheidener Entwickler, der zu weit unten in der Totem-Umfrage ist, werde ich dafür bezahlt, zu tun, anstatt nachzudenken . So sehr ich dagegen gekämpft habe, ich konnte sie nicht überreden, die Anforderungen neu zu schreiben - es gibt zu viel Papierkram und Bürokratie um Änderungen herum, was einfach zu mühsam ist.

Also gab ich ihnen, wonach sie fragten. Zumindest funktioniert es , aber die Datenbank ist seltsam gestaltet:

  • Viele unnötige Normalisierung. Ein einzelner Datensatz mit 5 oder 10 Feldern ist auf 3 oder 4 Tabellen aufgeteilt. Damit kann ich umgehen, aber ich persönlich möchte, dass alle 1: 1-Felder in einer einzigen Tabelle zusammengefasst werden.

  • Viele unangemessene Denormalisierung. Wir haben eine Tabelle, die Rechnungsdaten speichert, die mehr als Rechnungsdaten speichern. Wir speichern eine Reihe verschiedener Flags in der InvoiceData-Tabelle, auch wenn das Flag nicht logisch mit der InvoiceData-Tabelle verknüpft ist, sodass jedes Flag einen magischen, fest codierten Primärschlüsselwert und alle anderen in der InvoiceData-Tabelle auf Null gesetzten Felder enthält. Da das Flag als Datensatz in der Tabelle dargestellt wird, schlug ich vor, das Flag in eine eigene Tabelle zu ziehen.

  • Viel unangemessenere Denormalisierung. Bestimmte app-weite Flags werden als Spalten in unangemessenen Tabellen gespeichert, sodass zum Ändern des Flags einer App jeder Datensatz in der Tabelle aktualisiert werden muss.

  • Primärschlüssel enthalten Metadaten. Wenn ein varchar-Primärschlüssel auf "D" endet, werden Rechnungen mit einem Wertesatz berechnet, andernfalls mit einem anderen Satz. Sinnvoller wäre es, diese Metadaten in eine separate Spalte zu ziehen oder den Wertesatz zur Berechnung in eine andere Tabelle zu ziehen.

  • Fremdschlüssel werden oft zu mehr als einer Tabelle verschoben, sodass ein mit "M" endender Fremdschlüssel mit unserer Hypothekenkontentabelle verknüpft werden kann, während ein mit "A" endender Fremdschlüssel mit unserer Autokontentabelle verknüpft werden kann. Es wäre einfacher, die Daten in zwei Tabellen aufzuteilen, MortageData und AutoInsuranceData.

Alle meine Vorschläge wurden mit viel Wehklagen und Zähneknirschen niedergeschossen. Die App funktioniert so, wie sie entworfen wurde, und obwohl es sich um einen großen Schlammball handelt, sind alle bösen Hacks, Sonderfälle und seltsamen Geschäftsregeln sarkastisch und humorvoll im Quellcode dokumentiert.


3
Meine Güte, ich hoffe, Ihr Lebenslauf ist schön und auf dem neuesten Stand für eine schnelle Flucht, bevor der große Schlammball der Schwerkraft erliegt!
Benjol

7

Festhalten an älteren Technologien, da es zu umständlich zu sein scheint, Ihre Kunden auf eine neue .NET Framework-Version aktualisieren zu lassen, die Erstellung der Software jedoch tatsächlich mehr Entwicklungszeit in Anspruch nimmt, da Sie einige (zeitsparende) Komponenten der nicht verwenden können neuere Framework-Version.


+1: Ja, ich war schon da ... Und als ich merkte, dass die n00bs nicht aufgerüstet werden würden, begann ich meine Flucht auf grünere Weiden zu planen.
Jim G.

Und so ging ich im nächsten Monat in den Ruhestand!
Reben

6

Zurück an der Universität arbeitete ich an meinem Senior Design Projekt. Ein anderer Typ und ich haben ein webbasiertes Bug-Tracking-System geschrieben. (Nichts bahnbrechendes, aber wir wollten beide etwas Web-Erfahrung sammeln.) Wir haben das Ding mit Java-Servlets gemacht, und es hat einigermaßen gut funktioniert, aber aus irgendeinem dummen Grund haben wir uns für die Verwendung von Ausnahmen als Fehlerbehandlungsmechanismus entschieden Fehlercodes verwenden.

Als wir unser Projekt für eine Note vorstellten, fragte einer der Dozenten den Unvermeidlichen: "Wenn Sie es noch einmal machen müssten, was würden Sie anders machen?" Ich wusste sofort die Antwort: "Ich würde Ausnahmen verwenden, dafür sind sie da."


Ahhh die Freuden, das Rad neu zu erfinden! :-) Das ist lustig.

Ich nenne es absichtliche Fehler, nur damit Sie es in der nächsten Iteration verbessern können.
Whatnick

2
Ausnahmen gelten nur für die Behandlung von Ausnahmen. Zu viele Menschen missbrauchen Ausnahmen, indem sie alles in eine Ausnahme verwandeln.

@jacob - Ich stimme Ihrer Meinung zu, dass Ausnahmen für Dinge verwendet werden sollten, die Sie vorhersagen können (z. B. außergewöhnliche Bedingungen), aber von dem, was ich gesehen habe (und kein Java-Programmierer bin), scheint Java Ausnahmen für alles unter der Sonne zu verwenden. Wenn Sie also keine Ausnahmen in Java-Code verwenden, könnte dies dem Sprachfluss zuwiderlaufen.

6

Nicht meine Wahl der Methode, sondern eine XSLT erstellt, um eine zeilenbasierte XML-Datei in einen spaltenbasierten HTML-Bericht zu konvertieren.

Es funktionierte nur im IE, war völlig unmöglich zu entschlüsseln, wie es funktionierte. Jedes Mal, wenn wir es erweitern mussten, war es unglaublich schwierig und hat ewig gedauert.

Am Ende habe ich durch ein winziges C # -Skript ersetzt, das dasselbe tat.


Ich habe das auch getan. Ich habe eine E-Mail-Template-Engine mit XSL implementiert und fand es schwierig, sie zu lesen und zu warten.
TrueWill

Ja. Ersetzte einen riesigen Baum von XSLT-Dateien durch ein paar einfache VB.NET-Funktionen. Sehr zufriedenstellend, vor allem, wenn die nächste Kundenänderungsanforderung in XSLT nicht möglich gewesen wäre.

Ich habe festgestellt , dass die meisten Programmierer eine schlechte Wahl XSLT betrachten, nur weil sie nicht bekommen es. Es ist äußerst nützlich für eine kleine Menge von Problemen, viel effizienter als viele andere Lösungen. Auf der anderen Seite wird es viel zu oft verwendet und meistens NICHT in dieser kleinen Menge von Problemen ...
AviD

6

versuchen, alle neuen Technologien zu nutzen (um neue Technologien zu erlernen), obwohl es nicht einmal nötig ist.


5

Ich habe mir nicht genügend Zeit genommen, um das Geschäftsmodell zu beurteilen. Ich habe getan, was der Kunde verlangt hatte, aber 6-12 Monate später kamen wir beide zu dem Schluss, dass es anders hätte sein sollen.


4

Entwerfen ohne Vorgabe.


3
Angaben sind nicht immer möglich

Sollte lauten: "Implementierung der Lösung, ohne den Kunden zu fragen, ob er dies wünscht." Das bedeutet normalerweise, dass Sie die Spezifikationen befolgt haben.
Dietbuddha

3

Ich habe einen Teil einer Anwendung entsprechend den Anforderungen implementiert.

Es stellte sich heraus, dass die Anforderungen aufgebläht und vergoldet waren und mein Code überarbeitet wurde. Ich hätte meinen Unterbereich so gestalten sollen, dass er nur mit dem funktioniert, was ich zu der Zeit hinzugefügt habe, aber ich plane, alle anderen Dinge hinzuzufügen, ohne von Anfang an generische Unterstützung dafür einzubeziehen.

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.