<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>conception - Tag - Jordan Chapuy - Blog d'un développeur passionné ❤️</title><link>https://jordanchapuy.com/tags/conception/</link><description>conception - Tag - Jordan Chapuy - Blog d'un développeur passionné ❤️</description><generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Sat, 25 Feb 2023 16:44:00 +0100</lastBuildDate><atom:link href="https://jordanchapuy.com/tags/conception/" rel="self" type="application/rss+xml"/><item><title>Des guides plus que des dogmes</title><link>https://jordanchapuy.com/posts/2023/02/des-guides-plus-que-des-dogmes/</link><pubDate>Sat, 25 Feb 2023 16:44:00 +0100</pubDate><author>Auteur</author><guid>https://jordanchapuy.com/posts/2023/02/des-guides-plus-que-des-dogmes/</guid><description><![CDATA[<p>On est entouré de principes, de lois, de modèles, de méthodes et d&rsquo;un tas d&rsquo;autres concepts. C&rsquo;est utile pour construire des choses complexes comme des logiciels - on a besoin d&rsquo;être aidé. Pour autant, je conseille de garder un minimum de recul et de questionnement face à ces <em>grands écrits</em> - ce ne sont pas des vérités absolues en toutes circonstances. Notre cerveau est plus que jamais important.</p>
<p>J&rsquo;aime considérer les principes (&amp; co) comme des <strong>guides</strong>. Ils me donnent des indications sur ce que je fais pour prendre de la hauteur. Ça m&rsquo;aide à réfléchir et à <strong>me questionner</strong>. Suis-je dans une bonne direction ? Pourquoi ce principe semble m&rsquo;alerter ici ? Qu&rsquo;est-ce que ça va m&rsquo;apporter ? De quoi ai-je besoin ? En me posant des questions, je m&rsquo;assure de <strong>prendre en compte mon contexte</strong> et de m&rsquo;y adapter. Je cherche aussi à bien comprendre le principe, pour qu&rsquo;il me guide au mieux. Peut-être que ça ne fait pas sens de l&rsquo;appliquer ici.</p>
<p>Un exemple avec le principe <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" target="_blank" rel="noopener noreffer">DRY</a> (Don&rsquo;t Repeat Yourself). Je viens d&rsquo;écrire du code qui ressemble à un autre morceau de code ailleurs dans le projet. Le voyant DRY s&rsquo;allume et me dit d&rsquo;éviter la duplication. En prenant du recul, je peux me demander si c&rsquo;est réellement de la duplication. Est-ce qu&rsquo;ils sont dans le même domaine métier ? Est-ce qu&rsquo;ils ont les mêmes raisons de changer ? À quel point est-ce identique ? Ou même, est-ce trop tôt ? Même si le principe peut m&rsquo;indiquer un comportement à adopter, je prends d&rsquo;abord soin de réfléchir et d&rsquo;analyser mon contexte.</p>
<p>À l&rsquo;opposé, une approche plus <strong>dogmatique</strong> des principes. On arrête de réfléchir, on ne se pose pas (trop) de questions. On <strong>applique bêtement</strong> ce que le principe nous dit. En même temps il n&rsquo;y a pas à réfléchir, si le principe le dit, c&rsquo;est forcément vrai. Alors on le fait. On commence même à avoir une <strong>vision binaire</strong> : je respecte ou je ne respecte pas. D&rsquo;ailleurs, si je ne respecte pas, c&rsquo;est évidemment mal.</p>
<p>En reprenant l&rsquo;exemple du principe DRY, j&rsquo;aurais sûrement supprimé la duplication tout de suite. Sans questionnement. Deux bouts de code qui se ressemblent ? Oula, vite ! Qu&rsquo;on me supprime cette duplication ! Pourtant, il s&rsquo;agissait de règles métiers de deux domaines différents. Peu de temps après, j&rsquo;aurais cassé le comportement d&rsquo;un des deux domaines en modifiant ce bout de code non dupliqué. Espérons qu&rsquo;un test unitaire soit passé au rouge et que ce ne soit pas les retours alarmants de la prod qui auront mis en avant le problème.</p>
<p>Continuons de réfléchir, de creuser les principes en profondeur et de prendre en compte notre contexte. N&rsquo;appliquons pas bêtement et évitons les vérités absolues.</p>
]]></description></item><item><title>Les éléments d'un Event Storming et leurs interactions</title><link>https://jordanchapuy.com/posts/2021/11/les-ingredients-d-un-event-storming-et-leurs-interactions/</link><pubDate>Sun, 21 Nov 2021 17:18:00 +0100</pubDate><author>Auteur</author><guid>https://jordanchapuy.com/posts/2021/11/les-ingredients-d-un-event-storming-et-leurs-interactions/</guid><description><![CDATA[<p>Suite à mon <a href="https://jordanchapuy.com/posts/2021/10/une-introduction-a-levent-storming/" rel="">introduction sur l&rsquo;Event Storming</a>, j&rsquo;ai envie de compléter un peu en revenant sur les différents ingrédients à notre disposition pour composer un Event Storming. Je trouve qu&rsquo;on a une grande richesse. On a une large boîte à outils pour modéliser notre système et harmoniser les modèles mentaux, tout en restant simple d&rsquo;usage.</p>
<p>J&rsquo;ai présenté certains éléments dans mon précédent article, ici je ferais une liste plus complète afin d&rsquo;avoir une vision globale et rapide de ce qu&rsquo;on peut utiliser. On pourra ensuite voir les interactions entre les éléments. Individuellement, chaque ingrédient apporte un type d&rsquo;information, mais ensemble, ils forment un tout et agissent sur les autres.</p>
<figure><a href="https://jordanchapuy.com/posts/2021/10/une-introduction-a-levent-storming/images/template.jpeg"></a>
</figure>

<h1 id="les-différents-éléments">Les différents éléments</h1>
<h2 id="domain-event--événement">Domain Event / Événement</h2>
<p>Avec les événements, on construit la colonne vertébrale. C’est ce qu’il se passe dans notre système. Les événements sont décrits par un verbe au participe passé. « Facture générée », « Commande livrée ». C’est quelque chose qui a eu lieu. C’est très important. On veut forcer les participants à penser avec des actions achevées, des changements d’état, des choses qui peuvent agir comme un déclencheur pour une autre action.</p>
<p>Les événements forment la base de l&rsquo;Event Storming, tout tourne autour des événements. C&rsquo;est compréhensible par le métier, par tout le monde. On peut raconter une histoire avec. On aura forcément les événements dans cet atelier, et on commence d&rsquo;ailleurs par cette étape.</p>
<h2 id="actor--acteur">Actor / Acteur</h2>
<p>Les acteurs interagissent avec le système, ils déclenchent des commandes. Ils initient une action qui va produire un événement. Ce peut être un utilisateur ou une partie d’un logiciel, un système. On essaie d&rsquo;être assez précis avec la dénomination de l’acteur, de représenter ce qu&rsquo;il est vraiment, son nom, son rôle. « Le client », « Le livreur », « Le système Y ». On utilise très souvent les acteurs car on veut visualiser qui fait quoi.</p>
<h2 id="external-system--système-externe">External System / Système Externe</h2>
<p>Ce sont les dépendances. On veut visualiser ce qui est à l&rsquo;extérieur de notre système, ce qu&rsquo;on ne gère pas. On veut aussi voir apparaître les adhérences auxquels est soumis le système, ce qui le contraint, les goulots d&rsquo;étranglement. « Le fournisseur », « Service Z ». Tout comme les acteurs, on veut voir qui fait quoi, et cette fois-ci, on a une information supplémentaire - c&rsquo;est quelque chose d&rsquo;extérieur.</p>
<h2 id="command--commande">Command / Commande</h2>
<p>La commande est le déclencheur d&rsquo;un événement, souvent une conséquence d’une action utilisateur, une prise de décision d&rsquo;un acteur ou d’un système externe. On parle de l’action réalisée qui sera le déclencheur d’un ou plusieurs événements avec un verbe à l&rsquo;infinitif. « Ajouter au panier ». Il n’y a pas forcément une commande sur chaque événement.</p>
<p>Avec les commandes, on commence à être plus précis sur le processus et on se projette également un peu dans le code.</p>
<h2 id="policy--règle">Policy / Règle</h2>
<p>Une <em>Policy</em> permet de rendre explicite une règle métier. C&rsquo;est la glu qui lie un événement et une commande. Avec une <em>Policy</em>, on représente des commandes qui sont exécutées suite à un événement et selon une condition précise. En général, on décrit une <em>Policy</em> avec <code>Lorsque ... alors ...</code> : « Lorsque le paiement dépasse 500 €, alors il faut envoyer un SMS à l&rsquo;utilisateur ».</p>
<p>Les <em>Policies</em> peuvent être présentent dans un système, qui gère cette règle lorsque l&rsquo;événement correspondant se produit. Ce peut également être un humain qui agit lorsqu&rsquo;un événement se passe. Par exemple, « Lorsqu&rsquo;une fraude est détectée, alors il faut appeler le client ». C&rsquo;est un processus humain. Dans ce cas-là, on peut ajouter un post-it acteur sur la <em>Policy</em> pour représenter la personne.</p>
<h2 id="read-model--données">Read Model / Données</h2>
<p>Il y a une nuance importante dans le nom anglais, <em>Read Model</em>. On va parler des données que l’on affiche et qui vont aider les acteurs à prendre des décisions. On ne parle pas des données que l’on écrit (écriture dans une base, un registre…), ces informations sont déjà indiquées dans les commandes comme « Ajouter (l’article) au panier ».</p>
<p>On y écrit les données principales. « Nom, Prénom, Email ». On se limite pour mettre en valeur ce qui compte réellement.</p>
<h2 id="aggregate--agrégat">Aggregate / Agrégat</h2>
<p>Les agrégats vont apporter une vision bien plus micro et être très proche du code. Pour paraphraser Martin Fowler, un agrégat est un regroupement d&rsquo;objets du domaine qui peuvent être manipulés comme un seul objet. C&rsquo;est un pattern qui vient du Domain-Driven Design.</p>
<p>Ce regroupement a du sens pour le métier. On préfèrera manipuler l&rsquo;agrégat plutôt que chaque objets individuellement - ces objets sont cohérents s&rsquo;ils sont manipulés ensemble. Dans l&rsquo;exemple du e-commerce, on peut imaginer un agrégat « Panier » qui contiendrait plusieurs objets « Article » et un objet « Promotion ».</p>
<p>L&rsquo;intérêt en faisant émerger les agrégats avant de se plonger dans le code va être de visualiser où ils se retrouvent, s&rsquo;il n&rsquo;y a pas trop d&rsquo;événements ou commandes autour d&rsquo;un même agrégat.</p>
<h2 id="hot-spot--point-dattention">Hot Spot / Point d&rsquo;attention</h2>
<p>Tout au long de l&rsquo;atelier, on peut marquer les désaccords, les questions, les risques, etc. Ça fait partie du modèle. On peut marquer tout ce qui s’éloigne du scénario nominal pour rester concentré. Ce seront des éléments à creuser plus tard. « Attention RGPD », « Que fait X ? », « Risque de fraude de paiement ». On veut également les visualiser pour mettre en lumière les zones d&rsquo;ombres, les questions, les problèmes. On agira peut-être là-dessus suite à l&rsquo;atelier.</p>
<figure><a href="images/global.jpeg"></a>
</figure>

<h2 id="déclencheur-temporel">Déclencheur temporel</h2>
<p>Le temps est parfois aussi un déclencheur d&rsquo;action. Par exemple, une sauvegarde qui doit être réalisée toutes les heures. On marquera alors simplement « Toutes les heures » sur le post-it. Ce sera le déclencheur d&rsquo;une commande ou d&rsquo;un événement visant à créer une sauvegarde.</p>
<h2 id="bounded-context--contexte-borné">Bounded Context / Contexte borné</h2>
<p>Une fois la modélisation du système bien avancé, dessiner les Bounded Context va permettre de définir les contours des domaines et sous-domaines métiers. En les identifiant, en les explicitant, on veut faire émerger des périmètres métier cohérent, des services, des ensembles de fonctionnalités, des contextes à l&rsquo;intérieur desquels les objets, les mots, le vocabulaire auront un sens important. On peut aussi visualiser comment ils interagissent entre eux.</p>
<p>Dans une plateforme d&rsquo;e-commerce, on pourrait imaginer plusieurs contextes : le service client, le service achats, le service livraison. Le terme « client » n&rsquo;a peut-être pas la même signification au sein des trois services. Peut-être même que le terme est différent, le service livraison pourrait parler de « destinataire ».</p>
<h1 id="les-interactions-entre-les-éléments">Les interactions entre les éléments</h1>
<p>Individuellement, tous ces éléments sont simples et apportent un niveau de compréhension différent. L&rsquo;acteur informe sur qui prends la décision, l&rsquo;événement indique ce qu&rsquo;il s&rsquo;est passé.</p>
<p>Ensemble, ils forment un tout. Ils se complètent, et certains ont une interaction directe entre eux. Quand un acteur agit, il déclenche une commande. Quand une commande est exécutée dans un système, un événement se produit.</p>
<p>Je trouve intéressant de voir comment chaque élément se comporte avec les autres et ce schéma (venant d&rsquo;Alberto Brandolini, le créateur), le représente bien. C&rsquo;est intéressant pour la compréhension de l&rsquo;Event Storming, pour modéliser, et aussi pour concevoir plus tard le logiciel.</p>
<figure><a href="images/interactions.png"></a>
</figure>

<p>Une commande est exécutée. « Ajouter l&rsquo;article au panier ». Une décision a été prise, il y a une action, quelque chose doit se passer. Cette commande se produit dans un système. Ce peut être le nôtre, auquel cas elle agira sur un agrégat. « On ajoute un Article au Panier, on applique éventuellement une Promotion, on recalcule un prix total ». Ou ce peut être dans un système externe.</p>
<p>Par l&rsquo;action de cette commande, le système en question génère un événement. « Article ajouté ». Cette fois-ci, ça a eu lieu, l&rsquo;histoire a évolué. Il s&rsquo;est passé quelque chose dans le système.</p>
<p>Avec cet événement, un état a changé. On peut projeter de nouvelles données « il y a 5 articles dans le panier, le nouveau prix total est de 343 euros » et les afficher dans une nouvelle interface graphique.</p>
<p>L&rsquo;événement peut déclencher une règle, une <em>Policy</em>. Le système réagit à cet événement si une condition particulière est rencontrée. « Lorsque le panier contient 5 articles, alors une réduction de 20% est appliquée sur l&rsquo;article le moins cher ». Une commande est alors exécutée. « Appliquer la promotion ».</p>
<p>Qui d&rsquo;autre peut être à l&rsquo;origine d&rsquo;une commande ? Un acteur. « Le client » a lancé la commande « Ajouter l&rsquo;article au panier ». C&rsquo;est lui qui a pris la décision, qui a agi.</p>
<p>Une commande est donc exécutée par un acteur ou par une règle provenant d&rsquo;un système. Qui produira un événement. Et ainsi de suite. La boucle est bouclée.</p>
]]></description></item><item><title>Une introduction à l'Event Storming</title><link>https://jordanchapuy.com/posts/2021/10/une-introduction-a-levent-storming/</link><pubDate>Wed, 27 Oct 2021 16:45:00 +0200</pubDate><author>Auteur</author><guid>https://jordanchapuy.com/posts/2021/10/une-introduction-a-levent-storming/</guid><description><![CDATA[<p>L&rsquo;Event Storming est un moyen d&rsquo;harmoniser les modèles mentaux de différents acteurs en modélisant un métier, un processus, un existant. On veut cartographier de la connaissance. On veut mettre en lumière des zones d&rsquo;ombre, des points de douleurs, des problèmes. Et on veut le faire tous ensemble pour s&rsquo;aligner. On va créer des discussions et confronter des visions avec toutes les personnes impliquées.</p>
<p>C&rsquo;est un atelier qui peut s&rsquo;utiliser dans n&rsquo;importe quel domaine et pas seulement dans le monde du logiciel (même si son créateur, Alberto Brandolini, est un développeur). On pourrait modéliser le fonctionnement d&rsquo;une équipe de RHs tout comme le parcours d&rsquo;achat d&rsquo;une application.</p>
<p>Les événements forment la colonne vertébrale de L&rsquo;Event Storming. On parle de ce qu&rsquo;il se passe dans le processus, dans le système, sur une ligne de temps. On peut le raconter, c&rsquo;est une histoire. Le storytelling est un aspect très puissant de cet atelier.</p>
<p>C&rsquo;est en plus modulable : on peut ajouter différentes étapes qui feront naître de nouvelles conversations selon le besoin. On pourrait par exemple introduire les acteurs qui agissent sur le système ou les dépendances externes. On peut s&rsquo;adapter en fonction du niveau d&rsquo;abstraction que l&rsquo;on souhaite avoir, d&rsquo;une vision très macro à une vision très micro sur un bout de logiciel.</p>
<p>Pour autant, l&rsquo;Event Storming reste simple, ce qui le rend d&rsquo;autant plus efficace - on va en retirer quelque chose à la fin. Le cadre est léger. C&rsquo;est très libre, voire parfois chaotique. Et c&rsquo;est très bien. Ça donne de l&rsquo;espace aux participants pour faire émerger une compréhension commune.</p>
<figure><a href="images/workshop.jpg"></a>
</figure>

<h2 id="quand-déclencher-un-event-storming-">Quand déclencher un Event Storming ?</h2>
<p>Dès lors qu&rsquo;il y a de l&rsquo;incompréhension ou un besoin de s&rsquo;accorder. La force de l&rsquo;Event Storming est de rassembler de nombreuses personnes et de tout mettre à plat sur un mur. On va rendre l&rsquo;implicite explicite et harmoniser les modèles mentaux de chacun.</p>
<p>Quelques autres signaux intéressants pour déclencher : on a trop de bugs, on a des zones de floues, on veut s&rsquo;aligner avec un existant, on veut cartographier de la connaissance.</p>
<p>Plus axé conception logiciel, l&rsquo;Event Storming aura également son utilité associé au Domain-Driven Design lorsque l&rsquo;on souhaite découvrir des <em>Bounded Contexts</em> ou des agrégats, ou associé à de l&rsquo;Event Sourcing pour identifier les événements.</p>
<h2 id="une-animation-devent-storming">Une animation d&rsquo;Event Storming</h2>
<p>Il y a plusieurs recettes pour animer un Event Storming. Alberto compare l&rsquo;atelier à une pizza. Il y a une base avec de la tomate et de la mozza (notre ligne de temps avec nos événements). Et ensuite, on y ajoute différents ingrédients au choix (des acteurs, des commandes, des données, des règles, &hellip;), sauf quelques exceptions (ni ananas, ni table de base de données :p). Je parle de tous ces éléments et leurs interactions dans <a href="https://jordanchapuy.com/posts/2021/11/les-ingredients-d-un-event-storming-et-leurs-interactions/" rel="">cet article</a>.</p>
<p>Selon le besoin, on va donc ajouter des étapes supplémentaires. En général, on veut au moins voir qui fait quoi. On veut identifier les acteurs et les systèmes externes qui nous ajoutent des contraintes, ainsi que les problèmes.</p>
<p>Pour cette introduction, on composera avec les événements ainsi que les commandes, acteurs, données et dépendances. C&rsquo;est une bonne entrée en la matière que j&rsquo;ai vu avec Marion Lecerf et Pablo Pernot lors d&rsquo;un atelier pendant la conférence School of PO ; on obtient rapidement une cartographie intéressante du système.</p>
<p>Libre à vous d&rsquo;adapter comme vous le souhaitez. On peut ajouter ou supprimer des étapes, en rassembler certaines en une seule étape, être plus macro ou plus micro. C&rsquo;est très modulable. J&rsquo;y reviendrais dans un second temps.</p>
<h3 id="préparation">Préparation</h3>
<p>En amont de l&rsquo;atelier, on prendra soin d&rsquo;inviter toutes les personnes qui ont un lien avec ce que l&rsquo;on veut faire. Si on prend l&rsquo;exemple d&rsquo;un logiciel, on pourrait y inviter des développeurs, des POs, des experts du métier, des collaborateurs d&rsquo;une équipe externe, etc. Toute personne qui peut contribuer est la bienvenue - on veut voir l&rsquo;image dans son ensemble, on veut éclaircir des zones d&rsquo;ombre, il faut qu&rsquo;il y ait tous les acteurs.</p>
<p>Second point, la salle et le matériel. Il faut réserver un grand espace, avec de grands murs. On éloignera le mobilier qui peut gêner, et on mettra à disposition une infinité de stylos et de post-its avec les bonnes couleurs. Prévoir plusieurs mètres de papier craft idéalement pour permettre d&rsquo;écrire et dessiner directement dessus. Possiblement du scotch ou des ficelles. Ça fonctionne aussi à distance sur un outil comme Miro.</p>
<h3 id="les-événements">Les événements</h3>
<p>Sur une ligne de temps que l&rsquo;on aura tracé, les participants vont s&rsquo;atteler à positionner ensemble tous les événements qui composent le processus. On construit la colonne vertébrale. C&rsquo;est ce qu&rsquo;il se passe dans notre système. On peut commencer par délimiter le début et la fin en plaçant le premier événement et le dernier événement du processus pour borner.</p>
<p>On utilise des post-its oranges. Les événements sont décrits par un verbe au participe passé. « Facture générée », « Commande livrée ». C’est quelque chose qui a eu lieu. C&rsquo;est très important. On veut forcer les participants à penser avec des actions achevées, des changements d&rsquo;état, des choses qui peuvent agir comme un déclencheur pour une autre action. Les événements doivent être parlant pour les experts métiers et ça tombe bien, ils sont censés être dans la pièce avec nous.</p>
<figure><a href="images/1-event.jpeg"></a>
</figure>

<p>Si on a du conditionnel, on peut faire deux branches. Et si on a trop de branches, on se dit qu’il faut les mettre de côté et faire un atelier dédié afin de se concentrer sur notre branche principale. On veut se concentrer sur notre cas nominal.</p>
<p>On veillera à exprimer tout ce qui vient via des post-its. On veut voir émerger l&rsquo;ensemble du modèle. On discutera après. Ça peut sembler chaotique mais c&rsquo;est ce que l&rsquo;on veut. Lors de l&rsquo;atelier avec Pablo, il indiquait qu&rsquo;il poussait au chaos : si ce n&rsquo;est pas assez bordélique, c&rsquo;est peut-être qu&rsquo;il n&rsquo;y a pas les bonnes personnes ou qu&rsquo;il y a trop de limites.</p>
<p>On peut marquer les désaccords, les questions, les risques, ça fait partie du modèle. On utilise des post-its roses foncés / rouges pour ces points d&rsquo;attention (les <em>Hot Spots</em>). Alberto n&rsquo;hésite pas à marquer tout ce qui s&rsquo;éloigne du scénario nominal pour rester concentré. Ce seront des éléments à creuser plus tard. « Attention RGPD », « Que fait X ? », « Risque de fraude de paiement ». On peut les positionner en hauteur pour surplomber, ou directement à l&rsquo;endroit où ça fait sens, au choix.</p>
<p>Cette première étape peut prendre du temps, c&rsquo;est normal. Les événements forment le cœur du processus. Lorsqu&rsquo;on arrive à la fin, on demande à une personne de raconter l&rsquo;histoire qui est modélisée. Le storytelling fait son apparition, les gens aiment écouter des histoires. On en profite pour peaufiner et clarifier le modèle si besoin. Peut-être qu&rsquo;il manque une précision à un moment. Peut-être qu&rsquo;il reste une zone de flou.</p>
<h3 id="les-commandes">Les commandes</h3>
<p>Dans notre seconde étape, on va positionner les commandes. C&rsquo;est ce qui déclenche un événement, souvent une conséquence d&rsquo;une action utilisateur, une prise de décision, ou d&rsquo;un système externe.</p>
<p>On utilise des post-its bleus. La commande est décrite avec un verbe à l&rsquo;infinitif. « Ajouter au panier ». Elle est placée devant l&rsquo;événement sur la ligne de temps.</p>
<figure><a href="images/2-command.jpeg"></a>
</figure>

<p>Les commandes peuvent être utiles pour faire émerger du bordel, surtout sur un système existant, pour aligner les connaissances. On peut trouver que la commande et l&rsquo;événement sont redondants. Avec la commande, on parle de l&rsquo;action réalisée par un acteur, qui sera le déclencheur d&rsquo;un ou plusieurs événements. Il n&rsquo;y a pas forcément une commande sur chaque événement. Avec les commandes, on se projette également un peu dans le code.</p>
<h3 id="les-acteurs">Les acteurs</h3>
<p>Troisième étape, on positionne les acteurs. Ce sont eux qui déclenchent les commandes. Ce peut être un utilisateur ou une partie d&rsquo;un logiciel. On utilise des post-its jaunes et on y marque le nom de l&rsquo;acteur. « Le client », « Le livreur », « Le système Y ». L&rsquo;acteur est placé sur la commande, légèrement sur la gauche.</p>
<figure><a href="images/3-actor.jpeg"></a>
</figure>

<h3 id="les-données">Les données</h3>
<p>On arrive à la quatrième étape où l&rsquo;on positionne les données. En anglais <em>Read Model</em>. Il y a une nuance importante ici. On va parler des données que l&rsquo;on affiche et qui vont aider les acteurs à prendre des décisions. On ne parle pas des données que l&rsquo;on écrit (écriture dans une base, un registre&hellip;), ces informations sont déjà indiquées dans les commandes comme « Ajouter (l&rsquo;article) au panier ».</p>
<p>On utilise des post-its verts. On y écrit les données principales. « Nom, Prénom, Email ». On se limite pour mettre en valeur ce qui compte réellement. Le post-it est placé avant l&rsquo;acteur.</p>
<figure><a href="images/4-read-model.jpeg"></a>
</figure>

<p>Ne pas hésiter à se faire une session de storytelling pour s&rsquo;assurer que tout va bien, et qu&rsquo;on est aligné. On peut faire des sous-groupes. Est-ce qu&rsquo;on est tous d&rsquo;accord ? Est-ce clair pour tout le monde ? On peut commencer à préciser. Précis mais pas exhaustif, sinon on n&rsquo;en fini pas. On met davantage au propre.</p>
<h3 id="les-systèmes-externes">Les systèmes externes</h3>
<p>Pour notre cinquième étape, on positionnera les systèmes externes. Ce sont les dépendances. On veut voir apparaître les adhérences auxquels est soumis le système, ce qui le contraint. On utilise des post-its rose clair. « Le fournisseur », « Service Z ».</p>
<figure><a href="images/5-external-system.jpeg"></a>
</figure>

<p>On peut à nouveau reprendre le storytelling et raconter les événements afin de s’assurer que tout est représenté comme dans la vraie vie.</p>
<h2 id="quelques-détails-et-astuces">Quelques détails et astuces</h2>
<p>Ici comme ailleurs, vous verrez qu&rsquo;on associe une couleur à chaque élément de l&rsquo;Event Storming. Respecter ce code couleur a son importance. On veut faciliter la lecture et la compréhension lors de l&rsquo;atelier, et on veut s&rsquo;y retrouver facilement si ce n&rsquo;est pas notre premier Event Storming (on s&rsquo;enlève la charge mentale de devoir réapprendre un autre code couleur). En voici un rappel :</p>
<ul>
<li>Acteur en jaune,</li>
<li>Agrégat en jaune clair,</li>
<li>Commande en bleu,</li>
<li>Données en vert,</li>
<li>Événement en orange,</li>
<li>Point d&rsquo;attention en rose foncé / rouge,</li>
<li>Règle métier en violet,</li>
<li>Système externe en rose clair.</li>
</ul>
<p>On pourrait dire la même chose de la mise en page. Si tout le monde adopte une façon unique de présenter les post-its, on améliore la lisibilité. Une bonne pratique est d&rsquo;afficher le modèle des différents post-its sur le mur.</p>
<figure><a href="images/template.jpeg"></a>
</figure>

<p>Veillez à bien espacer les post-its entre eux pour faciliter l&rsquo;ajout de nouveaux post-its au fil des étapes. D&rsquo;ailleurs, un classique quand on joue avec des post-its, écrivez en majuscules, en gros, et soyez concis.</p>
<p>Dernière précision. On peut toujours mettre un événement, un acteur ou tout autre type de post-it même si on est passé à l&rsquo;étape suivante. C&rsquo;est toujours le bon moment d&rsquo;ajouter de l&rsquo;information.</p>
<h2 id="avec-quoi-on-repart-">Avec quoi on repart ?</h2>
<p>On obtient de la visibilité. L&rsquo;ensemble du processus, du système est rendu visible. Il n&rsquo;y a plus de zones d&rsquo;ombre - ou s&rsquo;il y en a, elles sont explicitement révélées. Les problèmes et les questions sont identifiés. On va pouvoir avancer sur ces sujets.</p>
<p>On obtient de la compréhension. On peut avoir des prises de conscience comme &ldquo;je ne pensais pas que je te créais des problèmes là-bas en faisant ça&rdquo; ou &ldquo;je ne savais pas que tu faisais ceci&rdquo;. Les participants comprennent ce qu&rsquo;il se passe chez eux et chez les autres, on casse les silos. On va améliorer la collaboration.</p>
<p>On obtient de l&rsquo;alignement. On s&rsquo;est mis d&rsquo;accord tous ensemble sur le modèle, sur les problèmes. Continuons d&rsquo;avancer ensemble.</p>
<p>La suite est très modulable, tout comme l&rsquo;est l&rsquo;atelier. On peut imaginer un tas de choses pour travailler sur le processus :</p>
<ul>
<li>Voter pour le problème principal, qui pourrait devenir la priorité numéro une.</li>
<li>Mettre en lumière les zones à améliorer, et travailler dessus avec le temps.</li>
<li>Identifier où il peut manquer des compétences.</li>
<li>Regarder le niveau de qualité dans les zones les plus importantes pour le métier.</li>
<li>Travailler sur les dépendances et goulots d&rsquo;étranglement.</li>
<li>Simplifier le processus.</li>
<li>Etc.</li>
</ul>
<p>Pour aller plus loin, <a href="https://jordanchapuy.com/posts/2021/11/les-ingredients-d-un-event-storming-et-leurs-interactions/" rel="">Les éléments d&rsquo;un Event Storming et leurs interactions</a>.</p>
<hr>
<p><em>Merci Marion Lecerf et Pablo Pernot pour les divers échanges, et Yannick Grenzinger qui avait initié mon équipe l&rsquo;année dernière :)</em></p>
]]></description></item><item><title>Pourquoi veut-on rendre un test unitaire indépendant ?</title><link>https://jordanchapuy.com/posts/2021/09/pourquoi-veut-on-rendre-un-test-unitaire-independant/</link><pubDate>Wed, 29 Sep 2021 08:50:00 +0200</pubDate><author>Auteur</author><guid>https://jordanchapuy.com/posts/2021/09/pourquoi-veut-on-rendre-un-test-unitaire-independant/</guid><description><![CDATA[<p>L&rsquo;indépendance n&rsquo;existe pas uniquement dans certaines régions de France ou dans un film avec Will Smith. Il se trouve aussi dans les tests unitaires. Lorsque vous écrivez des tests, il y a un moment qui arrive où vous souhaitez être indépendant de quelque chose. Vous allez naturellement casser cette dépendance et injecter autre chose pour remplacer ce qui gêne.</p>
<p>Ce n&rsquo;est cependant pas une décision à prendre à la légère. Certaines raisons sont parfaitement justifiées, alors que d&rsquo;autres peuvent nuire au projet. Pourquoi a-t-on besoin de casser une dépendance dans certains tests ? Et de quoi veut-on être indépendant ? À quoi faut-il faire attention ? C&rsquo;est de tout ça dont j&rsquo;ai envie de parler aujourd&rsquo;hui.</p>
<figure>
</figure>

<h1 id="quest-ce-qui-nous-pose-problème-">Qu&rsquo;est-ce qui nous pose problème ?</h1>
<p>Commençons par le commencement. On veut savoir pourquoi rendre un test indépendant, regardons du côté des problèmes auxquels cette envie d&rsquo;indépendantisme répond.</p>
<h2 id="test-déterministe">Test déterministe</h2>
<p>Avoir des tests qui échouent sans raison apparente à première vue, c&rsquo;est embêtant. Encore plus lorsque ça semble être aléatoire. Et parfois, on a un passage au rouge du jour au lendemain, ce qui nous vaut la célèbre phrase &ldquo;ça marchait avant&rdquo;. Un test devrait avoir une intention claire et n&rsquo;avoir qu&rsquo;une seule raison d&rsquo;échouer. On n&rsquo;a pas envie de se lancer dans une session de debug pour comprendre ce qu&rsquo;il se passe.</p>
<p>Alors qu&rsquo;est-ce qui peut bien causer ces problèmes ? Un autre test. Ce bienfaiteur qu&rsquo;est le test peut en effet être une source d&rsquo;ennuis pour d&rsquo;autres tests. Lorsqu&rsquo;on lance un ensemble de tests, l&rsquo;environnement et la mémoire sont partagés entre eux. Si deux tests lisent et écrivent dans un même endroit, ils vont éventuellement affecter le résultat de l&rsquo;autre. Vous voyez où je veux en venir ? Base de données, fichiers, singletons, variables globales, &hellip; Tout ça représente une zone partagée et peut créer un lien de dépendance entre deux tests.</p>
<p>On arrive donc à notre première et principale raison. <strong>Pourquoi rendre un test indépendant ? Pour éviter un effet de bord venant d&rsquo;un autre test.</strong> C&rsquo;est dans ce but que l&rsquo;on va casser une dépendance envers une base de données, un système de fichiers ou un singleton. Et que l&rsquo;on mettra une fausse implémentation, avec un base de données en mémoire par exemple, pour avoir un état déterministe.</p>
<p>C&rsquo;est d&rsquo;ailleurs une autre raison, être déterministe. <strong>On veut rendre un test indépendant pour obtenir toujours le même résultat.</strong> Du côté des causes, on retrouvera celles vues précédemment et on peut notamment y ajouter d&rsquo;autres éléments perturbateurs comme les requêtes HTTP, la date du jour, les fonctions aléatoires (quoi de mieux qu&rsquo;un bon <code>random()</code> pour avoir un résultat imprévisible ? :p). Ce sont des sources qu&rsquo;on ne contrôle pas. Mais pour être déterministe, il faut les contrôler : on cassera alors les dépendances afin de les remplacer. Ou peut-être que l&rsquo;on s&rsquo;orientera vers la création de fonctions pures.</p>
<h2 id="test-rapide">Test rapide</h2>
<p>Ajoutons un autre problème, sinon ce n&rsquo;est pas marrant. Une suite de tests lente à exécuter est assez fâcheux. Les tests unitaires nous guident dans la conception et parfois nous rattrapent lors de sorties de route. On a besoin d&rsquo;un feedback rapide, et encore plus lorsque l&rsquo;on pratique le TDD.</p>
<p>On aura une nouvelle fois les mêmes fautifs. Feraient-ils preuve d&rsquo;intelligence ? On se le demande, mais en tout cas ça nous arrange puisqu&rsquo;il n&rsquo;y a pas de centaines de causes différentes. Principalement, tout ce qui accède au réseau, aux internets, ralentira fortement vos tests. On peut rester dans la centaine de millisecondes comme dépasser aisément la barre des secondes. C&rsquo;est sûrement la source la plus lente. Viennent ensuite les bases de données et le système de fichiers. Unitairement, le temps est peut-être faible, mais quand on dézoom et qu&rsquo;on regarde le cumul sur l&rsquo;ensemble des tests, ça devient (trop) long.</p>
<p>On en vient à notre dernière raison. <strong>On veut rendre un test indépendant pour qu&rsquo;il soit rapidement exécuté.</strong> Là encore, on cassera éventuellement des dépendances qu&rsquo;on substituera par quelque chose répondant immédiatement.</p>
<h2 id="couper-les-ponts">Couper les ponts</h2>
<p>Si on résume en une phrase, on souhaite rendre un test indépendant afin d&rsquo;éviter qu&rsquo;il soit affecté par les autres tests, pour être déterministe, et pour être rapide. Voilà. Ce sont les raisons principales. Pas besoin d&rsquo;aller chercher plus loin et d&rsquo;isoler complètement un test.</p>
<p>Un autre moyen d&rsquo;entrevoir ces raisons est de regarder du côté des <a href="https://jordanchapuy.com/posts/2020/04/first-5-principes-pour-guider-l-ecriture-des-tests-unitaires/" rel="">principes FIRST</a>. Ce sont des principes pour guider l&rsquo;écriture des tests, et je trouve qu&rsquo;ils reflètent bien les besoins d&rsquo;indépendance. On parle de rapidité d&rsquo;exécution (F pour Fast), de test indépendant des autres tests (I pour Independent) et de résultat déterministe (R pour Repeatable).</p>
<h1 id="quelques-mauvaises-compréhensions">Quelques mauvaises compréhensions</h1>
<p>Maintenant que nous avons bien en tête les raisons qui motivent les tests à devenir indépendant, revenons sur quelques mauvaises compréhensions. C&rsquo;est essentiel d&rsquo;en parler, car il peut y avoir un impact fort : tests fragiles, maintenance lourde, démotivation des développeurs.</p>
<h2 id="system-under-test">System Under Test</h2>
<p>Quand on parle de <em>SUT</em>, on parle de <em>SYSTEM Under Test</em>. Ce n&rsquo;est ni <em>Class Under Test</em> ni <em>Fonction Under Test</em>. C&rsquo;est très important. Le système, ce peut être une fonction, ou une classe, ou un ensemble de classes et de fonctions. Peu importe, on va tester l&rsquo;ensemble et tout ce qu&rsquo;il y a derrière. On peut voir ça comme un module, ou une boîte noire - <strong>on teste toute la boîte depuis notre point d&rsquo;entrée</strong>.</p>
<p>On ne cherche pas à isoler le système que l&rsquo;on teste des autres classes et fonctions qu&rsquo;il utilise. On rend le test indépendant, oui, mais pas la classe. On s&rsquo;en tiendra aux raisons évoquées plus haut pour casser des dépendances. C&rsquo;est parfaitement ok qu&rsquo;une méthode que l&rsquo;on teste appelle d&rsquo;autres classes, qui appelleront aussi d&rsquo;autres classes.</p>
<h2 id="heavy-mocking">Heavy mocking</h2>
<p>En comprenant bien ce qu&rsquo;est le <em>SUT</em> et ce qu&rsquo;il faut rendre indépendant, on s&rsquo;évite au passage la sur-utilisation de mocks. On ne va pas essayer de tout isoler et donc de tout mocker.</p>
<p><strong>Le problème avec les mocks, c&rsquo;est qu&rsquo;ils connaissent trop les détails de l&rsquo;implémentation</strong>. Si on change notre implémentation (on a une meilleure idée, on fait du refactoring), on va casser les tests. Les assertions vont être fausses et c&rsquo;est normal, le mock vérifie la mécanique interne.</p>
<p>La sur-utilisation des mocks va entraîner des problèmes en cascade : on couple les tests à l&rsquo;implémentation, on a du mal à faire du refactoring, le code devient difficile à changer, le développeur se démotive, il y a moins de tests, moins de qualité, fin. Vraiment, on ne veut pas coupler les tests à l&rsquo;implémentation :)</p>
<h1 id="comportement">Comportement</h1>
<p>Ça me fait une bonne ouverture pour terminer. Ce que l&rsquo;on veut tester, c&rsquo;est le comportement. Quand on fait des applications, c&rsquo;est pour répondre à un besoin métier. C&rsquo;est ça que l&rsquo;on veut tester. On se limitera à enlever les dépendances gênantes pour les tests unitaires. <strong>Testez le comportement plutôt que les détails de l&rsquo;implémentation</strong>.</p>
<figure>
</figure>

<p><em>Crédits photos : Anne Nygård, Richard Lee.</em></p>
]]></description></item><item><title>La méthode Mikado : de grands changements avec de petites étapes</title><link>https://jordanchapuy.com/posts/2021/07/la-methode-mikado-de-grands-changements-avec-de-petites-etapes/</link><pubDate>Wed, 14 Jul 2021 13:38:00 +0200</pubDate><author>Auteur</author><guid>https://jordanchapuy.com/posts/2021/07/la-methode-mikado-de-grands-changements-avec-de-petites-etapes/</guid><description><![CDATA[<p>Vous avez déjà assemblé des Lego ou monté un meuble Ikea ? Quand j&rsquo;étais petit, j&rsquo;adorais les Lego. Je laissais libre cours à mon imagination en créant des tas de lieux, de véhicules et d&rsquo;histoires. J&rsquo;ai aussi eu des boîtes de Lego avec quelque chose de précis à assembler (un château par exemple). Dans ces boîtes, il y a toujours un plan. On y voit le résultat final (le château) et toutes les étapes à suivre pour le construire. Des étapes simples et petites qui se suivent. Parfois, on assemble un morceau (une tour, un mur) et on le met de côté avant de revenir dessus plus tard pour l&rsquo;assembler avec toute la structure. À la fin, on a notre grand château avec toute sa complexité, ses détails, ses nombreuses briques.</p>
<p>La méthode Mikado, c&rsquo;est un peu la même chose. On suit un plan décomposé en plusieurs petits pré-requis pour atteindre un objectif plus grand bien précis. Sauf que ce plan, on ne l&rsquo;a pas au départ mais on le construit au fil de notre avancée. Et c&rsquo;est là toute la puissance de la méthode Mikado. On avance par petits pas, on expérimente, on visualise notre chemin, et on reste toujours dans un état fonctionnel jusqu&rsquo;à atteindre l&rsquo;objectif défini.</p>
<p>Je m&rsquo;en sers régulièrement lors de <a href="https://jordanchapuy.com/posts/2021/06/le-refactoring/" rel="">refactoring</a> et je trouve ça génial (n&rsquo;en déplaise aux adeptes des chantiers abandonnés après 4 mois sans visibilité). La méthode m&rsquo;apporte de la structure, je vois ce que j&rsquo;ai à faire, j&rsquo;avance par petites étapes. Rencontrer des difficultés ou des imprévus en chemin est moins problématique grâce à l&rsquo;approche très itérative et expérimentale de la méthode. Je découpe les problèmes, j&rsquo;essaie des solutions, je garde ce qui marche, j&rsquo;annule ce qui ne fonctionne pas. Le projet est toujours dans un état fonctionnel. Je peux m&rsquo;arrêter à tout moment et le livrer.</p>
<p>C&rsquo;est très puissant pour effectuer des changements progressivement et avec rigueur dans n&rsquo;importe quel domaine. Je parlais de refactoring, mais on peut effectuer tout type d&rsquo;évolutions dans notre code, ou également sortir de la sphère technique en l&rsquo;utilisant dans notre équipe pour modifier une organisation, ou dans notre quotidien.</p>
<h1 id="la-méthode-mikado">La méthode Mikado</h1>
<p>Avant de plonger profondément dans les détails, je vous propose de découvrir un exemple d&rsquo;utilisation de la méthode Mikado qui parle à tout le monde pour représenter son fonctionnement.</p>
<div class="details admonition question open">
        <div class="details-summary admonition-title">
            <i class="icon fas fa-question-circle fa-fw"></i>Une histoire de TV<i class="details-icon fas fa-angle-right fa-fw"></i>
        </div>
        <div class="details-content">
            <div class="admonition-content"><p>Notre équipe a une salle de pause qui augmente la productivité de 700 % depuis que nous l’avons ré-aménagé. Son secret ? Des fauteuils confortables et des Fatboy pour profiter pleinement d’une diffusion continue des épisodes de Kaamelott. L’efficacité est telle que la direction nous a fait livrer une nouvelle TV 4K avec une très grande diagonale.</p>
<p>Je veux donc remplacer le vieil écran PC posé sur le plan de travail par la nouvelle TV afin de regarder Kaamelott en 4K ! Il faut cependant limiter au maximum l’interruption de la diffusion des épisodes, pas question de perdre les bénéfices de notre salle de pause.</p>
<p>Par quoi pourrais-je commencer ? Je pourrais brancher le lecteur sur la nouvelle TV, ou mettre le Blu-ray dans le lecteur à la place du DVD. Allez, je vais d’abord mettre le BluRay. J’arrête la lecture, je retire le DVD, je le range dans la boite, je prends le Blu-ray… Le Blu-ray ?! Ah, mince, on ne l&rsquo;a pas encore en fait. Je n’y avais pas du tout pensé. Ce n’est pas grave, je remet tout en état avec la diffusion du DVD, comme avant. Que dois-je faire maintenant pour avoir les Blu-ray ? Il faut simplement l&rsquo;acheter. Ok, rien ne me bloque, j&rsquo;y vais.</p>
<p>[Plus tard&hellip;]</p>
<p>J&rsquo;ai maintenant les Blu-ray de toutes les saisons de Kaamelott. Un superbe coffret. Je peux reprendre l’étape précédente. Je remplace le DVD dans le lecteur par le Blu-ray, puis je lance la lecture. Tout fonctionne, c’est génial. Je dois m’arrêter là pour le moment par contre, ça m’a pris plus de temps que prévu et j’ai des impératifs. Je continuerai la semaine prochaine.</p>
<p>[Plus tard&hellip;]</p>
<p>J’ai un peu de temps pour avancer vers notre objectif ce matin. Où est-ce que j’en étais ? Ah oui, au branchement du lecteur sur la nouvelle TV. Facile. Je débranche l’ancien écran, je sors la TV et… Et rien du tout. C’est une TV que l’on doit poser sur le mur, elle n’a pas de pied. Il faut que je pose cette accroche au mur avant, et pour ça, il faut que je perce les trous dans le mur. Retour en arrière, je range tout et je rebranche l’ancien écran.</p>
<p>Je ne peux pas m’occuper de ces dernières étapes tout de suite, mais un de mes collègues s’est proposé de prendre le relai. Il a compris ce qu’il restait à faire, il s’en charge. Percer les trous, puis poser l’accroche, installer la TV, et enfin la brancher. Voilà. Nous pouvons maintenant profiter d&rsquo;une légende arthurienne encore plus grande.</p>
</div>
        </div>
    </div>
<h2 id="les-grands-principes">Les grands principes</h2>
<p>Ok. Maintenant que vous avez un exemple simple et concret d&rsquo;utilisation de la méthode Mikado, nous pouvons décortiquer les grands principes au travers de cette histoire.</p>
<h3 id="avoir-un-objectif">Avoir un objectif</h3>
<p>On commence avec un objectif précis. Dès le départ, on sait où l’on doit aller, on a un cap. On se concentre dessus, on ne fait pas autre chose en même temps. Dans le récit précédent, le besoin était de remplacer un vieil écran par une nouvelle TV afin de regarder Kaamelott en 4K. Le résultat attendu est parfaitement clair.</p>
<h3 id="faire-des-expérimentations">Faire des expérimentations</h3>
<p>Tout au long de notre chemin pour arriver à notre objectif, on va expérimenter. On va essayer des choses qui nous rapprochent de l’objectif. On avance par petites étapes. On cherche des solutions simples et naïves. Par exemple, on essaie de brancher directement la nouvelle TV et on voit ce qu’il se passe.</p>
<p>N’essayez pas de tout prévoir en avance, de faire un plan complet pour aller sur la lune. Demandez-vous ce que vous pouvez faire comme toute première étape pour avancer. Mettre le Blu-ray ? Ok, j’essaie.</p>
<h4 id="valider-une-expérimentation-réussie">Valider une expérimentation réussie</h4>
<p>Lorsqu’une expérimentation fonctionne, on la valide. On commit, on enregistre, on garde ces modifications. Elles nous permettent d’avancer. Et si on arrête là, tout fonctionne toujours. On n’a peut-être pas terminé, mais on a avancé dans le schmilbik. J’ai acheté le Blu-ray de Kaamelott, je me suis rapproché de mon objectif final.</p>
<h4 id="annuler-une-expérimentation-échouée">Annuler une expérimentation échouée</h4>
<p>Quand une expérimentation rate, on annule. On retire toutes les modifications de notre expérimentation et on revient dans l&rsquo;état précédant. On restore sur git, on remet tout en place. C’est une des clés de la méthode. Si vous ne le faites pas, vous n’appliquez pas la méthode Mikado. Pour être transparent, j’ai tenté de ne pas le faire, de prendre des raccourcis, d&rsquo;aller trop vite. Je me suis perdu et cela ne m’a pas aidé.</p>
<p>Revenir en arrière est très puissant. On n&rsquo;a pas expérimenté pour rien, on a appris des choses. On se pose des questions pour continuer. Qu’est-ce qui me bloque ? Que faut-il faire pour débloquer cette étape ? On va construire la suite de notre chemin grâce à cette expérimentation échouée et on pourra revenir sur cette étape plus tard, dans de meilleures conditions pour réussir.</p>
<p>Si on arrête là, tout fonctionne. Toujours. Parce qu&rsquo;on garde les expérimentations qui ont réussi et on retourne en arrière lorsqu&rsquo;elles échouent.</p>
<h3 id="dessiner-un-graphe-pour-visualiser">Dessiner un graphe pour visualiser</h3>
<p>Vous ne le voyez pas en lisant l&rsquo;histoire, mais un graphe a été créé et modifié au fil des expérimentations. C&rsquo;est un outil essentiel dans l&rsquo;utilisation de la méthode Mikado qui permet de visualiser l&rsquo;avancée. On voit ce qu&rsquo;on a fait, ce qu&rsquo;on a tenté, ce qu&rsquo;il reste à faire. On sait facilement à quel point on se situe. On pourra reprendre aisément plus tard ou se faire aider par d&rsquo;autres personnes. Oui car c&rsquo;est également un très bon support pour communiquer, pour expliquer ce que l&rsquo;on fait, pour avoir un coup de main.</p>
<figure><a href="images/mikado-kaamelott.jpeg"></a>
</figure>

<h2 id="la-création-du-graphe">La création du graphe</h2>
<p>Dessiner un graphe avec la méthode Mikado est très simple. On commence par écrire l&rsquo;objectif tout en bas dans un double cercle.</p>
<figure><a href="images/mikado-graph-1.jpeg"></a>
</figure>

<p>On ajoute ensuite un cercle pour chaque expérimentation que l&rsquo;on réalise, au-dessus du pré-requis précédant, et on les relie à l&rsquo;aide d&rsquo;une flèche. La flèche pointe vers le ou les pré-requis à effectuer au préalable - il faut d&rsquo;abord acheter le Blu-ray afin de le mettre dans le lecteur.</p>
<figure><a href="images/mikado-graph-2.jpeg"></a>
</figure>

<p>On repère très rapidement les possibles prochaines étapes : il s&rsquo;agit des pré-requis n&rsquo;ayant pas de dépendance. On peut alors choisir une expérimentation et essayer.</p>
<ul>
<li>Si elle échoue, on ajoutera une ou des nouvelles expérimentations en pré-requis à cette étape.</li>
<li>Si elle réussie, on cochera l&rsquo;expérimentation. Ce qui débloquera peut-être d&rsquo;autres étapes.</li>
</ul>
<figure><a href="images/mikado-graph-3.jpeg"></a>
</figure>

<h2 id="bref-la-démarche">Bref, la démarche</h2>
<p>Si vous avez bien compris les principes, la démarche ne devrait pas vous surprendre. C&rsquo;est tout simplement l&rsquo;application de ces principes coordonnés par le graphe, étape par étape. Dans le livre Mikado Method, il y a un diagramme qui représente très bien les différentes étapes à suivre. Je l&rsquo;ai recréé ci-dessous.</p>
<figure><a href="images/mikado-method-diagram.jpeg"></a>
</figure>

<p>On commence par dessiner l&rsquo;objectif sur notre graphe. On essaie ensuite naïvement de trouver une solution. S&rsquo;en suit une répétition de ces étapes selon le succès de l&rsquo;expérimentation :</p>
<ul>
<li>Dès que l&rsquo;on bloque ou que notre expérimentation échoue, on dessine les nouveaux pré-requis dans le graphe, on annule les modifications, et on choisit un autre pré-requis.</li>
<li>Lorsque l&rsquo;on réussi, on enregistre nos modifications, on commit, et on démarre avec une autre expérimentation du graphe.</li>
</ul>
<p>On réitère toutes ces étapes jusqu&rsquo;à atteindre l&rsquo;objectif. Simple et terriblement efficace.</p>
<h1 id="la-dernière-brique">La dernière brique</h1>
<p>On a vu une méthode qui permet de structurer des changements. Même lorsqu&rsquo;il y a un grand chantier devant nous, la méthode Mikado apporte de la structure en travaillant rigoureusement par petites étapes et expérimentations. Le graphe nous guide tout le long pour arriver à notre objectif, et sert également de support pour communiquer. On ne conserve que ce qui fonctionne et on annule ce qui échoue, ce qui permet d&rsquo;avoir un projet ou contexte toujours opérationnel.</p>
<p>Et à la fin, il reste toujours une brique Lego ou une pièce du meuble Ikea. Considérez-là comme une dernière chance d&rsquo;améliorer votre travail une fois que l&rsquo;ensemble est achevé :)</p>
]]></description></item><item><title>Clean Architecture - Et si on passait à côté ?</title><link>https://jordanchapuy.com/posts/2020/11/clean-architecture-et-si-on-passait-a-cote/</link><pubDate>Tue, 17 Nov 2020 09:17:00 +0100</pubDate><author>Auteur</author><guid>https://jordanchapuy.com/posts/2020/11/clean-architecture-et-si-on-passait-a-cote/</guid><description><![CDATA[<p>Je vois de plus en plus la Clean Architecture comme le SCRUM. Quelque chose qui est souvent mal appliqué et mal compris. Quelque chose dont on oublie ou met de côté la philosophie, l&rsquo;essence même. Quelque chose qu&rsquo;on utilise parce que c&rsquo;est <em>à la mode</em>.</p>
<p>J&rsquo;observe un nombre grandissant de discussions autour de la Clean Architecture. C&rsquo;est davantage présent dans les projets, dans les souhaits, dans les échanges, dans les publications. Pourtant, je pense qu&rsquo;une (trop grande) partie des personnes passe à côté de concepts essentiels et ne se pose pas les bonnes questions. Malgré la bonne intention, ça peut être dangereux. J&rsquo;aimerais amorcer une prise de recul et ouvrir des questions.</p>
<h2 id="et-si-on-prenait-du-recul-">Et si on prenait du recul ?</h2>
<p>Je vois des discussions qui tournent seulement autour du pattern, du diagramme de classe. <em>&ldquo;Le Presenter fait ceci et cela. Il parle à celui-ci ou à celui-là.&rdquo;</em> Quand je demande ce qu&rsquo;est la Clean Architecture, on me répond souvent en me récitant un diagramme de classe. Pas un mot sur l&rsquo;abstraction, l&rsquo;entrée/sortie, l&rsquo;inversion de contrôle, &hellip; Et encore moins sur l&rsquo;isolation du métier.</p>
<p>J&rsquo;ai également assisté à des entretiens et des échanges avec des développeurs qui s&rsquo;acharnent avec des suites de questions pour savoir si <em>Machin</em> va plutôt dans le Router ou Interactor ou Presenter, si c&rsquo;est pas à <em>Bidule</em> de faire ça, et le rôle de <em>Truc</em> là-dedans, &hellip; Plutôt que de parler de l&rsquo;esprit de la Clean Architecture, ils ne parlent que des classes.</p>
<p>Certaines équipes utilisent la Clean Architecture comme cadre pour empêcher les développeurs d&rsquo;en sortir, en suivant un modèle à la lettre. Faire sans comprendre, sans réfléchir ne mène pas très loin. À quel point cela vaut le coup, de rendre des choses difficiles, d&rsquo;ajouter de la complexité pour empêcher des développeurs de sortir des rails ? Il y a peut-être d&rsquo;autres choix à explorer.</p>
<p>Dans tout ça, on oublie le <em>pourquoi</em>. On se concentre trop sur le <em>comment</em>. Pourquoi on l&rsquo;utilise ? <em>&ldquo;C&rsquo;est pour découper. C&rsquo;est pour pouvoir tester.&rdquo;</em> me dit-on souvent, sans trop détailler. Oui, mais pourquoi ça devient <em>&ldquo;plus découpé&rdquo;, &ldquo;plus testable&rdquo;</em> ? Quels concepts y a-t-il derrière ? Pourquoi fait-on cela ?</p>
<h2 id="et-si-on-se-recentrait-sur-le-métier-">Et si on se recentrait sur le métier ?</h2>
<p>Le métier est la partie la plus importante du produit. Sans métier, le produit n&rsquo;existerait pas, l&rsquo;équipe ne le fabriquerait pas. C&rsquo;est le cœur du programme et de l&rsquo;entreprise. Certaines règles vont au-delà du programme. La répartition des places dans un train par exemple. Cette règle peut être présente dans plusieurs programmes différents et existe même en dehors de tout ça, dans le monde réel.</p>
<p>Ces règles ne dépendent pas d&rsquo;un choix technique ou d&rsquo;un framework, elles ne sont pas affectées par un changement technique. On change de base de données ? Pas de problème. On n&rsquo;a pas encore choisi la base de données ? Pas de problème non plus. On change de framework ? Aucun souci.</p>
<p>Les règles devraient pouvoir changer aisément, le monde évolue constamment. On devrait les trouver et les comprendre facilement puisque c&rsquo;est le cœur du programme. C&rsquo;est pour toutes ces raisons qu&rsquo;il est important d&rsquo;apporter une grande attention sur cette brique. De la protéger de l&rsquo;extérieur. De la rendre compréhensible, lisible. De la tester.</p>
<p>Le schéma de Clean Architecture représenté par <a href="https://blog.cleancoder.com/uncle-bob/images/2012-08-13-the-clean-architecture/CleanArchitecture.jpg" target="_blank" rel="noopener noreffer">les 4 cercles</a> va d&rsquo;ailleurs dans ce sens. On retrouve les règles métiers et les règles applicatives au centre. Et uniquement ça. Pas de framework, pas de base de données, pas d&rsquo;interface graphique. Les frontières protègent les cercles à l&rsquo;intérieur de l&rsquo;extérieur. C&rsquo;est aussi l&rsquo;esprit de l&rsquo;architecture hexagonale et du DDD (Domain-Driven Design).</p>
<p>Le métier est au centre parce qu&rsquo;il est très important. Parce qu&rsquo;on veut le protéger. Parce qu&rsquo;on veut en prendre soin. Le reste, c&rsquo;est du détail. Du détail d&rsquo;implémentation.</p>
<h2 id="et-si-on-se-penchait-sur-les-principes-">Et si on se penchait sur les principes ?</h2>
<p>La programmation orientée-objet a son rôle à jouer, bien plus que ce que l&rsquo;on apprend souvent à l&rsquo;école (vous savez, ce fameux héritage pour classifier des animaux). Certains concepts qui gravitent autour de la POO se cachent derrière la Clean Architecture et sa séparation des couches.</p>
<p>L&rsquo;abstraction par exemple. Avec l&rsquo;abstraction, on cache les détails de l&rsquo;implémentation. On veut utiliser quelque chose sans savoir comment ça fonctionne derrière. On s&rsquo;enlève cette complexité. Je veux enregistrer un favori sans savoir de quelle manière il sera stocké.</p>
<p>L&rsquo;inversion de contrôle et l&rsquo;injection de dépendances sont un autre exemple. Ces concepts sont présents pour renforcer les frontières, pour protéger les cercles. On veut que les cercles discutent entre eux, mais sans qu&rsquo;un cercle intérieur n&rsquo;ait connaissance d&rsquo;un cercle extérieur. On découple. Un <em>Use Case</em> peut interagir avec une base de données sans que ce code ne soit à l&rsquo;intérieur du cercle, de son module. Cette brique est indépendante. Ainsi, les changements autour de la base de données ne vont pas affecter le <em>Use Case</em>. Et c&rsquo;est tout de même le <em>Use Case</em> qui est aux commandes, qui utilise la base de données.</p>
<p>On parle de modularité en programmation orientée objet. D&rsquo;autres concepts sont également là. Je vous conseille de prendre le temps de les découvrir et de les comprendre. De voir comment tout cela s&rsquo;articule, et d&rsquo;aller au-delà de la Clean Architecture. S&rsquo;ils ne vous intéressent pas, alors prenez encore plus de temps pour creuser le sujet. Mais n&rsquo;en restez pas à l&rsquo;application d&rsquo;un pattern.</p>
<h2 id="et-si-on-explorait-plus-loin-">Et si on explorait plus loin ?</h2>
<p>La Clean Architecture apporte de bonnes choses, mais ce n&rsquo;est pas une <em>silver bullet</em> pour autant. La solution miracle n&rsquo;existe pas. C&rsquo;est une solution parmi d&rsquo;autres. Il faut la comprendre, savoir ses forces et faiblesses, connaître ses principes, l&rsquo;approfondir.</p>
<p>Il faut également explorer ce qu&rsquo;il y a autour. L&rsquo;architecture hexagonale est une approche similaire par exemple. Elle accorde beaucoup d&rsquo;importance au métier, le place au centre et le protège avec un système de <em>ports</em> et d&rsquo;<em>adapters</em>. Une approche simple qui se marie très bien avec le Domain-Driven Design (un tas de choses à voir là-dedans, je recommande pleinement de s&rsquo;y plonger). Le <em>Functionnal Core, Imperative Shell</em> me semble être un autre moyen intéressant.</p>
<p>Et il faut garder en tête les différents principes de programmation. Ils sont toujours là, peu importe le choix de l&rsquo;architecture. Ils vous accompagneront pendant longtemps.</p>
<p>Cherchez à comprendre et approfondissez, n&rsquo;appliquez pas sans réfléchir. Soyez ouvert et explorateur, ne restez pas enfermé dans une vision unique. Et appréciez :)</p>
]]></description></item></channel></rss>