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.
quelle
Antworten:
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.
quelle
if FuncX() then return true, else return false
und nie wollen, dass Sie einfach schreibenreturn 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. :-)KISS-Prinzip
Halten Sie es einfach dumm. Clevere Lösungen sind großartig, aber oft ist die einfachste, direkte Lösung die beste.
Brian Kernighan
quelle
Dummköpfe ignorieren Komplexität; Pragmatiker leiden darunter; Experten meiden es; Genies entfernen es. - Alan Perlis
quelle
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.
quelle
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. “
quelle
Klugheit ist ein Werkzeug; an sich ist es nicht schädlich. Es wird nur dann schädlich, wenn es nicht notwendig ist.
quelle
"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.
quelle
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
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
Manchmal sind wir alle zu viel Ego schuldig, aber wenn es dem Team im Weg steht, ist es ein Problem.
quelle
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.
quelle
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."
quelle
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.
quelle
Manchmal war ich so schlau, dass ich mich geirrt habe.
quelle
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.
quelle
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.
quelle
Ich erinnere mich an ein Zitat, das ich vielen verschiedenen Leuten zugeschrieben habe, wie es die guten Zitate oft sind.
Umschreiben:
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.
quelle
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.
quelle
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.
quelle
"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."
quelle
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.
quelle
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 .
quelle
Dies ist mein Verständnis des Problems, basierend auf meiner Erfahrung und den anderen Antworten:
quelle
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.
quelle
"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.
quelle
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).
quelle
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.
quelle
Erneutes Zitieren für den Kontext und ein einfacheres Verständnis:
Was Brian Kernighan hier schrieb, bezieht sich offensichtlich auf Faltung, und er benutzte fälschlicherweise das Wort klug.
Faltung:
Klug:
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! :)
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 ...
quelle
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.
quelle
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.
quelle