PROGRAMMATION ASCENDANTE
OriginalJanvier 1993
(Cet essai est tiré de l'introduction deOn Lisp.)
C'est un principe de style de programmation de longue date que les éléments fonctionnels d'un programme ne doivent pas être trop volumineux. Si une composante d'un programme dépasse le stade où elle est facilement compréhensible, elle devient une masse de complexité qui dissimule les erreurs aussi facilement qu'une grande ville dissimule les fugitifs. Un tel logiciel sera difficile à lire, difficile à tester et difficile à déboguer.
Conformément à ce principe, un grand programme doit être divisé en morceaux, et plus le programme est grand, plus il doit être divisé. Comment divisez-vous un programme ? L'approche traditionnelle est appelée conception descendante : vous dites "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 suffisamment grande pour faire quelque chose de substantiel, mais suffisamment petite pour être comprise comme une seule unité.
Les programmeurs Lisp expérimentés divisent leurs programmes différemment. 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 ne vous contentez pas d'écrire votre programme vers le bas en direction du langage, vous construisez également le langage vers le haut en direction de votre programme. En écrivant un programme, vous pouvez penser "J'aimerais que Lisp ait tel ou tel opérateur". Alors vous allez l'écrire. 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 tracée et retracée, jusqu'à ce qu'elle finisse par se stabiliser le long des montagnes et des rivières, les frontières naturelles de votre problème. Au final, votre programme ressemblera à si le langage avait été conçu pour lui. Et lorsque le langage et le programme s'adaptent bien l'un à l'autre, vous obtenez un code qui est clair, petit et efficace.
Il est important de souligner que la conception ascendante ne signifie pas simplement écrire le même programme dans un ordre différent. Lorsque vous travaillez de manière ascendante, vous obtenez généralement un programme différent. Au lieu d'un seul programme monolithique, vous obtiendrez un langage plus vaste avec des opérateurs plus abstraits, et un programme plus petit écrit dans celui-ci. Au lieu d'une traverse, vous obtiendrez une arche.
Dans le code typique, une fois que vous avez extrait les parties qui ne sont que de la tenue de livres, ce qui reste est beaucoup plus court ; plus vous construisez le langage, moins vous aurez de distance à parcourir du haut vers le bas pour l'atteindre. Cela présente plusieurs avantages :
En faisant en sorte que le langage fasse plus de travail, la conception ascendante donne 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 à cet endroit. Comme les designers industriels s'efforcent de réduire le nombre de pièces mobiles dans 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 ou plusieurs programmes, de nombreux utilitaires que vous avez écrits pour le premier programme seront également utiles dans les suivants. Une fois que vous avez acquis un large substrat d'utilitaires, écrire un nouveau programme peut ne prendre qu'une fraction de l'effort qu'il faudrait si vous deviez commencer avec du Lisp brut.
La conception ascendante rend les programmes plus faciles à lire.
Un exemple de ce type d'abstraction demande au lecteur de comprendre un opérateur à usage général ; un exemple d'abstraction fonctionnelle demande au lecteur de comprendre une sous-routine à usage spécial. [1]
Parce qu'elle vous incite à toujours être à la recherche de modèles dans votre code, le travail de manière ascendante vous aide à clarifier vos idées sur la conception de votre programme. Si deux composants éloignés d'un programme sont similaires en 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 des langages autres que Lisp. Chaque fois que vous voyez des fonctions de bibliothèque, la conception ascendante est en train de se produire. Cependant, Lisp vous donne des pouvoirs beaucoup plus larges dans ce domaine, et l'augmentation 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 étend les limites de ce qui peut être fait par un petit groupe. Dans Le Mythe du Mois-Homme, Frederick Brooks a proposé que la productivité d'un groupe de programmeurs ne croît pas linéairement avec sa taille. Au fur et à mesure que 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 : au fur et à mesure que 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 tire également parti des techniques que Lisp rend possibles, il peut gagner sans conteste.
Nouveau : Téléchargez On Lisp gratuitement.
[1] "Mais personne ne peut lire le programme sans comprendre tous vos nouveaux utilitaires." Pour voir pourquoi de telles affirmations sont généralement erronées, voir la section 4.8.