Überkomplizieren Programmierer manchmal absichtlich Code? [geschlossen]

26

Beim Stackoverflow scheint es oft so zu sein, dass Leute (insbesondere Programmierer) dazu neigen, eine Lösung für ein Problem zu komplizieren, bei der die Lösung weitaus komplizierter ist als das ursprüngliche Problem? Ich bin in keiner Weise ein Experte, aber oft versuche ich, die einfachste Lösung zu wählen, die funktioniert (und offensichtlich funktioniert dies ÜBERALL nicht), aber ich hatte ziemlich guten Erfolg damit, einfache Lösungen für den Job vorzuschlagen, den die Leute scheinen für VIEL kompliziertere Lösungen zu übersehen?

Ist das wie eine normale Sache für Programmierer ..... oder denke ich einfach nicht in der richtigen Perspektive.

user6791
quelle
5
1. Ja, ich denke manchmal. 2. Ja, zumindest einige Programmierer verkomplizieren ihren Code zumindest teilweise absichtlich. 3. Fälle geschlossen.
Job
3
Hattest du jemals jemanden, der dich anschreit: "Daran hättest du denken sollen!" Wenn Sie eine Anforderung verpasst haben, die in der ursprünglichen Anforderungserfassung nicht angegeben war? Das kann dazu führen, dass manche Dinge komplexer als nötig werden.
JB King

Antworten:

18

Offensichtlich wollen einige Programmierer zeigen, wie schlau sie sind, indem sie einen unglaublich komplizierten Code erstellen, den niemand verstehen kann. Andere Programmierer feuern auf so hohem Niveau, dass Komplikationen bei Lösungen eine natürliche Entwicklung sind.

Der schlechteste Code, den ich je gesehen habe, war eine Methode mit über 2000 Codezeilen. Zweifellos war dieser Code komplex, aber auch sehr schlecht.

Ich denke, dass ein guter Programmierer übermäßig komplizierten Code vermeidet. Dazu gehört, die Versuchung zu vermeiden, ein Entwurfsmuster dazu zu zwingen, in eine Lösung zu passen, die es nicht wirklich benötigt. Es beinhaltet auch das Vermeiden von Gott-Objekten, magischen Knöpfen, vorzeitiger Optimierung, vorzeitiger Verallgemeinerung und anderen Anti-Mustern.

Ich überarbeite ständig und suche nach Möglichkeiten, meine Lösungen zu vereinfachen, da Komplexitätswachstum eine organische Sache ist. Wie viele andere organische Dinge muss es beschnitten und zurückgeschnitten werden, damit es weiterhin verwendet werden kann. Ich hasse es, mit übermäßig komplizierten Lösungen interagieren zu müssen, denn mit zunehmender Komplexität steigt die Wahrscheinlichkeit, dass der Code beschädigt wird.

Ich denke, dass die Lesbarkeit das wichtigste Element der Codewartung ist, und übermäßig komplizierte Lösungen verringern fast immer die Lesbarkeit und erhöhen die Wartungskosten.

Tim Claason
quelle
32

Ich habe viel Code gesehen, der komplexer war als nötig und fast immer aus diesen drei Gründen:

1) Überentwickelt aufgrund verfrühter Verallgemeinerung oder des Versuchs, zukünftige Bedürfnisse zu antizipieren, die niemals entstanden sind

2) Entwickler wollten lernen / experimentieren mit einem neuen Designmuster oder einer neuen Technologie, die sie zuvor noch nicht verwendet hatten, und haben es selbst dann eingeschliffen, wenn es übertrieben war. Sie tun es, weil es ihre Arbeit interessanter macht und sie etwas Neues lernen können.

3) Funktionen und Fehlerbehebungen wurden hinzugefügt, aber der vorhandene Code wurde zu diesem Zeitpunkt nicht korrekt überarbeitet. Es ist vielleicht nur eine kleine Verdoppelung oder das Anheften eines anderen Flag-Arguments an eine Methode, aber es summiert sich alles. Tatsächlich werden Hacks hinzugefügt und es dauert nicht lange, bis alles aufgrund der Code-Gerüche überkompliziert ist. Dies ist die häufigste und in der Regel nur aufgrund von Unkenntnis oder Zeitdruck.

Alb
quelle
Ich fürchte, ich bin schuld an # 2. Mit Erfahrung (und Reife?) Neige ich jetzt allerdings dazu, mich zurückzuhalten ... und stattdessen zu Hause zu experimentieren :)
Matthieu M.
Ich sehe, dass die Leute die ganze Zeit 1 machen. Sie schaffen am Ende 5-mal so viel Arbeit für sich selbst
Ally,
11

Das ist absolut üblich. Wie die meisten Bücher sagen, weiß ein guter Entwickler, wie man es einfach hält. Es ist einfach zu einfach, etwas mit einer neuen Technologie oder einem "coolen" Framework, das Sie gerade gefunden haben, zu komplizieren, sodass Sie nach Möglichkeiten suchen, es zu verwenden, anstatt aus der Perspektive des Problems zu denken.

Wie Martin Fowler sagte, haben diejenigen, die eine neue Technologie erlernen, ein kurzfristiges Problem, bei dem es um "technologiegetriebene" Lösungen geht.

Martin Blore
quelle
4
-1: Wie die meisten Bücher sagen, weiß ein guter Entwickler, wie man es einfach hält. - Da hast du vollkommen recht. Aber dann haben Sie angedeutet, dass der Missbrauch neuer Technologien die Hauptursache für die Überkomplizierung des Codes ist. Da liegst du falsch. Glauben Sie mir, es gibt viele überkomplizierte Codes, die nichts mit dem Missbrauch neuer Technologien zu tun haben.
Jim G.
Wo genau habe ich damit gerechnet, dass es die "größte Ursache für die Überkomplizierung von Code" ist? Es ist sicherlich ein Problem, "Hey, ich habe gerade das Muster X gelernt, wo ich es anwenden kann" - Patternitus. Du hast mir wirklich Worte in den Mund gelegt, Jim.
Martin Blore
4
"Ich habe diesen Brief länger als gewöhnlich geschrieben, nur weil ich keine Zeit hatte, ihn kürzer zu machen." - Blaise Pascal Auch hier sehr gut anwendbar. "Kompliziert" ist oft ein Zeichen für gehetzte, faule oder inkompetente Kodierung.
Bill
@Bill Das Interessante daran ist, dass es aus geschäftlicher Sicht ein gutes Argument für komplexeren Code ist - wenn Sie einen festen Betrag für die Implementierung erhalten und die Umgestaltung oder Verkürzung eines Codes zusätzliche Zeit in Anspruch nimmt, es sei denn, Sie können dies tun Gleich beim ersten Mal (wer kann das?) gibt es im Wesentlichen eine Strafe dafür, dass Ihr bereits funktionierender Code weniger komplex ist.
Michael
10

Ich denke nicht, dass es für alle Programmierer normal ist, aber ich habe definitiv so manchen Programmierer gesehen, der dies tut.

Ich denke, einige Leute glauben, dass manche Leute es als zu einfach empfinden, etwas wirklich Einfaches zu machen, und dass es kein gutes Beispiel für ihre Fähigkeiten ist. Daher müssen sie eine große, komplexe Lösung finden, in der man sagen kann, was ich tun kann, auch wenn dies möglicherweise nicht die beste Lösung für das jeweilige Problem ist.

GSto
quelle
1
So sehe ich es aus. IE, wenn es zu einfach ist, lohnt es sich nicht?
@Mercfh Ich verstehe die Ansicht nicht. Was hat die Einfachheit einer Lösung mit ihrer Wirksamkeit zu tun?
GSto
Ich habe seinen Kommentar mit "Ja, ich stimme zu" kommentiert, der manchmal von Programmierern als "Oh, wenn es zu einfach ist, ist es nicht sehr gut" bezeichnet wird.
7

Ich habe gesehen, dass Programmierer oft mehrere Codezeilen schreiben, um eine Aufgabe zu erfüllen, von der sie nicht wussten, dass sie bereits in die Sprache integriert ist. Dies ist nicht beabsichtigt, kann aber sicher verhindert werden.

JD Isaacks
quelle
Ich habe Programmierer gesehen, die für jede String-Kopie eine Schleife geschrieben haben. Nie einen Aufruf einer Standardbibliotheksfunktion verwendet. (Was noch schlimmer ist, die Plattformkopie wurde optimiert, um jeweils ein Wort zu lesen.)
BillThor
7

Es kommt darauf an, was Sie "einfach" nennen. Einige Leute betrachten hoch überarbeiteten Code als "komplexer", weil es mehr Code und Diagramme mit mehreren Aufrufen gibt. Dieser Code ist jedoch "einfacher", da es viel einfacher ist, Änderungen vorzunehmen.

Ich finde oft, dass eine große Funktion "einfach" aussieht, bis Sie Änderungen vornehmen müssen, dann wird sie schnell komplex.

Einfach liegt also in vielen Fällen im Auge des Betrachters.

Erik Funkenbusch
quelle
2
+1: zu viele Programmierer nicht darüber nachdenken
Luca
5

Das Problem ist, wenn Sie entweder die einfachen Lösungen nicht klar erkennen können (hier kommen Diskussionen mit Kollegen ins Spiel) oder wenn Sie zu früh über generalisieren.

Mit anderen Worten, Sie machen einfache Schleifen zu erweiterten Bibliotheksfunktionen, weil Sie denken, dass Sie sie für Ihr nächstes Projekt sowieso brauchen werden (außer dass Sie nicht genau in dieser Form arbeiten). Tun Sie dies zu lange und Sie haben eine immens komplexe Anwendung mit einem sehr einfachen Kern.

Möglicherweise benötigen Sie auch sehr robusten Code, und die Robustheit macht ihn standardmäßig komplex. Ich denke aber nicht, dass dies Ihr Problem ist.

user1249
quelle
4

In einigen Fällen liegt es möglicherweise nur an der Komplexität, eine saubere / einfache Lösung zu finden.

Es gibt ein Zitat, an das ich mich nicht erinnern kann oder das etwas alleine sagt. Die Zeilen von "Code ist nicht vollständig, wenn Sie alles geschrieben haben, was Sie schreiben müssen, sondern erst, wenn Sie nichts mehr zu entfernen haben."

Der Mangel an Klarheit behindert die Fähigkeit der Menschen, den gesamten Überschuss zu entfernen.

Stephen Bailey
quelle
4
Ein anderes relevantes Zitat ist: "Ich hätte einen kürzeren Brief geschrieben, aber keine Zeit gehabt."
user16764
3
" Es scheint, als ob Perfektion nicht erreicht wird, wenn nichts mehr hinzuzufügen ist, sondern wenn es gibt nichts mehr zu entfernen. ”- Französischer Pilot, Dichter und Ingenieur Antoine Marie Roger Vicomte de Saint-Exupéry, 1939 (aus dem Buch Terre des Hommes ( Wind, Sand und Sterne )).
Jörg W Mittag
Danke, anscheinend wusste ich nie den wahren Ursprung :-) Schön.
Stephen Bailey
3

Die besten Ingenieure sind diejenigen, die wirklich komplizierte Probleme in einfach zu implementierende und leicht zu verstehende Lösungen umwandeln können. Es klingt einfach, aber es gibt nicht viele solche Ingenieure / Entwickler. In der Tat gibt es nicht viele solche Menschen, die existieren. In Wirklichkeit macht die Mehrheit der Leute da draußen genau das Gegenteil. Sie nehmen einfache Probleme auf und erschweren sie bis zur Unkenntlichkeit. Schauen Sie sich unsere Politiker an, um ein Beispiel für Menschen zu finden, die es schaffen, einfache Probleme zu lösen und sie in ein totales Chaos zu verwandeln. Programmierer sind in dieser Hinsicht nicht anders.

Dunk
quelle
3
Autsch! Ich wollte Ihnen gerade eine +1 geben, aber dann habe ich Ihre Analogie zur Politik gesehen, und das ist bestenfalls schwach. // Es ist wahr - Es gibt eine Menge Verschleierung, verschwendete Bewegung, Handbewegung und spezielle Interessen, die in der Politik verankert sind, und infolgedessen können Rechnungen überkompliziert werden. Aber die Überkomplikation ist ein Nebenprodukt der Verschleierung, Bewegungsverschwendung, Handbewegung und besonderen Interessen. Keine Grundursache.
Jim G.
Was auch immer der Grund sein mag, es gibt sehr einfache Lösungen für viele Probleme des Landes, aber die Politiker entscheiden sich dafür, sie härter zu machen, als sie brauchen. Wir gehen davon aus, dass dies entweder auf Geld, Macht oder Stimmen zurückzuführen ist, aber ich glaube auch, dass es hauptsächlich um Fähigkeiten geht. In diesem Fall steht meine Analogie auf einem soliden Fundament.
Dunk
1
@JimG. Ja, ich stimme Ihnen zu ... es scheint mir, dass viele der Probleme mit politischen Lösungen Politiker sind, die behaupten, dass es eine einfache Lösung (ihre!) Für ein wirklich kompliziertes Problem gibt, für das es keine einfache Lösung gibt.
Michael
2

Persönlich habe ich nie absichtlich versucht, ein Stück Software komplizierter zu machen. Ich habe jedoch etwas fertiggestellt und dachte "Wow, das ist zu kompliziert" und bin darauf zurückgekommen und habe es überarbeitet. Einige Leute sehen das vielleicht und denken einfach, es funktioniert und es ist gut genug und es nicht umgestalten.

jmq
quelle
1

Ein Weiser soll gesagt haben, man solle die Dinge so einfach wie möglich halten, aber nicht einfacher. Gleiches kann für Code gelten. Manchmal muss man eine Technik anwenden, die man als komplex ansieht (Rekursion könnte ein gutes Beispiel sein, sie erschreckt oft junge Programmierer).

Generell denke ich jedoch, dass komplexer Code häufig organisch entsteht. Ein einfaches Problem wird mit einfachem Code gelöst, der Gültigkeitsbereich wird erweitert und der Code wird ohne allzu große Überlegungen geändert. Mit der Zeit wird Code angezeigt, der versucht, das neue Problem zu behandeln, der jedoch tatsächlich zur Lösung eines anderen Problems entwickelt wurde. Es wird zu einem Patchwork-Quilt aus verschiedenen Logikelementen. Ein solcher Code kann dann oft als wesentlich komplexer erscheinen, als es das Problem erfordert, aber es ist auch so gekommen, weil jede kleine Änderung zu der Zeit die einfachste Möglichkeit zu sein schien, den Code zum Laufen zu bringen.

Ich denke nicht, dass die meisten Entwickler absichtlich darauf aus sind, Code komplexer zu machen (obwohl Sie gelegentlich zeigen, wer eine Technik einsetzt, um ihre eigenen Fähigkeiten zu beweisen) .

Steve
quelle
Es ist erstaunlich, wie viele Systeme mit einem wirklich einfachen Kern beginnen, der fast den Anforderungen entspricht, aber in vielerlei Hinsicht zu kurz kommt, und dann viele Komplikationen hinzufügen, um viele Lücken zu schließen, die mit einem etwas komplizierteren Design hätten vermieden werden können. Betrachten Sie das einfache Design von Cs Integer-Typen und einige der bizarr-komplexen Regeln, die damit einhergehen. Wenn es für jeden Typ eine Option gegeben hätte, die besagt, dass dies beförderbar sein sollte, hätte dies die Anzahl der Typen nominell verdoppelt (wenn auch nicht wirklich anders als bei einem Qualifikationsmerkmal volatileusw.), aber ...
supercat
... hätte die Regeln für Beförderung / Ausgleich erheblich vereinfacht. Ein nicht promotbares Short ohne Vorzeichen, das zu einem promotbaren Int. Hinzugefügt wird, würde ein nicht promotbares Short ohne Vorzeichen ergeben, unabhängig davon, ob shortes so groß ist oder nicht int. Eine unsigned shortzu einer Werbung hinzugefügte Werbung intwürde eine ergeben int. Das Hinzufügen von signierten und nicht signierten Dingen derselben Größe oder das Hinzufügen von nicht zu bewerbenden Dingen unterschiedlicher Größe wäre ein Fehler. Fügen Sie ein kleines Stück Komplexität hinzu, und die seltsamen nachgelagerten Eckfälle verschwinden.
Supercat
1

Ein weiterer Grund, der noch nicht angesprochen wurde, besteht darin, dass die gelieferten Lösungen möglicherweise zu kompliziert sind, um sicherzustellen, dass Sie ihre Dienste später zur Unterstützung dieser Lösungen benötigen. Mit anderen Worten: für die Arbeitsplatzsicherheit.

quant_dev
quelle
Da ich nicht sicher bin, warum dies abgelehnt wurde, bin ich auf extrem große Projekte gestoßen, die von einem Mann codiert wurden, der sein eigenes Framework erstellt hat, und für die stündliche Arbeit ausschließlich an diesem Projekt bezahlt wurde. Wenn der Arbeitgeber ihn verärgert, würde die gesamte Produktlinie geschraubt werden. Es hätte Monate gedauert, bis ein anderer Entwickler den Code vollständig verstanden hätte, während es ein paar Minuten gedauert hätte, bis der "allwissende" Codierer sein Spaghetti-Durcheinander aktualisiert hätte.
SSH Dieser
0

Vielleicht ein Problem eines klassischen Fehlers?

30. Entwicklervergoldung.

Entwickler sind fasziniert von neuen Technologien und sind manchmal bestrebt, neue Funktionen ihrer Sprache oder Umgebung auszuprobieren oder ihre eigene Implementierung einer nützlichen Funktion zu erstellen, die sie in einem anderen Produkt gesehen haben - unabhängig davon, ob dies in ihrem Produkt erforderlich ist oder nicht. Der Aufwand für das Entwerfen, Implementieren, Testen, Dokumentieren und Unterstützen nicht erforderlicher Funktionen verlängert den Zeitplan.

  • Steve McConnell, Schnelle Entwicklung.
ShrimpCrackers
quelle
0

Ja, manchmal überkomplizieren wir den Code, um uns selbst zu unterhalten. Meistens kommt die Wahrnehmung, dass Code zu kompliziert ist, von einem Unwissenden oder Junior-Teilnehmer des Projekts.

P. Roe
quelle
1
-1 Senior-Entwickler, die kategorisch Junior-Entwicklern die Schuld an Problemen geben, verstehen wahrscheinlich nicht die Motivation für ihre eigene Arbeit oder die Arbeit anderer. Wenn Nachwuchsentwickler Schwierigkeiten haben, Ihrem Code zu folgen, ist ES zu kompliziert.
Brandon
Ich sage, wenn ein Jr-Entwickler den Code für unverständlich hält, ist das ein Codegeruch, und es kann tatsächlich sein, dass der Code zu kompliziert ist, aber Sie verwenden hier viel, um einen Pinsel in die Breite zu ziehen. Dieser Codegeruch kann tatsächlich nur existieren, weil der Jr-Entwickler Hilfe benötigt, um eine fortschrittliche Technik zu verstehen, und nicht, weil die Technik selbst schuld ist.
P. Roe
-1

JA ... und ich habe den Preis zu oft bezahlt.

Auf meinem Whiteboard befindet sich jetzt ganz oben ein Sternchen mit der Aufschrift

"Wenn es nicht einfach ist, ist es nicht richtig"

... und jedes Mal, wenn ich einen Prototyp auf dem Whiteboard entwerfe, fällt mir das auf.

Es funktioniert wirklich für mich, weil meine komplexen Designs viel einfacher werden, was sich in saubererem Code niederschlägt.

Dal
quelle