<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arthur Rousseau</title>
    <description>The latest articles on DEV Community by Arthur Rousseau (@4rthurrousseau).</description>
    <link>https://dev.to/4rthurrousseau</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1454273%2Fbf2ee12f-9940-4035-94c7-359168aef8b6.jpeg</url>
      <title>DEV Community: Arthur Rousseau</title>
      <link>https://dev.to/4rthurrousseau</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/4rthurrousseau"/>
    <language>en</language>
    <item>
      <title>Devfest Nantes 2024, la frayeur s'invite à la cité des congrès 👻</title>
      <dc:creator>Arthur Rousseau</dc:creator>
      <pubDate>Tue, 19 Nov 2024 07:55:23 +0000</pubDate>
      <link>https://dev.to/onepoint/devfest-nantes-2024-la-frayeur-sinvite-a-la-cite-des-congres-3pan</link>
      <guid>https://dev.to/onepoint/devfest-nantes-2024-la-frayeur-sinvite-a-la-cite-des-congres-3pan</guid>
      <description>&lt;p&gt;Il y a tout juste un mois se tenait le Devfest Nantes 2024. Réunissant chaque année plus de 3 500 passionnés, cet événement s'impose comme le rendez-vous incontournable des communautés tech de la région.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/onepoint"&gt;Onepoint&lt;/a&gt; était présent à cet événement. Découvrez au travers de ces dark chapters notre rétrospective de cette édition effrayante !&lt;/p&gt;

&lt;h2&gt;
  
  
  L'événement tech le plus effrayant de la région
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5y5fa94io5shgwkoqkqa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5y5fa94io5shgwkoqkqa.jpg" alt="Aux portes du Devfest Nantes 2024" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
Pour cette douzième édition, ce ne sont pas moins de 40 conférences qui attendaient les nombreux participants. A celles-ci s'ajoutent 16 quickies et 15 codelabs répartis sur 4 tracks plongés dans l'ambiance terrifiante de ce "Dark Chapter of the Devfest".&lt;/p&gt;

&lt;p&gt;Le thème de cette année nous laissait envisager le pire dès le matin du premier jour. Heureusement pour nous, aucun bug ne s'est immiscé dans l'application de contrôle des billets et aucun fantôme malicieux n'a eu pour idée de créer une pénurie de café ! Nos peurs se sont assez vite évaporées, preuve que le Devfest Nantes est une machine bien rodée.&lt;/p&gt;

&lt;p&gt;Avant même d'accueillir les premières conférences de la journée, c'est dans le grand auditorium que Mehdi Moussaïd —aussi connu sur YouTube sous le pseudo de &lt;a href="https://www.youtube.com/c/Fouloscopie" rel="noopener noreferrer"&gt;Fouloscopie&lt;/a&gt;—, a présenté la keynote d'ouverture de ce Devfest. Chercheur spécialisé dans le comportement des foules, il nous fait découvrir son métier et nous donne les clés pour comprendre et ne plus avoir peur de la foule. Une &lt;a href="https://www.youtube.com/watch?v=xuKrkOh_mzk" rel="noopener noreferrer"&gt;keynote inattendue, passionnante&lt;/a&gt; qui nous dévoile les aspects scientifiques qui se cachent derrière ces situations que l'on peut vivre au quotidien.&lt;/p&gt;

&lt;p&gt;Deux animations spéciales étaient au programme cette année, mais ni moi ni les co-auteurs de cet article n'avons eu l'occasion d'y participer :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trois sessions de "Code In The Dark", un challenge pendant lequel les participants ont vingt minutes pour reproduire, à l'aveugle, une page web. À la fin du temps imparti, les participants présentent leurs réalisations et le résultat le plus proche de la maquette l'emporte !&lt;/li&gt;
&lt;li&gt;Deux sessions d'expérimentations sociales avec Mehdi Moussaïd.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Onepoint et le Devfest
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbr0r25bzk4gnrwou5bpy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbr0r25bzk4gnrwou5bpy.jpg" alt="Equipe Onepoint" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
Impossible pour nous d'évoquer cette édition du Devfest Nantes sans vous parler de notre présence à cet événement.&lt;/p&gt;

&lt;p&gt;Pour cette huitième édition consécutive, vous êtes nombreux à avoir bravé vos peurs pour nous rejoindre sur le stand &lt;a href="https://www.groupeonepoint.com/fr/" rel="noopener noreferrer"&gt;Onepoint&lt;/a&gt;. Au programme, ce ne sont pas moins de quatre animations effrayantes qui vous attendaient :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Beyond The Phobia", un jeu mobile multijoueur similaire à "Blanc-Manger Coco" dans lequel vous affrontez vos adversaires pour créer la phrase la plus drôle —ou effrayante— de la tech. La variante "Peur du noir", jouable en exclusivité sur notre stand, vous plonge dans le noir pour vous faire découvrir les enjeux qui se cachent derrière une application accessible.&lt;/li&gt;
&lt;li&gt;"Epouvant'AI", un projet autour de l'IA qui vous aide à lutter contre vos plus grandes peurs en générant une image de celle-ci tournée en ridicule,&lt;/li&gt;
&lt;li&gt;"Ouij-IOT", une table de ouija connectée aux esprits du code qui rôdent sur le Gitlab de nos projets,&lt;/li&gt;
&lt;li&gt;"OUIA", qui utilise cette même table de ouija et la puissance de l'IA générative pour générer le portrait horrifique de personnages historiques disparus. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous avez également retrouvé sur scène trois de nos experts, présents pour animer des conférences ou des ateliers en ce premier jour de Devfest :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/cecile-hannotte/" rel="noopener noreferrer"&gt;Cécile Hannotte&lt;/a&gt; nous présentait comment des algorithmes peuvent être utilisés pour expliquer les prédictions de nos IA dans son talk &lt;a href="https://www.youtube.com/watch?v=n7PeE_A1Gms" rel="noopener noreferrer"&gt;"IA-404 : Explication not found"&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/ga%C3%ABl-poupard-40117b30" rel="noopener noreferrer"&gt;Gaël Poupard&lt;/a&gt; nous proposait d'observer toutes les mutations qui se passent dans votre HTML au travers de son codelab "L'invasion du HTML mutant"&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/benjilegnard/" rel="noopener noreferrer"&gt;Benjamin Legrand&lt;/a&gt; était présent pour nous parler d'AnalogJS lors de sa conférence &lt;a href="https://www.youtube.com/watch?v=mQujRWe_hNk" rel="noopener noreferrer"&gt;"AnalogJS, le meta-framework pour Angular que l'on attendait (ou pas)"&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un énorme merci à eux, ainsi qu'aux personnes qui ont contribué à la réalisation et la mise en place du stand et de ces beaux projets que vous avez pu découvrir lors de ces deux jours. &lt;/p&gt;

&lt;p&gt;L’organisation d’un tel événement ne s’improvise pas. En interne, c’est le fruit d’un travail acharné. Chaque conférence, chaque projet, mais aussi chaque détail de la scénographie a été discuté en interne, validé, répété et peaufiné jusqu'au dernier jour. Chaque élément a été soigneusement pensé, des contenus présentés sur le stand en passant par les animations ou les supports visuels utilisés.&lt;/p&gt;

&lt;p&gt;Cette organisation pourrait certainement faire l’objet d’un article à part entière, tant elle reflète l’investissement de nos équipes. Alors, restez connectés, les secrets de l'organisation de ce Devfest seront peut-être bientôt dévoilés !&lt;/p&gt;
&lt;h2&gt;
  
  
  Et les conférences dans tout ça ?
&lt;/h2&gt;

&lt;p&gt;Si certains garderont comme plus beau souvenir de ce Devfest leur passage sur scène, d’autres auront surtout en tête les conférences qu’ils ont pu suivre depuis le public. Nous étions nombreux à avoir assisté à cet événement et certains d'entre nous ont souhaité revenir sur les conférences qui les ont le plus marquées. Un grand merci à &lt;a href="https://www.linkedin.com/in/benoit-reynaert-14292442/" rel="noopener noreferrer"&gt;Benoit Reynaert&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/anthony-baticle/" rel="noopener noreferrer"&gt;Anthony Baticle&lt;/a&gt; et &lt;a href="https://www.linkedin.com/in/herv%C3%A9-martin-253a27125/" rel="noopener noreferrer"&gt;Hervé Martin&lt;/a&gt; pour vous être prêtés à l'exercice !&lt;/p&gt;
&lt;h3&gt;
  
  
  Multi Kubernetes, Multi Régions, Au-secours !
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Jeudi 11h10 - Jules Verne - Aurélien Moreau, Nicolas Lavacry - Casden&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Aurelien Moreau, architecte Takima et Nicolas Lavacry de la Casden-Banque-Populaire ont eu à déployer des applications containerisées sur plusieurs clusters Kubernetes, multi région et multi providers. Cette conférence se base sur un projet imaginaire ayant les mêmes exigences que la Casden et explore les solutions possibles. &lt;/p&gt;

&lt;p&gt;Les premières difficultés exposées sont liées à l'incompatibilité de Kubernetes avec la latence entre nœuds du cluster, nécessitant de créer des clusters distincts. Sont ensuite explorés les problèmes d'optimisation des accès verticaux (routage et loadbalancing des clients extérieurs faisant appel aux services en fonction de leur géolocalisation) et horizontaux (routage des flux inter-cluster internes). &lt;/p&gt;

&lt;p&gt;L'intervention se clôt avec une démo du load balancing multi-région (via VPN) puis par la présentation des solutions possibles pour la création d'un service et d'une BDD répliquée inter-cluster. &lt;/p&gt;

&lt;p&gt;La conférence a été un succès tant sur le fond que sur la forme. Les speakers se donnent la parole de manière fluide et dynamique, la démo est simple et efficace, le sujet bien que complexe est abordé de manière accessible pour tous. Merci à eux ! &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retour de &lt;a href="https://www.linkedin.com/in/benoit-reynaert-14292442/" rel="noopener noreferrer"&gt;Benoit Reynaert&lt;/a&gt; - Abstract, feedbacks et replay à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/multi_kubernetes__multi_regions__au_secours__/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Our future without passwords
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Jeudi 14h00 - Titan - Milica Mihajlija - Google&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Milica Mihajlija, Technical Writer chez Google, a présenté une alternative innovante qui permet de se passer de mots de passe : les passkeys. Cette fonctionnalité encore méconnue aujourd'hui est présente sur de rares sites.&lt;/p&gt;

&lt;p&gt;Les passkeys sont des clés de sécurité qui permettent de s'authentifier sur des sites web sans avoir à saisir de mot de passe.&lt;br&gt;
Elles reposent sur le combo clé publique / clé privée et sont compatibles sur la plupart des plateformes et navigateurs.&lt;br&gt;
Cette approche se veut plus sécurisée car les passkeys ne peuvent être réutilisées entre plusieurs sites, ni être compromises en cas d'intrusion serveur, et permettent de se prémunir des attaques de type phishing.&lt;/p&gt;

&lt;p&gt;Ces clés sont générées par un appareil physique (comme une clé USB) ou un appareil mobile (comme un smartphone), elles sont prévues uniques pour chaque site web.&lt;br&gt;
La clé publique est stockée sur le serveur distant tandis que l'utilisateur conserve précieusement sa clé privée. &lt;/p&gt;

&lt;p&gt;Dans sa présentation, Milica explique les passkeys et montre un exemple de code exécuté dans le navigateur pour les générer. &lt;br&gt;
Elle aborde les configurations permettant d'utiliser une même passkey sur plusieurs sous-domaines d'un même site. Par exemple, il est possible de rendre valable une clé générée pour le domaine &lt;code&gt;domain.tld&lt;/code&gt; sur le sous-domaine &lt;code&gt;rewards.domain.tld&lt;/code&gt;. Durant son talk, Milica a également évoqué la possibilité de synchroniser ses passkeys entre différents appareils utilisateurs (PC, tablette, smartphone, etc.) via des solutions similaires aux gestionnaires de mots de passe.&lt;/p&gt;

&lt;p&gt;La présentation se termine par une proposition de démarche qui vise à introduire ce nouveau système de sécurité sur les sites web, de comment il est possible de sensibiliser les utilisateurs à la sécurité et les accompagner à ce changement.&lt;/p&gt;

&lt;p&gt;La conférence a été très intéressante, bien que légèrement commerciale avec un focus sur les solutions Google. Milica a su captiver son audience en expliquant de manière claire et concise un sujet complexe. Les exemples concrets et les démonstrations ont permis de bien comprendre le fonctionnement et la mise en place de ces passkeys. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retour d'&lt;a href="https://www.linkedin.com/in/anthony-baticle/" rel="noopener noreferrer"&gt;Anthony Baticle&lt;/a&gt; - Abstract, feedbacks et replay à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/our_future_without_passwords/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Introduction pratique à OpenTelemetry pour les développeurs
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Jeudi 15h10 - Jules Verne - Nicolas Frankël - Apache APISIX&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fort de 15 années d'expérience dans le domaine du développement, Nicolas Frankël, developer advocate pour APISIX, a été le témoin du déclin du &lt;em&gt;monitoring&lt;/em&gt;. Il nous présente, dans la plus grande des salles de ce Devfest, son talk intitulé "Introduction pratique à OpenTelemetry pour les développeurs".&lt;/p&gt;

&lt;p&gt;Un frisson s'est emparé de moi lorsqu'il a évoqué cette époque où des équipes entières passaient leurs journées à scruter des dashboards sur d'énormes murs d'écrans. Si comprendre le fonctionnement de nos applications a toujours été important, aujourd'hui la complexité de nos architectures et leur distribution est devenue telle qu'une approche archaïque n'est plus possible. C'est de ce constat qu'a émergé l'idée d'observabilité.&lt;/p&gt;

&lt;p&gt;Après avoir détaillé les trois piliers sur lesquels reposent l'observabilité —les métriques, les logs et le tracing— Nicolas nous partage sa propre définition de ce dernier. Selon lui, le tracing est "un ensemble de techniques et d'outils qui permettent de suivre une requête métier à travers de multiples composants et au travers du réseau".&lt;/p&gt;

&lt;p&gt;Ca tombe bien, c'est justement ce que font déjà les pionniers du tracing tels que Zipkin, Jaeger ou OpenTracing ! Malheureusement, chaque solution parle sa propre langue et ne peut propager ses traces qu'au travers de composants qui la comprennent. C'est là qu'intervient le W3C, qui s'est emparé de ce sujet pour proposer un standard de propagation de traces, &lt;a href="https://www.w3.org/TR/trace-context" rel="noopener noreferrer"&gt;trace-context&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Après avoir brièvement présenté ce qu'est OpenTelemetry —une implémentation du standard trace-context, et plus encore—, place à la démonstration ! Ici en représentant le SI d'un site de e-commerce fictif utilisant de nombreux composants différents (Java, Rust, Python, Go, etc.).&lt;/p&gt;

&lt;p&gt;En une vingtaine de minutes, nous découvrons la simplicité avec laquelle il est possible d'intégrer OpenTelemetry au sein de nos projets. A l'issue de cette démonstration, nous étions capables de retracer le cheminement des requêtes qui atteignaient notre SI.&lt;/p&gt;

&lt;p&gt;Un énorme merci à Nicolas Frankël qui, à travers sa conférence, a su souligner l'importance du tracing au sein de nos architectures distribuées. Je ressors de cette salle avec l'espoir que demain, plus aucun développeur ne devrait avoir à &lt;del&gt;subir&lt;/del&gt; fouiller désespérément dans des logs pour essayer de retracer le chemin d'une requête !&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retour d'&lt;a href="https://www.linkedin.com/in/arthur-rousseau-2980b913a/" rel="noopener noreferrer"&gt;Arthur Rousseau&lt;/a&gt; - Abstract, feedbacks et replay à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/introduction_pratique_a_opentelemetry_pour_les_developpeurs/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Atelier - Fresque de la Data
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Vendredi 09h00 - Hangar - Laurène Thenoz, Sandra Pietrowska - Hymaïa&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Animée par &lt;a href="https://www.linkedin.com/in/lvol1/?originalSubdomain=fr" rel="noopener noreferrer"&gt;Laurène Thenoz&lt;/a&gt;, Product Manager, et &lt;a href="https://www.linkedin.com/in/sandra-pietrowska-721b09a8/" rel="noopener noreferrer"&gt;Sandra Pietrowska&lt;/a&gt;, Data Scientist chez &lt;a href="https://www.hymaia.com/formation/fresque-de-la-data" rel="noopener noreferrer"&gt;Hymaïa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cet atelier, habituellement prévu pour durer 4 heures, a été adapté, pour l’occasion, à un format de 2 heures. Trente participants étaient répartis en quatre groupes, selon un niveau équitable de connaissances en Data.&lt;/p&gt;

&lt;p&gt;L’exercice débutait par un cas d’usage destiné à produire un dashboard pour la gestion de la vente d’organes (thème du Devfest oblige !). Chaque équipe devait ordonner une première série d’une dizaine de cartes correspondant aux différentes étapes du processus : réception de données via divers canaux et formats (structurés, non structurés, fichiers Excel, données sensibles), ingestion, stockage, transformation, déploiement et utilisation finale du dashboard. Cette mise en situation reflétait notamment mon quotidien, à l’exception, bien sûr, des organes !&lt;/p&gt;

&lt;p&gt;Quelques minutes après avoir posé les premières cartes, les organisatrices nous ont annoncé que l’atelier serait en fait un concours, avec des livres à gagner, ce qui a ajouté une dimension compétitive et stimulé la créativité collective sur les grandes tables blanches mises à disposition.&lt;/p&gt;

&lt;p&gt;Pour corser l’exercice, une équipe rivale nous imposait trois obstacles (par exemple, un dashboard buggé, des tests non réalisés ou un manque de confiance dans les chiffres affichés). Chaque problème pouvait être résolu en utilisant une carte solution appropriée.&lt;/p&gt;

&lt;p&gt;Au fil de l’atelier, les présentatrices ont introduit de nouvelles étapes pour enrichir le scénario et approfondir la compréhension des rôles comme Data Engineer, Data Scientist, ou Data Analyst, ainsi que des concepts tels que la Data Lineage, le RGPD, Data Quality, etc.&lt;/p&gt;

&lt;p&gt;Entre chaque étape, Laurène et Sandra prenaient la parole pour présenter des informations complémentaires, comme le Data Business Canvas Model (issu du Lean Canvas) pour définir un modèle économique axé sur la data, ou une matrice d’aide à la priorisation orientée création de valeur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54425x7d0ynt2vb5b4ur.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54425x7d0ynt2vb5b4ur.jpg" alt="Photo de l'atelier" width="312" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Peu après, avec un nouveau jeu de cartes, nous avons abordé les aspects prédictifs et prescriptifs de l’intelligence artificielle, en discutant de concepts tels que le machine learning, le deep learning, le feature engineering, la model baseline, etc., tout en étant confrontés à de nouvelles problématiques à résoudre.&lt;/p&gt;

&lt;p&gt;Laurène s'est arrêtée à notre table pour nous sensibiliser aux enjeux des modèles qui fonctionnent "trop bien" et se poser la question de savoir si notre modèle reste en adéquation avec la réalité.&lt;/p&gt;

&lt;p&gt;Pour conclure la session, quelques rappels importants :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les meilleures pratiques de développement s’appliquent à la Data, inutile de réinventer la roue.&lt;/li&gt;
&lt;li&gt;La performance des algorithmes de machine learning peut diminuer avec le temps, d'où la nécessité de les remettre en question régulièrement.&lt;/li&gt;
&lt;li&gt;Il est indispensable de passer d’une mentalité de PROJET à une mentalité de PRODUIT. Le PRODUIT doit être aligné sur la stratégie d’entreprise et la stratégie Data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avant de partir, un dernier message de sensibilisation sur l’impact environnemental de l’intelligence artificielle générative, comparant cela à un aller-retour Paris - New York (s’appuyant, entre autres, sur &lt;a href="http://dataforgood.fr" rel="noopener noreferrer"&gt;dataforgood.fr&lt;/a&gt;) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le cycle de vie (ACV) d’un serveur pour 6 ans de durée de vie : équivalent à 3 allers-retours Paris - New York.&lt;/li&gt;
&lt;li&gt;L'entraînement de ChatGPT 3 : équivalent à 200 allers-retours Paris - New York.&lt;/li&gt;
&lt;li&gt;Poser 16 questions à ChatGPT : équivaut à faire bouillir une bouilloire (heureusement, pas besoin d’aller jusqu’à New York !).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cerise sur le gâteau, notre équipe a remporté la victoire ainsi qu’un livre sur le product management : &lt;em&gt;Le kit de survie du product manager ambitieux&lt;/em&gt;. La journée commençait très bien !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxqtuxv7qlz6kewfyk1c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxqtuxv7qlz6kewfyk1c.jpg" alt="Guide remporté par l'équipe" width="334" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retour d'&lt;a href="https://www.linkedin.com/in/herv%C3%A9-martin-253a27125/" rel="noopener noreferrer"&gt;Hervé Martin&lt;/a&gt; - Abstract et feedbacks à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/fresque_de_la_data/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  J'ai une idée pour réduire l'empreinte environnementale du numérique par 4
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Vendredi 10h10 - Jules Verne - Tristan Nitot - OCTO Technology&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tristan Nitot est très impliqué depuis plusieurs années dans des projets importants du numérique, il a co-fondé Mozilla Europe, est passé par Qwant, Scaleway et Cozy Cloud. Aujourd'hui âgé de 57 ans, il est directeur associé chez OCTO Technology et est le présentateur du podcast « L'octet vert »&lt;/p&gt;

&lt;p&gt;Lors de sa conférence il propose son alternative à la loi de &lt;strong&gt;Moore&lt;/strong&gt; : le principe d'&lt;strong&gt;erooM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Il part du constat que l'impact environnemental du numérique est principalement lié aux ressources extraites et utilisées pour la fabrication de nos appareils, serveurs, smartphones, etc. Cet impact est fortement lié a La loi de Moore. Ce principe a fait que pendant des décennies, acheter un nouvel appareil pour le même prix que l'ancien offrait des performances grandement supérieures (X2 tous les 2 ans). La conséquence a été la mise en place d'une &lt;strong&gt;obsolescence programmée&lt;/strong&gt;, les applications fournies étant, selon la loi de Wirth proportionnellement plus lentes et consommatrices en ressources CPU et RAM. &lt;/p&gt;

&lt;p&gt;Cette loi de Moore arrive aujourd'hui à essoufflement. La proposition de Tristan est de passer a une loi d'optimisation, nos application devraient consommer 2X moins de ressources tous les 2 ans. La conséquence en serait une croissance maintenue mais une consommation en ressources grandement limitée. L'utopie étant qu'à un jeune adulte, on offre un bon ordinateur et que celui-ci lui serve toute sa vie.&lt;/p&gt;

&lt;p&gt;La conférence a beaucoup plu, tant sur la qualité du speaker, la forme et le fond. Dans les jours qui ont suivi, elle a entrainé plusieurs discussions notamment sur le sujet du profilling d'application et comment améliorer les performances de nos applis. Spoiler : il y a un profiler intégré dans les IDE Jetbrains pour la partie backend et pour le frontend, allez dans la console de dev de votre navigateur. Il y également eu une conférence d'introduction à l'OpenTelemetry lors de ce DevFest. &lt;/p&gt;

&lt;p&gt;En conclusion, le noeud du problème est aussi la motivation du client, comment l'inclure dans cette démarche d'optimisation quand "ça marche" et qu'il y a d'autres priorités ? A ce sujet, la mesure et l'amélioration de l'impact environnemental des entreprises va être de plus en plus important via des contraintes venant du RSE et du green deal de l'Europe. Prenons de l'avance !&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retour de &lt;a href="https://www.linkedin.com/in/benoit-reynaert-14292442/" rel="noopener noreferrer"&gt;Benoit Reynaert&lt;/a&gt; - Abstract, feedbacks et replay à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/j_ai_une_idee_pour_reduire_l_empreinte_environnementale_du_numerique_par_4/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Les aventuriers de la motivation perdue
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Vendredi 14h00 - Belem - Noémie Delrue - CGI&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Noémie Delrue est consultante SharePoint et Microsoft 365 chez CGI. &lt;br&gt;
Et si on se déconnectait de la tech' pour prendre du temps à réfléchir sur soi, se recentrer sur l'humain, se questionner sur ses aspirations, résonner sur ce qui nous anime et nous motive au quotidien ?&lt;/p&gt;

&lt;p&gt;Dans sa présentation, Noémie a présenté avec humour, bienveillance, et pragmatisme une conférence sur la motivation et l'engagement des collaborateurs en entreprise.&lt;br&gt;
Elle nous conte des anecdotes, nous fait rire et réfléchir, les analogies nous parlent.&lt;br&gt;
Noémie offre un moment inspiré de la relaxation pour lâcher prise, nous recentrer sur nous-même, nous aider à trouver un sens à ce que l'on fait au quotidien, et surtout dire MERCI.&lt;/p&gt;

&lt;p&gt;Cette conférence nous invite à un retour à l'essentiel, avec douceur, humour et empathie. Un moment inspirant et émouvant qui nous rappelle l'importance de prendre soin de soi et des autres.&lt;br&gt;
Et si vous aussi vous teniez votre Brag Doc pour célébrer vos réussites ? Si ce mot ne vous dit rien, je vous invite à voir le replay de la conférence.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retour d'&lt;a href="https://www.linkedin.com/in/anthony-baticle/" rel="noopener noreferrer"&gt;Anthony Baticle&lt;/a&gt; - Abstract, feedbacks et replay à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/les_aventuriers_de_la_motivation_perdue_/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Anatomie d'une faille
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Vendredi 15h10 - Jules Verne - Olivier Poncet - Arneo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Olivier Poncet, CTO de Arneo et habitué du Devfest était présent pour nous raconter une histoire.&lt;br&gt;
Cette histoire est celle de la faille de &lt;em&gt;XZ Utils&lt;/em&gt; qui, sans un coup de chance exceptionnel et la curiosité du développeur l'ayant découverte, aurait pu passer inaperçue et entraîner des conséquences dramatiques.&lt;/p&gt;

&lt;p&gt;La conférence débute par un retour à la date du 29 mars 2024. Ce jour-là, Red Hat rapporte que du code malicieux a été identifié au sein des livrables de &lt;em&gt;XZ Utils&lt;/em&gt;. Les risques liés à cette faille sont tels que le score de la CVE (&lt;em&gt;Common Vulnerabilities and Exposures&lt;/em&gt;) dans laquelle &lt;a href="https://www.cve.org/CVERecord?id=CVE-2024-3094" rel="noopener noreferrer"&gt;elle a été reportée&lt;/a&gt; est évalué à 10/10. Il s'agit là d'une faille dont la criticité est maximale et pour laquelle des actions de remédiation doivent être prises immédiatement.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;XZ Utils&lt;/em&gt; est un outil embarqué dans une grande partie des distributions Linux permettant de compresser / décompresser des données via l'algorithme &lt;a href="https://fr.wikipedia.org/wiki/LZMA" rel="noopener noreferrer"&gt;LZMA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mais... comment en sommes-nous arrivés là ? Quels étaient les objectifs de cette attaque et surtout, comment a-t-elle été déjouée ?&lt;/p&gt;

&lt;p&gt;Pendant 40 minutes, Nicolas nous retrace l'histoire de cette attaque menée sur le long terme. La présentation retrace les quatre phases de cette celle-ci. A l'image d'un épisode de Columbo, on nous présente directement l'auteur des faits, un certain &lt;a href="https://github.com/jiat75" rel="noopener noreferrer"&gt;Jia Tan&lt;/a&gt;. L'objectif de cette attaque ? Corrompre la supply-chain de certaines distributions Linux et y intégrer une porte dérobée via les outils de compression proposés par XZ Utils.&lt;/p&gt;

&lt;p&gt;Nous découvrons alors l'histoire de Collin Lasse, seul mainteneur du projet XZ Utils depuis 2009, et sa rencontre avec Jia Tan. En 2022, Collin Lasse est submergé de demandes liées à XZ Utils et la pression est telle qu'il est contraint de nommer un second mainteneur. Après avoir fait ses preuves en contribuant régulièrement au projet, Jia Tan est nommé co-mainteneur de XZ Utils au début de l'année 2023.&lt;/p&gt;

&lt;p&gt;Bien que les conséquences de cette décision ne soient pas visibles immédiatement, le mal est fait. Petit à petit, nous découvrons comment Jia Tan a pris le contrôle et ajouté du code malicieux au sein de XZ Utils. Au fur et à mesure du talk, l'énigme s'éclaircit. On prend alors la mesure de toute l'ingéniosité qu'a nécessité cette attaque. &lt;/p&gt;

&lt;p&gt;La compromission de XZ Utils est découverte par Andres Freud, membre de la core team de PostgreSQL et ingénieur chez Microsoft, &lt;a href="https://www.openwall.com/lists/oss-security/2024/03/29/4" rel="noopener noreferrer"&gt;le 29 mars 2024&lt;/a&gt;. Après avoir constaté une charge CPU anormale liée à openssh, il a enquêté et identifié la source du problème : liblzma, l'un des paquets de XZ Utils.&lt;/p&gt;

&lt;p&gt;Pour être honnête, je n'avais pas entendu parler de cette attaque avant d'assister à cette conférence, mais j'en ressors avec deux leçons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En tant que mainteneur de projet open source, on peut être amené à se retrouver en amont de la supply chain d'autres projets. Si votre projet est utilisé par d'autres projets, vous devenez potentiellement un vecteur d'attaque.&lt;/li&gt;
&lt;li&gt;En tant que consommateur de projets open source, il est nécessaire de rester attentif à ce qu'on utilise. On peut sans doute limiter les librairies qu'on utilise dans nos projets (a-t-on vraiment besoin de &lt;a href="https://www.npmjs.com/package/is-odd" rel="noopener noreferrer"&gt;is-odd&lt;/a&gt; dans nos projets ?). Au-delà de ça, il convient d'être attentif aux versions de ce qu'on utilise, en faisant parfois des compromis (est-ce que j'utilise la dernière version en date, est-ce que j'utilise une version moins récente, mais éprouvée ?).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette conférence est probablement celle qui m'a le plus intéressé de tout ce Devfest ! Si vous n'avez pas eu la chance d'assister à cette conférence en direct, je vous recommande vivement d'aller voir son replay !&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retour d'&lt;a href="https://www.linkedin.com/in/arthur-rousseau-2980b913a/" rel="noopener noreferrer"&gt;Arthur Rousseau&lt;/a&gt; - Abstract, feedbacks et replay à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/anatomie_d_une_faille/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Le monstre invisible : l'empreinte carbone de l'IA
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Vendredi 16h20 - Titan - Olivier Bierlaire - Carbonifer&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;À l’Auditorium 800 de la Cité des Congrès, la conférence est présentée par &lt;a href="https://www.linkedin.com/in/olivierbierlaire/?locale=fr_FR" rel="noopener noreferrer"&gt;Olivier Bierlaire&lt;/a&gt;, ancien pensionnaire de la maison Elastic et fondateur de &lt;a href="https://carbonifer.io/" rel="noopener noreferrer"&gt;Carbonifer&lt;/a&gt; aidant les sociétés à rendre leurs infrastructures cloud plus écologiques.&lt;/p&gt;

&lt;p&gt;Dès le début, Olivier nous plonge directement dans l'urgence climatique avec des chiffres révélateurs, montrant que l’empreinte carbone de l’IT dépasse aujourd’hui celle de l’aviation civile ou du transport maritime. Et cet impact ne se limite pas à la seule émission de CO₂ : il englobe également la consommation d'eau, l'exploitation des sols, le recyclage des composants, sans oublier les nuisances sonores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mj2h50ez4leiiqko4ff.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mj2h50ez4leiiqko4ff.jpg" alt="Impact de l'IT" width="377" height="283"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Et l'IA générative dans tout ça ?
&lt;/h4&gt;

&lt;p&gt;Ces quatre dernières années, les besoins en puissance de calcul pour l'IA ont connu une croissance exponentielle. Certaines grandes entreprises technologiques (GAFAM) ont même installé des data centers à proximité de centrales nucléaires américaines, anticipant une demande croissante en électricité au cours des deux prochaines années.&lt;/p&gt;

&lt;p&gt;Quelques repères :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Une tonne de CO₂ correspond, par exemple, “grosse maille” à un aller-retour entre Paris et New York.&lt;/li&gt;
&lt;li&gt;L’empreinte carbone par habitant : États-Unis (14 tonnes), Europe (7 tonnes), France (4 tonnes).&lt;/li&gt;
&lt;li&gt;Pour suivre les accords de Paris, nous devrions être à 2 tonnes…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Olivier nous invite à considérer l’empreinte carbone de ChatGPT-3 (très difficile à calculer, la transparence des chiffres d’émissions de CO₂ reste encore perfectible, voire même opaque) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L’entraînement : environ 500 tonnes de CO₂. Plus un modèle est petit, moins la consommation est importante.&lt;/li&gt;
&lt;li&gt;L’utilisation annuelle (inférence) : entre 40 000 et 120 000 tonnes de CO₂.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsv8j5g8r5ce8po72f8d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsv8j5g8r5ce8po72f8d.jpg" alt="Comparaison empreinte carbone" width="439" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il présente plusieurs tableaux montrant que le fine-tuning ne représente qu'une petite partie de l’entraînement, que ce soit en termes de matériel ou pour les modèles de langage de grande taille (LLM). Il souligne notamment que "CodeParrot" – un modèle basé sur GPT-2 – est l’un des plus efficaces en termes d’émissions de CO₂, avec seulement 2 à 3 tonnes métriques générées pour l'entraînement, grâce à sa taille réduite et à l’utilisation de datasets plus petits.&lt;/p&gt;
&lt;h4&gt;
  
  
  Mesurer pour mieux réduire
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfs95m8xioui5yrpm2zg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfs95m8xioui5yrpm2zg.jpg" alt="Citation Peter Drucker" width="431" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En s’appuyant sur une citation de Peter Drucker, “Si vous pouvez le mesurer, vous pouvez l’améliorer”, Olivier introduit ensuite des outils de mesure des émissions de CO₂ et met l’accent sur l’importance du choix des lieux de requêtage :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://carbontracker.info/" rel="noopener noreferrer"&gt;Carbon Tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codecarbon.io/" rel="noopener noreferrer"&gt;Code Carbon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genai-impact.org/" rel="noopener noreferrer"&gt;GenAI Impact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Outils de suivi carbone des grands clouds : &lt;a href="https://aws.amazon.com/fr/aws-cost-management/aws-customer-carbon-footprint-tool/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;, &lt;a href="https://cloud.google.com/carbon-footprint" rel="noopener noreferrer"&gt;Google Cloud&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Solutions pratiques pour réduire les émissions de CO₂
&lt;/h4&gt;

&lt;p&gt;On pourrait intuitivement penser que moins on dépense, moins on émet de CO₂. Ainsi, lors des phases d’entraînement, plus le modèle est petit, moins la consommation sera élevée, en tenant compte également du matériel utilisé et du &lt;a href="https://app.electricitymaps.com/map" rel="noopener noreferrer"&gt;pays où l’on souhaite effectuer cet entraînement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Côté inférence, même constat : plus le modèle est petit, moins la consommation sera élevée. Par ailleurs, générer du texte est moins gourmand en ressources que générer une image, sans oublier le matériel et la localisation de l’exécution de la requête.&lt;/p&gt;

&lt;p&gt;Olivier présente diverses initiatives, notamment &lt;em&gt;AI for Green&lt;/em&gt;, et mentionne des usages controversés de l'IA (comme la détection de nouveaux gisements pétroliers au Texas) ainsi que des applications plus positives, telles que le projet &lt;a href="https://globalfishingwatch.org/" rel="noopener noreferrer"&gt;Global Fishing Watch&lt;/a&gt; pour détecter la pêche illégale.&lt;/p&gt;

&lt;p&gt;Il mentionne également une étude aux résultats intrigants, selon laquelle la rédaction d'une page avec ChatGPT génèrerait environ 130 à 1 500 fois moins de CO₂ qu'un texte rédigé par un humain.&lt;/p&gt;

&lt;p&gt;J’ai assisté à une conférence percutante sur l'impact écologique de l’IA dans notre quotidien et les points essentiels que j’en retiens sont les suivants :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La consommation de l’IA dépend étroitement de l’infrastructure et du lieu d’utilisation (en France, par exemple, on est plus chanceux qu’en Allemagne !),&lt;/li&gt;
&lt;li&gt;Réduire la taille des modèles permet de diminuer leur impact écologique,&lt;/li&gt;
&lt;li&gt;Réutiliser les modèles existants plutôt que de les réentraîner à chaque fois,&lt;/li&gt;
&lt;li&gt;Mesurer, estimer et calculer les émissions pour adopter un retour sur investissement carbone,&lt;/li&gt;
&lt;li&gt;Remettre en question le recours systématique à l'IA, qui n’est pas toujours la meilleure solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Retour d'&lt;a href="https://www.linkedin.com/in/herv%C3%A9-martin-253a27125/" rel="noopener noreferrer"&gt;Hervé Martin&lt;/a&gt; - Abstract, feedbacks et replay à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/the_invisible_monster/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;. Le support de la conférence est disponible &lt;a href="https://www.canva.com/design/DAGTj0N_GQ0/ZqnX7cNDvbyAV2XReWZlyA/view?utm_content=DAGTj0N_GQ0&amp;amp;utm_campaign=designshare&amp;amp;utm_medium=link&amp;amp;utm_source=editor#1" rel="noopener noreferrer"&gt;à cette adresse&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Data et sport : la révolution
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Vendredi 16h50 - Jules Verne - Eric Alard - ENI Ecole Informatique&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;En tant que passionné de sport, il m'était impossible de rater cette conférence. &lt;a href="https://www.linkedin.com/in/ericalard/" rel="noopener noreferrer"&gt;Eric Alard&lt;/a&gt;, ancien bobeur ayant participé à cinq Jeux olympiques d’hiver, est désormais Responsable des relations École-Entreprises à l’ENI, coach, conférencier et auteur du livre *Devenez votre propre champion*.&lt;/p&gt;

&lt;p&gt;Le sport génère d’immenses émotions et souvenirs ; le présentateur s’appuie d’ailleurs sur des moments emblématiques du sport français pour raviver ces souvenirs. Aujourd'hui, nous nous trouvons à un carrefour où la data pourrait transformer nos prochains souvenirs.&lt;/p&gt;
&lt;h4&gt;
  
  
  La data au service de la performance
&lt;/h4&gt;

&lt;p&gt;Très populaire outre-Atlantique dans le baseball, le football américain ou le basketball, l’utilisation des données me rappelle le film Le Stratège. Ce film raconte l’histoire, vieille de plus de 20 ans, d’un entraîneur de baseball qui parvient à hisser son équipe au sommet de la Major League Baseball (MLB). Son succès repose sur une collaboration visionnaire avec un “data scientist” avant l’heure, qui a permis de constituer une équipe de joueurs complémentaires sur la base de statistiques.&lt;/p&gt;

&lt;p&gt;Mais revenons à notre présentation. En tant qu'ancien bobeur, le présentateur a lui-même constaté l’évolution technologique de son sport : l’apparition de capteurs, d'accéléromètres, et de données sur la vitesse. Ces informations sont devenues précieuses tant pour les athlètes que pour les entraîneurs, les aidant à optimiser les performances. La data transforme la préparation des sportifs et redéfinit le sport lui-même.&lt;/p&gt;

&lt;p&gt;Aujourd’hui, l’utilisation massive de données et leur précision touchent un éventail encore plus large de sports. Au rugby, par exemple, les joueurs utilisent des protège-dents équipés d’accéléromètres, ou des maillots dotés de poches intégrant un capteur GPS, permettant d’obtenir des données en temps réel et d’être plus prédictifs dans l’optique de remporter la victoire. En football, on admet souvent que l’équipe victorieuse est celle qui a parcouru le plus de kilomètres sur le terrain. Quant au cyclisme, l’une des équipes les plus performantes a développé des applications internes axées sur la diététique, ce qui a permis à trois de ses coureurs de remporter les trois principaux tours.&lt;/p&gt;

&lt;p&gt;Pour que la data représente un réel avantage, trois conditions sont nécessaires :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L’accès à la technologie&lt;/li&gt;
&lt;li&gt;Le traitement des données recueillies&lt;/li&gt;
&lt;li&gt;Des moyens financiers pour l'exploiter&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  La data pour enrichir l’expérience
&lt;/h4&gt;

&lt;p&gt;L’utilisation de la data ne se limite pas à la performance ; elle enrichit aussi l’expérience du sport. Le spectacle dépasse désormais l’événement lui-même et se prolonge bien au-delà, renforçant l'“expérience fan” et l’hyperconnexion. Le présentateur évoque le succès des derniers Jeux olympiques, notamment un moment dans la salle de basket de Lille : lors d’un temps-mort, la foule en délire ne soutenait pas les basketteurs mais Léon Marchand, en pleine finale à plusieurs centaines de kilomètres de là.&lt;/p&gt;

&lt;p&gt;Le sport est un miroir de notre société. Et quelle que soit l’avancée technologique, la machine la plus performante restera l’être humain, avec son libre arbitre, son génie et sa créativité. Ce sont ces éléments imprévisibles, ces exploits sportifs que même l’intelligence artificielle ne pourra prédire, qui continueront de nous faire vibrer et de créer nos souvenirs.&lt;/p&gt;

&lt;p&gt;Cette dernière conférence s'apparente à un TEDx avec un storytelling émotionnel travaillé. Certes moins technique, elle est plus accessible à tous, touchant un public plus large.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retour d'&lt;a href="https://www.linkedin.com/in/herv%C3%A9-martin-253a27125/" rel="noopener noreferrer"&gt;Hervé Martin&lt;/a&gt; - Abstract, feedbacks et replay à retrouver &lt;a href="https://devfest2024.gdgnantes.com/sessions/data_et_sport___la_revolution/" rel="noopener noreferrer"&gt;ici&lt;/a&gt;. Replay TEDx Orléans disponible &lt;a href="https://www.youtube.com/watch?v=qpEwq7SAZVE" rel="noopener noreferrer"&gt;sur YouTube&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Alors, pas trop peur ?
&lt;/h2&gt;

&lt;p&gt;Même placé sous le signe de la frayeur, cette édition du Devfest Nantes nous semble avoir été une véritable réussite. C'est toujours un plaisir de voir autant de passionnés réunis et nous sommes fiers d'avoir pu représenter l'équipe &lt;a href="https://www.groupeonepoint.com/fr/" rel="noopener noreferrer"&gt;Onepoint&lt;/a&gt; au cours de ces deux journées.&lt;/p&gt;

&lt;p&gt;Un grand bravo à l’équipe organisatrice du Devfest, mais aussi et surtout à toutes les personnes de &lt;a href="https://dev.to/onepoint"&gt;Onepoint&lt;/a&gt; qui ont rendu cet événement possible. Que ce soit à travers nos animations, nos conférences, ou votre visite sur le stand, ce que vous avez vécu avec nous est le résultat de plusieurs mois de travail acharné. Un immense merci à eux pour leur investissement !&lt;/p&gt;

&lt;p&gt;Merci également à &lt;a href="https://dev.to/onepoint"&gt;Onepoint&lt;/a&gt; et tout particulièrement à &lt;a href="https://www.linkedin.com/in/julien-guimier-3049aa3/" rel="noopener noreferrer"&gt;Julien Guimier&lt;/a&gt; et &lt;a href="https://www.linkedin.com/in/stephane-theou-470b2b/" rel="noopener noreferrer"&gt;Stéphane Théou&lt;/a&gt; pour nous avoir permis, une fois de plus, d'assister et participer à un tel événement !&lt;/p&gt;

&lt;p&gt;Riche en rencontres et en découvertes, ce Devfest Nantes 2024 restera gravé dans nos mémoires ! Merci à toutes celles et ceux qui ont pris le temps de venir discuter avec nous et découvrir nos animations pendant ces deux journées. On se donne rendez-vous l’année prochaine pour de nouvelles aventures toujours plus innovantes et surprenantes ! D’ici là, prenez le temps de revivre cette édition à travers les &lt;a href="https://www.youtube.com/watch?v=xuKrkOh_mzk&amp;amp;list=PLuZ_sYdawLiWenx-X315dfZNOaliVnSTY" rel="noopener noreferrer"&gt;rediffusions des conférences&lt;/a&gt;, les &lt;a href="https://photos.app.goo.gl/iQPsdQ8KKeXH8JrT8" rel="noopener noreferrer"&gt;photos de l'événement&lt;/a&gt; et notre &lt;a href="https://www.youtube.com/watch?v=YfIdOj4wK5g&amp;amp;pp=ygUTZGV2ZmVzdCBuYW50ZXMgMjAyNA" rel="noopener noreferrer"&gt;aftermovie&lt;/a&gt;. À très bientôt !&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YfIdOj4wK5g"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>techtalks</category>
      <category>devfest</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>ArchUnit : comment l'utiliser pour contrôler l'architecture de vos projets Java</title>
      <dc:creator>Arthur Rousseau</dc:creator>
      <pubDate>Tue, 25 Jun 2024 07:11:00 +0000</pubDate>
      <link>https://dev.to/onepoint/archunit-comment-lutiliser-pour-controler-larchitecture-de-vos-projets-java-388k</link>
      <guid>https://dev.to/onepoint/archunit-comment-lutiliser-pour-controler-larchitecture-de-vos-projets-java-388k</guid>
      <description>&lt;p&gt;Vous êtes développeur et vous vous lancez dans la conception d'un nouveau projet ? L'une des premières étapes cruciales consiste à déterminer l'architecture logicielle qui sera utilisée. "Les classes seront-elles regroupées par couche ou par fonctionnalité ?". "Est-il préférable d'avoir une architecture MVC, MVP, hexagonale, etc... ?". "Devons-nous envisager un découpage par module ?". Ce sont autant de questions auxquelles il vous faudra répondre avant même d'écrire votre première ligne de code.&lt;/p&gt;

&lt;p&gt;Cependant, la vraie difficulté commence une fois l'architecture définie. Le plus dur reste désormais de s'assurer que l'ensemble des développements respecte les règles que vous vous êtes fixées. Je ne compte plus le nombre de fois où j'ai pu déceler des soucis architecturaux lors de merge requests. "Cette classe devrait plutôt être dans tel package", "cette classe ne devrait pas utiliser ces modèles".&lt;/p&gt;

&lt;p&gt;Cette situation vous semble familière ? Et si je vous disais qu'il existe un outil qui peut faire ces contrôles à votre place ? ArchUnit est une librairie Java qui va vous permettre de vérifier automatiquement que votre code respecte vos règles d'architecture. Nul besoin d'outil externe, le tout est validé au travers de vos tests unitaires ! Dites au revoir aux contrôles manuels, faillibles et chronophages. Dans cet article, je vais vous présenter comment utiliser ArchUnit au travers de cas d'usage concrets, sélectionnés à partir de ce que j'ai pu mettre en place sur mes précédents projets.&lt;/p&gt;

&lt;p&gt;Bien qu'il soit préférable d'utiliser ArchUnit aux prémices de votre projet, vous constaterez qu'il est tout à fait possible de l'intégrer à un projet déjà bien avancé. Afin que vous puissiez avoir des exemples concrets auxquels vous référer, cet article contient de nombreux extraits de code. Pour simplifier leur lecture, certains d'entre eux ont été abrégés, mais l'exhaustivité des sources présentées est disponible dans le dépôt GitHub &lt;a href="https://github.com/4rthurRousseau/archunit-sample-project" rel="noopener noreferrer"&gt;archunit-sample&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ArchUnit, qu'est-ce que c'est ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz4wz8ex97v0012c6y5y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz4wz8ex97v0012c6y5y.png" alt="ArchUnit logo" width="580" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ArchUnit est une librairie conçue pour vérifier automatiquement l'architecture logicielle de votre application au travers de n'importe quel framework de test Java (typiquement, JUnit).&lt;/p&gt;

&lt;p&gt;Grâce à ArchUnit, vous pouvez définir des règles architecturales qui seront alors contrôlées au travers de tests unitaires. En cas d'échec, ces tests unitaires vous indiquent clairement les violations constatées et comment y remédier.&lt;/p&gt;

&lt;p&gt;Techniquement, ArchUnit repose sur l'analyse du bytecode Java, et sa matérialisation sous &lt;a href="https://www.javadoc.io/doc/com.tngtech.archunit/archunit/latest/com/tngtech/archunit/core/domain/package-summary.html" rel="noopener noreferrer"&gt;forme de classes spécifiques à ArchUnit&lt;/a&gt;. Par exemple, les classes &lt;a href="https://www.javadoc.io/doc/com.tngtech.archunit/archunit/latest/com/tngtech/archunit/core/domain/JavaClass.html" rel="noopener noreferrer"&gt;&lt;code&gt;JavaClass&lt;/code&gt;&lt;/a&gt; et &lt;a href="https://www.javadoc.io/doc/com.tngtech.archunit/archunit/latest/com/tngtech/archunit/core/domain/JavaMethod.html" rel="noopener noreferrer"&gt;&lt;code&gt;JavaMethod&lt;/code&gt;&lt;/a&gt; représentent respectivement les classes et les méthodes de votre projet.&lt;/p&gt;

&lt;p&gt;Son intégration simple et ses capacités d'extension font d'ArchUnit un outil de choix pour détecter automatiquement les écarts architecturaux, et ce dès les premières étapes de développement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intégration d'ArchUnit et création de votre première règle
&lt;/h2&gt;

&lt;p&gt;Au sein d'un projet qui utilise déjà JUnit, l'intégration d'ArchUnit ne nécessite que l'ajout de la librairie &lt;code&gt;archunit-junit5&lt;/code&gt; (ou &lt;code&gt;archunit-junit4&lt;/code&gt;, si vous utilisez toujours JUnit 4). &lt;br&gt;
Exemple d'intégration via Gradle :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;testImplementation 'com.tngtech.archunit:archunit-junit5:1.3.0'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintenant qu'ArchUnit est intégré à votre projet, il est temps de créer votre premier test d'architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;[...]&lt;/span&gt;

&lt;span class="c1"&gt;// Si vous utilisez JUnit 4, pensez à utiliser le runner ArchUnitRunner via l'annotation @RunWith(ArchUnitRunner.class)&lt;/span&gt;
&lt;span class="nd"&gt;@AnalyzeClasses&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"fr.arthurrousseau.archunit"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// #1&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ArchitectureTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@ArchTest&lt;/span&gt; &lt;span class="c1"&gt;// # 2&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="no"&gt;SERVICES_MUST_BE_ANNOTATED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// #3&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideInAPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..service.impl"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// #4&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;beAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// # 5&lt;/span&gt;

    &lt;span class="c1"&gt;// Les règles peuvent être déclarées sous forme de méthodes ou de variables statiques&lt;/span&gt;
    &lt;span class="nd"&gt;@ArchTest&lt;/span&gt; &lt;span class="c1"&gt;// #2&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;testThatClassesInDomainImplPackageMustBeAnnotated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JavaClasses&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="n"&gt;rule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// #3&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideInAPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..service.impl"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// #4&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;beAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// #5&lt;/span&gt;
        &lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;check&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/src/test/java/fr/arthurrousseau/archunit/ArchitectureTest.java" rel="noopener noreferrer"&gt;ArchitectureTest.java - Github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Décortiquons ensemble les informations présentes dans l'extrait de code ci-dessus.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;#1 - L'annotation &lt;code&gt;@AnalyzeClasses&lt;/code&gt; permet d'indiquer les classes qui seront testées par ArchUnit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#2 - L'annotation &lt;code&gt;@ArchTest&lt;/code&gt; (en remplacement de l'annotation &lt;code&gt;@Test&lt;/code&gt;) rend possible l'injection des &lt;code&gt;JavaClass&lt;/code&gt; au sein de vos méthodes de test.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3 - La méthode &lt;code&gt;.that()&lt;/code&gt; permet de ne conserver que les classes qui correspondent aux conditions qui suivent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#4 - La méthode &lt;code&gt;.should()&lt;/code&gt; applique les règles qui suivent aux classes qui ont été conservées.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le test ci-dessus permet donc de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;#1 - Charger l'ensemble des classes présentes dans le package &lt;code&gt;fr.arthurrousseau.archunit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;#3 - Filtrer et ne conserver que les classes qui sont présentes dans le package &lt;code&gt;*.service.impl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;#4 - Vérifier que l'ensemble des classes qui correspondent à ces filtres sont annotées avec l'annotation &lt;code&gt;@Service&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour tester cette règle, admettons qu'au sein de votre projet vous disposez d'une classe &lt;code&gt;ProductServiceImpl&lt;/code&gt; n'étant pas annotée &lt;code&gt;@Service&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;fr.arthurrousseau.archunit.products.service.impl&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// [...]&lt;/span&gt;

&lt;span class="nd"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductServiceImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ProductService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;[...]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voici le résultat que retournerait l'exécution des tests d'architecture :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'classes that reside in a package '..service.impl' should be annotated with @Service' was violated (1 times):
Class &amp;lt;fr.arthurrousseau.archunit.products.service.impl.ProductServiceImpl&amp;gt; is not annotated with @Service in (ProductServiceImpl.java:0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La classe &lt;code&gt;ProductServiceImpl&lt;/code&gt; ne respectant pas la règle décrite, le test échoue. Les informations tracées lors de l'exécution des tests ArchUnit permettent de cibler l'origine du problème.&lt;/p&gt;

&lt;p&gt;Aussi simple soit-elle, cette première règle vous rapproche un peu plus de l'automatisation du contrôle de l'architecture de votre projet !&lt;/p&gt;

&lt;h2&gt;
  
  
  Mise en place de règles unitaires et composites
&lt;/h2&gt;

&lt;p&gt;Maintenant que vous avez écrit votre première règle ArchUnit, passons à son intégration dans un projet plus complet. A partir de maintenant, les extraits de code qui suivent sont issus du projet &lt;a href="https://github.com/4rthurRousseau/archunit-sample-project" rel="noopener noreferrer"&gt;archunit-sample&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Le package &lt;code&gt;controller&lt;/code&gt; contient les classes qui exposent les points d'entrée permettant d'effectuer des opérations sur les produits que gère le projet.&lt;br&gt;
Afin de s'assurer de la cohérence de nos points d'entrée, il a été décidé que l'ensemble des controllers soient annotés avec l'annotation &lt;code&gt;@Controller&lt;/code&gt;, possèdent le suffixe &lt;code&gt;Controller&lt;/code&gt; et soient positionnés à la racine du package &lt;code&gt;..controller&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cette cohérence peut être assurée à l'aide des trois &lt;strong&gt;règles unitaires&lt;/strong&gt; suivantes :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="no"&gt;CONTROLLER_NAMING_RULE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;areAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;haveSimpleNameEndingWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Controller"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="no"&gt;CONTROLLER_ANNOTATION_RULE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;haveSimpleNameEndingWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Controller"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;beAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="no"&gt;CONTROLLER_LOCATION_RULE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;areAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideInAPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..controller"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais elles peuvent également être regroupées au sein d'une seule et même &lt;strong&gt;règle composite&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="no"&gt;CONTROLLER_RULE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;areAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;or&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;haveSimpleNameEndingWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Controller"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideInAPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..controller"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andShould&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;beAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andShould&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;haveSimpleNameEndingWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Controller"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/src/test/java/fr/arthurrousseau/archunit/ControllerTest.java" rel="noopener noreferrer"&gt;ControllerTest.java - Github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En regroupant ces vérifications au sein d'une seule et même règle, vous centralisez vos contrôles, vous rendez plus naturelle la compréhension de vos règles et vous simplifiez leur maintenance (si demain vous décidiez de modifier votre règle pour utiliser des &lt;code&gt;@RestController&lt;/code&gt; plutôt que des &lt;code&gt;@Controller&lt;/code&gt;, vous n'auriez qu'une seule règle à modifier).&lt;/p&gt;

&lt;h2&gt;
  
  
  Aller plus loin à l'aide des conditions personnalisées
&lt;/h2&gt;

&lt;p&gt;Toujours pour assurer la cohérence des points d'entrée, voyons comment faire pour s'assurer que ceux-ci ne manipulent que des objets qui leur sont dédiés. Interdiction donc de recevoir ou de renvoyer des objets du package &lt;code&gt;domain&lt;/code&gt; : les objets utilisés devront provenir du package &lt;code&gt;controller.model&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bien qu'ArchUnit mette à disposition un &lt;a href="https://javadoc.io/doc/com.tngtech.archunit/archunit/latest/com/tngtech/archunit/lang/conditions/ArchConditions.html" rel="noopener noreferrer"&gt;grand nombre de méthodes&lt;/a&gt; (163 à date) permettant de vérifier que vos classes respectent les règles que vous avez fixées (comme par exemple, les méthodes &lt;code&gt;beAnnotatedWith&lt;/code&gt; et &lt;code&gt;haveSimpleNameEndingWith&lt;/code&gt; que vous avez utilisées jusqu'à présent), vous aurez parfois besoin d'aller plus loin.&lt;/p&gt;

&lt;p&gt;Pour mettre en place cette nouvelle règle vous allez devoir utiliser une &lt;strong&gt;condition personnalisée&lt;/strong&gt;. Ce type de condition va vous permettre de mettre en place des règles plus poussées avec une extrême simplicité. En effet, il vous suffit d'étendre la classe &lt;code&gt;ArchCondition&lt;/code&gt; et implémenter la méthode &lt;code&gt;check&lt;/code&gt; pour lui faire faire ce que vous souhaitez !&lt;/p&gt;

&lt;p&gt;Voici la signature de la méthode que vous devrez implémenter :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JavaClass&lt;/span&gt; &lt;span class="n"&gt;clazz&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ConditionEvents&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le premier paramètre, &lt;code&gt;clazz&lt;/code&gt;, correspond à la classe qui est en train d'être contrôlée. Le second paramètre, &lt;code&gt;events&lt;/code&gt;, fait office de registre de violations de règles. A chaque fois qu'une violation sera constatée sur la classe en cours de test, c'est au travers de cet objet qu'elle devra être tracée.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UseDtoObjectsOnly&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ArchCondition&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;JavaClass&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UseDtoObjectsOnly&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"use DTO objects only"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// #1&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JavaClass&lt;/span&gt; &lt;span class="n"&gt;controllerClass&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ConditionEvents&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JavaMethod&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;controllerClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMethods&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;JavaClass&lt;/span&gt; &lt;span class="n"&gt;returnClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getReturnType&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toErasure&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;packageName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;returnClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPackageName&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"controller.model"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;returnClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSimpleName&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;endsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Dto"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// #2&lt;/span&gt;
                &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SimpleConditionEvent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;violated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Violation détectée"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// #3&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/src/test/java/fr/arthurrousseau/archunit/ControllerTest.java#L46" rel="noopener noreferrer"&gt;ControllerTest.java - Github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L'exemple ci-dessus présente une façon d'atteindre nos objectifs. Les éléments les plus importants de cette implémentation sont les suivants :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;#1 - Message associé à la condition, utilisé lorsque pour créer les traces d'erreur en cas de violation,&lt;/li&gt;
&lt;li&gt;#2 - On vérifie, au travers des objets fournis par ArchUnit, que l'objet retourné se trouve bien dans le package &lt;code&gt;controller.model&lt;/code&gt; et possède un nom qui termine par &lt;code&gt;Dto&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;#3 - &lt;code&gt;events.add(SimpleConditionEvent.**violated**(method, message));&lt;/code&gt; méthode permettant de tracer le fait que la méthode testée n'a pas respecté la condition personnalisée.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour utiliser cette condition, il suffit de l'associer à une nouvelle règle :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="no"&gt;CONTROLLER_RULE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;areAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;or&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;haveSimpleNameEndingWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Controller"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UseDtoObjectsOnly&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le controller &lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/src/main/java/fr/arthurrousseau/archunit/products/ProductControler.java" rel="noopener noreferrer"&gt;&lt;code&gt;ProductsController&lt;/code&gt;&lt;/a&gt; possède une méthode &lt;code&gt;add()&lt;/code&gt; qui prend en entrée un objet de type &lt;code&gt;Product&lt;/code&gt; qui réside dans le package &lt;code&gt;domain.model&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Controller&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductControler&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@PostMapping&lt;/span&gt;
    &lt;span class="nd"&gt;@ResponseStatus&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CREATED&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ProductDto&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;productService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La règle que vous venez de mettre en place lève une erreur et indique, comme vous pouviez vous y attendre, que ce controller manipule des données qui ne sont pas propres au package &lt;code&gt;controller.model&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'classes that are annotated with @Controller or have simple name ending with 'Controller' should use DTO objects only was violated (1 time):
Method fr.arthurrousseau.archunit.products.ProductControler.add() has a parameter fr.arthurrousseau.archunit.products.service.model.Product which is not in the controller.model package and / or does not end with Dto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ArchUnit et le concept de règles gelées
&lt;/h2&gt;

&lt;p&gt;Lors de l'ajout de nouvelles règles au sein de projets existants, il est possible qu'un certain nombre de violations existantes soient détectées. &lt;br&gt;
Parfois, leur nombre est tel qu'il n'est pas possible d'y remédier immédiatement. La meilleure façon de traiter ces violations consiste à les traiter petit à petit, de façon itérative. &lt;/p&gt;

&lt;p&gt;Les règles d'architecture peuvent être gelées à l'aide de la classe &lt;a href="https://www.javadoc.io/doc/com.tngtech.archunit/archunit/latest/com/tngtech/archunit/library/freeze/FreezingArchRule.html" rel="noopener noreferrer"&gt;FreezingArchRule&lt;/a&gt;. Le fait de geler une règle enregistre l'ensemble des violations actuelles dans un &lt;code&gt;ViolationStore&lt;/code&gt;. De cette façon, lors des prochaines exécutions, seules les nouvelles violations lèveront une erreur. Les violations listées lors du gel de la règle seront supprimées du &lt;code&gt;ViolationStore&lt;/code&gt; dès leur correction.&lt;/p&gt;

&lt;p&gt;Pour geler une règle, il suffit de l'encapsuler dans la méthode &lt;code&gt;FreezingArchRule.freeze(rule))&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="no"&gt;SERVICES_SHOULD_CALL_LOGGER_RULE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FreezingArchRule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;freeze&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="cm"&gt;/* Suite de la règle */&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/src/test/java/fr/arthurrousseau/archunit/ControllerTest.java#L23" rel="noopener noreferrer"&gt;ControllerTest.java - Github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En plus de cela, il vous sera nécessaire d'autoriser la création d'un nouveau store en créant un fichier &lt;code&gt;archunit.properties&lt;/code&gt; au sein des ressources de votre projet :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Permet la création du ViolationStore&lt;/span&gt;
&lt;span class="s"&gt;freeze.store.default.allowStoreCreation=true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/src/main/resources/archunit.properties" rel="noopener noreferrer"&gt;archunit.properties - Github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suite à la première exécution de cette règle gelée, vous constaterez qu'ArchUnit a créé deux nouveaux fichiers dans le dossier &lt;code&gt;archunit_store&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;#Tue Jun 04 23:48:33 CEST 2024&lt;/span&gt;
&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;NOM_DE_LA_REGLE&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="s"&gt;=2a2375fa-54ec-4fa7-b979-17478323ac4c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/archunit_store/stored.rules" rel="noopener noreferrer"&gt;stored.rules - Github.com&lt;/a&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Method fr.arthurrousseau.archunit.products.service.impl.Products.deleteProduct() doesn't log anything
Method fr.arthurrousseau.archunit.products.service.impl.Products.getAllProducts() doesn't log anything
Method fr.arthurrousseau.archunit.products.service.impl.Products.getProductById() doesn't log anything
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/archunit_store/2a2375fa-54ec-4fa7-b979-17478323ac4c" rel="noopener noreferrer"&gt;2a2375fa-54ec-4fa7-b979-17478323ac4c - Github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le premier fichier contient la liste des règles gelées et leurs identifiants. Le second fichier contient quant à lui l'ensemble des violations existantes au moment du gel de la règle. Chaque règle gelée possède son propre fichier, nommé en fonction d'un identifiant unique généré par ArchUnit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contrôler l'architecture globale de votre application
&lt;/h2&gt;

&lt;p&gt;Si vous souhaitez vous assurer que l'architecture globale de votre projet est respectée, alors vous aurez besoin d'utiliser des fonctions du package &lt;code&gt;com.tngtech.archunit.library&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ce package comporte une large collection de règles prédéfinies qui seraient complexes à mettre en place au travers de simples règles.&lt;/p&gt;

&lt;p&gt;Dans le cadre du projet &lt;a href="https://github.com/4rthurRousseau/archunit-sample-project" rel="noopener noreferrer"&gt;archunit-sample&lt;/a&gt;, voici les règles qui composent l'architecture globale du projet :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le package &lt;code&gt;controller&lt;/code&gt; n'est accédé par aucun autre package. Ce package a accès au package &lt;code&gt;service&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Le package &lt;code&gt;service&lt;/code&gt; est indépendant, il ne dépend ni du package &lt;code&gt;controller&lt;/code&gt;, ni du package &lt;code&gt;repository&lt;/code&gt;*.&lt;/li&gt;
&lt;li&gt;Le package &lt;code&gt;repository&lt;/code&gt; n'est accédé par aucun autre package*. Ce package a accès au package &lt;code&gt;service&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(*) Techniquement, le package service est indépendant des autres puisqu'il expose une interface &lt;code&gt;ProductRepository&lt;/code&gt; qui est implémentée par le package repository.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo01apykymzlqq0mryk0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo01apykymzlqq0mryk0x.png" alt="Graph de dépendance du projet archunit-sample" width="658" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cette architecture peut être vérifiée à l'aide de la règle ci-dessous :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="no"&gt;LAYERED_ARCHITECTURE_TEST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layeredArchitecture&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;consideringOnlyDependenciesInLayers&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Controller"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;definedBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..controller.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Service"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;definedBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..service.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Data"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;definedBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..data.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whereLayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Controller"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mayNotBeAccessedByAnyLayer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whereLayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Controller"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mayOnlyAccessLayers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Service"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whereLayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Service"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mayNotAccessAnyLayer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whereLayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Data"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mayOnlyBeAccessedByLayers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Service"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/4rthurRousseau/archunit-sample-project/blob/solution/src/test/java/fr/arthurrousseau/archunit/ArchitectureTest.java#L20" rel="noopener noreferrer"&gt;ControllerTest.java - Github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Au travers d'une syntaxe simple, chacun des packages du projet est associé à une couche de l'architecture de l'application. Chacune des couches déclarées peut alors spécifier à quelle autre couche elle a accès, mais aussi quelle autre couche a droit d'y accéder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Que retenir de l'utilisation d'ArchUnit ?
&lt;/h2&gt;

&lt;p&gt;Mettre en place l'architecture logicielle d'un projet est une chose, s'assurer qu'elle soit respectée et maintenue en est une autre.&lt;/p&gt;

&lt;p&gt;ArchUnit permet de définir et de vérifier automatiquement que votre projet respecte les règles architecturales que vous vous êtes fixées. En vous affranchissant de ces vérifications manuelles, vous aurez plus de temps pour vous concentrer sur ce qui compte vraiment pour vous : produire du code de qualité et développer de nouvelles fonctionnalités innovantes pour vos clients.&lt;/p&gt;

&lt;p&gt;L'intégration d'ArchUnit dans vos projets Java est simple et rapide : il vous suffit d'ajouter la librairie qui correspond à votre version de JUnit et le tour est joué ! Sa flexibilité et son extensibilité en font un outil puissant capable de s'adapter aux besoins spécifiques de chaque projet. De plus, la possibilité de geler des règles vous permet de remédier progressivement aux violations existantes, sans impact immédiat sur vos développements.&lt;/p&gt;

&lt;p&gt;Vous êtes en quête d'idées de règles à appliquer à vos projets ? N'hésitez pas à consulter la &lt;a href="https://www.archunit.org/userguide/html/000_Index.html#_what_to_check" rel="noopener noreferrer"&gt;documentation officielle&lt;/a&gt; d'ArchUnit. Vous y trouverez de nombreux cas d'usage qui pourront vous aider à trouver l'inspiration.&lt;/p&gt;

&lt;p&gt;Pour les utilisateurs avancés, voici quelques pistes que vous pourriez explorer pour aller plus loin.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mettre en place une règle pour vérifier que vous n'avez pas d'annotations &lt;code&gt;@Autowired&lt;/code&gt; sur vos attributs (préférez les injections par constructeur),&lt;/li&gt;
&lt;li&gt;Exporter vos règles dans une librairie dédiée (idéal si vous avez de nombreux projets qui doivent respecter les mêmes règles),&lt;/li&gt;
&lt;li&gt;Générer vos règles ArchUnit à partir de diagrammes de classe PlantUML (exemple &lt;a href="https://www.archunit.org/userguide/html/000_Index.html#_plantuml_component_diagrams_as_rules" rel="noopener noreferrer"&gt;à cette adresse&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si à la suite de cet article vous avez sauté le pas, n'hésitez pas à partager vos retours d'expérience. Je suis curieux de savoir comment vous avez adopté ArchUnit au sein de vos applications !&lt;/p&gt;

</description>
      <category>java</category>
      <category>testing</category>
      <category>archunit</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
