Pourquoi l'habileté est-elle considérée comme nuisible dans la programmation par certaines personnes?

89

J'ai récemment remarqué beaucoup de questions concernant différentes techniques d'abstraction, et des réponses disant en gros que les techniques en question sont "trop ​​intelligentes". Je penserais qu'une partie de notre travail en tant que programmeurs consiste à déterminer les meilleures solutions aux problèmes qui nous sont confiés, et l'intelligence est utile pour le faire.

Ma question est donc la suivante: les personnes qui pensent que certaines techniques d’abstraction sont-elles trop intelligentes s’opposent-elles à l’habileté en soi , ou y at-il une autre raison à l’objection?

EDIT: Ce combinateur d’analyseur est un exemple de ce que je considérerais comme du code intelligent. Je l'ai téléchargé et l'ai examiné pendant environ une demi-heure. Ensuite, j’ai traversé l’expansion macro sur papier et j’ai vu la lumière. Maintenant que je le comprends, il semble beaucoup plus élégant que le combinateur d’analyseur Haskell.

Larry Coleman
la source
116
Je pense que vous êtes peut-être incompris: l'habileté chez une personne est une vertu, mais l'habileté dans un système est un vice. Les systèmes et le code ne doivent pas être intelligents, ils doivent être clairs comme du cristal. Il faut souvent un individu intelligent pour créer de telles choses.
nlawalker
15
@ nlawalker: Je pense que je comprends maintenant. Les gens utilisent le mot "intelligent" pour désigner le code en tant qu'Antonyme de "clair" ou "simple" parce qu'ils veulent vraiment utiliser un mot qui est un antonyme de "clair" ou "simple".
Larry Coleman
2
@ Larry: Je ne suis pas sûr de ce que cela impliquerait. Intelligent comme dans inventif, original, ingénieux et, implicitement, utiliser des choses d'une manière jamais vue auparavant. Parfois, c’est formidable (de nombreux modèles de conception sont astucieux), mais l’étrangeté de la solution peut également rendre le travail difficile.
doppelgreener
2
Est-ce que personne ne commente plus le code? C'est là que vous expliquez l'intelligence pour que ceux qui suivent puissent comprendre. Comme toi dans 6 mois.
Phil Lello

Réponses:

207

Les solutions simples conviennent mieux pour la maintenance à long terme. Et ce n’est pas toujours une question de familiarité linguistique. Une ligne complexe (ou des lignes) prend du temps à comprendre même si vous êtes un expert dans la langue donnée. Vous ouvrez un fichier et commencez à lire: "ok, simple, simple, compris, oui, WTF ?!" Votre cerveau s'arrête brutalement et vous devez maintenant vous arrêter et déchiffrer une ligne compliquée. À moins d’une raison concrète et mesurable pour cette mise en œuvre, celle-ci est "trop ​​intelligente".

Il devient de plus en plus difficile de comprendre ce qui se passe, au fur et à mesure que la complexité passe d'une méthode intelligente à une classe intelligente en un modèle intelligent. Outre les approches bien connues, vous devez comprendre le processus de réflexion nécessaire pour créer une solution "intelligente", ce qui peut être assez difficile.

Cela dit, je déteste éviter un schéma (lorsque son utilisation est justifiée) simplement parce que quelqu'un pourrait ne pas le comprendre. C'est à nous, développeurs, de continuer à apprendre et si nous ne comprenons pas quelque chose, c'est une raison pour l'apprendre, et non pour l'éviter.

Anna Lear
la source
7
+1 bien dit. Je pense que c'est une question d'équilibre. Si je peux m'attendre à ce que quelqu'un avec une quantité suffisante de connaissances comprenne le code en pensant un peu à lui-même, vous pouvez agir intelligemment et éventuellement ajouter un commentaire. Si cela prend quatre fois plus de temps pour comprendre le code simplement parce que quelqu'un voulait prouver ses compétences en codage - nah! Si quelqu'un est assez intelligent pour proposer une solution intelligente, il devrait l'être suffisamment pour décider si c'est compréhensible ou non. Sinon, c'est juste montrer.
Anne Schuessler
Le dernier paragraphe que j'aime bien. Le reste est vrai, mais regrettable.
Orbling
On dirait que vous avez vu le code source de Zend PHP :)
Tim Post
+1 Un modèle simple peut ne pas fonctionner aussi bien qu'un modèle intelligent , et comme vous l'avez dit, il nous appartient, en tant que développeurs, de continuer à améliorer l'enveloppe de "intelligent" en le comprenant.
Stephen Furlani
3
En tant que personne qui a dû justifier de faire quelque chose "d'intelligent" alors qu'elle était vraiment "minimalement, orthogonalement correcte", je voudrais ajouter qu'il existe une certaine subjectivité sur la question de savoir ce qui est habilement intelligent. Par exemple, certaines personnes voudront toujours écrire if FuncX() then return true, else return falseet ne voudront jamais que vous écriviez return FuncX(). Je ne plaisante pas, j'ai littéralement eu cette conversation. Parce que les gens veulent quelque part accrocher leurs points d'arrêt, ou quelque chose du genre. :-)
Warren P
102

Principe du baiser

Restez simple, stupide. Les solutions intelligentes sont excellentes, mais souvent la solution la plus simple et directe est la meilleure.

«Le débogage est deux fois plus difficile que d’écrire le code. Par conséquent, si vous écrivez le code aussi intelligemment que possible, vous n'êtes pas, par définition, assez intelligent pour le déboguer. ”

Brian Kernighan

Josh K
la source
8
D'autre part, si vous écrivez le code de manière aussi intelligente que possible, vous devez alors apprendre à le déboguer et, ce faisant, vous deviendrez plus intelligent. Ou quelque chose comme ça.
James McNellis
11
@ James: Ou vous échouez simplement. ;)
Josh K
10
@ Josh K: J'ai toujours connu KISS comme "Keep It Simple, Stupid!" - en.wikipedia.org/wiki/KISS_principle
Orbling
1
@Orbling: Je me suis rappelé différemment, eh bien, maintenant je sais.
Josh K
1
"Reste simple et sois stupide" , selon Wikipedia ? :) Est-ce que cela signifie que rester simple est stupide ou que pour rester simple, vous devez être stupide ? : P
Mateen Ulhaq
83

Les imbéciles ignorent la complexité; les pragmatiques en souffrent; les experts l'évitent; les génies l'enlèvent. - Alan Perlis

Martijn Verburg
la source
5
+1 pour la belle citation et pour être la première réponse sans la supposition implicite que quelque chose ne peut pas être à la fois simple et intelligent
Larry Coleman
15
Ce qui est important, c’est que c’est le programmeur qui est censé être intelligent, pas le code.
Kristopher Johnson
Mieux vaut citer qu’un imbécile qui utilise mal le mot malin.
Derek Litz
30

La meilleure solution n'est pas toujours la solution la plus intelligente. Parfois, des solutions simples sont tout aussi bonnes.

Dans le logiciel, vous devez toujours penser en termes de maintenabilité. Si un morceau de code est trop intelligent pour quelqu'un qui le maintiendra, je dirais que l'intelligence n'en vaut pas la peine.

Geek
la source
3
Une solution simple à un problème complexe est aussi intelligente que tout le monde peut l’obtenir.
JeffO
bien qu'il y ait toujours la mise en garde que vous ne voulez pas trop simplifier simplement parce que le responsable ne peut pas coder (ou le lire).
Ken Henderson
@confusedGeek - mais si vous savez que le programmeur de maintenance ne peut pas le gérer, alors la solution intelligente devient une bombe à retardement. Ici, l’équilibre est essentiel - et cela ne s’applique que si vous connaissez l’équipe de maintenance. Si vous n'en avez pas la moindre idée, votre mieux est de faire preuve de clarté dans votre intelligence.
Michael Kohne
1
@Michael, les contraintes de performances peuvent nécessiter que votre code soit intelligent. Il incombe alors au mainteneur d’apprendre et, s’ils ne le peuvent pas, d’engager de nouveaux mainteneurs.
Stephen Furlani
@Stephen, si le code A BESOIN d'être intelligent, le programmeur doit prendre grand soin d'expliquer POURQUOI il doit l'être, afin que le responsable ne soit pas obligé de partir de zéro.
26

Pour citer Brian Kernighan:

«Le débogage est deux fois plus difficile que d’écrire le code. Par conséquent, si vous écrivez le code aussi intelligemment que possible, vous n'êtes pas, par définition, assez intelligent pour le déboguer. ”

peterchen
la source
"... À moins que vous n'utilisiez la définition correcte de malin et que le code soit réellement simple à comprendre et à déboguer."
Derek Litz
Cela dépend du dictionnaire que vous utilisez, je suppose. D'après mon expérience, tout code "intelligent" - facile à mémoriser ou non - exploite toujours une conjonction heureuse dans la spécification. Même si c'est évident, il convient d'indiquer si une telle hypothèse est susceptible de changer et ne doit pas fuir dans différentes parties du code.
peterchen
Vous avez raison, mais j'aimerais ajouter une mise en garde: cela dépend de la facilité avec laquelle le langage et l'implémentation sont lus et compris, et vos commentaires peuvent n'être que du bruit de code au lieu de quelque chose d'utile. Et s'il est courant d'utiliser intelligemment le sens opposé, nous devrions nous efforcer d'être plus clairs afin que les autres ne puissent pas mal interpréter les choses à leur avantage.
Derek Litz
Aucune objection à cela :)
peterchen
22

l'intelligence est un outil; En soi, ce n'est pas dangereux. Cela ne devient nuisible que dans un contexte où cela n'est pas nécessaire.

Steven A. Lowe
la source
16

"Clever", lorsqu'il est appliqué au code, est presque toujours un euphémisme pour "inutilement compliqué".

Bien lire, du code clair et simple est déjà assez difficile. Lire du code "intelligent" revient à étudier de nouveau la poésie latine.

La confusion survient parce que "intelligent" en tant qu'attribut d'une personne a une signification complètement différente. Ce cas peut également être vu comme un exemple de la raison pour laquelle concevoir un logiciel pour des personnes réelles est difficile: parce qu’ils sont ambigus.

Et parce que certains programmeurs ont du mal à comprendre les protocoles sociaux suivis par la plupart des gens, qui leur interdisent de dénoncer directement le code comme "inutilement compliqué", ils peuvent avoir du mal à faire la différence entre les deux sens du mot intelligent . Contrairement à ce que certains pourraient penser, je pense qu’en fin de compte, de meilleurs "personnes, des personnes" (signifiant: des personnes qui ont de l’empathie, de l’introspection et de la patience) font de meilleurs développeurs. Parce qu'ils savent pour qui écrire.

minute
la source
5
J'aurais voté en faveur de cela si vous n'aviez pas prêché des protocoles sociaux et des "personnes personnes [sic]".
Jason Baker
2
C'est bon et merci de me le rappeler. J'ai tendance à être trop prêché. Mais je suis vraiment contrarié par l’incapacité et / ou le refus de programmeurs de traiter avec le comportement humain ordinaire, et le manque général d’empathie et d’introspection que je constate dans notre domaine. J'aurais peut-être dû mettre "personnes personnes" entre guillemets au lieu d'italiques. L'anglais n'est pas ma langue maternelle, je ne savais pas comment faire comprendre que, pour être un excellent développeur, il fallait comprendre non seulement le code, mais également les gens. A MON HUMBLE AVIS.
fzwo
Edité ma réponse. Plus clair / moins offensant maintenant?
fzwo
+1 pour la première phrase, ce que j'avais en fait conclu après avoir obtenu les premières réponses.
Larry Coleman
Oui, merci d'avoir expliqué à quel point les personnes stupides font preuve d'intelligence dans ce contexte!
Derek Litz
9

La plupart des gens se concentrent sur l’intelligence du point de vue "Le code nécessite trop de déchiffrement pour comprendre ce qu’il fait" et toutes les choses négatives qui s’y rattachent, telles que

  1. Personne d’autre ne peut le comprendre, encore moins le maintenir / le déboguer.
  2. La personne qui a écrit ne sait même pas ce que ça fait.
  3. Ce n’est peut-être pas si brillant au début
  4. etc....

Tous les bons points, mais il y a un autre aspect négatif de l'ingéniosité et c'est le vieux problème de l'ego. Cela provoque des problèmes dans le sens de

  1. Quelqu'un qui est trop "intelligent" pour utiliser les solutions de quelqu'un d'autre. Pourquoi chercher ce que les autres ont fait quand vous pouvez inventer votre propre façon de dépouiller le même chat?
  2. Quelqu'un qui pense avoir inventé la solution la plus cool à un problème refusera souvent de prendre des entrées.
  3. Ne laissez personne modifier le "code" même s'il y a des problèmes évidents ou qu'un changement anodin est nécessaire.
  4. À l'inverse, ils pensent être intelligents et doivent utiliser la "dernière" technique pour prouver leur intelligence, mais ne parviennent pas à bien le gérer, que ce soit dans des projets personnels ou dans un code non productif, avant de l'intégrer à des parties critiques de le système.

Nous sommes tous coupables de trop d'ego parfois, mais quand ça gêne l'équipe, c'est un problème.

MIA
la source
8

Good Clever - ratio élevé entre les lignes de code intelligentes et les lignes de dans une alternative non intelligente. 20 lignes de code qui vous évitent d'écrire 20000, c'est extrêmement bien. Good Clever consiste à vous sauver du travail.

Mauvais malin - faible ratio entre les lignes de code écrites en écriture par rapport aux lignes de code sauvegardées. Bad Clever est une ligne de code intelligente qui vous évite d'écrire cinq lignes de code. Mauvais malin parle de "masturbation syntaxique".

Juste pour noter: Bad Clever n'est presque jamais appelé "Bad Clever"; il voyagera souvent sous les pseudonymes "beau", "élégant", "concis" ou "succinct".

utilisateur8865
la source
Réponse intéressante, mais le code que vous appelez "Mauvais malin" est-il qualifié de "beau", etc., par quelqu'un d'autre que la personne qui a écrit le code en question?
Larry Coleman
2
Dépend. En Objective-C / C ++ / C, le phénomène est généralement limité à un individu. En Perl et Ruby, souvent toute la communauté aura une valeur commune sur le fait que Bad Clever soit "beau", "élégant", etc.
user8865
1
@ user8865: de plus, le code "Good Clever" finit par être beaucoup plus facile à déboguer que l'original, car selon votre définition, 3 ordres de grandeur en moins.
Larry Coleman
2
Ah, les programmes Perl sont - maintenant presque par définition - extrêmement bons, intelligents :) Bon à savoir!
7

Je me pose des questions sur la définition de malin de chacun.

Personnellement, j’ai l’impression d’être habile lorsque j’ai pris un problème difficile et complexe et que je l’ai mis en œuvre de manière très simple et directe, tout en maintenant un niveau d’efficacité acceptable.

dr je me sens intelligent quand, lors d'une révision du code, mon critique dit "wow, c'était plus facile que je ne le pensais", par opposition à "wtf c'est tout ça ..."

Avatar_Squadron
la source
1
LOL à propos du tl; dr, à quel point pensez-vous que les programmeurs lisent? Oui, je méprise absolument l’utilisation abusive d’intelligent ici pour signifier le contraire de ce qu’il est réellement. Les développeurs et les gestionnaires Dumb / Ignorant / Evil l'utilisent en fait pour justifier de ne pas embaucher quelqu'un qui, à leur avis, pourrait être "trop ​​intelligent".
Derek Litz
6

En plus des réponses théoriques énumérées, cela est souvent utilisé dans un contexte trop intelligent pour tous les autres.

Passez d’une équipe de maintenance de niveau intermédiaire à une équipe de maintenance de niveau intermédiaire pour voir les différences réelles de ce qui est "trop ​​intelligent".

En laissant de côté les arguments théoriques, trop intelligent est souvent basé sur ce avec quoi les membres de l'équipe les moins qualifiés peuvent travailler raisonnablement, donc il est très relatif à l'environnement.

Facture
la source
Excellent: "trop ​​intelligent est souvent basé sur ce avec quoi les membres de l'équipe les moins qualifiés peuvent travailler raisonnablement"
Orbling
En fonction de votre emplacement, c'est parfois moins qu'excellent :-)
Bill
Qui se soucie du membre le moins qualifié de l'équipe? Presque toutes les équipes (même si je suis sûr qu’il existe quelques exceptions) ont au moins un membre qui n’a absolument aucun intérêt à s’appeler programmeur.
Dsimcha
1
J'espère que vous les améliorerez, mais même si cela ne réussit pas, vous devez toujours les traiter en tant que membre de l'équipe et ils doivent pouvoir participer à certains travaux. Je vois actuellement cela dans les expressions lambda. Beaucoup de gens avec qui je travaille ne les ont pas encore, alors ils les voient trop intelligents. C’est regrettable, car ils résolvent beaucoup de nos problèmes de manière assez efficace et élégante, mais si aucun type intermédiaire ne les réussit, ils iront à la gestion pour que le logiciel ne soit pas supporté.
Bill
@ Bill: Fonctions Lambda ??? Quiconque ne peut pas comprendre quelque chose d'aussi simple, même après avoir été explicitement invité à en apprendre davantage à son sujet, n'a aucune raison d'être un programmeur professionnel.
dsimcha
6

Parfois, j'ai été si intelligent que je me suis trompé.

John
la source
1
Cela peut arriver. Et parfois, quelque chose ne va pas, c'est juste.
Bobobobo
Ils appellent ces théories John. Les théories peuvent et doivent être fausses de temps en temps :), cela ne signifie pas que nous devrions cesser d'être intelligents et nous efforcer d'être aussi intelligents que possible. Sinon, comment allons-nous devenir des leaders dans ce monde! "Ah, mais la portée d'un homme devrait dépasser sa portée - ou à quoi sert un paradis?"
Derek Litz
4

Je mesure une solution de manière performante, maintenable, rapide et économique. Je suppose que malin pourrait également faire partie d'une solution, à condition que cela n'affecte pas négativement ces qualités.

Heath Lilley
la source
+1 pour avoir utilisé "pas cher" comme facteur positif de développement
Gary Rowe
J'ai vu trop de code 'intelligent' qui n'est pas performant!
HLGEM
Il existe plus de paramètres de valeur, mais ceux-ci peuvent être bons en fonction du projet. Souvent, ils sont en désaccord. Vous devez donc privilégier l'un par rapport à l'autre pour réussir.
Derek Litz
3

Si le code intelligent + la quantité de commentaires requis pour le rendre compréhensible <= code simple, alors je dis aller pour le code intelligent. À chaque fois.

Je pense que le problème se pose lorsque des personnes qui écrivent du "code intelligent" omettent délibérément de le commenter correctement, car ce n’est que si cela est initialement incompréhensible que les générations futures qui le découvriront devront passer du temps à "apprécier" à quel point il est intelligent.

thesunneversets
la source
Eh bien, ou parce qu'ils ne pensent tout simplement pas au prochain gars, ou à autre chose. Je ne suis pas sûr que j'attribuerais à l'égotisme intellectuel ce qui peut être expliqué de manière adéquate par une paresse irréfléchie et une mauvaise habitude. Mais le fait est que si votre code ne peut pas être compris au premier abord, il a besoin de commentaires, et si le code + les commentaires sont plus longs (en LOC ou dans le temps) qu’une autre façon, vous travaillez plus que nécessaire.
Dan Ray
Bonne réponse, (ne peut pas +1, il n'en reste plus, le sera plus tard). Si les gens ne passent pas de temps à écrire du code intelligent et que les autres ne le passent pas à le comprendre, préférez un code simple moins complexe, même s'il est moins efficace. Ensuite, aucun progrès dans les compétences n'aura lieu.
Orbling
Meilleure réponse. Le mantra: écrivez un code de base simple, un code de débutant qui est plutôt lent et lent que tous se lèvent ... et faites-en un commentaire lorsque vous le réduisez à un one-liner illisible. C'est comme ça que vous apprenez tous les sales tours de votre langue!
Droogans
Si je prends votre utilisation d'intelligent pour signifier compliqué, j'ai personnellement écrit un code compliqué qui a été rendu compréhensible par la journalisation. Alors que je n'avais pas prévu d'écrire du code compliqué, à l'époque, cela m'a fait gagner un peu de temps, mais j'ai ajouté un # TODO selon lequel il devrait probablement être réécrit pour qu'il soit simple si nous devons le modifier de manière significative.
Derek Litz
3

Je me souviens d'une citation que j'ai vue attribuée à de nombreuses personnes, comme le sont souvent les bonnes citations.

Paraphraser:

Toute personne intelligente peut faire le complexe simple, il faut un génie pour rendre le complexe simple.

Prendre une idée complexe et la simplifier pour la rendre compréhensible montre l’intelligence du constructeur, mais prendre une idée simple et la rendre complexe montre que le constructeur veut être perçu comme intelligent.

Pickle Pumper
la source
Oui, c'est l'idée égocentrique de vouloir être intelligent qui rend votre base de code compliquée. Vous êtes, ou n'êtes pas intelligent. Malheureusement, au début de l'apprentissage, les gens pensent qu'ils sont plus intelligents qu'ils ne le sont. Plus tard, ils réalisent à quel point ils ne sont pas intelligents et écrivent ensuite un code intelligent une fois les connaissances acquises comblées.
Derek Litz
2

Si la solution «intelligente» est difficile à déterminer, elle ne devrait pas être utilisée. Par exemple, si, à travers les effets secondaires, vous pouvez sous-traiter un calcul complexe à une ligne, c'est malin. Mais s'il faut une heure à quelqu'un pour comprendre ce que vous avez fait dans le monde, c'est trop intelligent.

Michael K
la source
2
Très bien, mais votre réponse change-t-elle si la personne qui ne comprend pas le code ne connaît pas toutes les fonctionnalités de la langue?
Larry Coleman
2
C'est différent, au moins IMO. Si une personne ne connaît pas les fonctionnalités d'une langue, elle n'est pas en mesure de juger de ce qui est malin ou non.
Joe D
@ Larry: Pas nécessairement. Je suppose que la personne qui le lit a un niveau de compétence basique / avancé. Et si cela commence à devenir un complexe irrécupérable, alors il est temps de mettre un commentaire de bloc expliquant ce que le code est censé faire, ce qui aidera à établir un cadre de référence pour comprendre ce qu'il fait réellement. Le commentaire doit cependant être de haut niveau - écrivez le calcul, expliquez le processus; ne répétez pas le code. Une personne chez devrait (idéalement) être capable de comprendre le code tel qu'il le lit. C'est le but, de toute façon.
Michael K
2

À mon avis, l'intelligence en soi n'est pas un problème. Habituellement, nous pouvons faire des confusions à propos du code "intelligent" (sans sarcasme) et du code "insightfull". Ce que je considère comme un problème, c'est le fait que le code "intelligent" (avec le sarcasme) contient généralement des exigences implicites non visibles, ce qui rend plus difficile le débogage et la maintenance au fil du temps.

Il existe plusieurs algorithmes connus qui sont intelligents. Quicksort est un, IMO.

Le code "intelligent" (avec sarcasme) suppose généralement que les variables en cours de définition et les états du système sont virtuellement déconnectés du code "intelligent" (fichiers ouverts précédemment, connexions réseau, bases de données, etc.).

La quantité de données que vous devez charger dans votre cerveau pour conserver correctement un code "intelligent" est généralement trop importante pour obtenir un bon rapport coûts / avantages.

Machado
la source
1

"Code intelligent" désigne tout code pour lequel le programmeur doit réfléchir très sérieusement ou utiliser des compétences avancées pour l'écrire. Le problème avec cela, c'est qu'il ignore la nécessité d'une certaine "marge d'ingéniosité", que Brian W. Kernighan a bien exprimé:

"Le débogage est deux fois plus difficile que l'écriture du code. Par conséquent, si vous écrivez le code aussi intelligemment que possible, vous n'êtes pas assez intelligent, par définition, pour le déboguer."

Alex
la source
1

Parce que ce qui semble être une intelligence pour un développeur dans un élan de créativité peut simplement passer pour un gâchis et être simplement un bloc illisible et incontrôlable d’ énigmes obscures pour les autres.

Malgré tout, c'est un bloc d'énigmes agréable, intelligent et performant, mais si vous avez de l'expérience, vous vous rendrez souvent compte que cela coûtera beaucoup plus cher à votre entreprise (pas à vous, le développeur) de la maintenir sur le même support. ou à long terme. Vous préférez donc calmer l'ardeur de vos collègues développeurs lorsqu'ils sont portés.

Sauf, bien sûr, s'il existe une justification pour l'ingéniosité. Et s’il ya une bonne documentation qui accompagne ce que vous venez d’écrire de manière obscurcie. Vous avez commenté cet astucieux code, n'est-ce pas? Expliquez son intention, pourquoi cela doit être, et comment il se comporte?

S'il n'y a aucune justification, c'est probablement simplement une optimisation prématurée, une sur-ingénierie ou un problème du type YAGNI. S'il faut 15 niveaux d'indirection pour faire quelque chose de simple, alors il est fort probable que vous tombiez également dans les catégories précédentes. Et si ce n'est pas documenté, alors ce ne sont que des ennuis.

Un bon code ne devrait pas obliger le responsable à être à 100% tout le temps pour le comprendre. Un bon code est intelligent. Un bon code peut être presque aussi efficace, mais meilleur dans de nombreux autres aspects. Un bon code ne devrait pas nécessiter un IDE avec 15 vues pour suivre la conception de votre application.

Note: hé, j'ai écrit quelques trucs que je pensais intelligents mais qui ont attiré WTF? sur - si pas mes co-développeurs '- la bouche de mon manager. Avoir à le regarder de leur point de vue.

haylem
la source
Merci d'avoir répondu. Vous semblez être d'accord avec les autres qui disent que "intelligent" ne veut pas dire ce que je pensais.
Larry Coleman
1

J'ai tendance à être intelligent , mais je m'efforce d'être élégant .

Développer du code maintenant que les autres n'essaieront pas d'éviter plus tard .

kevpie
la source
1
Allez ... clever est synonyme d'élégant, votre cerveau a été commercialisé. Oui, j'ai inventé ce mot, cela signifie que votre cerveau est influencé par le marketing au lieu de la vérité.
Derek Litz
Élégant: simple et intelligent. @ DerekLitz +1 pour n'importe quoi cromulent.
kevpie
1

C’est ce que je comprends du problème, sur la base de mon expérience et des autres réponses:

  1. Un code qui prenait l'habitude d'écrire, mais qui en sort lisible et maintenable n'est pas considéré comme nuisible. Cependant, la plupart des développeurs n’appelleraient pas ce type de code "malin"; ils peuvent utiliser un terme différent comme "élégant". Il peut y avoir ou non un débat quant à savoir si un tel code existe.
  2. Un code de production qui nécessite beaucoup de temps et d’efforts pour être compris même par un développeur expérimenté et familiarisé avec le langage est "intelligent" et considéré comme nuisible par tout le monde.
  3. Le code de production qui nécessite beaucoup de temps et d’efforts de la part de développeurs inexpérimentés est considéré comme néfaste. J'ai vu des réponses dans les deux cas, et j'ai travaillé avec des développeurs qui ont explicitement déclaré qu'ils préféreraient conserver le "plus petit commun dénominateur".
Larry Coleman
la source
L’ensemble de la culture occidentale est l’écran LCD, je suppose que cela signifie que la programmation doit être aussi; pas bon.
Orbling le
@Orbling: Oui, mais n'oubliez pas la gratification instantanée.
Larry Coleman
J'aime vos points d'expérience. Il est regrettable que les gens ne recherchent pas d'amélioration itérative et n'investissent pas les uns dans les autres en partageant leurs connaissances et leur compréhension. Au lieu de cela, ils préféreraient que nous soyons engrenages sur une roue afin que nous puissions être facilement remplacés le moment venu. En faisant cela, nous empêchons le progrès. Nous nous vendons aussi à court ...
Derek Litz
1

Je connais un mec; il est probablement la personne la plus brillante que j'ai jamais rencontrée. Il est sans aucun doute un codeur incroyable, probablement meilleur que je ne le serai de toute ma vie en termes de programmation. Il écrit du code comme s'il tapait un document Word et peut inverser une liste chaînée comme vous ne le croyez pas. Si vous voulez parler d'écrire un code très complexe, c'est votre homme et si je rencontre un problème incroyablement difficile, je me tourne toujours vers lui. Cependant, travailler sur un projet avec lui en équipe est une tâche pénible. Il est incapable de cibler directement le problème de l'entreprise et de lui fournir une solution logique, efficace et concise. Pour lui, une liste de codes de 1000 lignes serait mieux que 100. Au lieu d'utiliser les outils qui lui sont fournis via l'IDE ou le framework, il va lancer son propre outil super optimisé.

Bien que j'admire sa capacité à faire ces choses complexes, j'ai besoin de quelqu'un qui puisse résoudre le problème et passer à autre chose. Ce n’est pas génial de le dire ou de l’admettre, mais parfois, dans une entreprise, le temps est compté et vous devez simplement résoudre le problème et poursuivre votre vie, vous pouvez toujours y revenir plus tard et le remanier pour vous améliorer. votre code. Il y a une ligne de démarcation entre être intelligent et être pénible. Ma devise pour mon équipe est toujours, quelle est la chose la plus simple possible qui fonctionnera dans cette situation et partira de là. Parfois, la solution n'est pas toujours simple, mais c'est un sacré bon point de départ.

Nodey Le Node Guy
la source
Désolé, malgré la qualité de cette personne que vous avez rencontrée pour pouvoir coder des choses complexes, elle est stupide. Les gens peuvent être et sont stupides indépendamment de leurs autres traits. Vos déclarations de ce que vous voulez vraiment du développement sont évidentes pour une personne talentueuse. S'il est vraiment intelligent, vous devriez lui faire une faveur et le confronter au lieu de le laisser faire des choses stupides avec son talent. Vous rendez un mauvais service à lui et à tout le monde autour de lui en étant oisif et en vous plaignant derrière son dos. S'il n'est pas intelligent, vous devriez le virer, alors peut-être qu'il l'obtiendra.
Derek Litz
J'ai une relation avec une ressource principale qui traite quotidiennement avec des personnes intelligentes depuis des décennies. Certaines personnes manquent simplement de quelques connaissances pour être productives dans un environnement d'équipe. Ils peuvent s'en sortir par eux-mêmes si au moins vous leur faites connaître le problème.
Derek Litz
1

"Clever" dans ce contexte signifie "trop ​​intelligent pour son propre bien", c'est-à-dire quelque chose qui fonctionne maintenant mais qui sera un cauchemar à comprendre et à changer plus tard.

Surtout s'il s'agit d'une astuce qui exploite une fonction obscure du langage de programmation, utilise des effets secondaires étranges, ou constitue un moyen vraiment bizarre de résoudre le problème dans la langue cible.

Andres F.
la source
0

Je préfère les solutions simples, j'aime beaucoup le style rubis. Lorsque vous voulez par exemple additionner les 2 premiers éléments de la liste. Tout d’abord, vous coupez la liste pour qu’elle ait la taille = 2, puis vous l’ajoutez.

Je me souviens qu’une fois j’ai utilisé 1 liste au lieu de 3 et créé une grande fonction très difficile à gérer / modifier.

Dans le monde actuel, il n'est pas nécessaire de sacrifier la clarté du code pour la performance (sauf en c ++, ce n'est pas obligatoire, mais ce sera le cas).

IAdapter
la source
0

Habituellement, lorsque vous devez être "intelligent", vous devez résoudre un problème de code. Si c'est une solution de contournement et pas très simple, alors vous aurez beaucoup de visages confus ou d’autres effets secondaires étranges lorsqu’on suppose certaines conditions (ce qui peut être correct à 100% au moment de la rédaction du code).

Donc intelligent == déroutant == mauvais :( Mais c'est aussi génial que je les ai utilisés pour des solutions pratiques à des problèmes limités.

utilisateur2528
la source
0

Re-citer pour le contexte et et la compréhension plus facile:

"Le débogage est deux fois plus difficile que l'écriture du code. Par conséquent, si vous écrivez le code aussi intelligemment que possible, vous n'êtes pas assez intelligent, par définition, pour le déboguer."

Ce que Brian Kernighan a écrit ici se réfère évidemment à la convolution, et il a utilisé à tort le mot intelligent.

"Le débogage est deux fois plus difficile que l'écriture du code. Par conséquent, si vous écrivez le code aussi [convolué] que possible, vous n'êtes, par définition, pas assez intelligent pour le déboguer."

Convolution:

A thing that is complex and difficult to follow.

Intelligent:

Showing intelligence or skill; ingenious

Les programmeurs instruits savent que le code simple est ingénieux. Un code aussi intelligent que possible devrait être simple par définition. Les programmeurs instruits éviteront également de travailler avec et d’écrire du code compliqué comme la peste. Ils transformeront également le code compliqué en code intelligent chaque fois qu'ils en auront l'occasion. Le code commence généralement de manière compliquée et aborde l'habileté à mesure que la connaissance du domaine et la compréhension de la capacité cognitive humaine dans la programmation sont mieux comprises à travers l'expérience et les connaissances partagées.

En raison de la popularité de cette citation et de la popularité assez répandue de Brian Kernighan dans l'industrie, cet emploi abusif du mot a un impact social négatif et j'aimerais sincèrement que l'homme lui-même s'en saisisse. Avant d’écrire cet article, j’ai essayé de voir si je pouvais simplement lui envoyer un courrier électronique, mais j’ai été incapable de trouver des informations de contact par courrier électronique que j’ai comprises :(.

L'impact social négatif que j'ai vu est que d'autres programmeurs ostracisent leurs pairs les plus intelligents, car ils voient maintenant l'intelligence comme un problème. Le vrai problème, ce sont les pairs stupides qui pensent être intelligents en faisant les choses d'une manière nouvelle et non inventive, et en inventant constamment de nouvelles choses quand il n'y a aucun avantage, au lieu d'acquérir et de comprendre la communauté en général et de réutiliser les idées intelligentes autant que possible.

J'ai besoin de préciser, cependant, qu'il est souvent plus difficile de comprendre que d'inventer la vôtre. En raison du problème courant rencontré par l'industrie en matière de délais irréalistes, inventer le vôtre pour résoudre votre petit problème de niche servira à gagner du temps. Ceci est basé sur l'observation que les objets utiles et réutilisables ciblent généralement une niche plus grande, ou fournissent une abstraction utile pour l'invention. Il est également basé sur le fait que les gens ciblent les grandes niches pour gagner plus d'argent, ce qui rend souvent l'outil extrêmement difficile à utiliser en raison de la complexité inhérente à la création d'un élément utilisable pour un large domaine d'applications.

L’autre impact social négatif est que cela empêche le progrès et le désir de comprendre parce que, dans notre monde égocentrique, nous allons immédiatement nier notre propre manque de compréhension et rayer le code de «compliqué» même si, une fois comprise, l’idée est en réalité Plutot malin.

TODO Je voudrais citer quelques références, mais je voudrais aussi le manque de références afin de ne pas entraver ma capacité à partager des informations. Je vais donc rapidement citer ce dont je me souviens en tant que sources de mes informations et peut-être trouver des informations jour (ou vous pouvez le trouver pour moi! :)

  • Le discours de Guido Van Rossum sur les boucles d'événement et comment il en est venu à les comprendre
  • Un employé de GitHub qui a déclaré qu'il évitait d'embaucher des personnes intelligentes sur Y-Combinator
  • Une grande partie de la discussion et de l'apprentissage qui se passe dans la communauté Python. La communauté Python est particulièrement critique vis-à-vis des nouvelles idées, mais ne rejette pas les nouvelles idées qu’elles ne comprennent pas incidemment, et vous pouvez généralement voir des fonctionnalités considérées à l’origine comme alambiquées comme une caractéristique / un package linguistique principal.
  • Ma propre expérience et mon opinion professionnelle basées sur mes observations de 10000 pieds. Cependant, je ne vois pas les détails pour éclairer de haut en bas :( J'espère que votre expérience et vos observations vous diront la même chose et que quelqu'un d'autre peut commenter ci-dessous pour donner un peu de mérite à cette réponse.

N'hésitez pas à ajouter vos propres citations! Aussi, n'hésitez pas à ajouter des virgules à mon texte. Je n'ai pas rafraîchi mes connaissances sur l'utilisation des virgules en anglais depuis un certain temps ...

Derek Litz
la source
-1

Parce que souvent les gens ne connaissent pas une langue, des idiomes et des modèles. Ils pourraient prendre un livre et l'apprendre, mais ils ne le font pas. Et à cause de ces personnes, vous devriez écrire un code simple.

Ce n'est pas une intelligence. C'est une connaissance.

Abyx
la source
2
Je ne suis certainement pas d'accord avec cela (bien que cela ne vaille pas un -1). Par cet argument, vous pourriez dire que vous ne mettriez pas en œuvre le modèle de commande pour gérer une pile de transactions Undo / Redo car les responsables étaient à peine sortis de l'école et ne comprenaient pas ce qui se passait. À un moment donné, vous devez simplement dire que s'ils ne le savent pas, ils doivent l'apprendre.
Ken Henderson
@confusedGeek Très bien, où tirez-vous la ligne de l'ignorance?
Orbling
@Orbling, honnêtement, c'est la partie la plus difficile et dépend dans une certaine mesure de la situation. Le guide général que j’ai tendance à utiliser est que si un développeur raisonnablement expérimenté (connaissant les technologies utilisées) peut le maîtriser, alors c’est probablement correct. S'ils ne le peuvent pas, ils doivent être refondus (ou revoir les pratiques d'embauche).
Ken Henderson
@confusedGeek Aye, semble raisonnable. Le test décisif est probablement qu'un développeur du même calibre que vous-même peut facilement comprendre ce que vous avez fait assez rapidement. Si ce n'est pas le cas et qu'il existe un moyen plus simple, il faut changer. Parfois, il n'y a pas de moyen plus facile.
Orbling
-1. Ne codez pas pour le plus petit dénominateur commun. La complexité inutile est mauvaise, mais si une habileté rend le code beaucoup plus sec, etc., cela peut en valoir la peine.
dsimcha
-1

Je ne pouvais pas trouver le mot discipline mentionné nulle part ici, alors je vais donner mon avis. Je ne veux pas poster la réponse, mais je voudrais partager un aperçu différent sur le sujet, peut-être un que la question initiale n'avait pas en tête .

Un développeur intelligent est une bonne chose.

Cependant, avant l'habileté viennent d'autres traits. Comme vous l'avez peut-être compris, je parlerai de discipline . Un développeur intelligent et indiscipliné peut être très dommageable pour la maintenabilité à long terme du système.

Supposons qu'un bogue survienne ou qu'une nouvelle exigence entre en jeu. Un développeur intelligent pourrait bientôt se rendre compte que quelques correctifs locaux permettront d'accomplir le travail en 2 minutes. Si ce développeur est discipliné, il s'abstiendra d'appliquer ces correctifs au code source et trouvera à la place un moyen significatif de composer le comportement souhaité pour le système. Ainsi, lors de la prochaine modification des éléments de code, le responsable de la maintenance disposera de suffisamment de temps pour comprendre le code et implémenter les nouvelles modifications sans rien perdre. Sinon, vous obtenez l'image.

dkateros
la source
« Battements continueront jusqu'à ce que le mora »
moucheron
@gn Signification Pour éclaircir un peu les choses; Je ne prends pas la discipline comme une contrainte imposée aux développeurs. C'est un bon trait de personnalité. Celui qui est généralement développé par des personnes intelligentes après un certain temps de maintenance du logiciel. Le problème vient de personnes intelligentes qui n’ont pas suffisamment occupé le poste de responsable et qui laissent partout des bombes intelligentes à la disposition des autres.
dkateros