| 1 | -*- mode: text; fill-column: 55 -*- |
|---|
| 2 | (utf-8) |
|---|
| 3 | |
|---|
| 4 | * XP et programmation fonctionnelle |
|---|
| 5 | |
|---|
| 6 | XP est applicable et utile quel que soit le langage utilisé. En outre, Le choix du langage dépend de nombreux facteurs (humains, domaine métier, code existant...) autres que ses qualités intrinsÚques. |
|---|
| 7 | |
|---|
| 8 | Cependant, quand c'est possible, choisir un langage puissant et adapté au mode de travail d'XP peut en démultiplier les avantages. |
|---|
| 9 | |
|---|
| 10 | La famille des langages dits "fonctionnels" présente plusieurs caractéristiques les rendant trÚs adaptés à XP et en particulier au TDD. |
|---|
| 11 | |
|---|
| 12 | "Well, there are agile languages and agile methods. When you put the two together you get agile squared." -- Ward Cunningham. |
|---|
| 13 | |
|---|
| 14 | ** Introduction aux langages fonctionnels |
|---|
| 15 | |
|---|
| 16 | Lisp (Common Lisp, Scheme), ML (SML, Ocaml), Haskell, Erlang, Clean... |
|---|
| 17 | |
|---|
| 18 | Ces langages fonctionnels utilisent les fonctions plutÃŽt que les |
|---|
| 19 | objets ou procédures comme briques de base pour la construction de |
|---|
| 20 | programmes. |
|---|
| 21 | |
|---|
| 22 | Leur objectif est de permettre, encourager voire imposer des fonctions sans effets de bord: le résultat en sortie ne dépend que des valeurs en entrée. On ne manipule plus des emplacements en mémoire: on évalue des expressions ne contenant plus que des valeurs et exprimant des relations entre elles. |
|---|
| 23 | |
|---|
| 24 | Pour que ce paradigme soit possible, pragmatique et utile pour la construction de vrais programmes, les langages fonctionnels comportent un sous-ensemble plus ou moins grand des caractéristiques suivantes: |
|---|
| 25 | |
|---|
| 26 | - les fonctions sont des citoyens de premiÚre classe, pouvant être manipulées comme des valeurs (affectées, passées en paramÚtres ou retournées); |
|---|
| 27 | |
|---|
| 28 | - des clÎtures lexicales, fonctions anonymes pouvant être crées à l'exécution, de maniÚre à ce qu'un bloc de code emporte avec lui une partie de son environnement (autres valeurs); |
|---|
| 29 | |
|---|
| 30 | - affectation unique et programmation par cas ("pattern matching") conduisant à un style récursif; |
|---|
| 31 | |
|---|
| 32 | - structures de données natives, notamment les listes; |
|---|
| 33 | |
|---|
| 34 | - constructeur d'ensemble; |
|---|
| 35 | |
|---|
| 36 | - gestion automatique de la memoire (ramasse-miette); |
|---|
| 37 | |
|---|
| 38 | - typage dynamique (ou inférence de type); |
|---|
| 39 | |
|---|
| 40 | - séparation des fonctions et des structures de données. |
|---|
| 41 | |
|---|
| 42 | L'ensemble de tout ça conduit à des programmes réputés: |
|---|
| 43 | |
|---|
| 44 | - courts et concis, |
|---|
| 45 | |
|---|
| 46 | - expressifs, |
|---|
| 47 | |
|---|
| 48 | - corrects et robustes. |
|---|
| 49 | |
|---|
| 50 | Cette derniÚre caractéristique devrait intéresser les développeurs XP, soucieux de qualité, mais dont les tests, s'ils sont omniprésents et considérables par rapport à une culture de développement traditionnelle, sont avant tout des outils de conception et de spécification, et ne sont pas conçus dans un souci d'exhaustivité ou de parade totale face aux facéties des programmes typiques. |
|---|
| 51 | |
|---|
| 52 | Quelques dates: |
|---|
| 53 | |
|---|
| 54 | Lisp: ~1959 |
|---|
| 55 | ML: ~1977 |
|---|
| 56 | Erlang: ~1988 |
|---|
| 57 | Haskell: ~1990 |
|---|
| 58 | |
|---|
| 59 | ** Survol du langage Erlang |
|---|
| 60 | |
|---|
| 61 | Erlang est un langage développé et supporte par Ericsson: |
|---|
| 62 | |
|---|
| 63 | - fonctionnel strict |
|---|
| 64 | - dynamiquement typé |
|---|
| 65 | - programmation par cas |
|---|
| 66 | - valeurs immuables |
|---|
| 67 | - programmation concurrente (parallÚle) a base de processus |
|---|
| 68 | séquentiels communicants |
|---|
| 69 | |
|---|
| 70 | Erlang est compilé en bytecode qui tourne sur une machine virtuelle. Erlang vient avec un 'environnement de dév' complet (compilateur, debugger, profiler), des librairies et diverses applications incluant Mnesia (base de données répartie, un serveur HTTP, un ORB CORBA). |
|---|
| 71 | |
|---|
| 72 | Erlang est développé et supporté par Ericsson ComputerScience lab et est distribué gratuitement sous une licence OpenSource depuis 1998. |
|---|
| 73 | |
|---|
| 74 | Erlang est un langage généraliste mais dont les caractéristiques uniques en termes de programmation concurrente le rende particuliérement adapté au développement de systÚmes distribués (internet), notamment robustes et pseudo-temps-réel (télécommunications, contrÎle-commande...). |
|---|
| 75 | |
|---|
| 76 | ** Testabilité |
|---|
| 77 | |
|---|
| 78 | *** Cf. fp_tdd |
|---|
| 79 | |
|---|
| 80 | *** testabilité des programmes multi-"thread" |
|---|
| 81 | |
|---|
| 82 | Les applications actuelles sont de maniÚre courante maintenant multi-threadées. Les problÚmes surviennent lorsque l'on veut tester ces applications. Le but recherché en utilisant des threads est de lancer des traitements en parallÚle. Ces traitements peuvent être, et le ceux généralement, interdépendant entre eux. Les threads sont gÚrées par le systÚme d'exploitation, leur lancement et leur sequencement ne sont donc pas PRÃDICTIBLES. 99% du temps tout se passera bien, mais en fonction de la charge machine ou d'un autre évenement externe, un 'nouvel' sequement de thread va réveler un bug, soit du à un accÚs concurrent à une variable, soit du à un interblocage. |
|---|
| 83 | Il est trÚs dur de tester le comportement d'un application multi-thread. On peut facilement tester le comportement d'UN thread, et encore au prix d'une mise au point importante (lancement du thread, attente de X secondes ... ), mais lorsque l'application comporte un grand nombre de thread, l'ensemble ne sera jamais testé dans TOUS les cas de figures. |
|---|
| 84 | |
|---|
| 85 | >>> lister les outils, techniques... connues (devpartner?) |
|---|
| 86 | |
|---|
| 87 | Hormis les faiblesses de testabilité, le "multithreading", modÚle de concurrence à mémoire partagée, présente plusieurs faiblesses conceptuelles ou contradictions avec l'objet et/ou XP: |
|---|
| 88 | |
|---|
| 89 | - rendre tout thread-safe? pas YAGNI... mais les modifier aprÚs coup est 1) risqué 2) viole OCP, on est obligé de modifier la classe originale. |
|---|
| 90 | - C/C++: obligation de mettre des objets en portée globale, ou de créer/détruire les "objets actifs" à différents endroits... |
|---|
| 91 | - décourage lâ²encapsulation |
|---|
| 92 | |
|---|
| 93 | Le langage Erlang inclue 'nativement' la notion de 'process'. Les 'process' s'apparentent aux threads dans la mesure où ils permettent dans réaliser des traitements en parallele. Les 'process' erlang, grâce aux propriétés des langages fonctionnels, sont totalement isolés les uns des autres et peuvent uniquement communiquer entre eux que par l'intermédiaire de messages asynchrones. Un process répondant uniquement aux 'excitations' d'un ensemble de messages, ils sont polymorphiques et peuvent être substitués par un nouveau de maniÚre totalement transparent. L'unité de code étant la fonction, different process peuvent partager trÚs facilement différent 'set' de fonctions. |
|---|
| 94 | |
|---|
| 95 | Démontrer sa testabilité |
|---|
| 96 | Un process reçoit et envoie des messages à n'importe qui, par conséquent l'intégration dans un programme de test est simple à réaliser. Un process testé isolement aura de maniÚre certaine le même comportement dans la vraie "vie". |
|---|
| 97 | |
|---|
| 98 | Au pire, un systÚme complexe révÚlera un comportement inattendu en exploitation, en raison du cÎté aléatoire du séquenceur et/ou des charges machine ou réseau. Toutefois, tous les aléas se traduiront au final, pour un process donné, par une séquence de message qu'il suffira de simuler pour reproduire avec certitude le problÚme découvert. |
|---|
| 99 | |
|---|
| 100 | (On peut même tester localement un systÚme multiprocess puis le déployer en distribué, sans changement de comportement). |
|---|
| 101 | |
|---|
| 102 | Exemple? |
|---|
| 103 | |
|---|
| 104 | ** Abstraction, expressivite, DSL |
|---|
| 105 | |
|---|
| 106 | Expressivité: |
|---|
| 107 | concision (typage dynamique, compréhensions, ) |
|---|
| 108 | clarté (referential transparency - pas d'effets de bord) |
|---|
| 109 | pattern matching |
|---|
| 110 | |
|---|
| 111 | Abstraction (équivalent a l'héritage): fonction d'ordre superieur. |
|---|
| 112 | |
|---|
| 113 | DSL: |
|---|
| 114 | |
|---|
| 115 | Externes: fichier de config en langage natif (structures symboliques natives plutÃŽt que XML). |
|---|
| 116 | Internes: pseudo langage spécifique a un besoin, mais qui est en fait code en Erlang... (exemple: parser combinators?) |
|---|
| 117 | Parsers: ... |
|---|
| 118 | |
|---|
| 119 | |
|---|
| 120 | ** Tableau comparatif des langages fonctionnels p/r a XP |
|---|
| 121 | |
|---|
| 122 | (indiquer typage dynamique ou statique) |
|---|
| 123 | |
|---|
| 124 | A FAIRE |
|---|
| 125 | Trouver des exemples de code et montrer leur conception via TDD |
|---|
| 126 | Trouver des façons de faire participer l'auditoire |
|---|
| 127 | - sondage a main levée (qui connaît un langage fonctionnel?) |
|---|
| 128 | - aprÚs un ou deux exemples (avec TDD ping pong) inviter quelqu'un a |
|---|
| 129 | essayer l'exemple suivant? |
|---|
| 130 | |
|---|
| 131 | Vérifier qu'on satisfait les remarques et questions ci-dessous. |
|---|
| 132 | Vérifier que ça tient en 90 minutes. |
|---|
| 133 | |
|---|
| 134 | ** Q&A |
|---|
| 135 | |
|---|
| 136 | *** Bien pour refactoring? |
|---|
| 137 | |
|---|
| 138 | - typage dynamique + filtrage simplifie la plupart des remaniements. |
|---|
| 139 | - les modules sont indépendants |
|---|
| 140 | - transparence référentielle induit une bonne plasticité (structure gigognes plutÎt que graphes complexes). |
|---|
| 141 | - la correction à chaud accélÚre le cycle de remaniement |
|---|
| 142 | - certains refactorings spécifiques à Erlang. |
|---|
| 143 | |
|---|
| 144 | *** Typage statique ou dynamique? |
|---|
| 145 | |
|---|
| 146 | Typage statique utile pour: |
|---|
| 147 | |
|---|
| 148 | 1) documenter |
|---|
| 149 | |
|---|
| 150 | 2) vérifier des choses à la compilation |
|---|
| 151 | |
|---|
| 152 | Or, c'est un moyen imparfait d'atteindre ces deux objectifs. Au contraire, le TDD permet de les atteindre tous les deux, et rend alors superflu le typage statique. |
|---|
| 153 | |
|---|
| 154 | (N.B. typage statique est moins "lourd" dans les langages fonctionnels, car ils font en général de l'inférence). |
|---|
| 155 | |
|---|