Pourquoi est-il inapproprié d'utiliser des diagrammes UML pour planifier la façon dont votre code sera organisé?

9

Donc, oui, les diagrammes peuvent parfois être inappropriés. Quand sont-ils inappropriés? Lorsque vous les créez sans code pour les valider, puis que vous souhaitez les suivre. Il n'y a rien de mal à dessiner un diagramme pour explorer une idée.

Développement de logiciels agiles: principes, modèles et pratiques - Robert C. Martin

Que veut-il dire exactement par là? L'UML n'est-il pas conçu pour vous aider à planifier la structure de votre code avant de vous lancer ? Quel est l'intérêt de l'utiliser si vous ne suivez pas les diagrammes que vous avez créés?

Contexte: Dans ce chapitre, Oncle Bob crée un diagramme UML pour le Score Keeper d'un jeu de bowling. Il développe ensuite le programme de manière pilotée par les tests, sans consulter le diagramme UML. Le programme résultant ne ressemble en rien au diagramme UML, et l'oncle Bob arrive à la conclusion citée ci-dessus.

q126y
la source
4
Le point de l'oncle Bob est que l'architecture qui émerge du développement piloté par les tests peut différer radicalement du diagramme UML.
Robert Harvey
1
Lire aussi le design est-il mort? Par Martin Fowler pour une discussion équilibrée sur ce sujet et le mouvement agile
Eliezer Steinbock
4
Vote en faveur de cette question en réponse à un mauvais jugement de la part de @RobertHarvey et al en votant pour clore ce qui est une question importante et utile.
David Arno
3
@DavidArno Si vous avez des opinions bien arrêtées sur ce qui devrait ou ne devrait pas être fermé, je vous encourage fortement à vous impliquer dans les discussions sur notre méta-site. Tous ceux qui y postent actuellement (y compris moi) relèvent probablement de "@RobertHarvey et al", à l'exception de quelques employés de SE, et nous craignons qu'un autre point de vue ne soit pas représenté, mais jusqu'à présent, personne ne s'est jamais présenté pour le représenter. .
Ixrec
1
@Ixrec, je ne me suis jamais impliqué dans des méta-discussions auparavant, sauf une fois pour vérifier si je pouvais faire référence à mes propres bibliothèques open source dans les réponses (la réponse à cela était que je pouvais). Je devrais peut-être suivre votre avis et m'impliquer davantage. Merci pour la suggestion.
David Arno

Réponses:

19

Pour bien expliquer cela, nous avons besoin d'une courte leçon d'histoire. Aux débuts du génie logiciel, une analogie souvent utilisée était la construction d'une maison. Un architecte et un ingénieur en structure discutent des plans avec un client et élaborent une conception. Les constructeurs suivent ensuite cette conception pour construire la maison réelle. L'écriture de code était considérée comme l'équivalent de la construction de la maison actuelle. Ainsi, il y avait un besoin perçu de conception initiale avant que cette construction puisse avoir lieu. Divers outils de conception graphique ont été créés, dont UML en fait partie.

L'idée à l'origine avec UML était que l'on concevrait entièrement un système avec UML, puis le confierait aux codeurs pour traduire cette conception en code. En réalité, cela ne fonctionne tout simplement pas et a conduit à des années de programmeurs considérés comme des «exécutants» plutôt que des «concepteurs», les projets étant en retard, les conceptions devant constamment changer après qu'elles étaient censées être terminées, etc.

La raison est simple. Le codage, c'est le design . Avec l'analogie de la maison, le code est les dessins de l'architecte. Le compilateur est le constructeur qui prend ces conceptions et construit un programme à partir d'eux. Cette réalisation a ensuite conduit à la naissance de techniques agiles, TDD etc.: des outils pour améliorer la qualité de la conception de ce code.

Tout comme un architecte peut produire des croquis préliminaires pour l'aider, elle et son équipe, à visualiser la conception globale, un développeur peut utiliser UML ou d'autres outils pour aider à visualiser la conception nécessaire. Tout comme ces esquisses ne sont pas suivies aveuglément, l'UML ne doit pas être suivi aveuglément. La conception du code devrait évoluer à partir d'itérations agiles et à l'aide de TDD. De même, tout comme un architecte peut construire un modèle de maison pour l'aider, elle et son équipe, à visualiser les dessins, UML peut être utilisé pour aider à visualiser la structure du code.

Comme le dit l'oncle Bob, vous ne pouvez pas valider l'UML, vous pouvez uniquement valider le code. Par conséquent, le code est la documentation de conception principale et UML, s'il est utilisé, est uniquement une documentation secondaire.

David Arno
la source
7
J'ai fait soulever une partie du toit de ma maison plus tôt cette année et c'était assez instructif. L'architecte n'a vraiment plus dessiné à quoi devait ressembler le produit final. Il a remis les calculs difficiles et la conception structurelle à un ingénieur en bâtiment. Les constructeurs ont ensuite dû adapter les conceptions théoriques à la réalité de la maison (une fois la plaque de plâtre retirée, les poutres se trouvaient à des endroits légèrement différents), de sorte que la conception avait lieu à chaque étape.
Jaydee
1
C'est une réponse utile, mais elle simplifie trop certains aspects. L'une des principales raisons pour lesquelles UML ne fonctionne pas bien en tant que "notation de conception de haut niveau" est à mon humble avis, leurs inventeurs étaient trop têtus pour ajouter un diagramme de flux de données. C'est le seul type de notation que je connaisse qui convient à la conception top-town, permettant d'exprimer des abstractions pour des composants et des interfaces entre eux de différentes échelles, et peut également avoir un mappage bien défini pour coder. Au lieu de cela, UML contient beaucoup de bêtises dont personne n'a vraiment besoin.
Doc Brown
3

Je suppose que tous les idiomes de programmation (ou conception ou code) ne correspondent pas à UML (que j'avoue ne pas bien connaître - je n'ai lu que quelques livres dessus), je ne l'ai jamais utilisé et je ne l'aime probablement pas).

Le code C simple (par exemple le code source du noyau Linux) peut ne pas être exactement modélisé par UML.

Le code Ocaml (avec ses modules et ses foncteurs) ou même le code C ++ 11 (avec lambdas et modèles) peuvent ne pas correspondre à UML.

La programmation en plusieurs étapes à la MetaOcaml ne rentre probablement pas dans UML.

Le code Prolog ou Common Lisp ne rentre probablement pas dans UML.

Voir aussi cette réponse et cette question de la mienne.

Lisez les livres Pragmatics du langage de programmation de Scott et Concepts, techniques et modèles de programmation informatique de Van Roy , puis demandez-vous si chaque modèle de programmation y correspond en UML.

Voir également Is Design Dead de Martin Fowler ? Blog.

Basile Starynkevitch
la source