Loading...

PROGRAMMATION DE BAS EN HAUT

Original

Janvier 1993

(Cet essai est extrait de l'introduction àOn Lisp.)

C'est un principe de longue date en matière de style de programmation que les éléments fonctionnels d'un programme ne doivent pas être trop grands. Si un composant d'un programme dépasse le stade où il est facilement compréhensible, il devient une masse de complexité qui dissimule les erreurs aussi facilement qu'une grande ville dissimule des 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 diviser un programme ? L'approche traditionnelle s'appelle 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 unité unique.

Les programmeurs Lisp expérimentés divisent leurs programmes différemment. En plus de la conception descendante, ils suivent un principe qui pourrait être appelé conception ascendante : changer le langage pour s'adapter au problème. En Lisp, vous n'écrivez pas simplement votre programme vers le langage, vous construisez également le langage vers votre programme. En écrivant un programme, vous pouvez penser "J'aimerais que Lisp ait tel ou tel opérateur." Alors vous allez et l'écrivez. Par la suite, 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 limite entre le langage et le programme est tracée et retracée, jusqu'à ce qu'elle se stabilise finalement le long des montagnes et des rivières, les frontières naturelles de votre problème. À la fin, votre programme aura l'air comme 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 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 finissez généralement par un programme différent. Au lieu d'un programme unique et monolithique, vous obtiendrez un langage plus large avec des opérateurs plus abstraits, et un programme plus petit écrit dans celui-ci. Au lieu d'un linteau, vous obtiendrez un arc.

Dans un code typique, une fois que vous abstraisez les parties qui ne sont que de la comptabilité, ce qui reste est beaucoup plus court ; plus vous construisez le langage, moins vous aurez à parcourir de distance du haut vers celui-ci. Cela apporte plusieurs avantages :

En faisant en sorte que le langage fasse plus de travail, la conception ascendante produit des programmes qui sont plus petits et plus agiles. Un programme plus court n'a pas besoin d'être divisé en tant de composants, et moins de composants signifie des programmes qui sont plus faciles à lire ou à modifier. Moins de composants signifie également moins de connexions entre les composants, et donc moins de chances d'erreurs à cet endroit. Alors que 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 programmes ou plus, bon nombre des 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 nécessiterait 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'elle vous oblige toujours à être à l'affût des motifs dans votre code, travailler de bas en haut 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 similarité et peut-être à redessiner le programme de manière plus simple.

La conception ascendante est possible dans une certaine mesure dans des langages autres que le Lisp. Chaque fois que vous voyez des fonctions de bibliothèque, la conception ascendante est en cours. Cependant, le 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 le 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 The Mythical Man-Month, Frederick Brooks a proposé que la productivité d'un groupe de programmeurs ne croît pas de manière linéaire avec sa taille. À mesure que la taille du groupe augmente, la productivité des programmeurs individuels diminue. L'expérience de la programmation Lisp suggère une manière plus optimiste de formuler cette loi : à 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 profite également des techniques que le Lisp rend possibles, il peut gagner à coup sûr.

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.