January 2010 - Messages

Model Driven Executable
31 January 10 12:22 PM | Nico | 1 comment(s)
Importance des Modèles

Le développement logiciel est complexe. Il mêle plusieurs domaines d'expertise, fonctionnels et techniques, et implique la cohabitation des experts "métiers" et "techniques" sur le projet. Ce ne sont rarement les mêmes, et ils doivent communiquer, échanger, et valider que les informations perçues par les autres sont cohérentes avec leur vision du système. Schématiquement, la MOA définit le besoin à la MOE qui réalise:
 
 
Le recours à des modèles permet l'abstraction d'un certain nombre de concepts, et favorise la communication entre ces différents acteurs. Il est plus facile de se mettre d'accord et de s'assurer que la vision est commune, avec un modèle. Le modèle ne doit ni être trop technique, au risque de ne pas impliquer l'expert métier, ni trop métier, au risque que l'expert technique ne puisse pas le comprendre pour l'implémenter facilement.

En unifiant une vision commune des différentes fonctionnalités et en proposant un langage commun, le modèle permet le rapprochement entre les équipes de développements et les équipes fonctionnelles.
 

Jusque là, tout le monde est d'accord, le modèle est le produit de la phase de conception, indispensable à la mise en oeuvre du Système d'Informations. Finalement, tout le monde fait plus ou moins un modèle avant de commencer à développer.

Le Model-Driven-Architecture

En dématérialisant une partie de la logique de l'application, la tentation est grande de diminuer la rupture de charge entre l'homme et la machine. Moins il y a d'intermédiaire humain entre le concepteur et celui qui réalise, plus il y a de chances que l'application donne satisfaction à l'arrivée. C'est là qu'intervient la génération de code.


Le modèle devient source pour un générateur de code, car l'implémentation du modèle ne présente pas de difficultés, en apparence; reposant essentiellement sur du code technique, sans complexité métier, cette approche présente plusieurs avantages:
  • un alignement meilleur, parce qu'il existe une partie commune entre les machines de la MOA et la MOE.
  • un gain de temps sur le développement, parce que les allers et retours entre une demande de l'utilisateur et sa mise en production sont plus rapide.
  • une meilleure qualité, parce que moins de code écrit par des êtres humains, et donc autant moins de bugs écrits par le développeur

Regardons maintenant d'un peu plus près comment est utilisé le code généré par le modèle dans le développement. Il est clair que le modèle ne suffit pas, le besoin métier atteint un niveau de spécificité tel, qu'il est nécessaire de compléter avec du code dédié à l'application, écrit par le développeur. Ne serait-ce que pour des raisons d'IHM, par exemple, qui est toujours spécifique, le modèle ne peut pas être exhaustif (c'est pourtant le but affiché par quelques initiatives comme Oslo, qui n'a pas abouti à ce jour).

Le générateur de code produit un ensemble de classes et de fonctions, qui sont intégrées dans le projet de développement. Le développeur complète ensuite le développement, avec des compléments sur les classes générées (les classes partielles ont été en grande partie faites pour cela), et du code qui va appeler les fonctions générées. Du code est nécessaire pour réaliser l'interface entre le code métier, le code généré, et le code technique (constitué la plupart du temps par un Framework).


Le problème est que cette approche vieillit très mal. Les frontières entre le code généré et le code écrit sont floues, fluctuantes avec le temps, et la maintenance est difficile. Il y a un risque fort que les 2 mondes ne cohabitent plus dans une version N+1. Une fois que le code a été généré, le lien avec le modèle est rompu. Et une fois que le lien avec le modèle est rompu, le risque que celui-ci ne soit pas mis à jour est élevé, et le bénéfice du modèle est perdu sur le long terme. Il n'est pas rare qu'un modèle soit utilisé pour les premiers cycles de développement et abandonné par la suite, parce que la maintenance du modèle avec le code écrit est devenu trop complexe.

Une autre solution : le Model Driven Executable

Le modèle exécutable constitue une autre approche, qui ne repose pas sur un générateur de code et permet d'allier le meilleur des 2 mondes:
  • Capitaliser sur le modèle pour abstraire et structurer l'essentiel de la conception.
  • Garantir la maintenance du lien entre le modèle et l'application, puisque...
Le modèle est l'application, l'application est le modèle

Microsoft a ouvert la voie avec le DSL, qui est une avancée considérable pour unifier le modèle le code exécuté dans l'environnement de développement. En s'appuyant sur une séparation complète du code technique et du code métier, l'approche Aspectize permet d'étendre le modèle à bien plus de concepts que prévus initialement dans le MDA.
 
Que trouve-t-on dans le modèle ?

  • La logique des données, avec un modèle Entité-Relation, qui va bien au-delà du stockage: règles de validation, champs calculés, données et relations temporaires, le Modèle permet de décrire l'essentiel de la logique de l'application.
  • La configuration de l'application et des services: sécurité, log, trace, gestion d'erreurs, tous les services techniques de l'application sont configurables de façon déclarative.
  • Les liens entre l'IHM, le modèle Entité-Relation et les services configurés: avec un modèle de DataBinding et de CommandBinding, l'ensemble de la cinématique de l'application est décrite et non plus codée.

Que reste-t-il en dehors du modèle ?

  • Le code métier, principalement des règles de validation et des règles de calcul. Il s'agit de service stateless, qui peuvent être appelés sur le client ou sur le serveur. Ce code est dépourvu d'appels à des éléments techniques, il s'agit de code pure.
  • L'IHM, ou plutôt la description visuelle de l'IHM, puisqu'il s'agit, pour une Application Web, de fichier HTML et CSS, purement descriptif, ou de contrôles WinForm, dépourvus de la moindre ligne de code.
Comment interagissent le modèle et le code ?

Le modèle est rendu avec le serveur d'applications, qui contient le code technique, générique qui évolue peu. En s'appuyant sur le princide de Hollywood (qui mérite un post à part entière) on inverse la dépendance entre le code technique et le code métier; ce n'est plus le code métier qui appelle le code technique, mais c'est le code technique, celui du serveur d'applications, qui appelle le code métier et interprète le modèle.
 
 
 
On est ainsi affranchi de tout risque de décalage entre, ce qui serait le code généré dans une solution Model Driven standard (mais qui n'en est pas avec le modèle exécutable), et du code spécifique métier écrit par le développeur. La frontière n'est pas définie dans le code métier, mais elle faite une fois pour toute, dans le code technique. Non seulement, cela permet de garantir l'évolution du Système, avec une meilleure réponse aux changements, car le code métier pourra évoluer plus facilement, mais cela élimine tous les appels techniques qui polluent habituellement le code métier, et celui-ci est beaucoup plus lisible et maintenable.

Unifier le modèle pour la conception, le développement et la documentation

En maintenant le Modèle au niveau du RunTime, cela permet d'avoir une vision commune de l'application tout au long de sa durée de vie. Cela facilite sa maintenance, parce que la cohérence entre le modèle et l'application est constamment garantie. Une évolution du Modèle est immédiatement visible sur l'Application, il n'y a pas de rupture pour réconcilier le modèle avec l'application. Cela permet également de faire vivre l'application avec un modèle incomplet, dès le premier jour du projet.

Cela permet également de modifier des paramètres applicatifs à chaud, en agissant directement sur le modèle. Le modèle est non seulement utile pour la conception et le développement, mais également pour l'administration de l'application en production.

Enfin, parce que la documentation applicative est directement issue du modèle, elle peut être générée à partir du RunTime et reflète exactement le fonctionnel de l'application. En permanence, l'information indispensable contenue dans les modèles est accessible. Cela favorise le turn-over inévitable qui arrive tôt ou tard dans les équipes de développement.
 
Le Model Driven Executable est le chaînon manquant qui fait défaut au Model Driven Architecture. En unifiant modèle de conception et implémentation, il offre de nouvelles perspectives d'agilité et de souplesse. A la place de la génération de code, qui a déjà trouvé ses limites, l'élimination de code est une voie à privilégier pour améliorer considérablement le développement logiciel.