Loading...

PROGRAMMATION ASCENDANTE

Original

Janvier 1993

(Cet essai est tiré de l'introduction de On Lisp .)

C'est un principe de longue date du style de programmation que les éléments fonctionnels d'un programme ne doivent pas être trop volumineux. Si un composant d'un programme dépasse le stade où il est facilement compréhensible, il devient une masse de complexité qui cache des erreurs aussi facilement qu'une grande ville cache des fugitifs. Un tel logiciel sera difficile à lire, difficile à tester et difficile à déboguer.

Conformément à ce principe, un programme volumineux doit être divisé en plusieurs parties, et plus le programme est volumineux, plus il doit être divisé. Comment divise-t-on un programme ? L'approche traditionnelle est appelée conception descendante : on dit « le but du programme est de faire ces sept choses, donc je le divise en sept sous-routines principales. La première sous-routine doit faire ces quatre choses, donc elle aura à son tour quatre de ses propres sous-routines », et ainsi de suite. Ce processus se poursuit jusqu'à ce que l'ensemble du programme ait le bon niveau de granularité, chaque partie étant suffisamment grande pour faire quelque chose de substantiel, mais suffisamment petite pour être comprise comme une seule unité.

Les programmeurs expérimentés de Lisp divisent leurs programmes de manière différente. En plus de la conception descendante, ils suivent un principe que l'on pourrait appeler conception ascendante : changer le langage pour l'adapter au problème. En Lisp, vous n'écrivez pas simplement votre programme vers le bas en fonction du langage, vous construisez également le langage vers le haut en fonction de votre programme. Lorsque vous écrivez un programme, vous pouvez penser : « J'aimerais que Lisp ait tel ou tel opérateur. » Vous l'écrivez donc. Ensuite, vous réalisez que l'utilisation du nouvel opérateur simplifierait la conception d'une autre partie du programme, et ainsi de suite. Le langage et le programme évoluent ensemble. Comme la frontière entre deux États en guerre, la frontière entre le langage et le programme est dessinée et redessinée, jusqu'à ce qu'elle finisse par se poser le long des montagnes et des rivières, les frontières naturelles de votre problème. Au final, votre programme aura l'air d'avoir été conçu pour lui par le langage. Et lorsque le langage et le programme s'accordent bien, vous obtenez un code clair, court et efficace.

Il convient de souligner que la conception ascendante ne signifie pas simplement écrire le même programme dans un ordre différent. Lorsque vous travaillez de bas en haut, vous vous retrouvez généralement avec un programme différent. Au lieu d'un programme unique et monolithique, vous obtiendrez un langage plus vaste avec des opérateurs plus abstraits et un programme plus petit écrit dedans. Au lieu d'un linteau, vous obtiendrez une arche.

Dans un code classique, une fois que vous avez fait abstraction des parties qui ne sont que de la comptabilité, ce qui reste est beaucoup plus court ; plus vous construisez le langage, moins vous aurez de distance à parcourir pour y parvenir. Cela présente plusieurs avantages :

En faisant travailler davantage le langage, la conception ascendante produit des programmes plus petits et plus agiles. Un programme plus court n'a pas besoin d'être divisé en autant de composants, et moins de composants signifie des programmes plus faciles à lire ou à modifier. Moins de composants signifie également moins de connexions entre les composants, et donc moins de risques d'erreurs. Alors que les concepteurs industriels s'efforcent de réduire le nombre de pièces mobiles d'une machine, les programmeurs Lisp expérimentés utilisent la conception ascendante pour réduire la taille et la complexité de leurs programmes.

La conception ascendante favorise la réutilisation du code. Lorsque vous écrivez deux programmes ou plus, de nombreux utilitaires que vous avez écrits pour le premier programme seront également utiles dans les programmes suivants. Une fois que vous avez acquis un large substrat d'utilitaires, l'écriture d'un nouveau programme peut ne nécessiter qu'une fraction de l'effort qu'il faudrait fournir si vous deviez commencer avec du Lisp brut.

La conception ascendante rend les programmes plus faciles à lire.

Une instance de ce type d’abstraction demande au lecteur de comprendre un opérateur à usage général ; une instance d’abstraction fonctionnelle demande au lecteur de comprendre une sous-routine à usage spécial. [1]

Parce qu'il vous oblige à toujours être à l'affût de modèles dans votre code, travailler de bas en haut vous aide à clarifier vos idées sur la conception de votre programme. Si deux composants distants d'un programme sont similaires dans leur forme, vous serez amené à remarquer la similitude et peut-être à repenser le programme de manière plus simple.

La conception ascendante est possible dans une certaine mesure dans d'autres langages que Lisp. Chaque fois que vous voyez des fonctions de bibliothèque, il s'agit d'une conception ascendante. Cependant, Lisp vous donne des pouvoirs beaucoup plus étendus dans ce domaine, et l'amélioration du langage joue un rôle proportionnellement plus important dans le style Lisp, à tel point que Lisp n'est pas seulement un langage différent, mais une toute autre façon de programmer.

Il est vrai que ce style de développement est mieux adapté aux programmes qui peuvent être écrits par de petits groupes. Cependant, en même temps, il repousse les limites de ce qui peut être fait par un petit groupe. Dans The Mythical Man-Month , Frederick Brooks a avancé que la productivité d'un groupe de programmeurs ne croît pas linéairement avec sa taille. Lorsque la taille du groupe augmente, la productivité des programmeurs individuels diminue. L'expérience de la programmation Lisp suggère une façon plus joyeuse de formuler cette loi : lorsque la taille du groupe diminue, la productivité des programmeurs individuels augmente. Un petit groupe gagne, relativement parlant, simplement parce qu'il est plus petit. Lorsqu'un petit groupe profite également des techniques rendues possibles par Lisp, il peut gagner haut la main .

Nouveau : Télécharger On Lisp gratuitement .

[1] « Mais personne ne peut lire le programme sans comprendre tous vos nouveaux utilitaires. » Pour comprendre pourquoi de telles déclarations sont généralement erronées, voir la section 4.8.