Litterate programming 2017

J’ai récemment lu l’article de Donald Knuth sur la programmation lettrée. C’est un de ces paradigmes un peu oubliés, avec pourtant un potentiel très cool.

C’est quoi la programmation lettrée ?

L’idée original de Donald Knuth est d’écrire un programme sous la forme d’un essai en langage naturel, expliquant ce que le programme fait, avec entre les lignes des morceaux de code exécutable.

Le programme est écrit sous la forme d’un essai en langage naturel, avec du code exécutable entre les lignes.

Il est ainsi possible de générer à partir du même fichier une documentation en langue naturelle (par exemple sous la forme d’un fichier latex, html, etc…) et un programme exécutable par une machine.

Vous me direz « c’est javadoc » : Eh bien non !

Les outils de génération auxquels nous sommes habitués permettent de générer une documentation à partir de texte annoté sur la structure du programme. C’est toujours le langage machine qui donne la contrainte de où est placé le texte. On documente une classe ou une fonction.

Avec la programmation lettrée, le texte est au premier plan, et c’est lui qui impose la structure du programme, pas le langage machine.

Avec la programmation lettrée, le texte est au premier plan.

Personnellement je trouve l’idée assez cool. Pour plein de raisons.

Déjà, on ne raconte pas assez nos vies, ou plutôt la vie du projet dans nos programmes. Il est rare que les gens placent le contexte, le pourquoi fonctionnel, politique, historique de tel ou tel morceau de code. Et souvent on se pose des questions longtemps après, même si le code est clair sur ce qu’il fait, sur pourquoi ça a été fait.

Ensuite, écrire du texte en français (ou en anglais, c’est un autre débat) permet de structurer sa pensée. On peut penser à des choses que l’on aurait oublié (pour moi qui suit un intuitif et un éternel distrait c’est intéressant), mieux comprendre un concept, une fonctionnalité, et donc mieux l’implémenter, etc…

Et aussi, j’aime assez tout ce qui s’écarte de l’habituel et permet de voir la programmation autrement. Avouons que le changement est rafraîchissant.

Comme ce paradigme est un peu oublié, il y a peu d’outils à disposition pour en faire, et pas vraiment d’envie de le voir arriver dans les projets (contrairement à la programmation fonctionnelle, qui a le vent en poupe).

Je me suis demandé ce que cela donnerait si on essayait d’appliquer cette idée dans un langage mainstream actuel. Voici un exemple en Java, tiré d’un programme réel, et un peu retravaillé :

Le code complet :

/**
* Interroge le service infos pour récupérer les informations, et les stocke
* dans redis.
* On ne garde que les infos en cours de validité.
*/

public F.Promise<List> poll() {
    // En avril 2016, la direction des renards a demandé à intégrer les
    // informations aviaires à l'application, afin de [...].
    // On commence par récupérer la liste des contenus auprès du service infos.
    return infosClient.getContentList().flatMap((contentList) -> {
        // On a alors une liste d'objets qui contiennent les ids et date
        // de validité des contenus existants.
        List<F.Promise> promises = contentList.stream()
            // On ne conserve que les publications en cours de validité.
            .filter(InfosService::mustBeDisplayedNow)
            // pour chacun des contenus non filtrés, on va chercher le
            // détail (avec le titre, le texte, etc...) en appelant
            // le service infos avec l'identifiant donné dans la liste,
            // et on traduit le résultat dans notre modèle.
            .map((content) -> infosClient
            .getContent(content.getContentId())
            .map(InfosService::convert))
            .collect(Collectors.toList());

        // Note : on va chercher les détails en parrallèle, pour plus d'efficacité.
        return F.Promise.sequence(promises).map((informations) -> {
            // Une fois les contenus récupérés, on les stocke dans redis
            storeInCache(informations);
            // Par commodité, on renvoie les contenus stockés, ce qui permet
            // pour un poll fait à la main de voir ce qui a été stocké.
            return informations;
        });
    });
}

On voit qu’il y a beaucoup de commentaires, qui peuvent parfois paraître un peu redondant avec le code en dessous, mais pas non plus complètement inutiles.

Si on enlève les commentaires qui ne sont pas de la documentation de méthode ça donne :

/**
* Interroge le service infos pour récupérer les informations, et les stocke
* dans redis.
* On ne garde que les infos en cours de validité.
*/

public F.Promise<List> poll() {
    return infosClient.getContentList().flatMap((contentList) -> {
        List<F.Promise> promises = contentList.stream()
            .filter(InfosService::mustBeDisplayedNow)
            .map((content) -&gt; infosClient
            .getContent(content.getContentId())
            .map(InfosService::convert))
            .collect(Collectors.toList());
        return F.Promise.sequence(promises).map((informations) -> {
            storeInCache(informations);
            return informations;
        });
    });
}

C’est le genre de chose qu’on est habitué à voir tous les jours. C’est assez lisible, si on est familier avec la syntaxe du langage et les API du framework play!.

Si on garde seulement les commentaires d’explication inséré au milieu du code ça donne :

En avril 2016, la direction des renards a demandé à intégrer les informations aviaires à l’application, afin de […].
On commence par récupérer la liste des contenus auprès du service infos.
On a alors une liste d’objets qui contiennent les ids et date de validité des contenus existants. On ne conserve que les publications en cours de validité.
Pour chacun des contenus non filtrés, on va chercher le détail (avec le titre, le texte, etc…) en appelant le service infos avec l’identifiant donné dans la liste, et on traduit le résultat dans notre modèle.
Note : on va chercher les détails en parrallèle, pour plus d’efficacité.
Une fois les contenus récupérés, on les stocke dans redis.
Par commodité, on renvoie les contenus stockés, ce qui permet pour un poll fait à la main de voir ce qui a été stocké.

On le voit ce petit texte ne ressemble pas du tout à une description de méthode, et il explique très bien ce que fait le petit bout de programme et pourquoi.

On a donc un essai qui décrit le programme.

Les avantages de cette démarche :

  • Le programme produit est plein d’explications, et donc plus documenté et plus clair.
  • Ecrire le texte permet de penser plus longtemps le programme et aussi un peu différemment, on pense donc à plus de choses, et cela permet d’éviter des oublis, des cas particuliers, etc…
  • Les commentaires ajoutés permettent de donner du contexte, d’expliciter des choses et de justifier des choix techniques, même micros.

Les inconvénients :

  • C’est assez verbeux et un peu redondant.

124 réflexions au sujet de « Litterate programming 2017 »

  1. Ping : Cialis uk

  2. Ping : Viagra 5 mg

  3. Ping : Purchasing cialis on the internet

  4. Ping : Low cost viagra 20mg

  5. Ping : Online cialis

  6. Ping : Cialis daily

  7. Ping : Viagra uk

  8. Ping : Cialis for sale

  9. Ping : Cialis 5 mg

  10. Ping : Cialis 20mg

  11. Ping : writeaessay

  12. Ping : Buy cialis online

  13. Ping : Cialis generic

  14. Ping : Cialis 5 mg

  15. Ping : cialis without a prescription

  16. Ping : Buy cialis

  17. Ping : buy cialis

  18. Ping : buy viagra

  19. Ping : cialis

  20. Ping : viagra

  21. Ping : sildenafil 100mg

  22. Ping : cialis generic

  23. Ping : cialis coupon

  24. Ping : cialis 20mg

  25. Ping : levitra

  26. Ping : generic cialis

  27. Ping : cialis online

  28. Ping : tadalafil 5mg

  29. Ping : tadalafil 20mg

  30. Ping : viagra tablets

  31. Ping : sildenafil

  32. Ping : tadalafil

  33. Ping : cialis dosage

  34. Ping : cialis prices

  35. Ping : cialis tablets

  36. Ping : viagra vs cialis

  37. Ping : generic viagra

  38. Ping : viagra connect

  39. Ping : viagra without doctor prescription

  40. Ping : viagra natural

  41. Ping : cialis vs viagra

  42. Ping : tadalafil 20 mg

  43. Ping : tadalafil generic

  44. Ping : cialis 20 mg

  45. Ping : cialis 5 mg

  46. Ping : cialis pills

  47. Ping : cheap cialis

  48. Ping : cialis coupons

  49. Ping : cialis canada

  50. Ping : sildenafil citrate

  51. Ping : viagra pills

  52. Ping : viagra 100mg

  53. Ping : viagra online

  54. Ping : viagra prices

  55. Ping : viagra generic

  56. Ping : generic viagra 100mg

  57. Ping : viagra coupons

  58. Ping : cheap viagra

  59. Ping : generic viagra available

  60. Ping : buy viagra online

  61. Ping : viagra tablet

  62. Ping : sildenafil 20 mg

  63. Ping : sildenafil 100

  64. Ping : buy biaxin

  65. Ping : buy ceftin

  66. Ping : buy chloromycetin

  67. Ping : buy biaxin online

  68. Ping : buy ceftin online

  69. Ping : chloromycetin

  70. Ping : buy cordarone

  71. Ping : cialis 20mg generic

  72. Ping : generic cialis 20mg

  73. Ping : generic cialis available

  74. Ping : generic cialis tadalafil

  75. Ping : female viagra

  76. Ping : sildenafil tablets

  77. Ping : prednisone 20 mg

  78. Ping : buy sildenafil

  79. Ping : sildenafil generic

  80. Ping : viagra doctor prescription

  81. Ping : sildenafil 50 mg

  82. Ping : sildenafil coupons

  83. Ping : sildenafil 100 mg

  84. Ping : sildenafil citrate 100mg

  85. Ping : buy cialis online

  86. Ping : cialis tadalafil

  87. Ping : sildenafil citrate tablets

  88. Ping : sildenafil citrate pricing

  89. Ping : fluoxetine 20 mg

  90. Ping : prozac generic

  91. Ping : bactrim ds

  92. Ping : biaxin antibiotic

  93. Ping : ceftin antibiotic

  94. Ping : cephalexin 500mg

  95. Ping : ciprofloxacin 500mg

  96. Ping : fluconazole 150 mg

  97. Ping : levofloxacin 500 mg

  98. Ping : cefdinir 300 mg

  99. Ping : bactrim antibiotic

  100. Ping : azithromycin 250 mg

  101. Ping : baclofen

  102. Ping : 100mg viagra without a doctor prescription

  103. Ping : natural viagra

  104. Ping : viagra on line

  105. Ping : over the counter viagra

  106. Ping : female viagra pills

  107. Ping : viagra for men

  108. Ping : viagra without a doctor prescription

  109. Ping : viagra without a doctor prescription usa

  110. Ping : viagra medicine online order

  111. Ping : viagra without doctor prescription usa

  112. Ping : cialis generico

  113. Ping : cialis generika

  114. Ping : tadalafila

  115. Ping : using amitriptyline to treat ibs

  116. Ping : how to order baclofen suspension in usa

  117. Ping : long term use of escitalopram

  118. Ping : prednisone and caffeine interaction

  119. Ping : buy viagra usa

  120. Ping : canada medication

  121. Ping : Viagra online

  122. Ping : Viagra for sale

  123. Ping : Cheap viagra

  124. Ping : Viagra vs cialis vs levitra

Les commentaires sont fermés.