La simplicité améliore-t-elle toujours la lisibilité?
Je dirais, peut-être avec un peu de controverse, absolument pas .
Vous pourriez me donner une classe avec 200 fonctions membres dans son interface publique, et c'est peut-être l'interface publique la plus lisible humainement. Ce pourrait être une joie de lire nonchalamment ce code et sa documentation. Cependant, je n'appellerais pas cela "simple", car malgré la lisibilité, je devrais m'inquiéter de la façon dont toutes ces fonctions interagissent les unes avec les autres, et potentiellement faire attention aux cas délicats résultant d'une mauvaise utilisation.
Je préférerais une classe avec 20 fonctions membres qui n'étaient pas si faciles à lire à 200 qui le sont, car la "lisibilité" n'est pas la priorité absolue pour moi en termes de prévention des erreurs humaines et d'amélioration de la maintenabilité du code (la facilité avec laquelle on peut le changer, ie).
Cependant, tout cela dépendra de notre définition personnelle de la "simplicité". La «lisibilité» ne varie généralement pas si énormément parmi nous, à moins que quelqu'un ait acquis une telle expertise et une telle fluidité qu'il considère que l'expression régulière est très «lisible», par exemple, en oubliant le reste d'entre nous de simples mortels.
Simplicité
Il fut un temps, il y a longtemps, où je pensais que "simplicty" signifiait "aussi facile à lire que possible". J'écrirais donc du code C avec beaucoup de fonctions pratiques, en essayant d'améliorer la syntaxe et de rendre les choses aussi faciles à lire et à écrire que possible.
En conséquence, j'ai conçu de très grandes bibliothèques riches et de haut niveau, essayant de modéliser une fonction pour chaque pensée humaine naturelle: aides sur aides sur aides, le tout pour façonner le code client selon une syntaxe plus lisible. Le code que j'ai écrit à l'époque était peut-être le plus "lisible", mais il était aussi le plus "incontrôlable" et "complexe".
Zézayer
Pourtant, j'ai eu une brève passion avec LISP vers le milieu des années 90 (retardataire). Cela a changé toute mon idée de la "simplicité".
LISP n'est pas la langue la plus lisible. Espérons que personne ne pense que l'extraction de CDR et de CAR tout en invoquant une fonction récursive avec une cargaison de parenthèses imbriquées est très "lisible".
Néanmoins, après avoir lutté pour que mon cerveau s'enroule autour de la syntaxe étrange du langage et des façons de faire totalement récursives, cela a définitivement changé mon idée de la simplicité.
Ce que j'ai trouvé avec le code que j'ai écrit dans LISP, c'est que je ne faisais plus d'erreurs subtiles, même si la difficulté de penser de cette façon m'a fait faire des erreurs plus flagrantes (mais celles-ci sont faciles à repérer et à corriger). Je ne comprenais pas mal ce que faisait une fonction et je manquais un effet secondaire subtil et imprévu. J'avais juste plus de facilité à faire des changements et à écrire des programmes corrects.
Après LISP, la simplicité est devenue pour moi le minimalisme, la symétrie, la flexibilité, moins d'effets secondaires, des fonctions moins nombreuses mais plus flexibles qui se combinent de manière infinie.
J'ai fini par comprendre que le code le plus fiable de tous est le code qui n'existe pas. Bien qu'il ne s'agisse que d'une mesure brute, j'ai tendance à voir le potentiel de manque de fiabilité du code en fonction de sa quantité. La recherche de la plus grande commodité syntaxique et de la meilleure lisibilité tend à augmenter cette quantité d'un facteur important.
Minimalisme
Avec l'état d'esprit LISP intégré en moi, j'en suis venu à préférer les API minimalistes. Je préférerais une bibliothèque avec moins de fonctions mais plus fiables et flexibles, moins pratiques et plus difficiles à lire qu'une bibliothèque qui offre une multitude d'aides "pratiques" et qui pourraient rendre le code facile à "lire" mais potentiellement trébucher plus de problèmes de manque de fiabilité et de surprises résultant d'une mauvaise compréhension de ce que font ces milliers de fonctions.
sécurité
Une autre chose à propos de LISP était la sécurité. Cela favorisait des effets secondaires minimes et des fonctions pures, et c'est là que je ne me voyais plus commettre d'erreurs subtiles, même si la difficulté de lire et d'écrire dans la langue augmentait les erreurs les plus flagrantes que je pouvais repérer 10 secondes plus tard.
Les fonctions pures et les états immuables m'est devenu préférable chaque fois que je pouvais me le permettre, même si la syntaxe de:
sword = sharpen(sword)
... est un peu moins simple et détaché de la pensée humaine que:
sharpen(sword)
Lisibilité VS. Simplicité
Encore une fois, LISP n'est pas le langage le plus "lisible". Il peut regrouper beaucoup de logique dans une petite section de code (peut-être plus d'une pensée humaine par ligne). J'ai tendance à préférer idéalement une pensée humaine par ligne pour la "lisibilité", mais ce n'est pas nécessairement pour la "simplicité".
Avec ce type de définition de «simple», parfois «simple» pourrait en fait quelque peu rivaliser avec «lisible». Cela considère les choses davantage du point de vue de la conception de l'interface.
Une interface simple signifie que vous devez apprendre beaucoup moins de choses pour l'utiliser, et potentiellement avoir une plus grande fiabilité et moins de problèmes en raison de son minimalisme. Une documentation complète sur le sujet pourrait convenir à un livret plutôt qu'à un volume massif de livres. Néanmoins, cela pourrait nécessiter plus de travail et produire du code moins lisible.
«Simple» pour moi améliore notre capacité à comprendre les fonctionnalités de notre système à un large niveau. «Lisible» pour moi améliore notre capacité à connecter chaque petite ligne de code au langage naturel et à la pensée et pourrait accélérer notre compréhension de ce qu'une seule ligne de code fait, surtout si nous ne parlons pas couramment la langue.
Regex est un exemple de ce que je considère comme "extrêmement simple". C'est "trop simple et trop illisible" à mon goût personnel. Il y a un équilibre pour moi entre ces extrêmes, mais le regex a cette qualité de simplicité LISP telle que je le définis: minimalisme, symétrie, flexibilité incroyable, fiabilité, etc. Le problème pour moi avec le regex est qu'il est si simple qu'il est devenu tellement illisible au point où je ne pense pas que je pourrais jamais le maîtriser (mon cerveau ne fonctionne tout simplement pas de cette façon et j'envie les gens qui peuvent écrire couramment du code regex).
Donc, de toute façon, c'est ma définition de la "simplicité", et elle est complètement indépendante de la "lisibilité" et peut même parfois interférer avec l'autre, conduisant à un équilibre entre une bibliothèque plus "syntaxiquement pratique" et lisible mais plus grande ou une "syntaxiquement" inconvenient ", bibliothèque moins lisible, mais plus petite. J'ai toujours trouvé que les véritables priorités de «commodité de compréhension» et de «maintenabilité» s'alignaient sur ces dernières, avec la forte préférence pour le minimalisme, même à un certain coût pour la lisibilité et la syntaxe humaine plus naturelle (mais pas au point de regex) . YMMV.