Les programmeurs compliquent-ils parfois intentionnellement le code? [fermé]

26

Il semble beaucoup de fois sur stackoverflow, que les gens (les programmeurs en particulier) ont tendance à trop compliquer une solution à un problème où la solution est beaucoup plus compliquée que le problème d'origine? Je ne suis en aucun cas un expert, mais beaucoup de fois j'essaie de choisir la solution la plus simple qui fonctionne (et évidemment cela ne fonctionne pas PARTOUT) mais j'ai eu un assez bon succès en suggérant des solutions simples sur le tas que les gens semblent ignorer pour des solutions BEAUCOUP plus compliquées?

Est-ce que c'est comme une chose normale pour les programmeurs ..... ou est-ce que je ne pense pas dans la bonne perspective.

6791
la source
5
1. Oui, je pense parfois. 2. Oui, au moins certains programmeurs au moins parfois compliquent trop leur code, au moins parfois intentionnellement. 3. Affaires clôturées.
Job
3
Avez-vous déjà vu quelqu'un vous crier: "Vous auriez dû y penser!" lorsque vous avez manqué une exigence qui n'était pas indiquée lors de la collecte des exigences initiales? C'est ce qui peut conduire à rendre les choses plus complexes que nécessaire.
JB King

Réponses:

18

De toute évidence, certains programmeurs sont impatients de montrer à quel point ils sont intelligents en créant du code incroyablement compliqué que personne ne peut comprendre. D'autres programmeurs tirent à un niveau si élevé que la complication des solutions est une évolution naturelle.

Le pire code que j'ai jamais vu était une méthode qui contenait plus de 2000 lignes de code. Sans doute, ce code était complexe, mais il était également très pauvre.

Je pense qu'un bon programmeur évite le code trop compliqué. Cela implique d'éviter la tentation de forcer un modèle de conception à s'intégrer dans une solution qui n'en a pas vraiment besoin. Cela inclut également d'éviter les objets divins, les boutons magiques, l'optimisation prématurée, la généralisation prématurée et d'autres anti-modèles.

Je refactorise constamment et cherche des opportunités pour simplifier mes solutions car la croissance de la complexité est une chose organique. Comme beaucoup d'autres choses organiques, il doit être taillé et taillé si nous voulons qu'il continue à être utilisable. Je déteste devoir interagir avec des solutions trop compliquées car avec une complexité accrue, il y a une probabilité accrue de casser le code.

Je pense que la lisibilité est l'élément le plus important de la maintenance du code, et les solutions trop compliquées réduisent presque toujours la lisibilité et augmentent les coûts de maintenance.

Tim Claason
la source
32

J'ai vu beaucoup de code plus complexe que nécessaire et presque toujours pour ces trois raisons:

1) Sur-ingénierie en raison d'une généralisation prématurée ou en essayant d'anticiper les besoins futurs qui ne se sont jamais posés

2) Le (s) développeur (s) souhaitaient apprendre / expérimenter avec un nouveau modèle de conception ou une nouvelle technologie qu'ils n'avaient pas utilisé auparavant et l'ont intégré même lorsqu'il était excessif. Ils le font parce que cela rend leur travail plus intéressant et qu'ils apprennent quelque chose de nouveau.

3) Des fonctionnalités et des corrections de bugs ont été ajoutées, mais le code existant n'a pas été correctement refactorisé à l'époque. Il peut ne s'agir que d'un petit morceau de duplication ou d'un autre argument indicateur sur une méthode, mais tout s'additionne. En effet, des hacks sont ajoutés et il ne faut pas longtemps pour que tout devienne trop compliqué en raison de toutes les odeurs de code. C'est le plus courant et généralement dû au fait de ne pas savoir mieux ou à cause du temps.

Alb
la source
Je suis coupable de # 2, je le crains. Avec l'expérience (et la maturité?), J'ai maintenant tendance à m'abstenir ... et à expérimenter à la place à la place :)
Matthieu M.
Je vois que les gens en font 1 tout le temps, ils finissent par créer 5 fois plus de travail pour eux
Ally
11

C'est absolument une chose courante. Comme le disent la plupart des livres, un bon développeur sait rester simple. Il est tout simplement trop facile de compliquer excessivement quelque chose avec une nouvelle technologie ou un cadre "cool" que vous venez de trouver, alors vous commencez à chercher des moyens de l'utiliser, au lieu de penser du point de vue des problèmes.

Comme l'a dit Martin Fowler, ceux qui apprennent une nouvelle technologie ont un problème à court terme où ses solutions "technologiques" sont axées.

Martin Blore
la source
4
-1: Comme le disent la plupart des livres, un bon développeur sait rester simple. - Vous avez absolument raison à ce sujet. Mais ensuite, vous avez laissé entendre que l'abus de nouvelles technologies est la principale cause de la complexité excessive du code. Vous vous trompez à ce sujet. Croyez-moi, il y a beaucoup de code trop compliqué qui n'a rien à voir avec un abus des nouvelles technologies.
Jim G.1
Où ai-je laissé entendre exactement que c'était la "plus grande cause de code trop complexe"? C'est certainement un problème, "Hé, je viens d'apprendre le motif X, où je peux aller l'appliquer" - Patternitus. Tu as vraiment mis des mots dans ma bouche, Jim.
Martin Blore
4
"J'ai rendu cette lettre plus longue que d'habitude, uniquement parce que je n'ai pas eu le temps de la raccourcir." - Blaise Pascal Très applicable ici aussi. «Compliqué» est souvent un signe de codage précipité, paresseux ou incompétent.
Bill
@Bill La chose intéressante à ce sujet est que c'est un bon argument pour un code plus complexe d'un point de vue commercial - si vous êtes payé un montant fixe pour implémenter quelque chose et qu'il faut plus de temps pour refactoriser ou raccourcir, sauf si vous pouvez le faire dès la première fois (qui peut?), il y a essentiellement une pénalité pour rendre votre code déjà fonctionnel moins complexe.
Michael
10

Je ne pense pas que ce soit normal pour tous les programmeurs, mais j'ai certainement vu beaucoup de programmeurs faire cela.

Je pense que certaines personnes pensent que certaines personnes voient que quelque chose de vraiment simple est «trop facile» et que ce n'est pas une bonne vitrine de leurs compétences. Par conséquent, ils doivent trouver une solution grande et complexe qui est un moyen de dire «regarde ce que je peux faire!», Même si ce n'est peut-être pas la meilleure solution pour le problème en question.

GSto
la source
1
Voilà comment je le vois. IE si c'est trop facile ça ne vaut pas la peine d'être utilisé?
@Mercfh Je ne comprends pas la vue. Qu'est-ce que la facilité d'une solution a à voir avec son efficacité?
GSto
Je commentais son commentaire en disant "Oui je suis d'accord" que parfois les programmeurs pensent "Oh si c'est trop simple, ce n'est pas très bon".
7

J'ai vu des programmeurs écrire souvent plusieurs lignes de code pour accomplir une tâche qu'ils ignoraient déjà intégrée au langage. Ce n'est pas exactement intentionnel mais peut certainement être évité.

JD Isaacks
la source
J'ai vu des programmeurs qui ont écrit une boucle pour chaque copie de chaîne. Jamais utilisé un appel à une fonction de bibliothèque standard. (Ce qui est pire, c'est que la copie des plates-formes a été optimisée pour lire un mot à la fois.)
BillThor
7

Cela dépend de ce que vous appelez "simple". Certaines personnes voient le code hautement refactorisé comme plus "complexe" car il y a plus de code et plusieurs graphiques d'appels. Cependant, ce code est plus "simple" dans la mesure où il est beaucoup plus facile d'apporter des modifications.

Je trouve souvent qu'une grande fonction semble "simple" jusqu'à ce que vous ayez besoin de faire des changements, puis elle devient rapidement complexe.

En d'autres termes, le simple est dans l'œil du spectateur dans de nombreux cas.

Erik Funkenbusch
la source
2
+1: trop de programmeurs n'y pensent pas
Luca
5

Le problème est si vous ne pouvez pas voir clairement les solutions simples (c'est là que les discussions avec les collègues entrent en jeu) ou si vous généralisez trop tôt.

En d'autres termes, vous faites des boucles simples en fonctions de bibliothèque avancées parce que vous pensez que vous en aurez besoin pour votre prochain projet de toute façon (sauf que vous ne le ferez pas sous cette forme exacte). Faites cela trop longtemps et vous avez une application extrêmement complexe avec un noyau très simple.

Vous pourriez également constater que vous avez besoin d'un code très robuste, et toute la robustesse le rend complexe par défaut. Cependant, je ne pense pas que ce soit votre problème.

user1249
la source
4

Dans certains cas, cela pourrait être simplement la complexité de trouver une solution propre / simple.

Il y a une citation dont je ne me souviens pas ou qui va quelque chose seule: le code n'est pas complet une fois que vous avez écrit tout ce que vous avez besoin d'écrire, mais ne complétez qu'une fois que vous n'avez plus rien à supprimer.

Le manque de clarté empêchera les gens de retirer tout l'excès.

Stephen Bailey
la source
4
Une autre citation pertinente est: "J'aurais écrit une lettre plus courte mais je n'avais pas eu le temps."
user16764
3
"Il semble que la perfection soit atteint non quand il n'y a plus rien à ajouter, mais quand il n'y a plus rien à retrancher." ("Il semble, la perfection n'est atteinte pas quand il n'y a plus rien à ajouter mais quand il n'y a plus rien à enlever. ») - Pilote, poète et ingénieur français Antoine Marie Roger Vicomte de Saint-Exupéry, 1939 (extrait du livre Terre des Hommes ( vent, sable et étoiles )).
Jörg W Mittag
Merci, il semble que je n'ai jamais connu la véritable origine :-) Sympa.
Stephen Bailey
3

Les meilleurs ingénieurs sont ceux qui peuvent prendre des problèmes très compliqués et les transformer en solutions faciles à mettre en œuvre et à comprendre. Cela semble simple, mais il n'y a pas beaucoup d'ingénieurs / développeurs comme celui-là qui existent. En fait, il n'y a pas beaucoup de gens comme ça qui existent. En réalité, la majorité des gens font exactement le contraire. Ils prennent des problèmes simples et les compliquent au-delà de la reconnaissance. Il suffit de regarder nos politiciens pour un exemple de personnes qui parviennent à prendre des problèmes simples et à les transformer en un chaos total. Les programmeurs ne sont pas différents à cet égard.

Tremper
la source
3
Aie! J'étais sur le point de vous donner un +1, mais j'ai ensuite vu votre analogie avec la politique, et c'est au mieux faible. // C'est vrai - Il y a beaucoup d'obscurcissement, de mouvements gaspillés, de signes de la main et d'intérêts particuliers ancrés dans la politique, et en conséquence, les projets de loi peuvent devenir trop compliqués. Mais la surcomplication est un sous-produit de l'obscurcissement, du mouvement gaspillé, de l'ondulation de la main et des intérêts particuliers. Pas une cause profonde.
Jim G.1
Quelle que soit la raison, il existe des solutions très simples à de nombreux problèmes du pays, mais les politiciens choisissent de les rendre plus difficiles qu'ils n'en ont besoin. Nous supposons que c'est soit à cause de l'argent, du pouvoir ou des votes, mais je crois aussi que c'est en grande partie une question de capacités. Dans ce cas, mon analogie repose sur des bases solides.
Dunk
1
@JimG. Oui, je suis d'accord avec vous ... il me semble que beaucoup de problèmes avec les solutions politiques sont des politiciens qui prétendent qu'il existe une solution facile (la leur!) À un problème vraiment compliqué qui n'a vraiment pas de solution facile.
Michael
2

Personnellement, je n'ai jamais intentionnellement tenté de compliquer un logiciel. Cependant, j'ai terminé quelque chose et j'ai pensé "wow, c'est trop compliqué" et j'y suis retourné et refactorisé. Certaines personnes peuvent voir cela et penser que cela fonctionne et que c'est assez bon et ne pas le refactoriser.

jmq
la source
1

Un sage aurait dit que vous devriez garder les choses aussi simples que possible, mais pas plus simples. La même chose pourrait s'appliquer au code. Parfois, vous devez utiliser une technique que certains considèrent comme complexe (la récursivité peut être un bon exemple, elle fait souvent peur aux programmeurs débutants).

Cependant, en général, je pense que le code complexe se produit souvent de manière organique. Un problème simple est résolu avec du code qui est simple, puis la portée se développe et le code est modifié sans trop de réflexion, et au fil du temps, vous obtenez du code qui essaie de couvrir le nouveau problème mais a été vraiment conçu pour résoudre un problème différent. Il devient une courtepointe patchwork de différentes pièces de logique. Un tel code peut alors souvent sembler beaucoup plus complexe que le problème ne l'exige, mais il l'a obtenu parce que chaque petit changement semblait, à l'époque, être le moyen le plus simple de faire fonctionner le code.

Je ne pense pas que la plupart des développeurs aient délibérément décidé de rendre le code complexe (bien que vous obteniez une démonstration étrange qui utilisera une certaine technique pour prouver leur propre compétence), je pense que le code ne fonctionne que de cette façon s'il n'est pas agressivement maintenu et refactorisé .

Steve
la source
Il est étonnant de voir combien de systèmes commencent avec un cœur très simple qui correspond presque aux exigences mais échoue de nombreuses manières distinctes, puis finit par ajouter de nombreuses complications pour combler de nombreuses lacunes qui auraient pu être évitées avec une conception légèrement plus compliquée. Considérez la conception simple des types entiers de C et certaines des règles étrangement complexes qui les accompagnent. Si pour chaque type, il y avait eu une option "si cela devait être promotable", cela aurait nominalement doublé le nombre de types (mais pas vraiment d'une manière différente d'un qualificatif comme volatile, etc.) mais ...
supercat
... cela aurait considérablement assoupli les règles de promotion / équilibrage. Un court non signé non promotible ajouté à un int promotable donnerait un court non signé non promotible, qu'il soit ou non shortaussi grand que int. Un promotable unsigned shortajouté à un promotable intdonnerait un int. Ajouter des choses signées et non signées de la même taille, ou ajouter des choses non promotionnelles de différentes tailles, serait une erreur. Ajoutez un tout petit peu de complexité à l'avant, et les cas de coins étranges en aval disparaissent.
supercat
1

Une autre raison qui n'a pas encore été soulevée est que les gens peuvent trop compliquer les solutions livrées pour s'assurer que vous aurez besoin de leurs services plus tard pour prendre en charge ces solutions. En d'autres termes: pour la sécurité de l'emploi.

quant_dev
la source
Je ne sais pas pourquoi cela a été rejeté, j'ai rencontré des projets extrêmement importants codés par un homme, qui a créé son propre cadre, et a été payé à l'heure uniquement pour travailler sur ce projet. Si l'employeur le faisait chier, toute la gamme de produits serait vissée. Il aurait fallu des mois à un autre développeur pour bien comprendre le code, tandis qu'il aurait fallu quelques minutes au codeur "omniscient" pour mettre à jour son fouillis de spaghettis.
SSH ce
0

Peut-être un problème d'erreur classique?

30. Révélateur plaqué or.

Les développeurs sont fascinés par les nouvelles technologies et sont parfois impatients d'essayer de nouvelles fonctionnalités de leur langage ou de leur environnement ou de créer leur propre implémentation d'une fonctionnalité fluide qu'ils ont vue dans un autre produit - qu'elle soit ou non requise dans leur produit. L'effort requis pour concevoir, implémenter, tester, documenter et prendre en charge les fonctionnalités qui ne sont pas nécessaires allonge le calendrier.

  • Steve McConnell, développement rapide.
Crevettes
la source
0

Oui, parfois, nous compliquons trop le code pour nous amuser. Surtout si la perception que le code est trop compliqué vient d'un participant ignorant ou junior du projet.

P. Roe
la source
1
-1 Les développeurs seniors qui attribuent catégoriquement les problèmes aux développeurs juniors ne comprennent probablement pas les motivations de leur propre travail ou du travail des autres. Si les développeurs juniors ont du mal à suivre votre code, alors IL EST trop compliqué.
Brandon
Je dirai que si un développeur Jr trouve le code impossible à comprendre, c'est une odeur de code et il se peut en fait que le code soit trop compliqué, mais vous utilisez beaucoup pour élargir un pinceau ici. Cette odeur de code peut en fait simplement exister parce que le développeur Jr a besoin d'aide pour comprendre une technique avancée, pas que la technique elle-même soit à blâmer.
P. Roe
-1

OUI ... et j'ai payé le prix trop de fois.

Mon tableau blanc a maintenant une déclaration en astérisques tout en haut qui indique

"Si ce n'est pas simple, ce n'est pas bien"

... et chaque fois que je prototype quelque chose sur le tableau blanc, cela attire toujours mon attention.

Cela fonctionne vraiment pour moi car mes conceptions complexes deviennent beaucoup plus simples, ce qui se traduit par un code plus propre.

Dal
la source