les décorateurs, ou pourquoi j'aime toujours la programmation

Je programme des ordinateurs depuis 30 ans, et tous les 5 ans environ je me demande pourquoi je continue à aimer ça. Et à chaque fois je découvre quelque chose qui provoque un "éclair haha", une de ces illuminations cérébrales où l'on entrevoit le Génie dans toute sa Pureté avant de retomber sur sa chaise motivé pour les 5 ans suivants.

Le dernier a été provoqué cette semaine par les "décorateurs" de Python, dont je vous parlerai plus bas.

Ma première extase informatique date donc de 1980 environ, je m'en souviens comme si c'était hier. Mon PET 2001 se programmait en BASIC, un langage qu'on a bien fait d'oublier. Mais une astuce (ou plutôt une horreur) sur le PET permettait de faire en sorte que le programme s'ajoute des lignes de programme à lui-même ! J'avais ainsi modifié le jeu "animals" de Creative Computing pour qu'il "apprenne" de nouveaux animaux de façon permanente. Un programme qui s'améliore lui-même, ça me fait encore rêver, 30 ans après...

Le second flash date de 1985, la grande époque de Turbo-Pascal. Un jour j'ai vu quelque chose comme ça:

function factorielle(n: integer): integer;
begin
    if n <= 1 then result := 1 else result := n*factorielle(n-1);
end;

Une fonction qui s'appelle elle même ! Merveilleuse récursivité, chaque fois que je te revois, je me rappelle mon émoi à notre première rencontre.

Les années 1990 sont riches en "haha"s plus rapprochés mais moins intenses pendant mes études à l'EPFL : la programmation fonctionnelle (LISP), le moteur d'inférence de Prolog,  la généricité en d'ADA, qui semblait à l'époque bien plus importante que la programmation orientée objet, juste entrevue.  Et Occam, précurseur de la programmation parallèle trop tôt disparu.

Un peu avant 1995, je découvre LabView et le flash se produit lorsque je comprends que c'est un véritable langage de programmation complet... sans code ! Ou plus exactement que le langage graphique de LabView permet de programmer directement au niveau sémantique. Adieu "syntax error" ! Quel dommage que NI vende cette merveille si cher et l'aie blindé de brevets défendus avec vigueur : un des concepts les plus innovants en programmation reste confiné à un cercle d'initiés alors qu'il aurait pu révolutionner l'informatique.

un programme LabView avec blocs concurrents, boucles, tests etc.

Vers 2000, je constate qu'on m'avait menti : C++ est beaucoup plus qu'un C amélioré. C'est un grand festival de "haha" en quelques jours : les références, la const-correctness, l'héritage multiple, la surcharge des opérateurs, les exceptions , le RTTI, mais surtout la Standard Template Library(STL). Java et .NET ont des librairies de classes et fonctions à tout faire, mais C++ a une "méta-librairie", un système qui produit du code très optimisé pour chaque opération spécifique, en utilisant notamment le concept d'itérateur.

En 2005, je lis Andrei Alexandrescu "Modern C++ Design: Generic Programming and Design Patterns Applied" (2001) Addison-Wesley Professional ISBN:9780201704310 WorldCat Goodreads Google Books  . Flash d'illumination : c'est génial, mais j'ai pas tout compris. Je le relis: re-flash: c'est encore plus génial que je pensais. Je le lis une troisième fois (à part "Les Robots" d'Asimov je n'ai jamais lu un livre 3 fois) : ça y'est je suis converti au "policy based design", une approche révolutionnaire de la programmation autorisée par une exploitation transcendantale de la combinaison C++, STL, et #macros. Les C++istes trouveront un petit tutoriel ici qui les convaincra à la fois de la puissance de cette approche, et de sa lourdeur d'écriture...

Et nous voici donc en 2010 où, poursuivant ma découverte de Python, je tombe sur ça:

@cache()
def fib(n):
    if n &lt; 2:
      return 1
    return fib(n-1) + fib(n-2)

Même ceux qui ne parlent pas Python reconnaîtront une fonction récursive calculant le n-ième terme de la suite de Fibonacci, mais il y a une astuce : le @cache().

Ca s'appelle un "décorateur" et en l’occurrence, le @cache() ajoute un comportement de "mémoization" (déjà mentionné ici) à la fonction : si on appelle la fonction fib pour un n déjà calculé précédemment, le @cache() va renvoyer le résultat mémorisé avec un gain de vitesse appréciable plutôt que de recalculer la fonction, et ceci sans rien changer à la fonction elle-même!

Et bien sur, le décorateur est lui-même écrit en Python : c'est , et c'est une version simplifiée d'un cache plus sophistiqué fourni avec la librairie Python. Une librairie de décorateurs très variés est en train de naître (voyez par exemple les machines d'états, chers collègues...), mais il me semble que les décorateurs permettent surtout de réaliser des choses ressemblant beaucoup aux "politiques" d'Alexandrescu avec une syntaxe plus simple qu'en C++. (Pythonistes, voyez ce tutoriel)

C'est pour cela que j'aime toujours la programmation : les langages gagnent en pouvoir d'abstraction en même temps que moi, et vice-versa. Chaque fois que je programme dans un nouveau langage, tout est plus simple, plus clair et plus vite juste que dans le précédent, et, luxe suprême,  je dois presser moins de touches. Les ordinateurs sont restés des esclaves qui camouflent leur stupidité derrière une vitesse stupéfiante, mais les concepteurs de langages, eux sont devenus vraiment malins. Merci Guido, grâce à toi j'en reprends pour 5 ans.

Comment | , , . permalink.
  • Culand

    Bravo pour ce stupéfiant et brillant résumé de nos 30 dernière années de passion informatique…

    Puisse nonobstant ce qui sera lu comme un charabia++ toucher un tant soit peu le profane qui tomberait sur ces lignes !

    J’ai bien pour qu’au contraire il nous perçoive, toi, moi, et nos semblables, comme des grands malades…

    Aujourd’hui on dit geeks…

    Combien de fois ne me suis-je senti incompris et surtout impuissant en rentrant chez les miens incapable de leur faire saisir et partager tout ce qui faisait mon passionnel bonheur d’informaticien touché par la grâce d’un nouveau paradigme de programmation…

  • Guillaume

    J’ai eu le même flash concernant Modern C++ Design et la même réaction -> relecture !

    Allez, encore un flash sur C++ ? allez donc voir ce qu’on peut faire avec l’idiome SFINAE, ça vaut son pesant de cacahuètes !

    Sinon pour le cas présent en plus propre (mais ça n’a pas la portée de ce que permet les décorateurs de python) Y’a gcc qui offre un attribute particulier :

    long fib(long) __attribute__((pure));

    c’est vraiment une chouette activité la programmation, intellectuellement y’a pas plus complet je pense !

    • http://drgoulu.com Dr. Goulu

      Ah oui, j’ai vu « substitution failure is not an error » une fois, mais je n’y ai pas trop réfléchi… A l’époque, la librairie Boost en était à ses débuts, là je vois « enable_if » pour la première fois et on dirait effectivement que Boost est devenue une super extension Alexandrecu-ifiée de la STL… intéressant… très intéressant…

      Bon, quelqu’un connait un vrai beau projet en C++ qui tire vraiment parti de ces idiomes ? Ca m’intéresse de m’y replonger…

  • http://nauticaerium.blogspot.com/ Guy Capra (Alomphega)

    J’aime beaucoup votre néologisme « éclair haha ».
    Dans un autre domaine beaucoup moins savant mais pourtant tout aussi abstrait, je ressens ce qui pourrait s’y apparenter dans une sorte de « flash inventif », c’est-à-dire quand une idée qui trottait floue dans mes rêves prend soudain forme lisible sous l’éclairage de ma propre compréhension. Bref c’est chouette tout ça ! ;o)

    • http://drgoulu.com Dr. Goulu

      merci, mais ce n’est pas de moi : « Haha » ou l’éclair de la compréhension mathématique est le titre d’un livre du regretté Martin Gardner. Mais on parle bien de la même chose :-)

      Un pote m’a dit une fois qu’on peut ressentir ça à volonté prenant du LSD. Je lui ai répondu « peut-être, mais on a moins de mérite »…

      • http://nauticaerium.blogspot.com/ Guy Capra (Alomphega)

        :-)
        Nous ne sommes pas sur facebook, donc il n’y a pas de bouton « j’aime » sous la citation de la réponse à votre copain, mais nous sommes bien d’accord et je n’en pense pas moins ;-)

      • Benoît

        J’ai adoré ce livre. Mais je n’ai pas trouvé la réponse à certaines énigmes.

        C’était dans ma jeunesse. Je vais essayer de le retrouver grace à votre pointeur.

  • hyperbate

    J’aime bien ce texte. Je remarque que je manque de courage pour découvrir de nouveaux paradigmes, de nouveaux langages,… Pour la programmation « par icônes », il existe des systèmes dans le multimédia (avant tout destinés à gérer des entrées/sorties) : IconAuthor (mort), MaxMSP ou encore PureData.

  • http://www.courtois.cc/blogeclectique/ Krysztof von Murphy

    Bien résumé !

    Le @cache m’a moins impressionné, car j’avais déjà vu la même chose en PL/SQL (langage pas très sexy mais bien fichu pour développer la base de données d’Oracle). C’est tout con quand on y pense.

  • http://www.sirtin.fr/ Sirtin

    J’ai rien compris, c’est normal docteur ? :D

    Sinon, je comprends aussi la frustration en ce qui concerne les sciences auprès de mes proches.

  • http://jeanmichel.gens.free.fr jean-michel

    houla on voit l’étoffe d’un touche à tout comme je les aime. j’ai un parcours plus modeste mais avec beaucoup de langages aussi

  • http://sciencetonnante.wordpress.com DavidL

    Bouh tout ça me rend un peu triste…
    je me souviens qu’il y a un an quand j’ai changé de job, je me suis dit la veille que c’était certainement la dernière fois de ma vie que je programmais…

    J’ai eu la tentation d’apprendre Pyhton et j’ai renoncé en me disant qu’il était trop tard pour moi…votre évocation de Modern C++ me fait le même effet ! bouh moi aussi j’aime toujours la programmation!!!

    • http://drgoulu.com Dr. Goulu

      faut pas renoncer à un plaisir parce que vous ne le pratiquez plus professionnellement, voyons !
      Un moyen très efficace de se frictionner les neurones tout en apprenant un nouveau langage comme Python, c’est le « Project Euler« . Une fois que vous avez trouvé une solution que vous trouvez acceptable à un problème, vous verrez les solutions 10’000x plus efficaces proposées par d’autres en divers langage, ça permet de progresser vraiment vite.

  • http://tykay.free.fr tykayn

    c’est sûr que y’a plein de choses intéressantes là dedans et qu’une fois qu’on pourra diriger les machines par la pensée on pourra se voir trouver des réponses à nos pensées par des machines.
    pour le moment je gère quelques trucs pour le web, le php, le sql, le css et le html, le Js et tous ces langages promettent de donner des choses encore passionantes :) je vais voir un peu ces liens

  • http://progmod.org Poulet

    Et pourtant, il vous reste tellement de choses à découvrir (tout comme à moi, et à chacun d’entre nous) !

    Pour la suite, puis-je vous suggérer les langages fonctionnels, tel Haskell ? Les assistants de preuve comme Coq ? Et pourquoi pas des domaines inexplorés, comme l’écriture d’un petit compilateur pour votre propre langage ?

    Quant à moi, je pense qu’il est grand temps que j’aille lire le Modern C++.

  • http://www.facebook.com/diane.cairn Diane Cairn

    oh ça donne envie, là je viens de mettre 14 ans de post-production au placard pour me lancer dans la grande aventure programmation plutôt web mais pas que, au menu des cours : html/css/javascript puis le binome php/sql suivi de java/objective-c … j’ai 18 mois de recablage du cerveau à faire ça va être amusant… à ce propos est-ce que ceci vous semble pertinent ?
    http://courses.cs.vt.edu/csonline/Algorithms/Lessons/index.html

    • http://drgoulu.com Dr. Goulu

      Bravo Diane, et bienvenue sur ce blog où je vois que vous êtes d’emblée très actif(ve?) (merci !)
      Tous mes encouragements vous accompagnent, d’une part parce que la programmation c’est génial, vous verrez, et d’autre part car tout apprentissage demande efforts et persévérance. Mais pour une personne visiblement curieuse et rationnelle comme vous, ça ne devrait pas poser de problème particulier.

      Quelques conseils très personnels:

      1. imprégniez vous des perlisismes. Ils composent à la fois le zen et le décalogue de la programmation, mais vous ne vous en apercevrez qu’avec le temps. Au début, ils sont juste drôles.
      2. La programmation est devenue un domaine immense, et même si j’ai suivi plutôt la voie « algorithmique » (ingénieur oblige), je ne suis pas sur que ce soit forcément la meilleure approche pour la programmation web, qui est plutôt « évènementielle« . Donc même si le cours d’introduction que vous linkez me parait a priori bien fait, j’aurais plutôt tendance à vous aiguiller vers http://www.siteduzero.com/ par exemple, qui contient une ribambelle de tutoriels bien faits, de niveaux progressifs et permettant de …
      3. … faire vous mêmes des programmes rapidement. Car c’est en programmant qu’on devient programmeur, en développant qu’on devient développeur, en testant qu’on devient testeur et en déboguant qu’on devient débogueur. Alors qu’en lisant des cours, on devient lecteur… Faites des trucs. Rien qu’afficher « Hello World » sur une page web (en PHP…) est déjà une victoire. Et ensuite ajouter un formulaire qui demande votre nom puis affiche « Hello Diane » sera une seconde victoire. etc.
      4. Mais ensuite, avant de vous lancer dans un gros programme compliqué, passez beaucoup de temps à chercher des librairies, bouts de codes et autres modules déjà existants qui pourraient faire une partie du job, à regarder comment ils sont faits (avantage de l’open source) et à choisir ceux qui vous demanderont le moins de programmation possible. Partez du principe que tout existe déjà, quelque part. Perso je compte qu’un jour de recherche, d’analyse ou de conception économise une semaine de programmation.

      Tenez nous au courant de vos progrès.

      • http://www.facebook.com/diane.cairn Diane Cairn

        Sans rien y connaître j’ai suivi une formation de 2 semaines en php/sql où le prérequis était de connaître l’html et le css. Je n’ai jamais fait que lire le html/css des autres et y prendre ce que j’avais besoin sans forcément tout comprendre… et ma foi après deux semaines intensives nous avons réussis à créer des tables, à y faire appel, et à créer un miniblog avec gestion utilisateur, insertion de billet et ien toutnterface de tri. Celq a été un peu rock’n’roll mais très enrichissant. Merci pour les liens.

        Finalement j’ai compris la blague/leçon de 42 dans le guide galactique, vous savez ce super ordinateur à qui on demande la réponse ultime, qui répond 42 et pour comprendre la réponse on lance un autre ordi pour trouver la question. Après avoir passé ces 2 semaines, ça m’a semblé clair, comme décomposer des problèmes simples pour nous en suites logiques conditionnelles, bref les algorithmes.

        Et comme c’est fêtes, un moment détente.
        http://lesjoiesducode.tumblr.com/