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.
Antworten:
YAGNI immer wieder ignorieren ...
quelle
"Ich mache es später"
"Später" kommt nie.
quelle
C ++, rautenförmige mehrfache virtuelle Vererbung . Du hast die Idee.
quelle
Die Konfigurierbarkeit in einer Anwendung ist nett. Zu viel Konfigurierbarkeit ist ein Albtraum, der zu verwenden und zu warten ist.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Auswählen von Microsoft Foundation Classes (MFC) zum Schreiben einer Java-IDE.
quelle
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:
Hoppla.
quelle
Das Rad neu erfinden
quelle
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.
quelle
Glauben, dass Kunden wissen, was sie wollen, und dann zu viel tun, bevor sie sich an sie wenden.
quelle
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.
quelle
Ü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.
quelle
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).
quelle
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.
quelle
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.
quelle
Den Bereitstellungsmechanismus / das Bereitstellungsmodell nicht so früh wie möglich definieren.
quelle
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 ...
quelle
Verwenden von ASP.Net-Designs, wenn nur ein normaler alter CSS-Ordner funktioniert hätte.
quelle
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).
quelle
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.
quelle
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.
quelle
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."
quelle
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.
quelle
versuchen, alle neuen Technologien zu nutzen (um neue Technologien zu erlernen), obwohl es nicht einmal nötig ist.
quelle
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.
quelle
Entwerfen ohne Vorgabe.
quelle
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.
quelle