Warum wird Cleverness von manchen Leuten als schädlich beim Programmieren angesehen?

89

Ich habe in letzter Zeit viele Fragen zu verschiedenen Abstraktionstechniken bemerkt und Antworten erhalten, die im Grunde genommen besagen, dass die fraglichen Techniken "zu clever" sind. Ich denke, dass es ein Teil unserer Arbeit als Programmierer ist, die besten Lösungen für die Probleme zu finden, die wir lösen müssen, und Klugheit ist dabei hilfreich.

Meine Frage lautet also: Sind die Leute, die bestimmte Abstraktionstechniken für zu klug halten, der Klugheit an sich entgegengesetzt , oder gibt es einen anderen Grund für den Einwand?

EDIT: Dieser Parser-Kombinator ist ein Beispiel für etwas, das ich als cleveren Code bezeichnen würde. Ich habe es heruntergeladen und ungefähr eine halbe Stunde lang durchgesehen. Dann schritt ich durch die Makro-Erweiterung auf Papier und sah das Licht. Jetzt, da ich es verstehe, wirkt es viel eleganter als der Parser-Kombinator von Haskell.

Larry Coleman
quelle
116
Ich denke, Sie missverstehen vielleicht - Klugheit in einer Person ist eine Tugend, aber Klugheit in einem System ist ein Laster. Systeme und Code sollten nicht schlau sein, sie sollten klar wie Kristall sein. Es braucht oft einen klugen Menschen, um solche Dinge zu erschaffen.
Nlawalker
15
@nlawalker: Ich denke, ich verstehe es jetzt. Die Leute benutzen das Wort "clever", wenn sie sich auf Code als Antonyme für "klar" oder "einfach" beziehen, weil sie wirklich ein Wort verwenden wollen, das ein Antonyme für "klar" oder "einfach" ist.
Larry Coleman
2
@ Larry: Ich bin nicht sicher, was das bedeuten würde. Clever wie erfinderisch, originell, genial und implizit mit Dingen auf eine Weise, die Sie noch nie gesehen haben. Manchmal ist es großartig (viele Designmuster sind clever), aber die Fremdheit der Lösung kann es auch schwierig machen, damit zu arbeiten.
Doppelgreener
2
Codiert keiner mehr einen Kommentar? Hier erklärst du die Klugheit, damit die folgenden verstehen können. Wie du in 6 Monaten.
Phil Lello

Antworten:

207

Einfache Lösungen sind besser für die langfristige Wartung. Und es geht nicht immer nur um Sprachkenntnisse. Eine komplexe Zeile (oder Zeilen) braucht Zeit, um herauszufinden, auch wenn Sie ein Experte in der angegebenen Sprache sind. Sie öffnen eine Datei und beginnen zu lesen: "OK, einfach, einfach, verstanden, ja, WTF ?!" Ihr Gehirn kommt zu einem kreischenden Stillstand und Sie müssen jetzt eine komplizierte Zeile anhalten und entschlüsseln. Wenn es keinen messbaren, konkreten Grund für diese Implementierung gibt, ist sie "zu clever".

Das Herausfinden, was los ist, wird zunehmend schwieriger, da die Komplexität von einer cleveren Methode zu einer cleveren Klasse zu einem cleveren Muster wächst. Abgesehen von bekannten Ansätzen müssen Sie den Denkprozess herausfinden, der zur Schaffung einer "cleveren" Lösung geführt hat, die recht schwierig sein kann.

Das heißt, ich hasse es, ein Muster zu vermeiden (wenn seine Verwendung gerechtfertigt ist), nur weil jemand es möglicherweise nicht versteht. Es liegt an uns als Entwicklern, weiter zu lernen. Wenn wir etwas nicht verstehen, ist es ein Grund, es zu lernen und nicht zu vermeiden.

Anna Lear
quelle
7
+1 Schön gesagt. Ich denke, es ist eine ausgewogene Sache. Wenn ich davon ausgehen kann, dass jemand mit anständigen Kenntnissen den Code versteht, wenn er ein wenig an sich selbst denkt, können Sie clever vorgehen und vielleicht einen Kommentar hinzufügen. Wenn es viermal so lange dauert, den Code zu verstehen, nur weil jemand seine Codierungsfähigkeiten unter Beweis stellen wollte - nee! Wenn jemand klug genug ist, um eine clevere Lösung zu finden, sollte er klug genug sein, um zu entscheiden, ob es verständlich ist oder nicht. Ansonsten zeigt es sich nur.
Anne Schuessler
Der letzte Absatz gefällt mir. Der Rest ist wahr, aber unglücklich.
Orbling
Sieht so aus, als hätten Sie den Quellcode von Zend PHP gesehen :)
Tim Post
+1 Ein einfaches Muster kann möglicherweise nicht so gut funktionieren wie ein cleveres Muster. Wie Sie bereits sagten, liegt es an uns als Entwicklern, den Rahmen von "clever" weiter zu erweitern, indem wir es verstehen.
Stephen Furlani
3
Als jemand, der rechtfertigen musste, etwas "Kluges" zu tun, als es wirklich nur "minimal, orthogonal korrekt" war, möchte ich hinzufügen, dass es eine gewisse Subjektivität in der Frage gibt, was genau klug ist. Zum Beispiel werden manche Leute immer schreiben wollen if FuncX() then return true, else return falseund nie wollen, dass Sie einfach schreiben return FuncX(). Ich mache keine Witze, ich habe buchstäblich dieses Gespräch geführt. Weil die Leute irgendwo ihre Haltepunkte aufhängen wollen oder so. :-)
Warren P
102

KISS-Prinzip

Halten Sie es einfach dumm. Clevere Lösungen sind großartig, aber oft ist die einfachste, direkte Lösung die beste.

„Das Debuggen ist doppelt so schwierig wie das Schreiben des Codes. Wenn Sie den Code so geschickt wie möglich schreiben, sind Sie per Definition nicht klug genug, um ihn zu debuggen. “

Brian Kernighan

Josh K
quelle
8
Wenn Sie Code jedoch so geschickt wie möglich schreiben, müssen Sie lernen, ihn zu debuggen, und dabei werden Sie schlauer. Oder etwas ähnliches.
James McNellis
11
@ James: Oder du versagst einfach. ;)
Josh K
10
@Josh K: Ich habe KISS immer als "Keep It Simple, Stupid!" - en.wikipedia.org/wiki/KISS_principle
Orbling
1
@Orbling: Ich erinnerte mich anders, na ja, jetzt weiß ich es.
Josh K
1
"Halte es einfach und sei dumm" , so Wikipedia ? :) Bedeutet das, dass es dumm ist, es einfach zu halten, oder dass man dumm sein muss, um es einfach zu halten ? : P
Mateen Ulhaq
83

Dummköpfe ignorieren Komplexität; Pragmatiker leiden darunter; Experten meiden es; Genies entfernen es. - Alan Perlis

Martijn Verburg
quelle
5
+1 für das nette Zitat und für die erste Antwort ohne die implizite Annahme, dass etwas nicht gleichzeitig einfach und klug sein kann
Larry Coleman
15
Wichtig ist, dass es der Programmierer ist, der schlau sein soll, nicht der Code.
Kristopher Johnson
Besser zitieren als ein Idiot, der das Wort clever auf clevere Weise missbraucht.
Derek Litz
30

Die beste Lösung ist nicht immer die klügste Lösung. Manchmal sind einfache Lösungen gleich gut.

In der Software muss man immer an die Wartbarkeit denken. Wenn ein Teil des Codes für jemanden, der ihn pflegen wird, zu clever ist, würde ich sagen, dass Klugheit es nicht wert ist.

Aussenseiter
quelle
3
Eine einfache Lösung für ein komplexes Problem ist so clever wie es nur irgendjemand kann.
JeffO
obwohl es immer die Einschränkung gibt, die Sie nicht zu stark vereinfachen möchten, nur weil der Betreuer nicht codieren (oder lesen) kann.
Ken Henderson
@confusedGeek - aber wenn Sie wissen, dass der Wartungsprogrammierer nicht damit umgehen kann, wird die clevere Lösung zu einer Zeitbombe. Balance ist hier der Schlüssel - und dies gilt nur, wenn Sie das Wartungsteam kennen. Wenn Sie keine Ahnung haben, ist es das Beste, wenn Sie in Ihrer Klugheit klar sind.
Michael Kohne
1
@Michael, Leistungseinschränkungen erfordern möglicherweise, dass Ihr Code clever ist. Es ist dann die Aufgabe des Betreuers, neue Betreuer einzustellen, falls dies nicht möglich ist.
Stephen Furlani
@Stephen, wenn der Code clever sein muss, sollte der Programmierer sorgfältig erklären, WARUM er sein muss, damit der Betreuer nicht von vorne anfangen muss.
26

Um Brian Kernighan zu zitieren:

„Das Debuggen ist doppelt so schwierig wie das Schreiben des Codes. Wenn Sie den Code so geschickt wie möglich schreiben, sind Sie per Definition nicht klug genug, um ihn zu debuggen. “

peterchen
quelle
"... es sei denn, Sie haben die richtige Definition von clever verwendet und der Code ist tatsächlich einfach zu verstehen und zu debuggen."
Derek Litz
Hängt davon ab, welches Wörterbuch Sie verwenden. Nach meiner Erfahrung nutzt jeder "clevere" Code - leicht zu verstehen oder nicht - immer noch eine glückliche Konjunktion in der Spezifikation. Auch wenn es offensichtlich ist, sollte markiert werden, ob sich eine solche Annahme ändern kann und nicht zu verschiedenen Teilen des Codes führt.
Peterchen
Sie haben Recht, aber ich möchte den Vorbehalt hinzufügen, dass es davon abhängt, wie einfach die Sprache und die Implementierung zu lesen und zu verstehen sind, und dass Ihre Kommentare möglicherweise nur Code-Rauschen sind, anstatt etwas Hilfreiches. Und während es üblich ist, das Gegenteil mit clever zu meinen, sollten wir uns bemühen, klarer zu sein, damit andere die Dinge nicht zu ihrem eigenen Vorteil falsch interpretieren können.
Derek Litz
Keine Einwände dagegen :)
Peterchen
22

Klugheit ist ein Werkzeug; an sich ist es nicht schädlich. Es wird nur dann schädlich, wenn es nicht notwendig ist.

Steven A. Lowe
quelle
16

"Clever", wenn es auf Code angewendet wird, ist fast immer nur ein Euphemismus für "unnötig kompliziert".

Es ist schwer genug, guten, klaren und einfachen Code zu lesen. Das Lesen von "cleverem" Code ist, als würde man noch einmal lateinische Poesie studieren.

Die Verwirrung entsteht, weil "klug" als Attribut einer Person eine ganz andere Bedeutung hat. Dieser Fall kann auch als Beispiel dafür gesehen werden, warum es schwierig ist, Software für echte Menschen zu entwerfen: Weil sie nicht eindeutig sind.

Und weil einige Programmierer die sozialen Protokolle, denen die meisten Menschen folgen, nicht verstehen, was ihnen verbietet, Code direkt als "unnötig kompliziert" anzuprangern, fällt es ihnen möglicherweise schwer, zwischen den beiden Bedeutungen des Wortes clever zu unterscheiden . Im Gegensatz zu dem, was manche vielleicht denken, denke ich, dass letztendlich bessere "People Persons" (dh Menschen mit Einfühlungsvermögen, Selbstbeobachtung und Geduld) bessere Entwickler sind. Weil sie wissen, für wen sie schreiben müssen.

fzwo
quelle
5
Ich hätte das positiv bewertet, wenn Sie nicht über Sozialprotokolle und "Personen Personen" gepredigt worden wären.
Jason Baker
2
Das ist in Ordnung - und danke, dass du mich daran erinnert hast. Ich neige dazu, zu predigen. Aber ich ärgere mich über die Unfähigkeit und / oder den Unwillen einiger (vieler?) Programmierer, mit normalem menschlichem Verhalten umzugehen, und über den allgemeinen Mangel an Empathie und Selbstbeobachtung, den ich auf unserem Gebiet sehe. Vielleicht hätte ich "people persons" in Anführungszeichen anstatt in Kursivschrift setzen sollen. Englisch ist nicht meine Muttersprache, ich wusste nur nicht, wie ich es auf den Punkt bringen sollte, dass man, um ein großartiger Entwickler zu sein, nicht nur Code verstehen muss, sondern auch die Leute. MEINER BESCHEIDENEN MEINUNG NACH.
fzwo
Bearbeitet meine Antwort. Klarer / weniger offensiv jetzt?
fzwo
+1 für den ersten Satz, den ich tatsächlich abgeschlossen hatte, nachdem ich die ersten Antworten erhalten hatte.
Larry Coleman
Ja, danke, dass du geklärt hast, wie schlau dumme Leute in diesem Zusammenhang sind!
Derek Litz
9

Die meisten Leute konzentrieren sich auf Cleverness unter dem Aspekt "Der Code erfordert zu viel Entschlüsselung, um herauszufinden, was er tut" und all die schlechten Dinge, die damit einhergehen, wie z

  1. Niemand sonst kann es herausfinden, geschweige denn warten / debuggen.
  2. Die Person, die geschrieben hat, weiß nicht einmal, was es tut.
  3. Eigentlich mag es gar nicht so genial sein
  4. usw....

Alles gute Punkte, aber es gibt einen anderen negativen Aspekt der Klugheit und das ist das alte Ego-Problem. Dies führt zu Problemen im Sinne von

  1. Jemand, der zu "klug" ist, um die Lösungen eines anderen zu verwenden. Warum suchen Sie nach dem, was andere Leute getan haben, wenn Sie Ihre eigene Methode zum Häuten derselben Katze erfinden können?
  2. Jemand, der denkt, er hätte die coolste Lösung für ein Problem erfunden, lehnt es oft ab, Eingaben zu machen.
  3. Lassen Sie niemanden "ihren" Code ändern, auch wenn offensichtliche Probleme vorliegen oder eine geringfügige Änderung erforderlich ist.
  4. Umgekehrt halten sie sich für schlau und müssen die "neueste" Technik anwenden, um zu beweisen, wie schlau sie sind. Sie können sie jedoch weder in persönlichen Projekten noch in anderem Nicht-Produktions-Code in den Griff bekommen, bevor sie sie in kritische Teile von rollen das System.

Manchmal sind wir alle zu viel Ego schuldig, aber wenn es dem Team im Weg steht, ist es ein Problem.

MIA
quelle
8

Guter Schlauer - hohes Verhältnis zwischen geschickten Codezeilen und Zeilen in einer nicht geschickten Alternative. 20 Zeilen Code, der Sie vor dem Schreiben von 20000 Zeilen bewahrt, sind extrem gut und clever. Bei Good Clever geht es darum, sich die Arbeit zu sparen.

Schlecht klug - Geringes Verhältnis zwischen geschriebenen und gespeicherten Codezeilen. Eine Zeile cleveren Codes, die Sie davon abhält, fünf Zeilen Code zu schreiben, ist Bad Clever. Schlecht klug geht es um "syntaktische Masturbation".

Nur zur Erinnerung: Bad Clever wird so gut wie nie "Bad Clever" genannt. es wird oft unter den Pseudonymen "schön", "elegant", "prägnant" oder "prägnant" reisen.

user8865
quelle
Interessante Antwort, aber wird Code, den Sie "Bad Clever" nennen, tatsächlich von jemand anderem als der Person, die den fraglichen Code geschrieben hat, als "schön" bezeichnet?
Larry Coleman
2
Hängt davon ab. In Objective-C / C ++ / C ist das Phänomen normalerweise auf eine Person beschränkt. In Perl und Ruby hat oft die gesamte Community einen gemeinsamen Wert, wenn Bad Clever "schön", "elegant" usw. ist.
user8865
1
@ user8865: Außerdem ist "Good Clever" -Code viel einfacher zu debuggen als das Original, da es Ihrer Definition nach 3 Größenordnungen weniger davon gibt.
Larry Coleman
2
Ah, also Perl-Programme sind - jetzt fast per Definition - extrem gut schlau :) Gut zu wissen!
7

Ich muss mich über die Definition von clever für jedermann wundern.

Persönlich fühle ich mich schlau, wenn ich ein hartes, komplexes Problem auf einfache und unkomplizierte Weise gelöst und dabei ein akzeptables Maß an Effizienz bewahrt habe.

Ich fühle mich schlau, wenn mein Rezensent während einer Codeüberprüfung sagt: "Wow, das war einfacher, als ich gedacht habe", im Gegensatz zu "wtf ist das alles."

Avatar_Squadron
quelle
1
LOL über die tl; dr, wie langsam denken Sie, dass Programmierer lesen? Ja, ich verachte den Missbrauch von clever hier absolut als das Gegenteil von dem, was es tatsächlich ist. Dumm / Ignorant / Evil-Entwickler und -Manager nutzen dies tatsächlich, um zu rechtfertigen, dass sie nicht jemanden einstellen, der ihrer Meinung nach "zu schlau" ist.
Derek Litz
6

Abgesehen von den aufgelisteten theoretischen Antworten wird dies oft im Kontext von zu klug für alle anderen verwendet.

Wechseln Sie irgendwann zwischen einem leistungsintensiven Team der obersten Stufe und einem Wartungsteam der mittleren Stufe, um die tatsächlichen Unterschiede in Bezug auf "zu clever" zu erkennen.

Wenn man die theoretischen Argumente außer Acht lässt, basiert dies oft darauf, mit welchen Fähigkeiten die am wenigsten qualifizierten Teammitglieder angemessen arbeiten können, und ist daher sehr relativ zur Umgebung.

Rechnung
quelle
Exzellent: "Zu clever basiert oft darauf, mit was die am wenigsten qualifizierten Teammitglieder vernünftig arbeiten können"
Orbling,
Abhängig von Ihrem Standort ist dies manchmal etwas weniger als "exzellent" :-)
Bill
Wer kümmert sich um das am wenigsten qualifizierte Mitglied des Teams? Fast jedes Team (obwohl ich mir sicher bin, dass es einige Ausnahmen gibt) hat mindestens ein Mitglied, das absolut nichts damit zu tun hat, sich selbst als Programmierer zu bezeichnen.
Dsimcha
1
Hoffentlich werden sie besser, aber auch wenn das nicht gelingt, müssen Sie sich als Teammitglied mit ihnen auseinandersetzen und sie müssen in der Lage sein, an einigen Arbeiten teilzunehmen. Ich sehe dies derzeit in Lambda-Ausdrücken. Viele Leute, mit denen ich zusammenarbeite, verstehen sie noch nicht, deshalb halten sie sie für zu schlau. Dies ist bedauerlich, da sie viele unserer Probleme recht effizient und elegant lösen. Wenn sie jedoch keiner der mittelständischen Mitarbeiter bekommt, werden sie sich an das Management wenden, da die Software nicht unterstützt werden kann.
Bill
@Bill: Lambda funktioniert ??? Wer etwas so Einfaches nicht verstehen kann, auch wenn er ausdrücklich darum gebeten wird, etwas über sie zu lernen, hat nichts damit zu tun, ein professioneller Programmierer zu sein.
Dsimcha
6

Manchmal war ich so schlau, dass ich mich geirrt habe.

John
quelle
1
Das kann Passieren. Und manchmal stimmt etwas nicht.
Bobobobo
Sie nennen diese Theorien John. Theorien können und sollten ab und zu falsch sein :), es bedeutet nicht, dass wir aufhören sollten, klug zu sein und uns bemühen, so klug wie möglich zu sein. Wie sonst werden wir Führer in dieser Welt! "Ah, aber die Reichweite eines Mannes sollte seine Reichweite übersteigen - oder wofür ist ein Himmel?"
Derek Litz
4

Performant, wartbar, pünktlich und günstig messe ich eine Lösung. Ich denke, clever könnte auch Teil einer Lösung sein, solange es diese Eigenschaften nicht negativ beeinflusst.

Heath Lilley
quelle
+1 für die Verwendung von "billig" als positiv in Bezug auf die Entwicklung
Gary Rowe
Ich habe zu viel 'cleveren' Code gesehen, der nicht performant ist!
HLGEM
Es gibt wertvollere Metriken, aber diese können je nach Projekt gute Metriken sein, und oft stehen sie im Widerspruch zueinander, so dass Sie einander überlegen müssen, um erfolgreich zu sein.
Derek Litz
3

Wenn cleverer Code + die Anzahl der Kommentare, die erforderlich sind, um ihn verständlich zu machen, <= einfacher Code, dann entscheide ich mich für den cleveren Code. Jedes Mal.

Ich denke, das Problem entsteht, wenn Leute, die "cleveren Code" schreiben, ihn absichtlich nicht richtig kommentieren, denn nur wenn er anfangs unverständlich ist, müssen zukünftige Generationen, die auf ihn stoßen, Zeit damit verbringen, zu "schätzen", wie schlau er ist.

dieunneversets
quelle
Na ja, oder weil sie einfach nicht an den nächsten Mann denken, oder was auch immer. Ich bin mir nicht sicher, ob ich dem intellektuellen Egoismus zuschreiben würde, was angemessen durch gedankenlose Trägheit und schlechte Angewohnheit erklärt werden kann. Tatsache ist jedoch, dass wenn Ihr Code auf den ersten Blick nicht verstanden werden kann, Kommentare erforderlich sind und wenn der Code + Kommentare länger sind (in LOC oder Zeit) als auf eine andere Art und Weise, arbeiten Sie härter als nötig.
Dan Ray
Gute Antwort, (kann nicht +1 geben, keiner bleibt übrig, wird es später tun). Wenn die Leute keine Zeit damit verbringen, cleveren Code zu schreiben, und andere keine Zeit damit verbringen, ihn zu verstehen, ziehen sie weniger komplexen einfachen Code vor, auch wenn dieser weniger effizient ist. Dann findet keine Verbesserung der Fertigkeiten statt.
Orbling
Beste Antwort. Das Mantra: Schreiben Sie eine einfache Grundlinie, einen Starter-Code, der schnell und langsam ist, wenn alle aufstehen ... und machen Sie dann einen Kommentar, wenn Sie einen unlesbaren Einzeiler daraus machen. So lernst du alle schmutzigen Tricks in deiner Sprache!
Droogans
Wenn ich Ihren Gebrauch von clever als verschachtelt bezeichne, habe ich persönlich einen verschachtelten Code geschrieben, der durch Protokollierung verständlich gemacht wurde. Während ich nicht vorhatte, verschachtelten Code zu schreiben, hat es mir etwas Zeit gespart, aber ich fügte ein # TODO hinzu, das wahrscheinlich umgeschrieben werden sollte, um einfach zu sein, wenn wir es erheblich ändern müssen.
Derek Litz
3

Ich erinnere mich an ein Zitat, das ich vielen verschiedenen Leuten zugeschrieben habe, wie es die guten Zitate oft sind.

Umschreiben:

Jeder intelligente Mensch kann den einfachen Komplex erschaffen, es braucht ein Genie, um den Komplex zu vereinfachen.

Wenn man eine komplexe Idee aufnimmt und vereinfacht, so dass sie verständlich ist, zeigt dies die Klugheit des Konstruktors, aber wenn man eine einfache Idee aufnimmt und sie komplex macht, zeigt dies, dass der Konstruktor als klug angesehen werden möchte.

Pickle Pumper
quelle
Ja, es ist die egozentrische Idee, schlau sein zu wollen, die Ihre Codebasis verwickelt. Sie sind entweder schlau oder nicht schlau. Leider denken die Leute in den ersten Lernphasen, sie seien schlauer als sie. Später stellen sie fest, dass sie nicht schlau sind, und schreiben schlauen Code, sobald sie die Wissenslücken geschlossen haben.
Derek Litz
2

Wenn die 'clevere' Lösung schwer herauszufinden ist, sollte sie nicht verwendet werden. Wenn Sie zum Beispiel durch Nebenwirkungen eine komplexe Berechnung auf eine Zeile beschränken können, ist dies clever. Aber wenn es eine Stunde dauert, bis jemand anderes herausgefunden hat, was in der Welt Sie getan haben, ist es zu klug.

Michael K
quelle
2
Fair genug, aber ändert sich Ihre Antwort, wenn die Person, die den Code nicht herausfinden kann, nicht mit allen Funktionen der Sprache vertraut ist?
Larry Coleman
2
Das ist zumindest bei IMO anders. Wenn eine Person mit den Merkmalen einer Sprache nicht vertraut ist, kann sie nicht beurteilen, was schlau ist oder nicht.
Joe D
@ Larry: Nicht unbedingt. Ich würde davon ausgehen, dass die Person, die es liest, über grundlegende / niedrige fortgeschrittene Kenntnisse verfügt. Und wenn es unwiederbringlich komplex wird, ist es an der Zeit, einen Blockkommentar einzutragen, in dem erklärt wird, was der Code tun soll, um einen Bezugsrahmen für das Verständnis dessen zu schaffen, was er tatsächlich tut. Der Kommentar sollte jedoch eine hohe Ebene haben - schreiben Sie die Berechnung aus, erklären Sie den Prozess; Wiederholen Sie den Code nicht. Eine Person bei sollte (idealerweise) in der Lage sein, den Code beim Lesen zu verstehen. Das ist jedenfalls das Ziel.
Michael K
2

Meiner Meinung nach ist Klugheit an sich kein Problem. Normalerweise können wir Verwirrungen über "cleveren" (ohne Sarkasmus) und "aufschlussreichen" Code machen. Was ich als Problem sehe, ist die Tatsache, dass der "clevere" (mit Sarkasmus) Code normalerweise implizite nicht sichtbare Anforderungen enthält, was das Debuggen und Verwalten im Laufe der Zeit erschwert.

Es gibt mehrere bekannte Algorithmen, die clever sind. Quicksort ist eins, IMO.

"Cleverer" (mit Sarkasmus) Code macht normalerweise Annahmen über gesetzte Variablen und Systemzustände, die vom "cleveren" Code praktisch getrennt sind (wie zuvor geöffnete Dateien, Netzwerkverbindungen, Datenbanken usw.).

Die Datenmenge, die Sie in Ihr Gehirn laden müssen, um einen "cleveren" Code korrekt zu verwalten, ist normalerweise zu groß, um ein gutes Kosten-Nutzen-Verhältnis zu erzielen.

Machado
quelle
1

"Cleverer Code" ist jeder Code, für den der Programmierer sich wirklich Gedanken machen oder fortgeschrittene Fähigkeiten einsetzen musste, um ihn zu schreiben. Das Problem dabei ist, dass die Notwendigkeit einer gewissen "Cleverness-Marge" außer Acht gelassen wird, die am besten von Brian W. Kernighan ausgedrückt wird:

"Das Debuggen ist doppelt so schwierig wie das Schreiben des Codes. Wenn Sie den Code also so geschickt wie möglich schreiben, sind Sie per Definition nicht klug genug, um ihn zu debuggen."

Alex
quelle
1

Denn was für einen Entwickler in einem Schuss Kreativität nach Cleverness aussieht, kann einfach als Chaos vergehen kreativen Moment und für andere ein unlesbarer , nicht zu wartender Block dunkler Rätsel sein .

Ein netter, cleverer und leistungsfähiger Rätselblock, aber wenn Sie die Erfahrung haben, werden Sie oft feststellen, dass es Ihr Unternehmen (nicht Sie, den Entwickler) sehr viel mehr kostet, das Ding auf dem Medium zu halten. oder langfristig. Deshalb ziehen Sie es vor, die Begeisterung Ihrer Mitentwickler zu beruhigen, wenn sie getragen werden.

Außer natürlich, wenn es eine Rechtfertigung für die Klugheit gibt. Und wenn es eine gute Dokumentation gibt, die mit der verschleierten Sache einhergeht, die Sie gerade geschrieben haben. Sie haben dieses clevere Stück Code kommentiert, oder? Erklären Sie, warum es so sein muss und wie es sich verhält.

Wenn es keine Rechtfertigung gibt, dann ist es wahrscheinlich nur eine vorzeitige Optimierung, Überentwicklung oder ein YAGNI-Problem. Wenn es 15 Indirektionsebenen dauert, um etwas Einfaches zu tun, besteht eine gute Chance, dass Sie auch unter die vorherigen Kategorien fallen. Und wenn es nicht dokumentiert ist, dann ist es nur Ärger.

Bei großartigem Code sollte es nicht erforderlich sein, dass der Betreuer die ganze Zeit über auf 100% ist, um ihn zu verstehen. Guter Code ist schlau. Guter Code kann fast genauso effizient sein, aber in vielen anderen Aspekten besser. Großartiger Code sollte keine IDE mit 15 Ansichten erfordern, um dem Design Ihrer Anwendung zu folgen.

Anmerkung: hey, ich habe ein paar Sachen geschrieben, die ich für schlau hielt, aber die haben WTF angezogen? aus dem Mund meines Managers - wenn nicht aus dem Mund meiner Mitentwickler. Muss es aus ihrer Perspektive betrachten.

Haylem
quelle
Danke für die Antwort. Sie scheinen den anderen zuzustimmen, die sagen, dass "klug" nicht bedeutet, was ich dachte, dass es getan hat.
Larry Coleman
1

Ich neige dazu, klug zu sein , aber ich bemühe mich, elegant zu sein .

Entwickeln von Code jetzt , dass andere nicht versuchen zu vermeiden und später .

kevpie
quelle
1
Komm schon ... clever ist ein Synonym für elegant, dein Gehirn wurde vermarktet. Ja, ich habe dieses Wort erfunden. Es bedeutet, dass Ihr Gehirn vom Marketing anstatt von der Wahrheit beeinflusst wird.
Derek Litz
Elegant: einfach und clever. @DerekLitz +1 für alles Cromulent.
Kevpie
1

Dies ist mein Verständnis des Problems, basierend auf meiner Erfahrung und den anderen Antworten:

  1. Code, dessen Schreiben Clever war, der jedoch lesbar und wartbar ist, wird nicht als schädlich eingestuft. Die meisten Entwickler würden diese Art von Code jedoch nicht als "clever" bezeichnen. Sie können einen anderen Begriff wie "elegant" verwenden. Es kann eine Debatte darüber geben, ob ein solcher Code existiert oder nicht.
  2. Produktionscode, dessen Verständnis selbst von erfahrenen Entwicklern, die mit der Sprache vertraut sind, viel Zeit und Mühe erfordert, ist "clever" und wird von allen als schädlich angesehen.
  3. Produktionscode, der von unerfahrenen Entwicklern viel Zeit und Mühe erfordert, wird von einigen als schädlich angesehen. Ich habe in beiden Fällen Antworten gesehen und mit Entwicklern zusammengearbeitet, die ausdrücklich gesagt haben, dass sie es vorziehen, alles "kleinste gemeinsame Nenner" beizubehalten.
Larry Coleman
quelle
Die gesamte moderne westliche Kultur ist LCD, ich denke, das bedeutet, dass das Programmieren auch so sein muss. nicht gut.
Orbling
@Orbling: Ja, aber vergiss die sofortige Befriedigung nicht.
Larry Coleman
Ich mag deine Erfahrungspunkte. Es ist traurig, dass die Menschen nicht nach einer iterativen Verbesserung streben und ineinander investieren, indem sie Wissen und Verständnis teilen. Stattdessen möchten sie, dass wir Zahnräder auf einem Rad haben, damit wir zu gegebener Zeit problemlos ausgetauscht werden können. Auf diese Weise behindern wir den Fortschritt. Wir verkaufen uns auch short ...
Derek Litz
1

Ich kenne einen Mann. Er ist wahrscheinlich der brillanteste Mensch, den ich je getroffen habe. Er ist definitiv ein unglaublicher Programmierer, wahrscheinlich besser als ich es jemals in meinem ganzen Leben sein werde, wenn es um das reine Programmieren von Chops geht. Er schreibt Code, als würde er ein Word-Dokument tippen, und kann eine verknüpfte Liste umkehren, wie Sie es nicht glauben würden. Wenn Sie über das Schreiben eines sehr komplexen Codes sprechen möchten, ist er Ihr Mann, und wenn ich auf ein unglaublich schweres Problem stoße, wende ich mich immer an ihn. Es ist jedoch unerträglich, mit ihm in einem Team an einem Projekt zu arbeiten. Er ist nicht in der Lage, das Geschäftsproblem direkt anzugehen und eine logische, effiziente und präzise Lösung dafür bereitzustellen. Für ihn wäre eine Codeliste von 1000 Zeilen besser als 100. Anstatt die Tools zu verwenden, die ihm über die IDE oder das Framework zur Verfügung gestellt werden, wird er sein eigenes, superoptimiertes Tool entwickeln.

Während ich seine Fähigkeit bewundere, diese komplexen Dinge zu tun, brauche ich jemanden, der das Problem lösen und weitermachen kann. Es ist nicht großartig zu sagen oder zuzugeben, aber manchmal ist in einem geschäftlichen Umfeld die Zeit alles und Sie müssen nur das Problem lösen und mit Ihrem Leben weitermachen. Sie können später immer wieder darauf zurückgreifen und es neu definieren, um es zu verbessern dein Code. Es gibt eine feine Grenze zwischen schlau sein und auch Schmerzen im Hintern. Mein Motto für mein Team ist immer, was das Einfachste ist, was in dieser Situation funktioniert und dann von dort weitergeht. Manchmal ist einfacher nicht immer die Antwort, aber es ist ein verdammt guter Ort, um anzufangen.

Nodey The Node Guy
quelle
Tut mir leid, trotz der Qualität dieser Person, die Sie getroffen haben, um komplexe Dinge zu kodieren, ist er dumm. Menschen können und sind dumm, unabhängig von ihren anderen Eigenschaften. Ihre Aussagen darüber, was Sie wirklich von der Entwicklung erwarten, sind für eine talentierte Person offensichtlich. Wenn er wirklich intelligent ist, solltest du ihm einen Gefallen tun und ihn konfrontieren, anstatt ihn mit seinem Talent dumme Dinge tun zu lassen. Sie tun ihm und allen um ihn herum einen schlechten Dienst, indem Sie untätig sind und sich hinter seinem Rücken beschweren. Wenn er nicht intelligent ist, solltest du ihn feuern, dann wird er es vielleicht bekommen.
Derek Litz
Ich habe eine Beziehung zu einer primären Ressource, die sich seit Jahrzehnten täglich mit intelligenten Menschen befasst, und einigen von ihnen fehlen nur ein paar Kenntnisse, um in einer Teamumgebung produktiv zu sein. Sie können es selbst herausfinden, wenn Sie sie zumindest über das Problem informieren.
Derek Litz
1

"Clever" bedeutet in diesem Zusammenhang "zu clever für sich selbst", dh etwas, das jetzt funktioniert, aber ein Albtraum sein wird, um es später zu verstehen und zu ändern.

Vor allem, wenn es sich um einen Trick handelt, der ein undurchsichtiges Merkmal der Programmiersprache ausnutzt, komische Nebenwirkungen nutzt oder eine wirklich bizarre Methode zur Lösung des Problems in der Zielsprache darstellt.

Andres F.
quelle
0

Ich bevorzuge einfache Lösungen, ich mag die rubinrote Art wirklich. Wenn Sie zum Beispiel die ersten 2 Elemente in der Liste summieren möchten. Zuerst schneiden Sie die Liste, damit sie die Größe 2 hat, und addieren sie dann.

Ich erinnere mich, dass ich einmal 1 Liste anstelle von 3 verwendet und eine große Funktion erstellt habe, die sehr schwer zu pflegen / zu ändern war.

In der heutigen Welt müssen wir die Code-Klarheit nicht für die Leistung opfern (mit Ausnahme von C ++ müssen sie das nicht, aber sie werden es tun).

IAdapter
quelle
0

Normalerweise, wenn Sie 'clever' sein müssen, um ein Problem im Code zu umgehen. Wenn dies eine Problemumgehung ist und nicht sehr einfach ist, treten bei bestimmten Bedingungen (die zum Zeitpunkt des Codeschreibens möglicherweise zu 100% korrekt sind) viele verwirrte Gesichter oder andere seltsame Nebenwirkungen auf.

Also klug == verwirrend == schlecht :( Aber es ist auch toll, weil ich sie für praktische Lösungen für begrenzte Probleme verwendet habe.

user2528
quelle
0

Erneutes Zitieren für den Kontext und ein einfacheres Verständnis:

"Das Debuggen ist doppelt so schwierig wie das Schreiben des Codes. Wenn Sie den Code also so geschickt wie möglich schreiben, sind Sie per Definition nicht klug genug, um ihn zu debuggen."

Was Brian Kernighan hier schrieb, bezieht sich offensichtlich auf Faltung, und er benutzte fälschlicherweise das Wort klug.

"Das Debuggen ist doppelt so schwierig wie das Schreiben des Codes an erster Stelle. Wenn Sie den Code daher so [verschachtelt] wie möglich schreiben, sind Sie per Definition nicht schlau genug, um es zu debuggen."

Faltung:

A thing that is complex and difficult to follow.

Klug:

Showing intelligence or skill; ingenious

Geschulte Programmierer wissen, dass einfacher Code genial ist. Code, der so clever wie möglich ist, sollte per Definition einfach sein. Geschulte Programmierer vermeiden es auch, mit verschlungenem Code wie der Pest zu arbeiten und diesen zu schreiben. Sie werden auch gewundenen Code in cleveren Code verwandeln, wann immer sie die Chance haben. Code beginnt normalerweise verwickelt und nähert sich der Klugheit, da Wissen über den Bereich und das Verständnis der menschlichen kognitiven Fähigkeiten beim Programmieren durch Erfahrung und geteiltes Wissen besser verstanden werden.

Aufgrund der Popularität dieses Zitats und der großen Beliebtheit von Brian Kernighan in der Branche wirkt sich dieser Missbrauch des Wortes negativ auf die Gesellschaft aus, und ich würde es gerne sehen, wenn der Mann selbst das anspricht. Bevor ich diesen Artikel schrieb, habe ich versucht, eine E-Mail an ihn zu senden, aber ich konnte keine E-Mail-Kontaktinformationen finden, die ich verstand :(.

Die negativen sozialen Auswirkungen, die ich gesehen habe, sind, dass andere Programmierer ihre schlaueren Kollegen ausschließen, weil sie Klugheit jetzt als Problem sehen. Das eigentliche Problem sind die dummen Kollegen, die denken, sie seien schlau, indem sie Dinge auf eine neue, unidiomatische Weise tun und ständig neue Dinge erfinden, wenn es keinen Vorteil gibt, anstatt die größere Gemeinschaft zu gewinnen und zu verstehen und schlauere Ideen so weit wie möglich wiederzuverwenden.

Ich muss jedoch klarstellen, dass es oft schwieriger ist, ein Verständnis zu erlangen, als das eigene zu erfinden. Aufgrund des in der Industrie häufig auftretenden Problems unrealistischer Fristen wird Zeit gespart, wenn Sie Ihre eigenen für Ihr kleineres Nischenproblem erfinden. Dies basiert auf der Beobachtung, dass nützliche, wiederverwendbare Dinge normalerweise auf eine größere Nische abzielen oder eine nützliche Abstraktion für die Erfindung darstellen. Es basiert auch auf der Tatsache, dass Menschen auf große Nischen abzielen, um mehr Geld zu verdienen, wenn dies die Verwendung des Tools aufgrund der Komplexität, die damit verbunden ist, etwas für ein breites Anwendungsgebiet nutzbar zu machen, häufig äußerst schwierig macht.

Die andere negative soziale Auswirkung ist, dass dies den Fortschritt und den Wunsch nach Verständnis verhindert, da wir in unserer egozentrischen Welt sofort unser eigenes Unverständnis verleugnen und den Code des Verwickelns abschreiben, selbst wenn die Idee einmal verstanden wurde ziemlich schlau.

TODO Ich möchte einige Referenzen zitieren, aber ich möchte auch, dass das Fehlen von Referenzen meine Fähigkeit, Informationen zu teilen, nicht beeinträchtigt, damit ich schnell zitiere, woran ich mich erinnere, als Quellen für meine Informationen und vielleicht die tatsächlichen Informationen finde Tag (oder du findest es für mich! :)

  • Guido Van Rossums Vortrag über Event-Loops und wie er sie verstanden hat
  • Ein GitHub-Mitarbeiter, der angab, es zu vermeiden, clevere Leute für Y-Combinator einzustellen
  • Ein Großteil der Diskussionen und des Lernens, die in der Python-Community stattfinden. Die Python-Community steht neuen Ideen besonders kritisch gegenüber, lehnt sie jedoch nicht ab, wenn sie sie nicht ohne weiteres verstehen. In der Regel werden Funktionen, die zunächst als verschlungen angesehen wurden, als Kernsprachfeature bzw. -paket betrachtet.
  • Meine eigene Erfahrung und professionelle Meinung basiert auf meinen 10000-Fuß-Beobachtungen. Ich kann die Einzelheiten nicht wirklich erkennen, um sie von oben aufzuklären :( Hoffentlich werden Ihre Erfahrungen und Beobachtungen Ihnen dasselbe verraten, und jemand anderes kann unten einen Kommentar abgeben, um dieser Antwort einen gewissen Wert zu verleihen.

Fühlen Sie sich frei, Ihre eigenen Zitate hinzuzufügen! Fühlen Sie sich auch frei, meinem Text Kommas hinzuzufügen. Ich habe meine Kenntnisse über die Verwendung von Kommas in Englisch seit geraumer Zeit nicht mehr aktualisiert ...

Derek Litz
quelle
-1

Weil die Leute oft keine Sprache, Redewendungen und Muster kennen. Sie könnten ein Buch nehmen und es lernen, aber sie tun es nicht. Und wegen dieser Leute solltest du einfachen Code schreiben.

Es ist keine Klugheit. Es ist ein Wissen.

Abyx
quelle
2
Dem stimme ich sicherlich nicht zu (obwohl es kein -1 wert ist). Mit diesem Argument könnten Sie sagen, dass Sie das Befehlsmuster nicht implementieren würden, um einen Rückgängig / Wiederherstellen-Transaktionsstapel zu handhaben, da die Betreuer frisch aus der Schule waren und nicht verstanden, was vor sich ging. Irgendwann muss man einfach sagen, dass sie es lernen müssen, wenn sie es nicht wissen.
Ken Henderson
@confusedGeek Ganz richtig, wo ziehen Sie die Grenze zur Ignoranz?
Orbling
@Orbling, ehrlich gesagt ist das der schwierige Teil und hängt bis zu einem gewissen Grad von der Situation ab. Die allgemeine Anleitung, die ich benutze, ist, wenn ein einigermaßen erfahrener Entwickler (der sich mit den verwendeten Technologien auskennt) es verstehen kann, dann ist es wahrscheinlich in Ordnung. Wenn dies nicht möglich ist, muss es überarbeitet werden (oder die Einstellungspraktiken müssen überprüft werden).
Ken Henderson
@confusedGeek Aye, hört sich vernünftig an. Der Lackmus-Test ist wahrscheinlich, kann ein Entwickler des gleichen Kalibers wie Sie leicht verstehen, was Sie schnell genug getan haben. Wenn nicht und es gibt einen einfacheren Weg, dann muss es geändert werden. Manchmal gibt es keinen einfacheren Weg.
Orbling
-1. Codiere nicht für den kleinsten gemeinsamen Nenner. Unnötige Komplexität ist schlecht, aber wenn der Code durch eine gewisse Klugheit wesentlich trockener usw. wird, kann es sich lohnen.
dsimcha
-1

Ich konnte das hier erwähnte Wort Disziplin nirgendwo finden, also werde ich eingreifen. Ich möchte die Antwort nicht posten , aber einen anderen Einblick in die Angelegenheit geben, vielleicht einen, den die ursprüngliche Frage nicht im Sinn hatte .

Ein kluger Entwickler ist eine gute Sache.

Vor der Klugheit kommen jedoch andere Merkmale. Wie Sie vielleicht bemerkt haben, werde ich über Disziplin sprechen . Ein kluger und undisziplinierter Entwickler kann für die langfristige Wartbarkeit des Systems sehr schlecht sein.

Angenommen, ein Fehler tritt auf oder eine neue Anforderung tritt ein. Ein cleverer Entwickler wird möglicherweise bald feststellen, dass einige lokale Korrekturen die Aufgabe in 2 Minuten erledigen. Wenn dieser Entwickler diszipliniert ist, wird er diese Korrekturen nicht auf den Quellcode anwenden und stattdessen einen sinnvollen Weg finden, um das gewünschte Verhalten für das System zu komponieren. Auf diese Weise kann der Betreuer auf einfache Weise den Code verstehen und die neuen Änderungen implementieren, ohne dass beim nächsten Mal Änderungen erforderlich werden. Wenn nicht, bekommen Sie das Bild.

dkateros
quelle
„Beatings wird fortgesetzt , bis Moral verbessert“
gnat
@gnat Bedeutung? Um ein bisschen aufzuräumen; Ich betrachte Disziplin nicht als etwas, das Entwicklern aufgezwungen wird. Es ist ein gutes Persönlichkeitsmerkmal. Eine, die normalerweise von klugen Leuten nach einiger Zeit der Softwarewartung entwickelt wird. Das Problem ist, dass clevere Leute nicht in der richtigen Position waren und überall clevere Bomben hinterlassen, die andere finden können.
Dkateros