Journal Conception de logiciel et UML

Posté par  .
Étiquettes : aucune
0
24
nov.
2007
On sent venir dans certains domaines de développement informatique la mode du formalisme UML. Le domaine que je connais est l'informatique industrielle (aéronautique, spatial,...), où les logiciels doivent être qualifiés, c'est-à-dire développés selon des méthodes permettant d'avoir un certain niveau de confiance dans le logiciel.

Dans les méthodes habituelles on trouve toujours une étape de conception du logiciel, qui permet de donner une architecture au logiciel en le découpant en briques, chacune en charge de fonctionnalités différentes. Et pour cette étape on utilise de plus en plus les diagrammes de classes UML.

Dans nos développements, nous utilisons un logiciel d'édition de classes UML, qui génère des squelettes de code C++ ou Java. A l'intérieur de ces squelettes nous écrivons le code manuellement, et il faut constamment garder une cohérence parfaite entre les classes UML et le code (cohérence des prototypes de méthodes, etc.). Ce mode de travail a les avantages suivants :
- on a une bonne vision de l'architecture du logiciel grâce à l'organisation en paquetages et aux schémas (les diagrammes de classes)
- on peut générer un document HTML qui permet de visionner cette architecture

Mais cela pose aussi de lourds problèmes d'inertie de développement :
- le logiciel d'édition UML est lourd à utiliser (utilisation mémoire, licence,...)
- impossible de faire des diff entre 2 versions
- changer un prototype de méthode demande d'abord de faire le changement dans le modèle UML, puis regénérer le squelette de code (travail manuel)
- le logiciel UML s'interface mal avec des bibliothèques externes déjà existantes, ce qui ajoute du travail manuel, comme par exemple ouvrir une fenêtre de dialogue pour spécifier un type particulier, ou inclure un fichier header .hpp au bon endroit.
- etc.

Et évidemment ces problèmes d'inertie ont un impact négatif direct sur la qualité du code développé puisqu'à chaque modification de structure de classe, on ne fait pas ce qui serait le mieux, mais ce qui est le plus simple à prendre en compte dans le modèle UML.

Au-delà de ces problèmes de bas-niveau, j'ai constaté qu'UML est un formalisme fourre-tout qui n'est pas spécialement adapté pour faire la conception de logiciels.
- L'exemple le plus évident est le "main" (branche principale d'exécution) : tous les logiciels en ont un, mais en UML non.
- On trouve facilement d'autres exemples, puisque UML est juste un formalisme vague pour faire des schémas, et par exemple des relations d'aggrégations seront interprétées différemment par différentes personnes.

Pour résumer ma pensée, UML est à la mode, on veut l'utiliser absolument, parfois on veut migrer d'anciens formalismes vers UML, mais beaucoup de gens ne se rendent pas compte qu'on y perd en clarté, qualité et efficacité.

En voyant des documentations Doxygen (j'ai vu mais pas utilisé), j'ai pensé qu'on pourrait s'affranchir du logiciel d'édition UML : on taperait tranquillement le code, et ensuite Doxygen (ou autre système similaire) génèrerait les beaux schémas. On gagnerait énormément de temps, on gagnerait en qualité de code, et on aurait d'aussi beaux schémas qu'avec un logiciel UML.

En vue de ces petits inconvénients je fais appel à vos retours d'expérience :
- comment faites-vous votre conception logicielle ?
- quelles sont les limites des systèmes du genre de Doxygen ?
- que pensez-vous d'UML ?
  • # Doxygen n'est pas fait pour la conception

    Posté par  . Évalué à 10.

    Doxygen c'est bien pour documenter le code, pas pour faire de la conception.
    Cependant, faire de l'UML pour la conception c'est bien, mais faire de l'UML pour de la maintenance de code, c'est lourd, comme tu l'as bien exposé.
    Ce que tu devrais faire, c'est utiliser un logiciel UML qui fasse de la rétro-ingienérie de code. Il y en a plein qui font celà, dont le célèbre rational rose. Ce que tu dois faire, c'est faire ton refactoring sur papier en concertation avec l'équipe de dev, ensuite tu modifies directement ton code, et là tu le passe à la moulinette dans ton outils de rétro-ingénierie UML pour garder tes diagrammes à jours. En plus, documente ton code au format doxygen, comme ça tu as à la fois l'UML et la documentation. C'est pourtant simple et logique, non?
  • # main()

    Posté par  . Évalué à 7.

    Pour ce qui est du main, la méthode UML est destinée à modéliser de l'objet, et la méthode main ne s'adapte pas vraiment à ce modèle.
    Ceci dit, si on veut rester à fond dans l'objet, il me semble qu'un main devrait ressembler à :

    int main(int argc,char *argv[])
    {
    MonApplication app;
    app.go/run/main/execute/...(argc,argv);
    }

    C'est en général le genre de code que l'on voit, par exemple, pour des interfaces en Qt.
    Il n'est dans ce cas pas nécessairement critique d'avoir une véritable modélisation de cette méthode ! Ton vrai point d'entrée est alors une méthode de ta classe "principale"...
  • # Quelques vérités sur UML

    Posté par  (site web personnel) . Évalué à 3.

    Utiliser UML n'implique pas forcément d'utiliser un langage objet. Les diagrammes de classes ne sont qu'une partie d'UML (et pas la plus intéressante à mon avis). Les diagrammes de classes utilisés pendant la conception n'ont pas besoin d'être complet, ils peuvent se contenter de mettre en valeur l'architecture du logiciel.

    Pour ce qui est de la génération automatique des diagrammes de classe à partir du code, n'importe quel bon logiciel fait ça (Umbrello, Rationale Rose ...).

    Les parties réellement utiles d'UML pendant la conception AMHA, ce sont les diagrammes permettant d'illustrer les cas d'utilisation, toute la partie fonctionnelle. Utiliser UML pour générer du code est (toujours AMHA) une erreur, car il est beaucoup plus long de faire le diagramme de classes que de l'écrire (seulement le squelette, en laissant les méthodes vides).

    Le rôle d'UML est (encore AMHA) de fournir un moyen de communication entre les utilisateurs (compréhensible facilement lorsque les diagrammes sont bien faits, même sans trop de connaissances), ceux qui font les spécifications, et ceux qui développent.
  • # Mes deux cents (trolls)

    Posté par  . Évalué à 8.

    - comment faites-vous votre conception logicielle ?

    Franchement personne n'a encore la réponse définitive à cette question. Et tant que ca sera le cas on trouvera une clause de non garantie du résultat dans la plupart des licenses de logiciels. Pour le moment cela n'a l'air de déranger personne mais imaginez vous achetez un four à mirco-onde ou une voiture sans garantie de fonctionnement ?

    - quelles sont les limites des systèmes du genre de Doxygen ?

    Si j'ai bien compris tu veux que doxygen te fournisse des schémas. Ca cera forcement limité car dans un schéma l'auteur essayer de communiquer des propriétés importantes en faisant des abstraction du systeme. Il peut aussi ajouter des information qui n'apparaisse pas dans le code.

    - que pensez-vous d'UML ?

    Le grand problème avec cette question c'est que personne n'a la même vision d'UML. En majorité quand quelqu'un dit UML ca veut dire diagrame statique de classe. Or ce diagramme c'est une toute petite portion d'UML.

    En plus c'est uniquement un standard de représentation de bubulles et de fleches mais il n'y marqué nul part quelle est la sémantique de ces choses là. Alors on crois qu'on parle une langue universelle alors que personne ne dit la même chose.

    Bref UML un gros buzzworld pour faire croire qu'on a une méthode de travail dans le logiciel alors que tout le monde continue comme avant. D'ou l'aspect fourre tout de la norme puisque la normalisation ne c'est faite qu'en surface.
    • [^] # Re: Mes deux cents (trolls)

      Posté par  . Évalué à 1.

      L'erreur fondamentale consiste à croire qu'UML est une méthode.

      UML est un langage et rien d'autre. De plus c'est un langage de MODÉLISATION par d'implémentation, on peut toujours le vendre pour ça, mais ça reste faux.

      En amont, et comme pour toute activité d'ingénierie, il faut commencer par définir un processus de développement, puis une méthode pour chacune des activités du processus et enfin un outillage. L'outillage peut être un référentiel de document traditionnels, un modèle ou ce que l'on veut dans la mesure ou il accepté par toutes les parties prenantes.

      Je trouve que l'utilisation d'UML est adapté lors de la phase de capture d'exigences et notamment pour définir et contractualiser le fonctionnel, ou comportemental, du logiciel, particulièrment dans l'embarqué. Cela permet de remettre le logiciel dans son contexte matériel ou système.

      Finalement je te rejoins sur le fait qu'UML est peut être trop généraliste, SysML est sur ce point une avancée intéressante puisque clairement on ne s'oriente plus implémentation (au sens logiciel, c'est à dire codage).
  • # UML oui, génération de code non

    Posté par  (site web personnel) . Évalué à 4.

    Personnellement j'utilise beaucoup UML sur le papier ou avec UMLet http://www.umlet.com/ . Je pense que c'est un bon outil d'analyse et de conception.
    Maintenant toutes les intégrations d'UML avec le code que j'ai essayé (Together, Rational, ...) ne m'ont jamais convaincu:
    - c'est lourd
    - le code généré n'est parfois (voire souvent) pas ce qu'on aurait écrit
    - le travail en équipe n'est pas facilité, intégration avec les outils de versionning assez difficile
    - dur de former les gens
    - et puis quand on doit faire de la mise au point sur sa machine (je travaille en info indus.) et qu'on doit faire vite, c'est quand même plus simple de taper directement dans le code.

    Je pense qu'il faut garder UML comme un outil d'analyse et de communication entre les développeurs. Les outils de génération enlèvent toute la souplesse d'UML.

    Pour la qualité du code, de la doc. et du gain de temps, moi je pense qu'il vaut mieux dépenser son énergie à mettre en place une bonne politique de tests unitaires et d'intégration continue avec des outils comme CruiseControl, xUnit, ... et garder UML pour l'analyse et la doc.
  • # La conception est différente de la réalisation !

    Posté par  (site web personnel) . Évalué à 3.

    Plusieurs remarques, déjà en terme d'outillage, le monde open source fournit des alternatives intéressantes.

    >- le logiciel d'édition UML est lourd à utiliser (utilisation >mémoire, licence,...)
    Le projet Topcased fournit un modeleur UML plus que correct directement au sein d'Eclipse. Cela facilite le passage code/modèle modèle/code car tout est intégré dans le même environnement.

    http://www.topcased.org/

    > - impossible de faire des diff entre 2 versions
    EMF compare permet de le faire directement depuis Eclipse,, qu'elle que soit le type de modèle.

    http://www.eclipse.org/modeling/emft/?project=compare#compar(...)

    > - changer un prototype de méthode demande d'abord de >faire le changement dans le modèle UML, puis regénérer le >squelette de code (travail manuel)

    Des outils comme Acceleo (et plus particulièrement la version pro) permettent de faire ce genre de round-trip : je renomme ma classe générée, l'outil me propose de mettre à jour le modèle et de re-générer.

    >- le logiciel UML s'interface mal avec des bibliothèques >externes déjà existantes, ce qui ajoute du travail manuel, >comme par exemple ouvrir une fenêtre de dialogue pour >spécifier un type particulier, ou inclure un fichier header .hpp >au bon endroit.

    Là le problème est plus lié à l'utilisation d'UML. Le modèle doit rester un modèle de conception et par conséquent abstrait. Tout ce qui est technique est très bien dans le code source mais n'a rien à faire dans le modèle. Ainsi utiliser UML avec un outil de génération qui va faire : "une classe UML" => "une classe CPP" incite à l'utiliser comme cela, mais la plus value est alors quasi-nulle. On pourrait utiliser une retro-ingénierie java vers UML (comme en propose Topcased) ou autre et on a le même résultat : un diagramme représentant le code source. Cela n'aide pas à la compréhension, et le modèle était alors fait de nombreuses classes techniques sa modification est ardue.

    Vive les modèle UML qui restent abstrait, et où chaque élément modélisé provoque la génération de 4 ou 5 fichiers !
    Il y'a plusieurs démonstrations sur le site Acceleo avec des modèles UML dont les éléments sont stéréotypés "métier", "écran" et qui permettent ainsi de générer une architecture de grande qualité pour les frameworks actuels.

    PHP : http://www.acceleo.org/pages/module-uml2-vers-php
    CSharp : http://www.acceleo.org/pages/module-uml-vers-csharp/
    JEE : http://www.acceleo.org/pages/module-uml2-vers-jee-java-strut(...)
  • # Code puis UML

    Posté par  (site web personnel) . Évalué à 2.

    Mon opinion : UML, c'est très bien pour illustrer un article scientifique, un rapport ou une présentation, ou à la rigueur une documentation technique. Mais pour générer du code ou même pour concevoir un logiciel, bof... En fait de mon point de vue, l'UML vient APRÈS le code, et pas avant. C'est un outil de "communication", pas de développement.
    • [^] # Re: Code puis UML

      Posté par  . Évalué à 5.

      De mon point de vue, l'UML vient justement très en amont du code. En particulier, c'est très utile pour identifier des design pattern.
      Combien de briques logiciel j'ai vu, qui tentaient désespérément de régler un problème en laissant la moitié des cas d'utilisation dans un comportement dégradé car le véritables concepts métier n'était pas bien identifiés.
      L'UML, c'est très bien pour abstraire un comportement. Alors si il faut utiliser UML pour tenter de représenter un choix d'implémentation dicté par les disponibilités techniques et les délais au moment du développement du logiciel, c'est sûr que ça va paraître inapproprié.
    • [^] # Re: Code puis UML

      Posté par  . Évalué à 3.

      La, pour le coup je ne vois pas quel intérêt il peut y avoir à utiliser une représentation UML à postériori.

      On peut discuter de ce que concevoir signifie, mais si l'on considère que Spécifier consiste à définir ce que le logiciel doit faire, on peut imaginer que concevoir consiste à définir comment le logiciel va le faire.
      Donc concevoir, pour faire court, c'est poser une hypothèse d'architecture organique et allouer les exigences fonctionnelles, ou les exigences issues de l'architecture fonctionnelle.

      Dans cette activité, les divers diagrammes d'UML permettent de représenter par affinages successifs la construction de cette architecture.
  • # UML ?? bof, des schemas simples au tableau oui

    Posté par  (site web personnel) . Évalué à 9.

    Je trouve que le mieux au boulot, plutot que d'utiliser un soft UML, c'est de tout simplement acheter un enorme tableau veleda, reunir l'equipe dev et faire un brainstorming avec schemas a la clef au tableau.

    Donc tu dessines tes schemas UML au tableau avec toute l'equipe, tu prends une photo du schema et tu l'upload sur ton SVN/CVS.

    Inconvenient: on ne peut pas laisser un schema au tableau car celui-ci est regulierement efface (avantage: refaire le schema au tableau permet de bien voir si l'un des dev de l'equipe a bien tout compris)
    • [^] # Re: UML ?? bof, des schemas simples au tableau oui

      Posté par  . Évalué à 4.

      Ca revient à faire de l'UML au tableau et effectivement c'est mieux (tm) pour toute l'équipe.
    • [^] # Re: UML ?? bof, des schemas simples au tableau oui

      Posté par  . Évalué à 3.

      "Inconvenient: on ne peut pas laisser un schema au tableau car celui-ci est regulierement efface
      POur éviter cela, un simple mot sur le tableau "Prière de ne pas effacer !!!" suffit amplement.
      Et puis sinon, faudrait vérifier le contrat passé avec l'agence d'entretien, mais péter les 2 jambes de la femme de ménage doit sans doute être toléré.




      ====>[]
    • [^] # Re: UML ?? bof, des schemas simples au tableau oui

      Posté par  (site web personnel) . Évalué à 1.

      Inconvenient: on ne peut pas laisser un schema au tableau car celui-ci est regulierement efface (avantage: refaire le schema au tableau permet de bien voir si l'un des dev de l'equipe a bien tout compris)

      Maintenant, il y a ça : http://fr.wikipedia.org/wiki/Tableau_blanc_interactif

      Idéal pour ce genre de chose, mais encore trop cher pour en avoir ailleurs qu'au service commercial...
      • [^] # Re: UML ?? bof, des schemas simples au tableau oui

        Posté par  (site web personnel) . Évalué à 2.

        Autant en rester au Tableau_blanc blanc alors et utiliser les moyens modernes de messagerie instantanée tels que Jabber et des outils de dessin vectoriel comme Inkscape permettant d'avoir au final les docs' collaboratifs disponibles au format électronique sans bouger de son portable...
        cf. http://fr.wikipedia.org/wiki/Tableau_blanc#Tableau_blanc_.C3(...)
        et http://wiki.jabberfr.org/Tableau_blanc liste plus complète de logiciels le gérant.
        • [^] # Re: UML ?? bof, des schemas simples au tableau oui

          Posté par  (site web personnel) . Évalué à 2.

          Ah une epoque, je me suis entete a vouloir garder mon code toujours en exacte synchronisation avec mes diagrammes UML. J'utilisais a l'epoque un soft (visual paradigm) qui me synchronisait les deux. Apres m'etre battu avec les problemes de synchronizations (oooh c'est marrant les corp de ma methode a disparu....) et les soucis de license, j'en suis revenu a la methode ancienne et je trouve ca beaucoup mieux. On a un ptit appareils qu'on branche au coin du tableau blanc et des feutres speciaux qui font que quand on ecrit au tableau ca enregistre sur l'ordi (ca ca a coute $30 je crois). Donc on commence par faire nos schemas au tableau , puis on les remet au propre sur l'ordi avec dia, pis apres on code. Les gros changements d'api se refont au tableau, en reunion et je trouve ca tres bien comme ca :-)
  • # Pas le bon outil ?

    Posté par  (site web personnel) . Évalué à 2.

    Dans le domaine de l'embarqué critique (certifié comme tu l'as précisé) à ma connaissance on utilise très peu l'orienté objet, bien que certains ( Rhapsody http://modeling.telelogic.com/modeling/products/rhapsody/ind(...) ) essayent d'explorer cette voie. En tout cas le "model based design" a le vent en poupe, des trucs comme SCADE ( http://www.esterel-technologies.com/products/scade-suite/ ) sont fréquemments utilisés dans le domaine. L'idée c'est d'aller jusqu' à la génération du code embarqué avec des compilateurs qualifiés. Sans être du fonctionel, le language est purement déclaratif et a toutes les propriétés qui vont bien ( basé sur LUSTRE, il doit y avoir des compilos libres disponibles http://www-verimag.imag.fr/~synchron/index.php?page=lang-des(...) ) pour l'embarqué critique.

    Donc out le formalisme vague d'UML, on peut parler de haut niveau et d'architecture, et dans le même formalisme descendre jusqu'au code embarqué. Les diffs sont gérés au niveau sémantique (pour la notation graphique)

    Pour répondre à tes trois dernières questions:
    >- comment faites-vous votre conception logicielle ?
    J'utilise SCADE pour l'embarqué. ocaml + ocamldoc pour ce qui ne l'est pas.
    >- quelles sont les limites des systèmes du genre de Doxygen ?
    En interne on travaille sur ce type d'outils (ocamldoc), et on retrouve l'idée du "model-based": un seul "document", central, et tout est généré à partir de ça. Dire que ton code commenté comme il faut est le modèle, et générer docs, tracabilité, executable, schémas d'architecture, ça roxe. Attention au problèmes de granularité des fichiers cependant, la gestion de conf peut vite poser problème.
    >- que pensez-vous d'UML ?
    Bullshit ? Non, sans rire, c'est sympa pour s'échanger trois crobards, discuter au tableau et "brainstormer". Les préliminaires quoi. Quand on passe aux choses sérieuses, ça peut encore servir de feuille de route, mais rien de contractuel/officiel. Ensuite en rétro-documentation + retouche manuelle pour avoir quelque chose de présentable, ou pour plonger dans un gros projet qu'on ne connâit pas.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.