Devez-vous sacrifier la lisibilité du code avec l'efficacité du code? [fermé]


37

Devez-vous sacrifier la lisibilité du code avec l'efficacité du code?

par exemple 3 lignes de code en 1 ligne.

J'ai lu dans Code Craft de Pete Goodliffe que la lisibilité est essentielle.

Tes pensées?


13
Pourquoi pensez-vous que le code avec moins de lignes est probablement plus efficace? C'est rarement le cas avec les langues modernes, bien que cela ait pu s'appliquer aux interprètes BASIC 8 bits.
David Thornley

69
Ni la lisibilité ni les performances ne sont mesurées en lignes.

Dans de très rares cas, je sacrifierais la lisibilité pour la vitesse, mais très rarement. Le code incorporé utilisant des machines à grande vitesse est un cas. Pour la plupart des logiciels, la lisibilité est beaucoup plus importante.
Jim C


Je privilégie toujours la lisibilité jusqu'à ce que la performance devienne un problème. Ensuite, je commençais à m'en inquiéter.
Pete

Réponses:


62

"Moins de lignes" n'est pas toujours la même chose que "plus efficace". Je suppose que vous voulez dire "Faut-il raccourcir un programme au détriment de sa lisibilité".

Les programmes doivent être écrits pour que les gens puissent les lire et, accessoirement, pour que les machines s’exécutent.

-Abelson & Sussman, Structure et interprétation des programmes informatiques

En général, je pense qu'il est plus important qu'un programme soit facile à comprendre que d'être court. Je devrais cependant noter que raccourcir un programme le rend souvent plus lisible (il est évident que le seuil commence quand le code commence à ressembler à du bruit de ligne, mais jusque-là, exprimer quelque chose de façon plus succincte le rend plus clair).

Il existe des exceptions spécifiques (telles que vos scripts de shell personnels ou l'un des codes de modification de données) que personne n'aura jamais besoin de gérer, et vous seul aurez besoin de lire. Dans cette situation, il est probablement correct de sacrifier une partie de la lisibilité au profit de l’opportunité, pour autant que vous puissiez la comprendre.


3
+1 Il y a des rendements décroissants, mais j'ai également constaté qu'un programme court est généralement plus facile à lire qu'un programme long.
Michael K

23
Malheureusement, j’ai trouvé qu’un code unique mongeur de données qui n’est pas immédiatement supprimé se transforme en code à long terme, beaucoup trop souvent. Attendez-vous toujours à ce que les choses traînent, soient réutilisées et développées, à moins que vous ne supprimiez le code.
Vatine

1
Je suis d'accord avec Vatine. Avez-vous déjà essayé de trouver quelque chose que vous pensiez être «parfaitement clair» il y a bien longtemps?
Wonko the Sane le

+ 1 pour le SICP. Livre génial.
Jason Yeo

30

Parfois oui.

La lisibilité est une bonne chose à faire. La plupart du code écrit pour des applications métiers typiques sera suffisamment performant et il est important de se concentrer sur la lisibilité. Dans des domaines plus exigeants en termes de performances (tels que la programmation de jeux vidéo ou le calcul intensif), il peut être important de renoncer à la lisibilité au profit d'une fonctionnalité de langage particulière qui est horriblement illisible et incroyablement performant.

Pour un exemple de ce dernier, voir l' article de la racine carrée à inversion rapide sur Wikipedia.

Je pense généralement qu'il est préférable de commencer par lire quelque chose et de se préoccuper des performances après, à condition de prendre des précautions de bon sens, comme de ne pas choisir un algorithme O (n ^ 2) au lieu de O (n). Le fait de sacrifier la lisibilité au seul souci de la brièveté est, à mon sens, erroné.


4
Je pense qu'il pourrait y avoir une différence entre "code lisible" et "connaître l'algorithme". Je suppose que tout code, si vous ne connaissez pas l'algorithme, sera plus ou moins difficile à lire et à comprendre. Par exemple, dans l'affaire FISR mentionnée, le code en clair est en fait assez lisible, mais l'algorithme n'est pas documenté. Si vous connaissiez l'algorithme FISR, combien plus lisible pourriez-vous écrire le code? La question étroitement liée pourrait être: quand choisir un algorithme de fantaisie?
Maglob

@ Maglob je faisais spécifiquement référence à l'utilisation de 0x5f3759df. Sans égard aux performances, vous pouvez utiliser l’implémentation de l’algorithme ISR en utilisant une division régulière, qui serait probablement plus lisible par une personne moins familiarisée avec les composants internes de l’ordinateur.
Adam Lear

3
Ceci pourrait peut-être être exprimé comme suit: "Il est parfois correct de remplacer un algorithme naïf exprimé en 5 lignes de commentaires et 20 lignes de code par un algorithme sophistiqué exprimé en 15 lignes de commentaires et 5 lignes de code".
Peter Taylor

1
Gardez également à l’esprit que ce qui est horriblement obscur à un développeur dans un domaine peut être parfaitement idiot pour un développeur dans un autre domaine. Bien que la constante magique dans l'algorithme ISR semble avoir quelque peu repoussé les limites, je suppose qu'à l'époque, ce type de piratage au niveau des bits pour les approximations à virgule flottante était assez courant dans le développement de jeux. De même, dans les systèmes embarqués, il y a beaucoup de bricolage idiomatique mais qui peut sembler excessivement obtus pour un développeur d'applications.
Cercerilla

une des merveilles d’Internet -> lors de la mise en oeuvre d’un algorithme complexe (exemple: distance de Levenshtein avec optimisation diagonale ... je travaille juste dessus;)), on peut référencer un article ou même copier l’article dans la documentation du projet et mettre une référence dans le code. De cette façon, les personnes connaissant les algorithmes ne font que suivre les commentaires qui expliquent des tests / optimisations spécifiques, tandis que les débutants devront d'abord se familiariser avec l'algorithme, puis revenir à la mise en œuvre.
Matthieu M.

22

La seule fois que je sacrifierais la lisibilité serait lorsque le code était considéré comme un goulot d'étranglement au niveau des performances et qu'une réécriture permettait de résoudre ce problème. Dans ce cas, l' intention du code doit être bien documentée afin que, en cas de bogue, il puisse être dépisté plus facilement.

Cela ne veut pas dire que la réécriture doit être illisible, bien sûr.


22

Je l'ai déjà cité et je le cite encore:

Faites le correct,
faites le clair,
faites le concis,
faites vite.

Dans cet ordre.

Wes Dyer


2
+1 Je faisais défiler rapidement pour m'assurer que cette citation était incluse. Maintenant, je n'ai pas à mettre de réponse. :-)
RationalGeek

9

Devez-vous sacrifier la lisibilité du code avec l'efficacité du code?

En termes de code, il est toujours agréable d’être auto-documenté. Mais parfois, cela ne peut pas arriver. Parfois, vous avez besoin d'optimiser et parfois, ce code n'est pas très lisible en soi.

Voici ce que les commentaires ont été inventés pour . Utilise les. Même l'assemblée a des commentaires. Si vous avez écrit une masse de code et qu'il n'y a pas de commentaire en vue, je suis inquiet. Les commentaires n'affectent pas les performances d'exécution, mais quelques notes sur ce qui se passe sont toujours utiles.

Dans mon esprit, il n’ya aucune excuse pour ne pas avoir quelques remarques fondamentales. if ( x == 0 ) /* check if x is 0 */Est clairement totalement inutile; vous ne devriez pas ajouter de bruit inutile au code, mais quelque chose comme ceci:

; this is a fast implementation of gcd
; in C, call as int gcd(int a, int b)
; args go in rdi, rsi, rcx, r8, r9
gcd:
    push rdp
    ; ...

Est très utile.


6

Devez-vous sacrifier la lisibilité du code avec l'efficacité du code?

Si votre objectif actuel est l'efficacité (comme dans la phase d'optimisation) et que vous savez, vous avez des métriques, n'est-ce pas? - cette ligne de code est le goulot d'étranglement actuel, alors oui.

Sinon, non: la lisibilité vous permettra (ou à un autre) de pouvoir modifier ce code ultérieurement pour le rendre plus efficace, car plus facile à comprendre.


4

Personne ne gagne le code de golf

par exemple 3 lignes de code en 1 ligne

Une idée particulièrement terrible.

Coût pour jouer au golf de code - très élevé.

Coût de maintenance des programmes illisibles - astronomique.

Valeur de ce type de code minimisé - zéro. Cela fonctionne toujours, mais ne fonctionne pas "mieux".

Efficacité judicieusement choisie

Coût pour choisir le bon algorithme et la bonne structure de données - modéré.

Coût pour maintenir le bon algorithme et la bonne structure de données - faible.

Valeur du bon algorithme et de la structure de données - élevée. L'utilisation des ressources est faible.

Foolish ("micro-optimisation") Efficacité

Coût pour jouer autour de la micro-optimisation - élevé.

Coût de maintenance du code micro-optimisé et illisible - très élevé.

Valeur de la micro-optimisation - varie. Lorsqu'il y a une valeur non nulle ici, les coûts l'emportent toujours sur elle.


2

Cela dépend si nous parlons d'efficacité en termes de rapidité d'exécution du code ou d'efficacité en termes de rapidité avec laquelle le développeur peut écrire le code. Si vous sacrifiez la lisibilité du code pour pouvoir taper le code très rapidement, vous risquez probablement de perdre du temps en termes de débogage.

Cependant, si nous parlons de sacrifier la lisibilité du code en termes de rapidité d'exécution du code, il s'agit probablement d'un compromis acceptable tant que le code doit être préformé de manière efficace. Écrire quelque chose qui va aussi vite que possible simplement parce que vous le pouvez n’est pas une raison aussi valable que parce que c’est quelque chose qui ressemble à la racine carrée rapide rapide où la performance est la clé. L'astuce consiste à équilibrer le code et à s'assurer que, même si le code source est difficile à lire, les commentaires décrivant ce qu'il explique expliquent ce qui se passe.



2

Je n'accepte pas l'argument "lisibilité sur performance". Laissez-moi vous donner une réponse avec une autre tournure.

Quelques antécédents: Vous savez ce qui me rend malade? Lorsque je double-clique sur Poste de travail et que je dois attendre qu’il soit rempli. Si cela prend plus de 5 secondes, je suis vraiment frustré. La chose stupide est, et ne blâmez pas simplement Microsoft pour cela, c’est que dans certains cas la raison pour laquelle cela prend tant de temps est qu’il faut décider quelle icône afficher! C'est vrai. Je suis donc assis, je ne suis intéressé que par mon lecteur C: et je dois attendre que le pilote accède à mon CD-ROM pour lire l'icône à partir de là (en supposant qu'il y ait un CD dans le lecteur).

D'ACCORD. Alors, pour une seconde, imaginez toutes les couches entre moi en double-cliquant sur Poste de travail et en train de parler via des pilotes au CD-ROM. Maintenant, imaginez que chaque couche était ... plus rapide ...

Vous voyez, derrière tout cela se trouvent des milliers de programmeurs heureux parce que leur code est "plus lisible". C'est génial. Je suis content pour toi. Mais du point de vue de l'utilisateur, ça craint (terme technique). Et vous dormez donc bien la nuit en vous disant que vous avez agi correctement en veillant à ce que le code soit plus lisible et plus lent. Même légèrement plus lent que ce ne peut être. Et ainsi, des milliers de développeurs le font et nous finissons par attendre nos PC à cause de vous. À mon avis, vous n'êtes pas digne. Je ne dis pas que vos toutes premières lignes doivent être les meilleures.

Voici mon approche: Tout d'abord, faites-le fonctionner, puis accélérez-le. Essayez toujours d’écrire du code efficace et si vous devez sacrifier la lisibilité, complétez-le avec des commentaires. Je ne sacrifierai pas l'efficacité pour qu'un programmateur médiocre puisse la maintenir. Je vais cependant expliquer mon code, mais si cela ne suffit pas, je suis désolé, vous êtes tout simplement incompétent pour travailler ici. Parce qu'ici, nous écrivons du code rapide et lisible, et bien qu'il y ait un équilibre, on peut expliquer le code lisible alors que l'inefficacité est simplement inacceptable.


"OK. Alors juste une seconde, imaginez toutes les couches entre moi en double-cliquant sur Poste de travail et en train de parler via des pilotes au CD-ROM. Maintenant, imaginez que chaque couche était ... plus rapide ..." instantanée pour moi avec 2 DVD Drives
Rangoric

Un mot: Upgrade
jmort253

2
Les gars, travaillez avec moi ici, c'est une illustration ...
Maltrap

@Rangoric est ce que j'appelle utiliser les avancées technologiques comme une béquille plutôt que comme un cadeau. Cela fonctionne bien pour l’industrie si vous pouvez persuader les utilisateurs d’ouvrir leurs portefeuilles plus souvent.
Jonathan Neufeld

Je pense que l'impact énergétique du code saturé exige plus de contrôle et des mesures strictes. La gérance de l'environnement fait défaut ici. Étant donné que nous observons actuellement une augmentation de 4 degrés de la température globale, pourquoi la complexité informatique passe-t-elle au second plan?
Jonathan Neufeld

2

Cette question m'est souvent venue à l'esprit lorsque les entretiens sont discutés au bureau. En tant que diplômé, il y a de nombreuses années, on m'a posé la question "Pensez-vous que le code est auto-documenté?". Maintenant, je devais répondre à cette question en tant que programmeur et en ce qui concerne l'intervieweur, c'était une question en noir et blanc, il n'y avait donc pas de moyen terme. Le processus doit survivre à l'individu, car les gens vont et viennent plus rapidement et vous voulez que les nouveaux départs soient prêts le plus tôt possible. Plus le code est lisible, plus il est facile de comprendre ce qui se passe.

Il y a quelque temps, j'avais lu un livre plutôt intéressant intitulé Domain Driven Development: Conception axée sur le domaine: aborder la complexité au cœur des logiciels. Certes, la lecture est un peu sèche au début, mais le matériel est bien présenté. Cela montre une bonne approche qui conduit à des systèmes qui se documentent bien. Le langage est le moyen de communication de votre solution. Plus la solution est clairement exprimée, plus il est facile de s’adapter si performace devient un facteur essentiel. C'est ma conviction et cela semble avoir bien fonctionné pour moi.


1

Il est rare que le retour sur investissement lié à une exécution plus rapide du code, au détriment de sa lisibilité, en vaille la peine. Les ordinateurs modernes fonctionnent si vite que je doute que vous souhaitiez cela. Si un ordinateur exécute le code, ce code doit être conservé.

À cette fin, je trouve la lisibilité très importante. Bien sûr, comme indiqué à de nombreuses reprises, ce n'est pas parce que le code est lisible que c'est plus lent.

Un bon exemple est un nom de variable: $a

C'est quoi $a?? Ceci est hors contexte, donc vous ne pouvez pas répondre à cette question, mais avez-vous déjà rencontré ce problème dans du code réel? Supposons maintenant que quelqu'un a écrit $file_handle- qu'est-ce que c'est maintenant? C'est clair même hors contexte. La longueur du nom de la variable fait une différence insignifiante pour l'ordinateur.

Je pense qu'il y a du bon sens à avoir ici.

Certaines applications peuvent nécessiter un raccourci de décalage que tout le monde ne comprendra pas, mais je pense qu'à un moment donné, les rendements diminuent et que trouver un scénario est rare *.

* Cela dépend de l'industrie et d'autres choses du même genre. Je regarde cela du point de vue du développeur de logiciels d'entreprise (Business Information Systems).


Pour examiner cela sous un autre angle (mais pas pour faire de la réflexion), je travaille dans une entreprise qui fabrique des SAAS. Lorsqu'un site tombe en panne, nous devons le réparer vraiment, très vite - généralement, quelqu'un d'autre corrige le code d'un autre développeur.

Je beaucoup plutôt quelqu'un faire quelque chose de très inefficacement mais lisible que de le faire et de fantaisie « rapide ». Nos serveurs Web sont à la pointe de la technologie et une demande ne doit pas être livrée en un millionième de seconde. Nous n'avons pas de problèmes de charge.

Donc, en pratique, je pense que vous risquez davantage de vous blesser ou de blesser les autres ... (Je préférerais que mon week-end revienne.)


1

Dans la plupart des cas, la réponse est "Faites confiance à votre compilateur pour faire son travail" et écrivez un code lisible. Cela implique que le code soit structuré logiquement (c'est-à-dire qu'il ne contient pas de spaghetti) et auto-documenté (c'est-à-dire des noms de variables, de fonctions, etc. suffisamment clairs). Code de supplément qui n'est pas auto-documenté avec des commentaires significatifs. Ne commentez pas pour le commentaire, c.-à-d.

x++; // Add one to x

Commentez plutôt pour vous, le lecteur, dans 6 mois ou 12 mois ou quelque temps suffisamment long. Adoptez une norme de codage et suivez-la.


+1 pour "Faites confiance à votre compilateur pour faire son travail". C'est mon nouveau commentaire sur Skype.
Jmort253

0

Le code propre est un code rapide. Clairement écrit, le code facile à gérer a tendance à être plus rapide, car il indique que le programmeur a compris la tâche à accomplir et a refactorisé le code pour en faire son objectif principal.

En outre, les compilateurs modernes optimisent très efficacement les instructions. Le nombre de lignes de code que vous tapez pour faire quelque chose et ce que le compilateur crée en termes d'instructions ne sont pas nécessairement liés. Renseignez-vous sur les compilateurs pour comprendre pourquoi c'est le cas.

Lorsque je travaille sur des éléments basés sur les performances, tels que les graphiques, je sacrifie parfois la lisibilité / la maintenabilité lorsque je travaille sur le traitement d'images, lorsque je travaille sur le plus profond des algorithmes imbriqués où de petites optimisations peuvent avoir un effet majeur. Et même dans ce cas, je ne le fais qu'après le profilage pour que les changements accélèrent réellement les choses. Je ne peux pas vous dire combien de fois j'ai essayé des «optimisations» codées à la main, mais je me suis rendu compte que l'application avait été ralentie en raison de la manière dont le compilateur avait optimisé le code manuscrit.


-1

La lisibilité est une excuse pour les programmeurs incompétents et paresseux (il en va de même pour la "simplicité" utilisée comme argument pour défendre un algorithme / design de merde)!

Pour chaque problème, vous devez rechercher la solution optimale! Le fait que les ordinateurs soient rapides n’est pas une excuse pour gaspiller des cycles de processeur. La seule contrainte devrait être "le temps de livrer". Notez que "solution optimale" signifie ici celui que VOUS pouvez proposer (nous ne pouvons pas tous proposer la meilleure solution; nous ne disposons pas non plus des compétences / connaissances nécessaires pour les mettre en œuvre).

Comme quelqu'un d'autre l'a mentionné, s'il y a des aspects "difficiles à comprendre" dans une solution, c'est à cela que servent les commentaires. L'ordre "correct, lisible, rapide" (ou quelque chose du genre), dont quelqu'un d'autre a parlé, n'est qu'une perte de temps.

J'ai vraiment du mal à croire qu'il existe des programmeurs qui, lorsqu'ils sont confrontés à un problème, pensent qu'ils se trouvent dans les lignes "... cela doit être fait comme ça, mais je vais faire de cette façon qui est moins efficace mais plus lisible / maintenable et autres telles merde ... ". L'erreur est que le prochain développeur (en voyant les inefficiences) modifiera probablement le code et que le prochain en fera de même, etc. Le résultat final est qu'après quelques versions, le code deviendra ce que l'original développeur aurait dû écrire à la 1ère place. La seule excuse pour le développeur original est un. il / elle n'y a pas pensé (assez bien) et (comme mentionné précédemment) b. contraintes de temps et de ressources.


-2

si diminuer la lisibilité aide la performance / l'optimisation du code (comme dans swfobject et d'autres bibliothèques Js ), il est bon de continuer à écrire du code bien formaté et lisible clairement et de le convertir en illisible / optimisé dans le cadre du processus de "compilation" / release.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.