| |
| |
| |
La compatibilité "Model Driven & Agilité" agite la blogosphère depuis quelques temps.
Revenons un instant sur nos arguments en faveur de l'association de ces deux approches.
MDSD, MDA ?
Tout d'abord nous tentons d'expliquer les racines des réticences récurrentes à l'approche Model Driven...
Le Model Driven est quasi-systématiquement assimilé au MDA alors qu'il existe d'autres approches. Nous n'utilisons pas cette approche et nous la critiquons également.
Notre démarche
De notre côté, nous voyons le Model Driven Software Development comme quelque chose de simple et efficace qui s'appuie sur des modèles décrits par des métaphores adaptées aux processus cognitifs de résolution de problèmes (DSL) et des composants tels que des générateurs, transformateurs et vérificateurs, permettant la capitalisation et la généralisation des savoirs-faire.
Notre démarche est basé sur 3 principes :
L'orientation "DSL+générateur sur mesure" est fondamentale et n'a été appliquée que par une minorité de projets. Nous mettons en place ce type de démarche MD depuis une dizaine d'années pour des sociétés du secteur bancaire, aéronautique, hospitalier... Nous appliquons cette démarche pour des développements personnels, avec une démarche itérative et incrémentale en développant conjointement l'application et le générateur.
Conception simple, refactoring, livraisons incrémentales
S'il s'agit de savoir si on peut utiliser une démarche de développement itérative et incrémentale avec du MDSD, la réponse est oui, la seule condition est de disposer d'un générateur qui offre la possibilité de créer autant de "zones manuelles" (zones dans lesquelles du code est écrit à la main) que nécessaire dans les fichiers générés.
Notre approche MDSD est top-down à sens unique, Modèle -> Code; On modifie soit le modèle, soit le générateur (soit les deux)
Un changement d’architecture technique intervient principalement au niveau du générateur
Un changement de type fonctionnel intervient au niveau du modèle ou du code spécifique
Les changements sont facilités, car automatiquement répercutés partout où cela est nécessaire; ex: renommage de classe, déplacement dans un autre paquetage, etc.
Gestion de configuration, chaîne de production et intégration continue
On peut ensuite s'interroger sur la duplication modèle / code : la réponse est "il n'y a pas duplication", pour différentes raisons :
Modèles et génération de code
Le choix du type d'information qu'on met dans les modèles, et le type d'information qu'on met dans les générateurs est de première importance, et l'approche que nous présentons est bien particulière.
Les modèles décrivent les concepts essentiels de l'application à construire, cad que ce sont tout simplement les Métaphores dont parle l'Agilité. Si on développe une application du type "composants MVC distribués" ou une application type SOA, on fait exister les concepts de haut niveau correspondants (objets métiers, contrôleurs, ihms, services, pages jsp, widget...). Le niveau d'abstraction du modèle est plus haut que le code, cad que par exemple, quand on modélise une <<donnée>> (cad UNE boiboite), on génère derrière plusieurs choses (un fichier hibernate, une interface JAVA, un classe d'implémentation, une classe DAO, un fichier de test JUnit, un fichier de properties, etc.). Autrement dit, le mapping technique "j'ai une donnée Facture, je dois mettre en place tous ces fichiers" qu'on faisait avant "à la main et au cerveau" est rentré une fois dans le générateur et réalisé automatiquement (+ sans erreurs, avec du code de qualité, etc... et sur 70% ou + du code). C'est à la fois évidemment :
On se fait souvent tout un monde des métamodèles ou des profils UML, et on considère que développer un générateur relève de la R&D. En fait c'est beaucoup plus simple que ça... Développer un profil ou un métamodèle revient à exprimer clairement et donner vie aux concepts de son architecture logique, et développer un générateur de code est un jeu d'enfant avec un outil comme MIA (www.mia-software.com). On peut toujours générer le code dont on a besoin.
On ne génère pas une conception. On applique des patterns de conception (règles de génération) sur des éléments du Modèle (objets métier, services, ihms...). Évidemment, ça veut dire que le gros du travail de conception technique n'est plus réalisé par tout le monde, mais par les personnes qui vont coder les règles de génération correspondantes dans le générateur. Au final, la conception est à la fois une décision prise par le développeur dans son modèle (qui conçoit une solution pour répondre aux histoires utilisateur en utilisant un vocabulaire technique limité au strict nécessaire), et un mapping de conception codé une fois dans le générateur. Il faut aussi noter que généralement le code généré (une classe java admettons) peut s'appuyer sur du code non généré (frameworks maison, hibernate, spring, etc.).
Cycle de vie
Le cycle de vie agile (type Scrum ou XP) est respecté. Finalement, la nouveauté, c'est seulement qu'au lieu de coder directement dans l'application, on code aussi dans le générateur. Avant on avait une tâche "développer mes fichiers hibernate pour Facture et Ligne de Facture", avec MD on a "développer le template de génération du fichier hibernate pour une donnée"). Ca ne prend guère plus de temps et ça n'impacte pas le cycle de vie.
Outils
On objecte souvent que la dépendance aux outils de modélisation et de génération va à l'encontre de la première valeur agile ("Interaction avec les personnes plutôt que les processus et les outils").
Certes, à ce jour, le panel d'outils disponible pour faire du MDSD est plus restreint que les environnements de développement. Mais quand les solutions outillées sont suffisamment diversifiées, elles ne constituent plus un frein ou une trop forte dépendance.
Nous ne demandons qu'à être pragmatique (nous le sommes déjà !) et ne pas dépendre de la promesse d'outils à venir. Certes nous rencontrons aujourd'hui quelques limites avec les outils existants mais ces restrictions nous semblent largement compensées par les avantages dont nous disposons par ailleurs.
C'est pourquoi aujourd'hui nous sommes bel et bien dans une optique de "consolidation" de notre approche et recherchons des environnements propices à cela et des projets, des personnes intéressées.
Conclusions
En présentant notre vision, nous nous attendions à de vives réactions et réticences. Le sujet divise et l'idée de l'incompatibilité des approches Model Driven et de l'Agilité semble l'emporter. Cependant nous demeurons confiant envers la communauté agile car elle est prompte à accueillir le changement avec bienveillance, à comprendre l'intérêt d'utiliser certaines pratiques MD de façon pragmatique, sans remettre en cause sa philosophie de développement agile préférée.
Il faudrait bien entendu aborder d'autres concepts et pratiques agiles pour poursuivre le débat (TDD, standard de codage...)
C'est justement l'objet de la présentation que nous mettons au point actuellement.
David & Romain
Commentaires
Bonjour, Encore une fois 100%
Bonjour,
Encore une fois 100% d'accord! Non! En fait 90% d'accord. Je m'explique :
Vous dites : "Notre approche MDSD est top-down à sens unique, Modèle -> Code", c'est à mon avis un gros écueil.
Dans notre cas nous privilégions une approche bottom-up. Un exemple : Une équipe projet nous fait la demande d'une nouvelle cible technologique (disons spring) nous créons un prototype fonctionnel (sans MDD) puis nous validons les choix techniques avec les équipes d'ingénierie de dev (quand on ne travaille pas conjointement avec eux au prototype) et enfin nous codons les scripts de génération nécessaire et modifions si nécessaire notre DSL.
Enfin, effectivement un DSL trop bas niveau est inutile. Par exemple aucun des DSL que nous utilisons n'a de notions de domaine métier.
Enfin, il est nécessaire que les tâches de codage de générateur et de codage du projet soit fait par deux équipes distinctes :
- codage du générateur fait par une équipe dédiée et qui assure également le support et la formation.
- codage du projet par une équipe à la configuration non imposée.
On retrouve alors un client et un vendeur, entre lesquels les échanges sont nécessaires et présents dès le prototypage. Le mode de fonctionnement est agile. Et ne nécessite pas de si grosses ressources humaines : nous sommes 5 personnes et supervisons une 10aine de projets de front, et ce depuis plus de 4ans.
Cordialement,
Xavier
(L'auteur de ce mini commentaire : http://davidbrocard.org/?q=node/25#comment-4 )
En fait, on est bien en
En fait, on est bien en phase...! Il est bien nécessaire de prototyper les choses manuellement, comme d'habitude, et quand tout est clair, de répercuter les évolutions sur le DSL et le générateur.
En évoquant le "top down", il s'agissait surtout de dire qu'on ne croit pas aux démarches dans lesquelles les modifications sur le code sont remontées (automatiquement) dans les modèles...
Cordialement,
Romain
Mea culpa!
Effectivement j'avais mal compris!
Cependant je crois que le refactoring du modèle depuis le code est possible. Dans une mesure limitée certes, mais possible. Voire intéressant! En effet, modéliser pour ajouter une pauvre petite opération à une classe, puis regénérer la classe qui va bien, est un processus lourd et est un processus que certains membres d'une équipe de dev ne respecteront pas...
Le résultat de tout cela est l'apparition d'un delta entre le modèle et le code. Ce qui est une chose hyper dangereuse... Modèle et code étant la vision de la même chose dans le MDD, voir un delta revient à avoir des hallucinations :)
Si vous disposez du métamodèle du langage et du métamodèle du langage de modélisation, une petite transfo de modèle fait l'affaire!
Bonne journée,
Xavier