<?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: Onepoint</title>
    <description>The latest articles on DEV Community by Onepoint (@onepoint).</description>
    <link>https://dev.to/onepoint</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%2Forganization%2Fprofile_image%2F2096%2F304cfb40-6047-424d-b66a-2807ca1d61f0.jpg</url>
      <title>DEV Community: Onepoint</title>
      <link>https://dev.to/onepoint</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/onepoint"/>
    <language>en</language>
    <item>
      <title>Generating an aerial view of your project with OpenRewrite</title>
      <dc:creator>Kosmik</dc:creator>
      <pubDate>Wed, 25 Mar 2026 13:10:52 +0000</pubDate>
      <link>https://dev.to/onepoint/generating-an-aerial-view-of-your-project-with-openrewrite-49kk</link>
      <guid>https://dev.to/onepoint/generating-an-aerial-view-of-your-project-with-openrewrite-49kk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Read it in &lt;a href="https://jtama.github.io/posts/g-n-rer-une-vue-a-rienne-de-votre-projet-avec-openrewrite/" rel="noopener noreferrer"&gt;french here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the previous article, we discussed (well, &lt;em&gt;I wrote, you read&lt;/em&gt;) &lt;a href="https://jtama.github.io/posts/technique-avanc-e-d-openrewrite-orchestrer-des-refactorings-complexes-avec-les-scanningrecipe/" rel="noopener noreferrer"&gt;Scanning Recipes&lt;/a&gt; when you need complete information to make a decision, or to generate code &lt;em&gt;ex nihilo&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I promised you a little toy at the end... The time has come for the reveal: the &lt;strong&gt;Project Graph Generator&lt;/strong&gt;.&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%2F5u8t7btttr934mtnn9l2.gif" 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%2F5u8t7btttr934mtnn9l2.gif" alt="Aerial view of the architecture generated by the tool" width="200" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Need: Mapping Your Code
&lt;/h2&gt;

&lt;p&gt;It’s sometimes difficult to get a global view of the dependencies within your own code. Is this package too tightly coupled to others? What is the central class of my domain? Has my wonderful initial design withstood the ravages of time?&lt;/p&gt;

&lt;p&gt;Since &lt;a href="https://docs.openrewrite.org/" rel="noopener noreferrer"&gt;OpenRewrite&lt;/a&gt; already knows how to build the complete &lt;strong&gt;LST&lt;/strong&gt; of your codebase, it’s not &lt;em&gt;exactly&lt;/em&gt; complicated to traverse it to deduce relationships.&lt;/p&gt;

&lt;p&gt;This is exactly the goal of the &lt;a href="https://github.com/jtama/project-graph-generator" rel="noopener noreferrer"&gt;project-graph-generator&lt;/a&gt; project: scanning your sources to deduce a dependency graph and produce a simple HTML page using &lt;a href="https://d3js.org/" rel="noopener noreferrer"&gt;D3.js&lt;/a&gt; to display it.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Oh thou, who doesn’t want to know more, but only wants to play with the graph, go no further than this chapter, you might gain some knowledge!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The project is easily usable via the &lt;code&gt;rewrite-maven-plugin&lt;/code&gt; &lt;a href="https://docs.openrewrite.org/running-recipes" rel="noopener noreferrer"&gt;or any other way to trigger an OpenRewrite recipe&lt;/a&gt;. Here is the command to launch a complete analysis of your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=io.github.jtama:project-graph-generator:RELEASE \ ①
-Drewrite.activeRecipes=io.github.jtama.openrewrite.ProjectAerialViewGenerator \
-Drewrite.exportDatatables=true
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;RELEASE&lt;/code&gt; = &lt;code&gt;latest&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the analysis is complete, the plugin generates a standalone HTML file containing the data AND the visualization. Simply open the &lt;code&gt;class-diagram.html&lt;/code&gt; file at the root of your project in your browser to explore the web of your architecture.&lt;/p&gt;

&lt;p&gt;You can also pass additional options to filter the nodes according to your needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;maxNodes=20&lt;/code&gt;&lt;/strong&gt;\
Filters for classes with the highest number of incoming connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;basePackages=com.mycompany&lt;/code&gt;&lt;/strong&gt;\
Forces the target base package&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;includeTests=true&lt;/code&gt;&lt;/strong&gt;\
Also include test classes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To learn more 👉 &lt;a href="https://github.com/jtama/project-graph-generator" rel="noopener noreferrer"&gt;Here is the project repository&lt;/a&gt;. Go ahead, it’s open source, use it, fork it, make issues and pull requests!&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%2Foswdgbdxowhh4oeounsq.gif" 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%2Foswdgbdxowhh4oeounsq.gif" alt="please" width="320" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mechanics: Analysis Without Modification
&lt;/h2&gt;

&lt;p&gt;Under the hood, the tool is based on the &lt;strong&gt;ScanningRecipe&lt;/strong&gt; concept we saw previously. The major difference here is that the &lt;strong&gt;generation&lt;/strong&gt; phase generates &lt;strong&gt;&lt;em&gt;HTML&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;, and the *modification&lt;/em&gt;* phase (&lt;code&gt;visit&lt;/code&gt;) does nothing, nada, zilch. The &lt;del&gt;entire goal&lt;/del&gt; of the recipe is concentrated in the first pass: scanning the &lt;strong&gt;LST&lt;/strong&gt;. Well, no, not the goal, rather the intelligence (not the A.I. kind).&lt;/p&gt;

&lt;p&gt;It all starts with an accumulator - our famous graph - which will store the classes (Nodes) and their relationships (Links) as the scan progresses:&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;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GraphScanAccumulator&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;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nodes&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;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ①&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;links&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;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// ... search methods findNode() and findLink()&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Did you seriously think I was going to explain this line?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To fill this graph, we will traverse the &lt;strong&gt;LST&lt;/strong&gt; using a &lt;code&gt;JavaIsoVisitor&lt;/code&gt;.&lt;br&gt;
First, we identify each component of our architecture by overriding the &lt;code&gt;visitClassDeclaration&lt;/code&gt; method. Each new class encountered becomes a "Node":&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;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="no"&gt;J&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ClassDeclaration&lt;/span&gt; &lt;span class="nf"&gt;visitClassDeclaration&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;J&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ClassDeclaration&lt;/span&gt; &lt;span class="n"&gt;classDecl&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ExecutionContext&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;)&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;includeTests&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isTestClass&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getCursor&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&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;classDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getType&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;fqn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getType&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getFullyQualifiedName&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findNode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fqn&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;orElseGet&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// ②&lt;/span&gt;
                &lt;span class="nc"&gt;Node&lt;/span&gt; &lt;span class="n"&gt;newNode&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;Node&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fqn&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;classDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getType&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="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nodes&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="n"&gt;newNode&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;newNode&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="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visitClassDeclaration&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classDecl&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&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;classDecl&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;ol&gt;
&lt;li&gt;We only look at test classes if explicitly requested.&lt;/li&gt;
&lt;li&gt;We use our &lt;code&gt;graph&lt;/code&gt; accumulator to register the current class if it hasn’t been seen already.&lt;/li&gt;
&lt;li&gt;We don’t forget to call &lt;code&gt;super&lt;/code&gt; so that the visitor continues to descend into the tree. &lt;strong&gt;&lt;em&gt;If and only if&lt;/em&gt;&lt;/strong&gt; the class is of interest to us, otherwise, we don’t waste our time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next, we must weave the web. How do we know that class &lt;code&gt;A&lt;/code&gt; depends on class &lt;code&gt;B&lt;/code&gt;? We simply capture type usages (method calls, fields access, instantiations). For example, here’s how we proceed for method invocations:&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;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="no"&gt;J&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MethodInvocation&lt;/span&gt; &lt;span class="nf"&gt;visitMethodInvocation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;J&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MethodInvocation&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ExecutionContext&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;)&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;mi&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="na"&gt;visitMethodInvocation&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="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ①&lt;/span&gt;

    &lt;span class="nc"&gt;JavaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FullyQualified&lt;/span&gt; &lt;span class="n"&gt;targetType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMethodType&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;mi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMethodType&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getDeclaringType&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&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;targetType&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;addLink&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;targetType&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&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;mi&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;ol&gt;
&lt;li&gt;Let the visitor visit.&lt;/li&gt;
&lt;li&gt;Extract the type information (&lt;code&gt;JavaType&lt;/code&gt;) carried by the invoked method to know which class it belongs to. The type can be &lt;code&gt;null&lt;/code&gt;, particularly if OpenRewrite failed to determine it.&lt;/li&gt;
&lt;li&gt;Invoke the &lt;code&gt;addLink&lt;/code&gt; method.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;addLink&lt;/code&gt; method contains all the logic allowing us to determine if the &lt;code&gt;targetType&lt;/code&gt; interests us, that is to say if it is part of the target packages. If so, we create a new link or strengthen an existing one.&lt;/p&gt;

&lt;p&gt;The same logic is obviously applied &lt;a href="https://github.com/jtama/project-graph-generator/blob/main/src/main/java/io/github/jtama/openrewrite/ProjectAerialViewGenerator.java#L118" rel="noopener noreferrer"&gt;to member references, class fields, constructor invocations, etc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the beauty of OpenRewrite’s model: the LST is already perfectly typed by the compiler during &lt;em&gt;parsing&lt;/em&gt;. We don’t need to guess who an invoked method belongs to, the type information tells us with certainty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going Further: Raw Export with Datatables
&lt;/h2&gt;

&lt;p&gt;Generating an HTML page is nice. But what if you want to cross-reference this data, render it yourself in a tool like &lt;a href="https://gephi.org/" rel="noopener noreferrer"&gt;Gephi&lt;/a&gt;, or even provide it as context to an LLM to audit your architecture?&lt;/p&gt;

&lt;p&gt;This is where OpenRewrite’s &lt;a href="https://docs.openrewrite.org/authoring-recipes/data-tables" rel="noopener noreferrer"&gt;Datatables&lt;/a&gt; come in. In addition to the view, &lt;code&gt;project-graph-generator&lt;/code&gt; can export metadata in the form of easily usable CSV files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;*&lt;code&gt;target/rewrite/datatables/io.github.jtama.openrewrite.model.NodesReport.csv&lt;/code&gt; *\
Contains all the classes found with their package and their number of incoming/outgoing connections.&lt;/li&gt;
&lt;li&gt;*&lt;code&gt;target/rewrite/datatables/io.github.jtama.openrewrite.model.LinksReport.csv&lt;/code&gt; *\
Exhaustive list of links between classes with an associated weight.&lt;/li&gt;
&lt;li&gt;*&lt;code&gt;target/rewrite/datatables/io.github.jtama.openrewrite.model.JavaSourceFileExcludedReport.csv&lt;/code&gt; *\
All classes that were excluded from the final result (often due to package filtering).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, it’s your turn. Run the scanner on your &lt;em&gt;legacy&lt;/em&gt;, and contemplate (or be frightened by) the extent of the web!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt;: As you may have noticed, this plugin is distributed on Maven Central (&lt;code&gt;io.github.jtama:project-graph-generator&lt;/code&gt;). If you’re wondering how to easily automate the entire publication chain without tearing your hair out, I recommend you take a look at &lt;a href="https://jtama.github.io/posts/en/release-everything-with-jreleaser/" rel="noopener noreferrer"&gt;my JReleaser tutorial&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>java</category>
      <category>jreleaser</category>
      <category>openrewrite</category>
      <category>graph</category>
    </item>
    <item>
      <title>TNT 2026</title>
      <dc:creator>Yann Schepens</dc:creator>
      <pubDate>Tue, 24 Feb 2026 08:01:36 +0000</pubDate>
      <link>https://dev.to/onepoint/tnt-2026-500n</link>
      <guid>https://dev.to/onepoint/tnt-2026-500n</guid>
      <description>&lt;p&gt;On ne le dira jamais assez, Touraine Tech, c’est un peu la madeleine de Proust de pas mal de conférenciers et conférencières. Il y a un côté "retour sur les bancs de l’école", ce qui est littéralement le cas, l’événement se déroulant dans les locaux de la Faculté des Sciences et Techniques de Tours.&lt;/p&gt;

&lt;p&gt;3ème édition pour moi cette année. Après avoir parlé d’ESI et d’Infra as Code, j’ai discuté de veille techno avec un nouveau format pour moi : le Quickie.&lt;/p&gt;

&lt;p&gt;Cette année, comme l’année dernière, nous débarquons avec une délégation onepoint. Trois Bordelais et trois Nantais. Un peu moins que les années précédentes, mais disons que ce sont les meilleurs…&lt;/p&gt;

&lt;h2&gt;
  
  
  Petit rappel sur TNT
&lt;/h2&gt;

&lt;p&gt;Cette conférence généraliste de l’IT, se déroulant sur deux jours, est un très bon endroit pour les primo-speakers comme pour les plus expérimentés. La plupart des speakers connaissent TNT ou, du moins, des membres de l’équipe d’organisation. C’est un point de rendez-vous annuel pour nombre d’entre eux, dans une ambiance toujours très bon enfant, mais très studieuse. Ici, on parle, on rigole et on apprend.&lt;/p&gt;

&lt;p&gt;Trêve de bavardages, allons découvrir ces deux jours.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'évènement
&lt;/h2&gt;

&lt;p&gt;TNT en est à sa 8ème édition. Il s’est déroulé pendant quelques années dans les locaux de Polytech’Tours mais, vu son succès, il investit maintenant la Faculté des Sciences. Les étudiants aident l’équipe organisatrice tout au long de l’événement, une particularité plutôt cool. Que ce soit pour l’installation, la logistique ou la gestion de la captation, ils sont partout. Bravo à eux, ce n’est pas facile de gérer tout un tas de développeurs en vadrouille.&lt;/p&gt;

&lt;p&gt;L’équipe organisatrice est composée de beaucoup de speakers et d’habitués des conférences et meetups, et ça se voit. Que ce soit au niveau de la planification, de la communication ou de la réactivité, l’événement est cadré, efficace et très professionnel, avec un accent important mis sur la bonne humeur et la bienveillance. C’est un confort incroyable pour tout le monde : speakers, sponsors et public.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 participants&lt;/li&gt;
&lt;li&gt;260 soumissions au CFP&lt;/li&gt;
&lt;li&gt;Diffusion en direct sur YouTube&lt;/li&gt;
&lt;li&gt;Atelier d’initiation aux premiers secours pendant l’événement&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Le lieu
&lt;/h2&gt;

&lt;p&gt;La Faculté des Sciences de Tours n’est plus toute jeune, et ça se voit. Par contre, elle a l’avantage de pouvoir accueillir sans problème cinq tracks dans cinq amphithéâtres. C’est une école, elle est donc bien équipée pour les conférences.&lt;/p&gt;

&lt;p&gt;Les lieux de passage peuvent être un peu étroits, surtout avec les stands, mais cela donne une petite impression de "retour à l’école" particulièrement drôle. Un barnum est aussi installé à l’extérieur pour les repas et le café. Cet endroit, un peu à l’écart, se prête bien au papotage sans gêner le passage entre les conférences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les soirées
&lt;/h2&gt;

&lt;p&gt;Autour de TNT, trois soirées : une "avant", une pour les speakers entre les deux jours, et une "après". Je ne peux pas aller à celle d'après (il faut bien rentrer à la maison !), mais je ne raterais pour rien au monde les deux premières.&lt;/p&gt;

&lt;p&gt;Cette année, comme l’an dernier, la première soirée s’est faite au Delirium Café. On ne va pas se mentir, le monde de l’IT et les brasseries ont une affinité particulière. Encore une occasion de revoir les connaissances avant de plonger dans le bain.&lt;/p&gt;

&lt;p&gt;Pour l’entre-deux, direction le Cubrik, dans le centre de Tours. Excellente soirée en très bonne compagnie. Cela faisait longtemps que je n'étais pas parti en conférence et ça m’a fait plaisir de revoir des têtes connues.&lt;/p&gt;

&lt;p&gt;C’est bien de faire la fête, mais l’important, ce sont les conférences !&lt;/p&gt;

&lt;h2&gt;
  
  
  Conférences
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Keynote d'ouverture "Tech vs bots, débuggons la démocratie"
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Clément Hammel-Cazenave CEO d'Agoratlas&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Qui de mieux pour ouvrir une conférence d'IT que le boss d'une entreprise spécialisée dans l'analyse de ce qu'il se passe dans les réseaux sociaux ; et plus précisement sur la notion de l'influence des réseaux sociaux et de manipulation des informations que l'on trouve dessus sur nos démocraties.&lt;/p&gt;

&lt;p&gt;Clément nous explique comment, techniquement et visuellement, ils font leur analyse et la génération des graphs (Méthode de Louvain). Je vous passe les détails, mais on constate très clairement la notion de récupération politique dans les communications sur les réseaux. Il appuie ces analyses avec des exemples assez importants, tel que les échanges entre Trump et Zelensky ou la crise des agriculteurs. On constate assez rapidement la création de faux comptes, la duplication de contenu et les différentes stratégies d'influences.&lt;/p&gt;

&lt;p&gt;En partant de ces états de fait, Clément prend de la hauteur et amène la notion de guerre de l'information et des usages par les différents états.&lt;/p&gt;

&lt;p&gt;Bref, le sujet est passionnant, autant techniquement que sur l'importance que ça a dans nos quotidiens.&lt;/p&gt;

&lt;p&gt;Pour conclure, quelques éléments que je souhaite mettre en avant : Viginum, Gephi, D3lta pour la tech et les organismes. Et enfin, Cadrer, Detecter, Réagir, Collaborer et SORTEZ DE X (Twitter).&lt;/p&gt;

&lt;p&gt;Merci beaucoup Clément.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onboarding 2.0 : Réinventer l'intégration des devs
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Hafsa ELMAIZI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : Avec 15ans d'expérience derrière-moi, je suis généralement côté intégration des équipes, ma vision est donc biaisée sur la façon dont son vécu les onboarding, surtout avec les plus juniors d'entre nous. Une piqure de rappel, et peut-être une nouvelle approche, me fera du bien.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Hafsa fait un constat que je partage : la plupart des onboarding sont nuls et mal faits. Il manque le materiel, les accès, une personne vous accueille pendant 1 heure et retourne à ces occupations, vous laissant là, au milieu du bureau, comme une ame en peine.&lt;/p&gt;

&lt;p&gt;Elle propose donc une structure, un plan, sur plusieurs mois permettant d'améliorer ce process, qui n'est pas qu'une formalité.&lt;/p&gt;

&lt;p&gt;Au travers différentes scénettes, Hafsa décrit chacune de ces étapes et les granularités et objectifs attendus. De l'intégration, la découverte de la culture d'entreprise, la création de lien et comment devenir performant, tout y passe.&lt;/p&gt;

&lt;p&gt;Que ce soit par les outils ou les intervenants, l'objectif de cette intégration est d'avoir un nouveau collaborateur en confiance, autonome et évidemment performant.&lt;/p&gt;

&lt;p&gt;Je vous conseille vivement d'aller voir cette conférence, qui au-delà de son côté "plein de bons sens", est très "terrain" et rapidement applicable.&lt;/p&gt;

&lt;p&gt;Merci Hafsa&lt;/p&gt;

&lt;h3&gt;
  
  
  Redécouvrir PHP : pratiques modernes au-delà de l’héritage
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Horacio Gonzalez (LostInBrittany)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : Parce que PHP, j'aime ce langage et même si je n'en fais plus régulièrement, ça reste mon langage de prédilection. Je veux connaitre les évolutions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Ouuuuuuuuuuuuuuiiiiiiiiiiiii, enfin, merci ! Ce sujet était dans mon backlog de conférence depuis quelques années, mais je n'ai jamais pris de temps de l'aborder. Et Horacio le fait extrêmement bien.&lt;/p&gt;

&lt;p&gt;Il reprend toutes les horreurs encore évoquées sur PHP aujourd'hui, se basant sur un PHP de... 2004. Il va falloir grandir un peu et se renseigner. Il évoque le fait qu'à de "se faire bully" par les autres développeurs, les développeurs PHP ont créé leur propre écosystème de conférence, de plateforme, etc. Clairement aussi qualitive que les plateformes généralistes.&lt;/p&gt;

&lt;p&gt;Il revoit toutes les évolutions du langage pour arriver aujourd'hui, et depuis quelques années en réalité, à un langage, des frameworks et des pratiques qui ressemblent peu ou prou à ce que propose l'ensemble des langages dit moderne.&lt;/p&gt;

&lt;p&gt;Il passe aussi sur l'omniprésence de ce langage et de son ecosystème sur Internet et les plateformes que nous utilisons au quotidien. Tout en montrant les évolutions présentes et à venir autour du langage.&lt;/p&gt;

&lt;p&gt;Et merci Horacio de bien faire la distinction entre Wordpress et le reste de l'écosystème PHP, on a pas la même démarche, car pas les mêmes besoins et/ou envies.&lt;/p&gt;

&lt;p&gt;J'en entends certains se dire : "impossible, c'est du PHP", ces gens sont nulles et incompétents pour un langage nul et inutile. Vous savez quoi, restez dans vos dogmes ou allez vous renseigner un minimum (d'ailleurs, faites attention, on utilise plus le franc maintenant, on est passé à l'euro).&lt;/p&gt;

&lt;p&gt;Ca fait du bien de voir ce genre de sujet arrivé dans des conférénces généralistes.&lt;/p&gt;

&lt;p&gt;Bravo !&lt;/p&gt;

&lt;h3&gt;
  
  
  Title, ce faux ami de l'accessibilité
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;François-Xavier Lair&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : Parce que FX déjà, ensuite le HTML, c'est juste la base de ce que nous développons et qui est visible par les utilisateurs, TOUS les utilisateurs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : FX que je vois sortir en courant de la salle, oubli de télécommande, puis qui se rend compte, au bout de 3 min (sur un quickie), qu'il n'est pas sur les bons slides et le son qui ne fonctionne pas, ca n'a pas de prix.&lt;/p&gt;

&lt;p&gt;Sinon, bonne (re)mise au point sûr d'usage de l'attribut title, les impacts sur l'accessibilité et surtout les alternatives à title pour les tooltips et les fonctionnalités de title. Découverte pour moi de l'attribut popover qui est vraiment intéressant.&lt;/p&gt;

&lt;p&gt;FX est toujours un très bon speaker, précis et efficace, d'autant plus qu'il imite hyyyyper bien le lecteur d'écran (et oui pas de son).&lt;/p&gt;

&lt;p&gt;Merci FX !&lt;/p&gt;

&lt;h3&gt;
  
  
  J'ai packagé mon application en image Docker, et maintenant ?
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Aurélie Vache&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : Parce que Aurélie. Et surtout comment assurer la sécurité dans notre chaine de fabrication.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Tiens ?! Aurélie sur un sujet tech, mais oui !&lt;/p&gt;

&lt;p&gt;Puis pas n'importe quel sujet : la mise en place de la norme SLSA dans le cas des réglementations CRA, NIS2, etc.&lt;/p&gt;

&lt;p&gt;Via cette conférence, Aurélie nous réexplique les failles potentielles sur une chaine de fabrication et la raison d'être du SLSA, et son côté très obscur d'ailleurs. Les notions de SBOM, VEX, In-toto, PURL nous sont expliqués ainsi que leur usage, mais le plus intéressant est la mise en pratique.&lt;/p&gt;

&lt;p&gt;En effet, elle met en œuvre, en live, les mécanismes de sécurisation de la chaine de fabrication de son image docker. Elle nous montre comment utilisez chacun des outils (et il y en a beaucoup), en nous conseillant sur les usages, et ce, de bout en bout de la chaine de fabrication.&lt;/p&gt;

&lt;p&gt;A son habitude, l'explication est claire et efficace. Pour m'être confronté au sujet, j'aurais préféré avoir vu cette conférence (ou avoir une petite Aurélie sur l'épaule) avant de m'y lancer.&lt;/p&gt;

&lt;p&gt;Au-delà d'être une excellente approche 360 autour du sujet, on repart avec une nouvelle boite à outils en sachant comment et à quoi sert chacun de ces outils.&lt;/p&gt;

&lt;p&gt;Merci Aurélie !&lt;/p&gt;

&lt;h3&gt;
  
  
  Fatigués de la POO ? Passer à la DOP !
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Jérôme Tama&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : Parce que Jérôme (oui, je choisis aussi en fonction de mes connaissances), En tant qu'adepte de la conception logicielle sous toutes ses coutures, forcement, la notion de DOP m'intrigue.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Jérôme et les démos live, on voit qu'il aime ça. Comme à son habitude, il prend un bout de code déjà existant et le reprend pour apporter les concepts.&lt;/p&gt;

&lt;p&gt;Il nous remontre comment utiliser correctement la POO, en cherchant à modéliser le réel. Là où sa conférence est particulièrement intéressante, c'est qu'il va s'appuyer sur les capacités avancées, ou non, de son langage pour arriver à ses fins.&lt;/p&gt;

&lt;p&gt;On arrive à un code élégant et efficace, il nous emmène à l'état de l'art de la conception et du langage, c'est un exemple.&lt;/p&gt;

&lt;p&gt;Merci Jérôme.&lt;/p&gt;

&lt;h3&gt;
  
  
  Un jardin sur sol vivant connecté, pourquoi et comment ?
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Alexandre Delegue&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : L'informatique est censé aider les gens, quoi de plus utile qu'un jardin ?.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Un talk sur le jardinage, sérieusement. Alexandre reprend les différents types d'agriculture, les mécanismes artificiels ou naturels pour faire pousser des plantes, l'impact de l'homme de manière très concrète sur la terre (avec un t minuscule).&lt;/p&gt;

&lt;p&gt;On parle de sol vivant, de grandes cultures, de serres tropicales et on finit avec un peu de domotique dans le jardin d'Alexandre qui nous explique comment il compte faire son jardin en s'appuyant sur ce qu'il a lu et un peu de tech.&lt;/p&gt;

&lt;p&gt;C'était ... rafraichissant :)&lt;/p&gt;

&lt;p&gt;Plus sérieusement, j'ai beaucoup aimé, de part à ma curiosité naturelle, ça ne parle vraiment pas de tech, hormis un peu à la fin. Et encore.&lt;/p&gt;

&lt;p&gt;Merci Alexandre :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Open-source : Pourquoi ? Comment ?
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Julien Deniau&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : Le titre. Sans l'opensource, notre métier serait bien différent. Il est important de contribuer, je veux découvrir cette approche.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Première fois que je vois Julien, et j'ai apprécié le personnage et l'approche. Il rappelle que tout le monde de l'IT tient sur le travail de quelques personnes... Que même nous, nous ne connaissons pas.&lt;/p&gt;

&lt;p&gt;Il nous coince avec un quizz sur les maintainer/créateurs de Curl, PHP, Java. On ne connait personne. Tristesse.&lt;/p&gt;

&lt;p&gt;Ensuite, s'envient la discussion sur les motivations à faire de l'opensource. L'argent, la notoriété, tester des trucs, pas vraiment. Par contre, développer de la connaissance oui ! Et quelques trucs cools, comme le fait de recevoir des remerciements, mais c'est réellement rare.&lt;/p&gt;

&lt;p&gt;Il nous donne quelques conseils pour se lancer dans l'opensource et rappelle, à juste titre, que l'opensource, ce n'est pas que produire du code. C'est aussi rapporter des bugs, proposer des évolutions, écrire des articles, etc.&lt;/p&gt;

&lt;p&gt;Deux choses importantes à ce sujet : l'IA pompe tout l'opensource, à vous d'en tirer vos conclusions. Et surtout, 1,5% de femmes dans l'opensource.&lt;/p&gt;

&lt;p&gt;Merci Julien pour tous ces messages !&lt;/p&gt;

&lt;h3&gt;
  
  
  Keynote de fermeture
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Jean-François Garreau&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Speechless : Extra&lt;/p&gt;

&lt;p&gt;La confrontation entre 4 speakers chevronné(e)s, qui ne connaissent pas le sujet, ni les slides et qui n'en sont clairement pas aidé. C'est toujours exceptionnels. Je ne sais pas si ce sera capté, mais si vous voulez voir du talent à l'état pur et passer un bon moment de rigolade, allez-y.&lt;/p&gt;

&lt;p&gt;Et toujours aussi malicieusement animé par Jean-François, qui manipule diaboliquement le public et les speakers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keynote ouverture : Gray hat, Black Hat, Users, Employés
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Mikael Robert, Yohann Boyer, Benjamin Chouraqui (pas là, mais un peu là)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Découverte pour moi d'un nouveau réseau social : Yubo. Encore un truc de jeune. Et surtout, encore un endroit où la cybersécurité est importante. Mais pas de la façon dont on l'aborde généralement.&lt;/p&gt;

&lt;p&gt;Mikaël et Yohann nous expliquent qu'aujourd'hui, le hacker, ce n'est pas seulement la personne hypercalé en tech. C'est aussi l'ado qui sait se servir de son téléphone et comprend le fonctionnement d'une appli pour en contourner l'usage. Et l'IA lui permet d'aller vite et plus loin.&lt;/p&gt;

&lt;p&gt;Ils reprennent les notions de Black/White/Grey hat et le fait qu'aujourd'hui, ces termes sont beaucoup plus flous. Ils présentent différents types d'attaque, inédites pour la plupart, et comment ils arrivent à les contrer. Au passage, il nous redonne les bonnes pratiques pour gérer efficacement les failles de sécurité, sans se précipiter et pour trouver les bonnes solutions.&lt;/p&gt;

&lt;p&gt;Cette keynote est une excellente keynote, elle remet les pieds sur Terre, est très pratique et, je pense, lucide la réalité.&lt;/p&gt;

&lt;p&gt;Merci, j'ai hate d'avoir le replay pour le diffuser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Serveurs MCP au-delà des bases : bonnes pratiques, choix de conception et leurs conséquences
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Horacio Gonzalez&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : J'ai suivi Jérôme. Et de toute façon, va falloir que je me renseigne un peu sur les MCP&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Avec beaucoup de slides, Horacio revient sur les problématiques liés à la communication entre une IA et nos API plus classique. Il développe donc le principe des serveurs MCP et leur fonctionnement. Son idée, avec laquelle je suis en phase, est que nous fait de l'API first, et maintenant, il faudra aussi avec un serveur MCP automatiquement pour pouvoir interconnecter l'ensemble du monde de l'IT.&lt;/p&gt;

&lt;p&gt;Nous ne sommes plus à l'étape de la découverte pour les MCP, mais à l'étape des bonnes pratiques. Il en liste d'ailleurs une bonne quantité qu'il met à disposition sur son dépôt Github (je vous laisse aller les chercher sur github, son pseudonyme est LostInBrittany).&lt;/p&gt;

&lt;p&gt;Merci Horacio, c'était très clair. Dès que la vidéo sort, jetez-vous dessus, il vous apprendra des choses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tricher pour apprendre : 30 minutes par jour pour rester curieux dans nos métiers de la tech
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Yann Schepens&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : Ai-je besoin de répondre à cette question ?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : MON PREMIER QUICKIE ! Ben ça s'est bien passé, je suis assez content. Mais c'est vrai que le format est vraiment particulier. Passer d'un deepdive à un quicky, ça fait bizarre.&lt;/p&gt;

&lt;p&gt;Un passage à 13h avec pas mal de monde (merci à Estelle Landry d'ailleurs qui a poussé les gens à venir me voir), dont quelques guests stars :)&lt;/p&gt;

&lt;p&gt;Pas mal de bons retours, juste après ou dans les couloirs. Pour un sujet hors tech, c'est toujours agréable.&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%2F6xj79e17z3mgg5z1guv4.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%2F6xj79e17z3mgg5z1guv4.png" alt=" " width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Local-first et sync-engines, l'architecture du futur ?
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Benjamin Legrand&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pourquoi j'y vais&lt;/em&gt; : Parce que Benjamin. Même si je ne comprends pas tout, j'apprends toujours des super trucs&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mon avis&lt;/em&gt; : Je n'ai pas pris de note. Mais c'était bien. Plus sérieusement, Benjamin nous ramène un peu sur une logique qui devrait être standard, pourquoi dépendre d'un système moins stable que notre propre système de stockage ? Et d'un point de performance, ce n'est quand même pas la même chose non plus.&lt;/p&gt;

&lt;p&gt;Il amène aussi un second point qui en découle, le stockage de données décentralisé qui modifie grandement la façon d'aborder la persistance des infos.&lt;/p&gt;

&lt;p&gt;Il propose plusieurs solutions existantes, notamment sur les aspects synchronisations et pose l'ensemble des avantages et inconvénients liés à ces mécaniques.&lt;/p&gt;

&lt;p&gt;Merci Benjamin, j'adore tes conférences, elles n'ont jamais l'air vraiment fini :P&lt;/p&gt;

&lt;h2&gt;
  
  
  Le mot de la fin : Une édition "Grand Cru" (Par Gemini)
&lt;/h2&gt;

&lt;p&gt;(J'ai relu et je suis d'accord quand même)&lt;/p&gt;

&lt;p&gt;On repart de cette 8ème édition de Touraine Tech avec la tête bien pleine et le sourire aux lèvres. Si la faculté des sciences de Tours nous offre ce petit côté "nostalgie des bancs de l'école", le contenu, lui, était résolument tourné vers l'avenir.&lt;/p&gt;

&lt;p&gt;Cette année 2026 marque un tournant dans nos préoccupations de développeurs et de tech leads :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La sécurité n'est plus une option : Entre la sécurisation des chaînes de fabrication (SLSA) d'Aurélie, les enjeux de modération sur les réseaux sociaux et la lutte contre les bots, nous sommes les nouveaux gardiens de la confiance numérique.&lt;/li&gt;
&lt;li&gt;L'humain au cœur du code : Que ce soit par un onboarding soigné, la redécouverte de la noblesse de langages comme PHP ou l'investissement dans l'open-source, notre métier est avant tout une affaire de transmission et de passion.&lt;/li&gt;
&lt;li&gt;L'IA devient concrète : Avec les serveurs MCP, nous sortons du gadget pour entrer dans l'ère de l'industrialisation des agents intelligents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un immense bravo à toute l'équipe d'organisation et aux étudiants pour la logistique impeccable. C'est toujours un plaisir de croiser les copains, de refaire le monde au Delirium ou au Cubrik, et de voir la délégation Onepoint porter haut nos couleurs.&lt;/p&gt;

&lt;p&gt;Une pensée particulière pour ceux qui ont fait vibrer ces deux jours par leur expertise ou leur grain de folie : Aurélie, Estelle, Jean-François, Nathan, Ambre, Jérôme, Benjamin, FX, Thierry, Stéphane et Fanny. C'est grâce à des speakers et des organisateurs de cette trempe que la communauté tech reste aussi soudée et bienveillante.&lt;/p&gt;

&lt;p&gt;Touraine Tech reste, année après année, ce rendez-vous incontournable où l'on parle, on rigole et, surtout, on apprend énormément.&lt;/p&gt;

&lt;p&gt;À l'année prochaine, Tours !&lt;/p&gt;

</description>
      <category>techtalks</category>
      <category>events</category>
    </item>
    <item>
      <title>Multi-Agent Platform with A2A, Python, Strands &amp; AWS AgentCore</title>
      <dc:creator>Meidi Airouche</dc:creator>
      <pubDate>Wed, 14 Jan 2026 08:39:44 +0000</pubDate>
      <link>https://dev.to/onepoint/multi-agent-platform-with-a2a-python-strands-aws-agentcore-2n74</link>
      <guid>https://dev.to/onepoint/multi-agent-platform-with-a2a-python-strands-aws-agentcore-2n74</guid>
      <description>&lt;p&gt;A single RAG agent is easy to ship.&lt;/p&gt;

&lt;p&gt;But the moment you need &lt;strong&gt;multiple domains&lt;/strong&gt; (HR, IT, …), different knowledge sources, and clean ownership boundaries, a single “do‑everything” agent turns into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an unmaintainable prompt,&lt;/li&gt;
&lt;li&gt;a tangled toolset,&lt;/li&gt;
&lt;li&gt;and a retrieval strategy that mixes unrelated documents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post shows a &lt;strong&gt;production-shaped&lt;/strong&gt; approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HR Agent&lt;/strong&gt;: RAG over HR documents (AWS Knowledge Base ID configured via env)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IT Agent&lt;/strong&gt;: RAG over IT documents (different KB ID)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrator Agent&lt;/strong&gt;: routes queries by calling HR/IT agents over &lt;strong&gt;A2A&lt;/strong&gt;, then synthesizes the final answer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three are deployed as &lt;strong&gt;AgentCore Runtime&lt;/strong&gt; apps : each handler is a &lt;code&gt;BedrockAgentCoreApp&lt;/code&gt; entrypoint.&lt;/p&gt;

&lt;p&gt;Strands Agents is a Python SDK for building LLM-based production-ready agents as first-class software components.&lt;br&gt;
It abstracts prompt management, tool invocation, and agent-to-agent communication, enabling to compose complex agent systems without hard-coding control flows or glue logic.&lt;/p&gt;


&lt;h2&gt;
  
  
  What we are building
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Components
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HR Agent&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strands &lt;code&gt;Agent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tool: &lt;code&gt;strands_tools.retrieve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Config: &lt;code&gt;KNOWLEDGE_BASE_ID&lt;/code&gt; (HR KB)&lt;/li&gt;
&lt;li&gt;Exposed as an A2A endpoint via AgentCore Runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IT Agent&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same as HR agent&lt;/li&gt;
&lt;li&gt;Config: &lt;code&gt;KNOWLEDGE_BASE_ID&lt;/code&gt; (IT KB)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Orchestrator Agent&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strands &lt;code&gt;Agent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tools: &lt;code&gt;ask_hr_agent&lt;/code&gt;, &lt;code&gt;ask_it_agent&lt;/code&gt; (A2A client calls)&lt;/li&gt;
&lt;li&gt;Config: &lt;code&gt;HR_AGENT_URL&lt;/code&gt;, &lt;code&gt;IT_AGENT_URL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Decides routing automatically (tool choice) and synthesizes a final answer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Runtime request flow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;User sends a question to the &lt;strong&gt;Orchestrator&lt;/strong&gt; (AgentCore Runtime endpoint)&lt;/li&gt;
&lt;li&gt;Orchestrator LLM decides whether to use:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ask_hr_agent()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ask_it_agent()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;or both&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Orchestrator calls the specialized agent(s) via &lt;strong&gt;A2A&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Specialized agent uses &lt;code&gt;retrieve&lt;/code&gt; tool (RAG) against its Knowledge Base&lt;/li&gt;
&lt;li&gt;Orchestrator produces a final, human‑readable answer&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  1 — Configuration (env vars)
&lt;/h2&gt;

&lt;p&gt;This architecture is intentionally &lt;strong&gt;configuration-first&lt;/strong&gt;. No hardcoded URLs or KB IDs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Knowledge bases are created with S3 Vector base but outside of this topic since it's easy to create with 5 clics. Just collect the IDs once created.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The retrieve tool provided by strands_tools is automatically configured at runtime using KNOWLEDGE_BASE_ID, which AgentCore resolves to the correct vector store and injects into the retrieval tool execution.&lt;/p&gt;
&lt;h3&gt;
  
  
  HR Agent env
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;KNOWLEDGE_BASE_ID&lt;/code&gt;
The Knowledge Base ID for HR content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  IT Agent env
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;KNOWLEDGE_BASE_ID&lt;/code&gt;
The Knowledge Base ID for IT content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Orchestrator env
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;HR_AGENT_URL&lt;/code&gt;&lt;br&gt;&lt;br&gt;
A2A endpoint for the HR Agent (for example, an AgentCore Runtime service URL).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;IT_AGENT_URL&lt;/code&gt;&lt;br&gt;&lt;br&gt;
A2A endpoint for the IT Agent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AWS_REGION&lt;/code&gt; (optional)&lt;br&gt;&lt;br&gt;
Defaults to &lt;code&gt;eu-central-1&lt;/code&gt; in the handler.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  2 — HR Agent handler (AgentCore Runtime + RAG)
&lt;/h2&gt;

&lt;p&gt;This is the &lt;strong&gt;complete&lt;/strong&gt; HR agent handler.&lt;/p&gt;

&lt;p&gt;Key design choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lazy initialization&lt;/strong&gt;: create the Strands agent only once per runtime container&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single tool&lt;/strong&gt;: &lt;code&gt;retrieve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict behavior&lt;/strong&gt;: if retrieval doesn’t find anything relevant, say so
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
HR Agent handler for AgentCore Runtime deployment with A2A support.

Requirements: 1.1, 1.2, 1.4
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Configuration
&lt;/span&gt;&lt;span class="n"&gt;KNOWLEDGE_BASE_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KNOWLEDGE_BASE_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KNOWLEDGE_BASE_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;KNOWLEDGE_BASE_ID&lt;/span&gt;

&lt;span class="n"&gt;HR_SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are an expert HR assistant. You answer questions related to human resources,
HR policies, leave, benefits, recruitment, and people management.

Use the retrieval tool to search the HR knowledge base.
If you cannot find relevant information, clearly state it.

Always respond in a professional and concise manner.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Lazy agent initialization
&lt;/span&gt;&lt;span class="n"&gt;_hr_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_hr_agent&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Lazy load HR agent.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;_hr_agent&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;_hr_agent&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
        &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands_tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;retrieve&lt;/span&gt;

        &lt;span class="n"&gt;_hr_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HR_SYSTEM_PROMPT&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HR agent initialized&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_hr_agent&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Handle HR agent requests.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;prompt_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_hr_agent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HR agent error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Erreur agent RH: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="c1"&gt;# For AgentCore Runtime with A2A
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bedrock_agentcore.runtime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentCoreApp&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BedrockAgentCoreApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HR BedrockAgentCoreApp initialized&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


    &lt;span class="nd"&gt;@app.entrypoint&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HR received: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handle_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ImportError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock_agentcore.runtime not available: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Why &lt;code&gt;os.environ["KNOWLEDGE_BASE_ID"] = KNOWLEDGE_BASE_ID&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Some tooling layers (including retrieval integrations) resolve configuration directly from process environment. By forcing it into &lt;code&gt;os.environ&lt;/code&gt;, you ensure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistent behavior in local runs&lt;/li&gt;
&lt;li&gt;consistent behavior in AgentCore Runtime containers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  What “RAG” means here
&lt;/h3&gt;

&lt;p&gt;In this handler, &lt;strong&gt;RAG is not manual&lt;/strong&gt; (no explicit vector DB queries in your code).&lt;br&gt;
Instead, the Strands agent uses the &lt;strong&gt;&lt;code&gt;retrieve&lt;/code&gt; tool&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the LLM decides when to call &lt;code&gt;retrieve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the tool pulls relevant chunks from your Knowledge Base&lt;/li&gt;
&lt;li&gt;the response is generated with that context&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  3 — IT Agent handler (AgentCore Runtime + RAG)
&lt;/h2&gt;

&lt;p&gt;This is the &lt;strong&gt;complete&lt;/strong&gt; IT agent handler.&lt;/p&gt;

&lt;p&gt;Same architecture as HR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lazy init&lt;/li&gt;
&lt;li&gt;tool = &lt;code&gt;retrieve&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
IT Agent handler for AgentCore Runtime deployment with A2A support.

Requirements: 2.1, 2.2, 2.4
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Configuration
&lt;/span&gt;&lt;span class="n"&gt;KNOWLEDGE_BASE_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KNOWLEDGE_BASE_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KNOWLEDGE_BASE_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;KNOWLEDGE_BASE_ID&lt;/span&gt;

&lt;span class="n"&gt;IT_SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are an expert IT assistant. You answer questions related to IT,
systems, software, technical support, cybersecurity, and infrastructure.

Use the retrieval tool to search the IT knowledge base.
If you cannot find relevant information, clearly state it.

Always respond in a professional and concise manner.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Lazy agent initialization
&lt;/span&gt;&lt;span class="n"&gt;_it_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_it_agent&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Lazy load IT agent.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;_it_agent&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;_it_agent&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
        &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands_tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;retrieve&lt;/span&gt;

        &lt;span class="n"&gt;_it_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;IT_SYSTEM_PROMPT&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IT agent initialized&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_it_agent&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Handle IT agent requests.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;prompt_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_it_agent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IT agent error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Erreur agent IT: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="c1"&gt;# For AgentCore Runtime with A2A
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bedrock_agentcore.runtime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentCoreApp&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BedrockAgentCoreApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IT BedrockAgentCoreApp initialized&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


    &lt;span class="nd"&gt;@app.entrypoint&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IT received: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handle_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ImportError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock_agentcore.runtime not available: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Why separate agents instead of one big agent with two KBs?
&lt;/h3&gt;

&lt;p&gt;Because the separation buys you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;independent prompts&lt;/li&gt;
&lt;li&gt;independent retrieval scopes (no “HR policy” leaking into IT answers)&lt;/li&gt;
&lt;li&gt;independent deployment/scaling&lt;/li&gt;
&lt;li&gt;simpler evaluation (HR answers vs IT answers)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  4 — Orchestrator handler (AgentCore Runtime + A2A tools)
&lt;/h2&gt;

&lt;p&gt;Now the interesting part: the orchestrator.&lt;/p&gt;

&lt;p&gt;Your orchestrator is a Strands agent with two tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ask_hr_agent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ask_it_agent&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those tools are wrappers around an &lt;strong&gt;A2A client call&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Orchestrator key behaviors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It &lt;strong&gt;does not&lt;/strong&gt; use &lt;code&gt;retrieve&lt;/code&gt; itself&lt;/li&gt;
&lt;li&gt;It delegates to specialized agents&lt;/li&gt;
&lt;li&gt;It may call &lt;strong&gt;both&lt;/strong&gt; if needed
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Orchestrator Agent handler for AgentCore Runtime deployment.

Uses Strands Agent with HR/IT agents as tools - the model decides routing.

Requirements: 3.1, 3.2, 3.3, 3.4, 3.5
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Configuration
&lt;/span&gt;&lt;span class="n"&gt;AWS_REGION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWS_REGION&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eu-central-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;HR_AGENT_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HR_AGENT_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;IT_AGENT_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IT_AGENT_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Lazy initialization
&lt;/span&gt;&lt;span class="n"&gt;_orchestrator_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_call_a2a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Internal A2A call.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;a2a.client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;A2AClient&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;A2AClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_hr_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Ask the specialized HR agent.

    Use this tool for questions about:
    - HR policies, leave, payroll
    - Recruitment, hiring, contracts
    - Training, performance reviews
    - Benefits, insurance, retirement
    - Remote work, absences
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;HR_AGENT_URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Erreur: Agent RH non configuré&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;_call_a2a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HR_AGENT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HR agent error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Erreur agent RH: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_it_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Ask the specialized IT agent.

    Use this tool for questions about:
    - Computers, software, support
    - Network, Wi‑Fi, VPN, internet
    - Passwords, accounts, access
    - Security, antivirus
    - Email, Teams, apps
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;IT_AGENT_URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Erreur: Agent IT non configuré&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;_call_a2a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IT_AGENT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IT agent error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Erreur agent IT: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="n"&gt;ORCHESTRATOR_SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are an orchestrator assistant for employees.

You have access to two specialized agents:
- HR Agent: for all human resources questions (leave, payroll, contracts, training, etc.)
- IT Agent: for all IT-related questions (software, hardware, technical support, etc.)

Analyze each question and use the appropriate agent(s) to answer.
If a question spans both domains, consult both agents.

After receiving the responses, synthesize a clear and complete final answer.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_orchestrator_agent&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get or create the orchestrator agent with HR/IT tools.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;_orchestrator_agent&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;_orchestrator_agent&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

        &lt;span class="n"&gt;_orchestrator_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ask_hr_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ask_it_agent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ORCHESTRATOR_SYSTEM_PROMPT&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Orchestrator agent initialized with HR/IT tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_orchestrator_agent&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Handle orchestrator requests.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;prompt_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_orchestrator_agent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Orchestration error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Erreur: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="c1"&gt;# For AgentCore Runtime
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bedrock_agentcore.runtime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentCoreApp&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BedrockAgentCoreApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Orchestrator BedrockAgentCoreApp initialized&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


    &lt;span class="nd"&gt;@app.entrypoint&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handle_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ImportError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock_agentcore.runtime not available: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Why implement HR/IT calls as &lt;em&gt;tools&lt;/em&gt;?
&lt;/h3&gt;

&lt;p&gt;Because it makes routing &lt;strong&gt;model-driven&lt;/strong&gt; instead of hard-coded.&lt;/p&gt;

&lt;p&gt;You’re giving the orchestrator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a system prompt describing the domains&lt;/li&gt;
&lt;li&gt;tool docstrings that describe when to use them&lt;/li&gt;
&lt;li&gt;a stable interface (&lt;code&gt;ask_hr_agent(query) -&amp;gt; str&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The LLM chooses the right tool(s), and you keep your Python logic minimal.&lt;/p&gt;


&lt;h2&gt;
  
  
  5 — A2A call parsing
&lt;/h2&gt;

&lt;p&gt;A2A responses often come as structured messages with parts.&lt;br&gt;
The parsing strategy is resilient:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t assume a single “text blob” response&lt;/li&gt;
&lt;li&gt;You gracefully fallback to &lt;code&gt;str(response)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6 — Lazy initialization (production detail that matters)
&lt;/h2&gt;

&lt;p&gt;All three handlers use lazy init (&lt;code&gt;_agent = None&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Why it’s important in AgentCore Runtime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cold start cost is paid once per container&lt;/li&gt;
&lt;li&gt;subsequent requests reuse the same agent instance&lt;/li&gt;
&lt;li&gt;lower latency and less overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the kind of detail that separates a demo from something you can run for real users.&lt;/p&gt;




&lt;h2&gt;
  
  
  7 — How routing actually happens
&lt;/h2&gt;

&lt;p&gt;You don’t have &lt;code&gt;if "vpn" in query: ...&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The orchestrator receives the question&lt;/li&gt;
&lt;li&gt;It decides which tool(s) to call based on system prompt + tool descriptions&lt;/li&gt;
&lt;li&gt;It synthesizes a final answer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example behaviors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HR-only question → calls &lt;code&gt;ask_hr_agent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;IT-only question → calls &lt;code&gt;ask_it_agent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mixed question → calls both, then merges&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8 — Failure modes and debugging
&lt;/h2&gt;

&lt;p&gt;Your code already includes the essentials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;INFO logging&lt;/li&gt;
&lt;li&gt;explicit “not configured” messages&lt;/li&gt;
&lt;li&gt;tool-level error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common issues:&lt;/p&gt;

&lt;h3&gt;
  
  
  Missing URL
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;HR_AGENT_URL&lt;/code&gt; is empty:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ask_hr_agent&lt;/code&gt; returns &lt;code&gt;Error: HR agent not configured&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Network/A2A issues
&lt;/h3&gt;

&lt;p&gt;If A2A fails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;error is logged&lt;/li&gt;
&lt;li&gt;tool returns &lt;code&gt;Error HR agent: ...&lt;/code&gt; / &lt;code&gt;Error IT agent: ...&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The orchestrator can still produce a partial answer if only one agent fails.&lt;/p&gt;




&lt;h2&gt;
  
  
  9 — Practical hardening ideas (optional)
&lt;/h2&gt;

&lt;p&gt;These keep the same architecture, but improve resilience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Timeouts &amp;amp; retries&lt;/strong&gt; for A2A calls (network I/O).&lt;/li&gt;
&lt;li&gt;Avoid &lt;code&gt;asyncio.run()&lt;/code&gt; if you ever run inside an existing event loop.&lt;/li&gt;
&lt;li&gt;Return structured tool outputs (citations, metadata) if you need auditability later.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Why this architecture scales
&lt;/h2&gt;

&lt;p&gt;Adding a new domain agent (Finance / Legal / Security) is just repetition of the same pattern:&lt;/p&gt;

&lt;p&gt;1) new RAG agent handler with &lt;code&gt;retrieve&lt;/code&gt; + domain prompt + &lt;code&gt;KNOWLEDGE_BASE_ID&lt;/code&gt;&lt;br&gt;&lt;br&gt;
2) new orchestrator tool &lt;code&gt;ask_finance_agent&lt;/code&gt; calling A2A&lt;br&gt;&lt;br&gt;
3) add tool to orchestrator’s &lt;code&gt;tools=[...]&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;No refactor required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;If you already know how to build RAG (or deterministic tools), the next step is &lt;strong&gt;orchestration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This pattern gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;domain isolation&lt;/li&gt;
&lt;li&gt;deployable units (AgentCore Runtime)&lt;/li&gt;
&lt;li&gt;model-driven routing (tools)&lt;/li&gt;
&lt;li&gt;a clean evolution path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s basically microservices:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;small, focused services with a clear interface — except the services can reason.&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>python</category>
      <category>aws</category>
      <category>agents</category>
      <category>rag</category>
    </item>
    <item>
      <title>RAG Works — Until You Hit the Long Tail</title>
      <dc:creator>Meidi Airouche</dc:creator>
      <pubDate>Sun, 11 Jan 2026 23:23:12 +0000</pubDate>
      <link>https://dev.to/onepoint/rag-works-until-you-hit-the-long-tail-54lp</link>
      <guid>https://dev.to/onepoint/rag-works-until-you-hit-the-long-tail-54lp</guid>
      <description>&lt;h2&gt;
  
  
  Why Training Knowledge Into Weights Is the Next Step Beyond RAG
&lt;/h2&gt;

&lt;p&gt;If you use ChatGPT or similar large language models on a daily basis, you have probably developed a certain level of trust in them. They are articulate, fast, and often impressively capable. Many engineers already rely on them for coding assistance, documentation, or architectural brainstorming.&lt;/p&gt;

&lt;p&gt;And yet, sooner or later, you hit a wall.&lt;/p&gt;

&lt;p&gt;You ask a question that actually matters in your day-to-day work — something internal, recent, or highly specific — and the model suddenly becomes vague, incorrect, or confidently wrong. This is not a prompting issue. It is a structural limitation.&lt;/p&gt;

&lt;p&gt;This article explores why that happens, why current solutions only partially address the problem, and why training knowledge directly into model weights is likely to be a key part of the future.&lt;/p&gt;




&lt;h2&gt;
  
  
  The real problem is not the knowledge cutoff
&lt;/h2&gt;

&lt;p&gt;The knowledge cutoff is the most visible limitation of LLMs. Models are trained on data up to a certain point in time, and anything that happens afterward simply does not exist for them.&lt;/p&gt;

&lt;p&gt;In practice, however, this is rarely the most painful issue. Web search, APIs, and tools can often mitigate it.&lt;/p&gt;

&lt;p&gt;The deeper problem is the &lt;strong&gt;long tail of knowledge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In real production environments, the most valuable questions are rarely about well-documented public facts. They are about internal systems, undocumented decisions, proprietary processes, and domain-specific conventions that exist nowhere on the public internet.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why did this service start failing after a seemingly unrelated change?&lt;/li&gt;
&lt;li&gt;Has this architectural trade-off already been discussed internally?&lt;/li&gt;
&lt;li&gt;How does &lt;em&gt;our&lt;/em&gt; company interpret a specific regulatory constraint?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions live in the long tail. And that is exactly where large foundation models perform the worst.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three ways to give knowledge to a language model
&lt;/h2&gt;

&lt;p&gt;If we strip away tooling details, there are only three fundamental ways to make a language model “know” something new.&lt;/p&gt;

&lt;p&gt;The first is to place the knowledge directly into the prompt.&lt;br&gt;&lt;br&gt;
The second is to retrieve relevant information at inference time.&lt;br&gt;&lt;br&gt;
The third is to train the knowledge into the model itself.&lt;/p&gt;

&lt;p&gt;Most systems today rely almost entirely on the first two.&lt;/p&gt;


&lt;h2&gt;
  
  
  Full context: simple, expensive, and fragile
&lt;/h2&gt;

&lt;p&gt;The most naive solution is to put everything into the prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are an assistant with access to our internal documentation.

&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;internal_docs&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Question:
Why does service X fail under load?
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For small documents, this works. It is easy to implement and requires no additional infrastructure.&lt;/p&gt;

&lt;p&gt;However, as context grows, several issues appear at once. Token costs increase linearly. Latency increases significantly. Most importantly, reasoning quality degrades as more weakly relevant information is added.&lt;/p&gt;

&lt;p&gt;This is not an implementation issue. It is a consequence of how transformer models work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The transformer bottleneck and context degradation
&lt;/h2&gt;

&lt;p&gt;Transformers rely on self-attention, where every token attends to every other token. This leads to quadratic complexity with respect to input length.&lt;/p&gt;

&lt;p&gt;Even though modern models can technically accept very large context windows, there is an important difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;not crashing with long input, and&lt;/li&gt;
&lt;li&gt;reasoning well over long input.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Empirically, performance degrades as context grows, even when the relevant information remains the same. The model continues to produce fluent text, but its ability to connect the right pieces of information deteriorates. This phenomenon is often referred to as context rot.&lt;/p&gt;

&lt;p&gt;As a result, simply increasing the context window is not a viable long-term solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  RAG: external memory via embeddings
&lt;/h2&gt;

&lt;p&gt;To avoid pushing everything into the prompt, the industry converged on Retrieval-Augmented Generation (RAG).&lt;/p&gt;

&lt;p&gt;The idea is to store documents externally, retrieve the most relevant ones using embeddings, and inject only those into the prompt.&lt;/p&gt;

&lt;p&gt;A minimal Python example looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain.vectorstores&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Chroma&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain.embeddings&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIEmbeddings&lt;/span&gt;

&lt;span class="n"&gt;embeddings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAIEmbeddings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;vector_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Chroma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_documents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;similarity_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Why does the CI pipeline fail?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RAG is popular because it is flexible, relatively cheap, and easy to deploy. Today, it is the default solution for adding memory to LLM-based systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why RAG is fundamentally limited
&lt;/h2&gt;

&lt;p&gt;RAG retrieves information, but retrieval is not reasoning. Selecting a few relevant chunks does not guarantee that the model can correctly combine them, especially when the answer depends on implicit relationships or multi-step reasoning across documents.&lt;/p&gt;

&lt;p&gt;Embeddings also encode a single global notion of similarity. They are not adaptive to local domain semantics. In practice, documents that should never be confused often end up close together in vector space.&lt;/p&gt;

&lt;p&gt;Finally, embeddings are not inherently secure. With enough effort, large portions of the original text can be reconstructed from them. This makes vector databases unsuitable as a privacy-preserving abstraction.&lt;/p&gt;

&lt;p&gt;These limitations suggest that RAG is powerful, but incomplete.&lt;/p&gt;




&lt;h2&gt;
  
  
  The naive fine-tuning trap
&lt;/h2&gt;

&lt;p&gt;At this point, it is tempting to fine-tune the model directly on internal data.&lt;/p&gt;

&lt;p&gt;In practice, naive fine-tuning almost always fails. Training directly on small, specialized datasets causes the model to overfit, lose general reasoning abilities, and forget previously learned knowledge. This phenomenon is known as catastrophic forgetting.&lt;/p&gt;

&lt;p&gt;The result is a model that memorizes patterns but loses its ability to generalize and reason beyond the training data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Synthetic data as the missing link
&lt;/h2&gt;

&lt;p&gt;The key insight that changes the picture is synthetic data generation.&lt;/p&gt;

&lt;p&gt;Instead of training on raw documents, we generate a large and diverse set of tasks that describe the knowledge contained in those documents. These can include question–answer pairs, explanations, paraphrases, and counterfactuals.&lt;/p&gt;

&lt;p&gt;A simplified example in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_qa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instruction&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain the key idea behind: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;synthetic_dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;generate_qa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;internal_docs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach teaches the domain, not the surface text. Surprisingly, it works even when the original dataset is small, as long as the synthetic data is sufficiently diverse.&lt;/p&gt;




&lt;h2&gt;
  
  
  Training into weights without destroying the model
&lt;/h2&gt;

&lt;p&gt;To avoid catastrophic forgetting, modern systems rely on parameter-efficient fine-tuning. Instead of updating all weights, only a small subset is modified.&lt;/p&gt;

&lt;p&gt;One common technique is LoRA (Low-Rank Adaptation):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;peft&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LoraConfig&lt;/span&gt;

&lt;span class="n"&gt;lora_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LoraConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;lora_alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;target_modules&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q_proj&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v_proj&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key idea is to make small, localized changes that steer the model without overwriting its existing knowledge.&lt;/p&gt;

&lt;p&gt;Other approaches, such as prefix tuning or memory layers, follow the same principle with different trade-offs.&lt;/p&gt;




&lt;h2&gt;
  
  
  A hybrid future: context, retrieval, and weights
&lt;/h2&gt;

&lt;p&gt;None of these techniques replaces the others entirely. The most effective systems combine all three.&lt;/p&gt;

&lt;p&gt;Context is useful for immediate instructions. Retrieval is essential for fresh or frequently changing data. Training into weights provides deep, coherent domain understanding that retrieval alone cannot achieve.&lt;/p&gt;

&lt;p&gt;The central design question going forward is not whether to train models on private knowledge, but what knowledge deserves to live in weights versus being handled at inference time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;RAG is a pragmatic and powerful solution, and it will remain part of the LLM ecosystem. However, it is fundamentally limited when it comes to deep reasoning over specialized knowledge.&lt;/p&gt;

&lt;p&gt;As training techniques become more efficient, training knowledge into weights will no longer be a research curiosity. It will be an engineering decision.&lt;/p&gt;

&lt;p&gt;In the long run, the most valuable LLM systems will not be defined by the base model they use, but by what they have been taught — and how carefully that teaching was done.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>rag</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Guide d'apprentissage pour maîtriser GitHub Copilot</title>
      <dc:creator>Patrice Eon</dc:creator>
      <pubDate>Tue, 23 Dec 2025 11:37:36 +0000</pubDate>
      <link>https://dev.to/onepoint/guide-dapprentissage-pour-maitriser-github-copilot-283b</link>
      <guid>https://dev.to/onepoint/guide-dapprentissage-pour-maitriser-github-copilot-283b</guid>
      <description>&lt;p&gt;GitHub Copilot est le nouvel allié des développeurs pour coder plus vite et plus intelligemment.&lt;/p&gt;

&lt;p&gt;Mais soyons honnêtes : la plupart d'entre nous l'utilisent comme une simple autocomplétion augmentée. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Résultat ?&lt;/strong&gt; On exploite à peine 20 % de sa véritable puissance. C'est un peu comme avoir une Ferrari et ne jamais dépasser la deuxième vitesse. &lt;/p&gt;

&lt;p&gt;En effet &lt;strong&gt;en 2025, GitHub Copilot a pris du muscle&lt;/strong&gt;. Fini l'assistant timide qui suggère trois lignes de code. Place à un &lt;strong&gt;partenaire IA complet&lt;/strong&gt;, dopé aux modèles de pointe (Claude Sonnet 4.5, GPT-5, Gemini 3 Pro). Il comprend désormais votre code dans son ensemble, orchestre des tâches complexes en autonomie et s'intègre parfaitement à votre écosystème de développement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ce guide existe pour une raison simple&lt;/strong&gt; : vous faire passer de 20 % à 100 % d'utilisation. Grâce à &lt;strong&gt;10 techniques éprouvées&lt;/strong&gt; et des protocoles avancés, vous découvrirez comment transformer Copilot d'un simple assistant en &lt;strong&gt;copilote stratégique&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Parce qu'au final, l'objectif n'est pas juste de coder plus vite. C'est de coder &lt;strong&gt;plus intelligemment&lt;/strong&gt;, en laissant l'IA gérer la vitesse pendant que vous vous concentrez sur ce qui compte vraiment : l'intelligence de vos solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table des matières
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Partie I : Installation et présentation des fondamentaux (démarrage en douceur)

&lt;ul&gt;
&lt;li&gt;1.1 GitHub Copilot dans votre IDE vs GitHub Copilot CLI&lt;/li&gt;
&lt;li&gt;1.2 Installer GitHub Copilot sur VS Code&lt;/li&gt;
&lt;li&gt;1.3 Installer GitHub Copilot sur IntelliJ IDEA&lt;/li&gt;
&lt;li&gt;1.4 Obtenir un compte GitHub avec accès Copilot&lt;/li&gt;
&lt;li&gt;1.5 Installer GitHub Copilot CLI&lt;/li&gt;
&lt;li&gt;
1.6 GitHub Copilot dans votre IDE : Aperçu des contrôles et fonctionnalités
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Partie II : Maîtriser les leviers de productivité

&lt;ul&gt;
&lt;li&gt;2.1 Maîtriser les Commandes Slash&lt;/li&gt;
&lt;li&gt;2.2 Utiliser les Variables de Contexte&lt;/li&gt;
&lt;li&gt;2.3 Créer des Instructions Personnalisées&lt;/li&gt;
&lt;li&gt;2.4 Stratégie d'ouverture de Fichiers&lt;/li&gt;
&lt;li&gt;2.5 Commenter le flux de travail&lt;/li&gt;
&lt;li&gt;2.6 Le Dialogue itératif&lt;/li&gt;
&lt;li&gt;2.7 Fichiers de prompts personnalisés&lt;/li&gt;
&lt;li&gt;2.8 Glisser-Déposer de Contexte&lt;/li&gt;
&lt;li&gt;2.9 Stratégie de Nettoyage de Contexte&lt;/li&gt;
&lt;li&gt;
2.10 Maîtriser la Sélection de Code
&lt;/li&gt;
&lt;li&gt;2.11 Créer des issues à partir de captures d’écran&lt;/li&gt;
&lt;li&gt;2.12 Utiliser Github Copilot partout… Mais tirer le meilleur du plugin dans VS Code&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Partie III : Écosystème et Agenticité Avancée

&lt;ul&gt;
&lt;li&gt;3.1 Le Protocole de Contexte Modèle (MCP)&lt;/li&gt;
&lt;li&gt;3.2 Qu’est‑ce que « Awesome GitHub Copilot » ?&lt;/li&gt;
&lt;li&gt;3.3 Custom agents&lt;/li&gt;
&lt;li&gt;3.4 Maîtriser le GitHub Copilot CLI&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Partie IV : Qualité, sécurité et rôle humain (Les Pièges)

&lt;ul&gt;
&lt;li&gt;4.1 Prendre les suggestions de Copilot pour des vérités&lt;/li&gt;
&lt;li&gt;4.2 Ignorer la sécurité du code&lt;/li&gt;
&lt;li&gt;4.3 Utiliser Copilot comme béquille pour les fondamentaux&lt;/li&gt;
&lt;li&gt;4.4 Surcompliquer des solutions simples&lt;/li&gt;
&lt;li&gt;4.5 Ne pas fournir de contexte pour de meilleures suggestions&lt;/li&gt;
&lt;li&gt;4.6 Ne pas garder Copilot dans le bon scope&lt;/li&gt;
&lt;li&gt;4.7 Zapper les tests parce que « Copilot l’a écrit »&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusion : Codez plus Intelligemment, pas seulement plus vite&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Partie I : Installation et présentation des fondamentaux (démarrage en douceur)
&lt;/h1&gt;

&lt;p&gt;Cette partie couvre l'installation, les accès, et la compréhension des modes d'interaction avec Github Copilot.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.1 GitHub Copilot dans votre IDE vs GitHub Copilot CLI 🖊️
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot se déploie sur &lt;strong&gt;deux fronts stratégiques&lt;/strong&gt; : directement intégré à votre IDE préféré (VS Code, IntelliJ...) pour une assistance en temps réel, et en ligne de commande pour orchestrer vos workflows depuis le terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Copilot dans votre IDE
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fonctionnalités :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complétion de code en temps réel (ligne ou fonction complète)&lt;/li&gt;
&lt;li&gt;Copilot Chat intégré pour poser des questions ou générer des snippets&lt;/li&gt;
&lt;li&gt;Intégration IDE : coloration, prévisualisation, acceptation avec &lt;code&gt;Tab&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Support multi-langages : Python, Java, JS, C++, Go, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage typique :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saisie de code et suggestions automatiques&lt;/li&gt;
&lt;li&gt;Idéal pour une &lt;strong&gt;assistance immédiate et interactive&lt;/strong&gt; dans l’éditeur&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GitHub Copilot CLI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fonctionnalités :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assistant IA dans le terminal, indépendant de l’éditeur&lt;/li&gt;
&lt;li&gt;Exploration de projet (fichiers, dépendances, structure)&lt;/li&gt;
&lt;li&gt;Génération et modification de code via prompts en langage naturel&lt;/li&gt;
&lt;li&gt;Exécution de commandes shell suggérées (avec confirmation)&lt;/li&gt;
&lt;li&gt;Refactoring et workflows multi-étapes automatisés&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage typique :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Travailler depuis le terminal, générer ou corriger du code&lt;/li&gt;
&lt;li&gt;Idéal pour &lt;strong&gt;workflows scriptables ou projets distants&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comparaison rapide
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonctionnalité&lt;/th&gt;
&lt;th&gt;Copilot VS Code&lt;/th&gt;
&lt;th&gt;Copilot CLI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Suggestions inline de code&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;td&gt;❌ Non&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chat intégré&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;td&gt;❌ Terminal-style&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modification de fichiers&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exécution commandes shell&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analyse globale du projet&lt;/td&gt;
&lt;td&gt;Limité&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indépendant de l’éditeur&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatisation &amp;amp; workflows complexes&lt;/td&gt;
&lt;td&gt;Moyen&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Résumé :&lt;/strong&gt; VS Code pour coder efficacement au quotidien, CLI pour gérer et transformer des projets depuis le terminal.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.2 Installer GitHub Copilot sur VS Code 🧩
&lt;/h2&gt;

&lt;p&gt;La documentation officielle pour installer GitHub Copilot dans VS Code se trouve ici : &lt;a href="https://code.visualstudio.com/docs/copilot/setup?ref_product=copilot&amp;amp;ref_type=engagement&amp;amp;ref_style=text#_set-up-copilot-in-vs-code" rel="noopener noreferrer"&gt;Copilot VS Code extension&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ouvrir VS Code&lt;/li&gt;
&lt;li&gt;Aller dans la &lt;strong&gt;Marketplace des extensions&lt;/strong&gt; (&lt;code&gt;Ctrl+Shift+X&lt;/code&gt; ou &lt;code&gt;Cmd+Shift+X&lt;/code&gt; sur Mac)&lt;/li&gt;
&lt;li&gt;Rechercher &lt;strong&gt;GitHub Copilot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;Installer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Se connecter à GitHub quand demandé (OAuth)&lt;/li&gt;
&lt;li&gt;Les suggestions apparaissent automatiquement&lt;/li&gt;
&lt;li&gt;Pour activer/désactiver : &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; / &lt;code&gt;Cmd+Shift+P&lt;/code&gt; → taper &lt;strong&gt;Copilot&lt;/strong&gt; → &lt;code&gt;Enable/Disable GitHub Copilot&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configurer les suggestions dans &lt;code&gt;Fichier → Préférences → Paramètres → GitHub Copilot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fonctionne avec Python, Java, JS, C++, Go, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.3 Installer GitHub Copilot sur IntelliJ IDEA 🧩
&lt;/h2&gt;

&lt;p&gt;La documentation officielle pour installer GitHub Copilot dans IntelliJ (mais également les autres IDE supporté) se trouve ici : &lt;a href="https://docs.github.com/fr/copilot/how-tos/set-up/install-copilot-extension?tool=jetbrains" rel="noopener noreferrer"&gt;Copilot Jetbrains extension&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ouvrir IntelliJ IDEA&lt;/li&gt;
&lt;li&gt;Aller dans &lt;strong&gt;File → Settings → Plugins&lt;/strong&gt; (&lt;code&gt;Preferences → Plugins&lt;/code&gt; sur Mac)&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;Marketplace&lt;/strong&gt;, chercher &lt;strong&gt;GitHub Copilot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;Installer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Redémarrer IntelliJ&lt;/li&gt;
&lt;li&gt;Se connecter à GitHub pour activer Copilot&lt;/li&gt;
&lt;li&gt;Les suggestions apparaissent automatiquement lors de la saisie de code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activer/désactiver : &lt;code&gt;Settings → GitHub Copilot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Utilisable aussi dans le terminal intégré pour générer des snippets&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.4 Obtenir un compte GitHub avec accès Copilot 📝
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Étape 1 : Créer un compte GitHub
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Aller sur &lt;a href="https://github.com/join" rel="noopener noreferrer"&gt;https://github.com/join&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Remplir le formulaire (nom d’utilisateur, email, mot de passe)&lt;/li&gt;
&lt;li&gt;Confirmer votre email&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Étape 2 : Activer GitHub Copilot
&lt;/h3&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%2Fkp2gq897vhsbt33c01ak.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%2Fkp2gq897vhsbt33c01ak.png" alt="GitHub Sign Up" width="634" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Type d’abonnement&lt;/th&gt;
&lt;th&gt;Coût&lt;/th&gt;
&lt;th&gt;Étapes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;0$&lt;/td&gt;
&lt;td&gt;1. Aller sur &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;https://github.com/features/copilot&lt;/a&gt;&lt;br&gt;2. Cliquer sur &lt;strong&gt;Free&lt;/strong&gt;&lt;br&gt;3. Suivre l’activation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;~10$/mois ou 100$/an&lt;/td&gt;
&lt;td&gt;Aller sur &lt;a href="https://github.com/settings/billing" rel="noopener noreferrer"&gt;https://github.com/settings/billing&lt;/a&gt; → entrer les informations de paiement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Pro+&lt;/td&gt;
&lt;td&gt;~39$/mois ou 390$/an&lt;/td&gt;
&lt;td&gt;Aller sur &lt;a href="https://github.com/settings/billing" rel="noopener noreferrer"&gt;https://github.com/settings/billing&lt;/a&gt; → entrer les informations de paiement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Alternative : Abonnement Etudiant (gratuit)
&lt;/h4&gt;

&lt;p&gt;Aller sur &lt;a href="https://education.github.com/pack" rel="noopener noreferrer"&gt;GitHub Student Developer Pack&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Étape 3 : Vérifier l’accès
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Aller sur &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;https://github.com/features/copilot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vérifier le message &lt;strong&gt;“You have access”&lt;/strong&gt; ou la période d’essai en cours&lt;/li&gt;
&lt;li&gt;Installer l’extension dans VS Code ou IntelliJ et commencer à coder&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.5 Installer GitHub Copilot CLI 🚀
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot CLI, permet de déléguer une tâche à l'IA directement dans votre terminal — exit l'éditeur de code. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi l'installer maintenant ?&lt;/strong&gt; Parce que l'usage agentique avancé (détaillé plus loin dans ce guide) repose sur cette base. &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%2Fhg2tv85kml942q2vnyyd.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%2Fhg2tv85kml942q2vnyyd.png" alt="Interface CLI Github Copilot" width="549" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Prérequis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Un compte GitHub avec accès à Copilot activé (voir section précédente)&lt;/li&gt;
&lt;li&gt;Node.js version 20 ou supérieure installé&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Étapes d'installation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ouvrir votre terminal&lt;/li&gt;
&lt;li&gt;Installer l'extension GitHub CLI si ce n'est pas déjà fait :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Sur macOS/Linux avec Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;gh

&lt;span class="c"&gt;# Sur Windows avec winget&lt;/span&gt;
winget &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--id&lt;/span&gt; GitHub.cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Se connecter à GitHub :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Installer l'extension Copilot CLI :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh extension &lt;span class="nb"&gt;install &lt;/span&gt;github/gh-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Vérifier l'installation :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilisation basique
&lt;/h3&gt;

&lt;p&gt;Une fois installé, vous pouvez utiliser Copilot directement dans le terminal :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Demander de l'aide sur une commande&lt;/span&gt;
gh copilot suggest &lt;span class="s2"&gt;"comment lister tous les fichiers modifiés dans les 7 derniers jours"&lt;/span&gt;

&lt;span class="c"&gt;# Expliquer une commande complexe&lt;/span&gt;
gh copilot explain &lt;span class="s2"&gt;"git rebase -i HEAD~3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La documentation complète est disponible sur : &lt;a href="https://docs.github.com/fr/copilot/using-github-copilot/using-github-copilot-in-the-command-line" rel="noopener noreferrer"&gt;GitHub Copilot CLI Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Utilisez &lt;code&gt;gh copilot --help&lt;/code&gt; pour voir toutes les commandes disponibles&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.6 GitHub Copilot dans votre IDE : Aperçu des contrôles et fonctionnalités 🎛️
&lt;/h2&gt;

&lt;p&gt;N’utiliser qu’un prompt basique (comme ci‑dessous) sans exploiter les autres fonctionnalités utiles de GitHub Copilot peut sembler assez limitant.&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%2Fpvkw4v5n0wwhfzay60gx.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%2Fpvkw4v5n0wwhfzay60gx.png" alt="Prompt Chat Github Copilot" width="614" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;C’est pourquoi je partage une collection d’astuces pratiques; vous en reconnaîtrez certaines, mais j’espère que quelques‑unes vous inspireront à tirer pleinement parti de ce que Copilot peut offrir.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.6.1 Les contrôles du panneau de chat
&lt;/h3&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%2F1kzfhnsrcgh85rf6ccq5.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%2F1kzfhnsrcgh85rf6ccq5.png" alt="Exemple prompt" width="390" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Configurer un nouveau contexte pour vos prompts. Utile pour repartir à zéro sur des tâches non liées.&lt;/li&gt;
&lt;li&gt; Réouvrir les contextes de prompts historiques utilisés auparavant. Utile pour basculer entre différents contextes.&lt;/li&gt;
&lt;li&gt; Générer des fichiers de prompt, des instructions, etc. (voir la section Meta Prompting ci‑dessous)&lt;/li&gt;
&lt;li&gt; Options supplémentaires de configuration de la fenêtre de chat (prompt)&lt;/li&gt;
&lt;li&gt; Maximiser votre fenêtre de chat (prompt)&lt;/li&gt;
&lt;li&gt; Masquer votre fenêtre de chat (prompt)&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  1.6.2 Modes Agent, Ask, Edit, Plan et Configure
&lt;/h3&gt;

&lt;p&gt;Choisissez comment vous voulez que GitHub Copilot vous aide. Dans beaucoup de cas, vous utiliserez simplement l’&lt;strong&gt;Agent&lt;/strong&gt;. Difficile de voir pourquoi on aurait encore besoin de &lt;strong&gt;Ask&lt;/strong&gt; ou &lt;strong&gt;Edit&lt;/strong&gt; une fois qu’on a l’&lt;strong&gt;Agent&lt;/strong&gt;, utilisé pour notre &lt;em&gt;Vibe Programming&lt;/em&gt; !&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%2Fhhf180gvsry09fvsaix3.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%2Fhhf180gvsry09fvsaix3.png" alt="Options chat Github Copilot" width="612" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En réalité, ces trois modes répondent à des &lt;strong&gt;intentions différentes&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ask&lt;/strong&gt; est le mode &lt;em&gt;conversation et compréhension&lt;/em&gt;. Il sert à poser des questions, demander des explications, explorer une API, comprendre un bout de code ou valider une approche &lt;strong&gt;sans modifier votre code&lt;/strong&gt;. C’est idéal pour réfléchir, apprendre ou lever un doute rapidement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt; est le mode &lt;em&gt;chirurgical&lt;/em&gt;. Vous sélectionnez du code et demandez une transformation précise : refactoriser, renommer, optimiser, traduire un commentaire, corriger un bug local. Copilot agit uniquement sur la zone ciblée, sans initiative au-delà de ce que vous avez demandé. Parfait quand vous voulez &lt;strong&gt;garder un contrôle strict&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent&lt;/strong&gt; est le mode &lt;em&gt;autonome et orienté objectif&lt;/em&gt;. Vous lui donnez une intention globale (« ajoute l’authentification », « implémente cette feature », « corrige les tests cassés ») et il explore le projet, crée ou modifie plusieurs fichiers, exécute des actions et itère. C’est le compagnon idéal pour le &lt;em&gt;Vibe Programming&lt;/em&gt;, quand vous voulez avancer vite et laisser Copilot prendre des décisions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 En résumé :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask&lt;/strong&gt; = comprendre et discuter
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit&lt;/strong&gt; = modifier précisément
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent&lt;/strong&gt; = déléguer et construire
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les trois sont complémentaires : &lt;strong&gt;Agent pour aller vite&lt;/strong&gt;, &lt;strong&gt;Edit pour ajuster&lt;/strong&gt;, &lt;strong&gt;Ask pour comprendre&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Passer par &lt;strong&gt;Configure custum Agents&lt;/strong&gt; est utile pour fournir de meilleures instructions à l’agent afin de permettre des prompts plus puissants. Vous pouvez en savoir plus loin dans l’article.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.6.3 Sélection des modèles LLM
&lt;/h3&gt;

&lt;p&gt;Sélectionnez le modèle LLM que vous souhaitez utiliser. Certains modèles sont meilleurs que d’autres. D’après mon expérience, Claude Sonnet est plus pertinent que GPT.&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%2Fg1smdngj85ercnkww860.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%2Fg1smdngj85ercnkww860.png" alt="Options choix modèles Github Copilot" width="611" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais attention, l’utilisation des modèles est limitée par le quota de requêtes indiqué par 0x, 1x et 3x. Ce sont des multiplicateurs appliqués à votre quota de requêtes premium.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0x : utilisation illimitée&lt;/li&gt;
&lt;li&gt;1x : exactement votre quota de requêtes&lt;/li&gt;
&lt;li&gt;3x : 3× votre quota de requêtes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donc, utilisez‑les avec parcimonie selon vos besoins.&lt;/p&gt;

&lt;p&gt;Le &lt;strong&gt;mode Agent&lt;/strong&gt; de GitHub Copilot est devenu l’un des meilleurs agents de code depuis quelques mois. &lt;br&gt;
Il peut analyser votre projet entier, traiter des issues GitHub, rédiger des pull requests, et même aider à écrire des tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quel modèle fonctionne réellement le mieux en mode Agent de Copilot ?&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Gemini 3 Pro : Le débogueur UI
&lt;/h4&gt;

&lt;p&gt;Gemini 3 Pro de Google apportent quelque chose d’unique : un &lt;strong&gt;véritable raisonnement multimodal&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Cela signifie qu’il peut comprendre &lt;strong&gt;code, texte, images et même diagrammes&lt;/strong&gt; en une seule passe.&lt;/p&gt;

&lt;p&gt;Idéal pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Débogage UI ou visuel&lt;/li&gt;
&lt;li&gt;Analyse code + documents&lt;/li&gt;
&lt;li&gt;Pipelines de données en entreprise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Avantages :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Excellent pour le raisonnement visuel
&lt;/li&gt;
&lt;li&gt;✅ Rapide, économique et scalable
&lt;/li&gt;
&lt;li&gt;✅ Excelle dans le traitement parallèle et l’orchestration d’outils&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Donne parfois des solutions génériques pour des tâches générales.
&lt;/li&gt;
&lt;li&gt;❌ Moins « réfléchi » que Claude pour le raisonnement profond.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  GPT-5 : Le penseur profond
&lt;/h4&gt;

&lt;p&gt;Si votre travail implique du &lt;strong&gt;raisonnement multi-étapes&lt;/strong&gt;, du &lt;strong&gt;débogage complexe&lt;/strong&gt; ou une &lt;strong&gt;analyse au niveau de l’architecture&lt;/strong&gt;, GPT-5 brille — mais il faut bien l’instruire avec des prompts. Ses capacités d’analyse surpassent de nombreux autres modèles, et il peut résoudre des bugs complexes tout en offrant une vue d’ensemble plus claire du scénario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gros refactorings multi-fichiers&lt;/li&gt;
&lt;li&gt;Raisonnement et débogage profonds&lt;/li&gt;
&lt;li&gt;Projets nécessitant une compréhension contextuelle longue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Avantages :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Très fort en raisonnement logique
&lt;/li&gt;
&lt;li&gt;✅ Gère texte + vision (excellent pour les diffs UI et captures d’écran [&lt;em&gt;pas encore testé&lt;/em&gt;])
&lt;/li&gt;
&lt;li&gt;✅ Modes de raisonnement contrôlables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Plus lent que les modèles légers.
&lt;/li&gt;
&lt;li&gt;❌ Moins économique pour les petits projets&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Vous vous sentez bloqué ? Revenez au point de départ et expliquez tout le cas d’usage. &lt;em&gt;Boom&lt;/em&gt; — c’est probablement le meilleur modèle pour résoudre ces casse-têtes. Un peu lent, mais efficace.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  Claude Sonnet 4.5 : Le polyvalent raffiné
&lt;/h4&gt;

&lt;p&gt;S’il y a un modèle qui se rapproche &lt;em&gt;le plus d’un ingénieur senior&lt;/em&gt;, c’est &lt;strong&gt;Claude Sonnet 4.5&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Développé par Anthropic, Claude est reconnu pour sa &lt;strong&gt;clarté, sa fiabilité&lt;/strong&gt; et sa capacité à gérer des &lt;strong&gt;immenses bases de code&lt;/strong&gt; — jusqu’à &lt;strong&gt;1 million de tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dépôts de niveau entreprise&lt;/li&gt;
&lt;li&gt;Tâches autonomes de plusieurs heures&lt;/li&gt;
&lt;li&gt;Sorties sûres et à faible hallucination&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Avantages :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Gère d’énormes fenêtres de contexte
&lt;/li&gt;
&lt;li&gt;✅ Excellent pour les grands monorepos et les refactorings
&lt;/li&gt;
&lt;li&gt;✅ Faible taux d’hallucination et ton cohérent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Limité par le débit sur les configurations gratuites ou partagées
&lt;/li&gt;
&lt;li&gt;❌ Tarification légèrement premium&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Avis personnel :&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Claude Sonnet génère généralement un code plus propre et plus fiable que les autres. Mais quand vous atteignez les limites de débit, c’est frustrant — surtout lors de longues sessions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Pour des agents longue durée (comme des migrations de données ou des audits de dépôt), Claude Sonnet 4.5 est le choix le plus sûr.&lt;/p&gt;


&lt;h2&gt;
  
  
  1.6.4 Tableau de bord d’utilisation de Copilot
&lt;/h2&gt;

&lt;p&gt;Vous pouvez voir combien vous avez utilisé de requêtes premium ce mois‑ci. Avec un abonnement PRO payant, vous avez un quota mensuel de 300 requêtes.&lt;/p&gt;

&lt;p&gt;Notez que l’allocation est réinitialisée le premier du mois prochain.&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%2Ftcws86ccw49799aniwe6.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%2Ftcws86ccw49799aniwe6.png" alt="Board Github Copilot" width="624" height="363"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  1.6.5 Contrôle de l’activité des prompts
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; C’est ici que vous lancez le prompt ou l’arrêtez (s’il tourne)&lt;/li&gt;
&lt;li&gt; Après la réponse, vous pouvez garder les changements effectués par l’agent ou les annuler.&lt;/li&gt;
&lt;li&gt; Pour certaines étapes, il demandera votre permission avant d’agir (ex. exécuter une appli, installer, supprimer un fichier, etc.). Vous pouvez aussi le configurer pour toujours autoriser.&lt;/li&gt;
&lt;/ol&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%2Fp1bhak8qlkq1g0acp9o4.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%2Fp1bhak8qlkq1g0acp9o4.png" alt="Contrôle activité Copilot" width="536" height="563"&gt;&lt;/a&gt;&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%2Fxcab9f7brf23kpnbd0xq.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%2Fxcab9f7brf23kpnbd0xq.png" alt="Contrôle activité Copilot" width="514" height="330"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  1.6.6 Fichier de contexte pour l’agent
&lt;/h2&gt;

&lt;p&gt;Vous pouvez limiter votre agent à un contexte spécifique, qui peut être :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Un fichier ouvert&lt;/li&gt;
&lt;li&gt; Une partie du fichier ouvert (comme sur le schéma ci‑dessus, de la ligne 11 à 16)&lt;/li&gt;
&lt;li&gt; Ou joindre un nouveau fichier (ex. une image que l’agent lira, puis codera)&lt;/li&gt;
&lt;li&gt; Utiliser &lt;code&gt;#&lt;/code&gt; pour indiquer un fichier d’intérêt, &lt;code&gt;@&lt;/code&gt; pour accéder à l’extension et &lt;code&gt;/&lt;/code&gt; pour accéder à une commande ou un fichier de prompt.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  1.6.7 Gestion de code (Source Control)
&lt;/h2&gt;

&lt;p&gt;Vous pouvez effectuer la gestion de code directement depuis VS Code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accéder à Source Control. S’il n’y en a pas, un bouton permet de l’initialiser ici&lt;/li&gt;
&lt;li&gt;Ajouter (au contrôle de source), retirer ou ouvrir les fichiers modifiés&lt;/li&gt;
&lt;li&gt;Écrire votre message de commit ici, ou utiliser l’IA (bouton étoile) pour le générer&lt;/li&gt;
&lt;li&gt;Valider vos changements ajoutés, et choisir &lt;em&gt;Amend&lt;/em&gt;, &lt;em&gt;Push&lt;/em&gt; ou &lt;em&gt;Sync&lt;/em&gt; avec le commit.&lt;/li&gt;
&lt;/ol&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%2Ffupe46zf4naspb9lkwo1.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%2Ffupe46zf4naspb9lkwo1.png" alt="Gestion de code" width="375" height="414"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  1.6.8 Paramètres de l’extension GitHub Copilot
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Ouvrir le panneau des Extensions&lt;/li&gt;
&lt;li&gt; Sélectionner les paramètres de Copilot&lt;/li&gt;
&lt;li&gt; Vous pouvez maintenant activer l’autocomplétion pour le Markdown ou le texte brut !!&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Partie II : Maîtriser les leviers de productivité
&lt;/h1&gt;

&lt;p&gt;Cette section est le cœur du guide, détaillant les stratégies pratiques pour améliorer la précision et l'efficacité.&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.1 Maîtriser les commandes Slash
&lt;/h2&gt;

&lt;p&gt;Les slash commandes sont des raccourcis intégrés qui évitent des prompts interminables. Tapez &lt;code&gt;/&lt;/code&gt; dans Copilot Chat pour débloquer une productivité instantanée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slash Commands essentielles :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/tests&lt;/code&gt; — Génère des tests unitaires complets pour le code sélectionné, avec cas limites et mocks
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/fix&lt;/code&gt; — Analyse les erreurs et propose des correctifs (null checks, refactors)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/explain&lt;/code&gt; — Explique des snippets de code complexes
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/doc&lt;/code&gt; — Génère des commentaires de documentation pour fonctions et classes
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/refactor&lt;/code&gt; — Suggère des améliorations et optimisations de code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Astuce&lt;/strong&gt; : Combinez &lt;code&gt;/tests&lt;/code&gt; avec &lt;code&gt;#file:src/service.ts&lt;/code&gt; pour générer des tests spécifiques au service sans boilerplate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi c’est important :&lt;/strong&gt; Ces commandes fonctionnent en chat et en inline (Alt+/) et sont incluses dans l’offre basique. Commencez par &lt;code&gt;/tests&lt;/code&gt; et &lt;code&gt;/fix&lt;/code&gt; — des gains rapides pour tout codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact réel :&lt;/strong&gt; Sur ce projet e‑commerce, &lt;code&gt;/tests&lt;/code&gt; m’a à lui seul économisé 8 à 10 heures d’écriture de tests manuels sur tous les services.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note gratuit vs payant&lt;/strong&gt; : la version gratuite limite vos requêtes mensuelles. En gratuit, je me cognais les limites en plein projet. D’où mon passage à l’abonnement payant (10 $/mois individuel). Si vous utilisez Copilot au quotidien, le payant vaut le coup rien que pour l’illimité.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.2 Utiliser les Variables de Contexte 📦
&lt;/h2&gt;

&lt;p&gt;Copilot n’est pas devin. Plus vous lui donnez de contexte, mieux il vous aide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variables de contexte puissantes :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#file&lt;/code&gt; — Référencez des fichiers précis : &lt;code&gt;#file:auth.service.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#codebase&lt;/code&gt; — Laissez Copilot fouiller toute votre base de code
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#editor&lt;/code&gt; — Ajoute tous les fichiers ouverts au contexte
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@workspace&lt;/code&gt; — Posez des questions sur toute la structure du projet
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#fetch&lt;/code&gt; — Récupère du contenu web ou de la doc&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Exemple en action :
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@workspace Sur notre serveur Node, quelles optimisations pour gérer 10 000 requêtes concurrentes ?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Astuce : surlignez le code pertinent avant de questionner. Copilot donne alors des suggestions ciblées et évite les suppositions.&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.3 Créer des instructions personnalisées ✍️
&lt;/h2&gt;

&lt;p&gt;Pour arrêtez de vous battre avec les suggestions : Définir les standards de codage de l'équipe (style, conventions, utilisation de const vs var) dans le fichier .instructions.md,. L'objectif est de garantir une cohérence permanente du code généré.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurer les instructions personnalisées :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lancez &lt;code&gt;Chat: New Instructions File&lt;/code&gt; depuis la palette de commandes
&lt;/li&gt;
&lt;li&gt;Cela crée &lt;code&gt;.instructions.md&lt;/code&gt; dans le dossier &lt;code&gt;.github/instructions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Définissez vos règles projet en Markdown&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exemple de fichier d’instructions :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Custom instructions for Copilot

Project Context
This project is a React + Node.js e-commerce platform

Code Style
- Use TypeScript strict mode
- Prefer functional components with hooks
- Use camelCase for variables
- Write descriptive variable names (no single letters)

Testing
- Use Jest for unit tests
- Use Playwright for E2E tests
- Always include error handling tests

Indentation
We use 2 spaces, not tabs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pourquoi ça marche :&lt;/strong&gt; Copilot génère désormais du code conforme à VOTRE style, pas des patterns génériques. Temps d’édition réduit jusqu’à 40 %.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.4 Stratégie d'ouverture de fichiers 📂
&lt;/h2&gt;

&lt;p&gt;Petit secret : Copilot ne voit pas les fichiers fermés. Ouvrir 3 à 5 fichiers liés lui donne un contexte massif sur la structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stratégie d’ouverture maligne :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Avant d’écrire du nouveau code, ouvrez :  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le fichier que vous éditez
&lt;/li&gt;
&lt;li&gt;Les utilitaires/helpers liés
&lt;/li&gt;
&lt;li&gt;Les fichiers de types
&lt;/li&gt;
&lt;li&gt;Les fichiers de config
&lt;/li&gt;
&lt;li&gt;Des implémentations similaires existantes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple : écrire un nouvel endpoint API ? Ouvrez :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;routes/user.routes.ts&lt;/code&gt; (là où vous travaillez)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controllers/user.controller.ts&lt;/code&gt; (patterns existants)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;models/User.ts&lt;/code&gt; (structure de données)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;middleware/auth.ts&lt;/code&gt; (contexte d'authentification)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rappel critique :&lt;/strong&gt; fermez les fichiers hors sujet quand vous changez de tâche. Trop de fichiers non liés perturbent le contexte.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.5 Commenter le Flux de travail 🗨️
&lt;/h2&gt;

&lt;p&gt;Écrire des commentaires détaillés spécifiant l'architecture, le flux, le traitement des erreurs et les cas limites AVANT d'écrire le code. Cette planification augmente significativement la précision de la sortie de l'IA.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Objectif : Auth JWT + refresh tokens + reset password sécurisé
// Flux : signup -&amp;gt; email verify -&amp;gt; login -&amp;gt; refresh -&amp;gt; logout
// Exigences : rate limiting, CSRF, rotation de refresh tokens, IP logging
// Cas limites : token expiré, utilisateur désactivé, tentative brute force
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voyez Copilot comme un dev junior. Plus vos consignes sont claires, meilleur est le résultat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow « comment-first »
&lt;/h3&gt;

&lt;p&gt;Plutôt que plonger direct dans le code, écrivez en tête de fichier un commentaire descriptif expliquant l’architecture et le flux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Résultat :&lt;/strong&gt; Copilot génère un code qui suit vos spécifications, incluant la gestion d’erreurs et les cas limites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; incluez des exemples d’entrées/sorties dans les commentaires. La précision des suggestions augmente fortement.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.6 Le Dialogue itératif 🔄
&lt;/h2&gt;

&lt;p&gt;Ne pas accepter la première suggestion. Affiner les résultats par des follow-up prompts spécifiques pour garantir la validation côté client ou l'ajout de logique manquante.&lt;/p&gt;

&lt;p&gt;Gros morceau en 2025. Copilot CLI intègre Claude Sonnet 4.5 — et ce modèle est bluffant en code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fonctionnalités CLI puissantes :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/model&lt;/code&gt; — Changez de modèle IA à la volée
&lt;/li&gt;
&lt;li&gt;Exécution directe du shell avec le préfixe &lt;code&gt;!&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Support image via mentions &lt;code&gt;@&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Permissions d’outils améliorées avec des glob patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple concret :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Générer des commandes terminal complexes
gh copilot explain "How do I find all .js files modified in the last 7 days and run eslint on them?"

# Exécuter directement !
npm run test:unit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; utilisez la commande &lt;code&gt;/usage&lt;/code&gt; pour suivre les requêtes premium et optimiser votre flux.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.7 Fichiers de prompts personnalisés 🗃️
&lt;/h2&gt;

&lt;p&gt;Créer des modèles réutilisables pour des requêtes complexes dans votre projet (.github/prompts/).&lt;/p&gt;

&lt;p&gt;Le mode Agent permet à Copilot de travailler de façon autonome — trouver des fichiers, éditer du code, et décider sans saisie constante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quand utiliser le mode Agent :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactorings sur de grandes bases de code
&lt;/li&gt;
&lt;li&gt;Conversion entre frameworks
&lt;/li&gt;
&lt;li&gt;Implémentation de fonctionnalités à travers plusieurs fichiers
&lt;/li&gt;
&lt;li&gt;Débogage d’issues complexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comment activer :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+Alt+L&lt;/code&gt; (Windows) ou &lt;code&gt;Cmd+Shift+Alt+L&lt;/code&gt; (Mac)
&lt;/li&gt;
&lt;li&gt;Ou &lt;code&gt;/agent&lt;/code&gt; dans le chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple de prompt :&lt;/strong&gt;&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%2F6ri2xm6w90i9ux7ffmd8.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%2F6ri2xm6w90i9ux7ffmd8.png" alt="une capture de mon VS Code, GitHub Copilot Chat" width="614" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Commande GitHub Copilot dans mon espace réel&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@workspace Objectif :
Créer une page web statique qui présente une estimation des résultats du FC Nantes (FCN) pour la fin de saison de Ligue 1.

Contraintes générales :
Page web en HTML, CSS et JavaScript vanilla
Design moderne, lisible et responsive

Couleurs officielles du FC Nantes :
Jaune : #FFD700
Vert : #006A3D

Typographie sportive et élégante
Aucun framework externe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note de sécurité :&lt;/strong&gt; le mode Agent requiert votre validation avant exécution des changements. Relisez tout attentivement.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.8 Glisser-Déposer de Contexte 🖱️
&lt;/h2&gt;

&lt;p&gt;Contexte Visuel et Logistique : déposer des fichiers, des logs d'erreurs, des dossiers, et même des captures d'écran directement dans Copilot Chat pour une analyse immédiate. Utiliser le fichier &lt;code&gt;package.json&lt;/code&gt; pour informer l'IA des dépendances.&lt;/p&gt;

&lt;p&gt;Par ailleurs vous connaissez ce moment où vous êtes « dans la zone » et ne voulez pas changer de fenêtre ? L’inline chat est fait pour ça.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Raccourcis inline chat (je cherchais où l’ouvrir dans VS Code jusqu’à trouver ces raccourcis) :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+I&lt;/code&gt; / &lt;code&gt;Cmd+I&lt;/code&gt; — Démarrer le chat inline directement dans l’éditeur
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Alt+/&lt;/code&gt; — Accès rapide aux slash commands en inline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cas parfaits :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Petites corrections en debug
&lt;/li&gt;
&lt;li&gt;Générer une fonction unique
&lt;/li&gt;
&lt;li&gt;Ajouter de la gestion d’erreurs à du code existant
&lt;/li&gt;
&lt;li&gt;Refactoriser un bloc précis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Workflow pro :&lt;/strong&gt; surlignez le code problématique → &lt;code&gt;Ctrl+I&lt;/code&gt; → tapez &lt;code&gt;/fix&lt;/code&gt; → acceptez la suggestion → continuez à coder.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.9 Stratégie de nettoyage de contexte 🧹
&lt;/h2&gt;

&lt;p&gt;Supprimer les questions non pertinentes ou démarrer un nouveau fil de conversation pour éviter que l'historique ne dilue la qualité de la réponse (améliore la qualité de 30 %).&lt;/p&gt;

&lt;p&gt;Sauvez vos meilleurs prompts et partagez‑les avec l’équipe. Les fichiers de prompt sont des templates réutilisables pour les tâches courantes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Créer des fichiers de prompt :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Chat: New Prompt File&lt;/code&gt; via la palette
&lt;/li&gt;
&lt;li&gt;Enregistrez dans &lt;code&gt;.github/prompts/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Écrivez le prompt en Markdown avec métadonnées&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exemple de fichier (.prompt.md) :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mode: 'agent'
tools: ['githubRepo', 'search/codebase']
description: 'Generate a new React component'
Your goal is to generate a new React component based on templates in #githubRepo yourcompany/design-system.
Requirements:
* Use TypeScript with strict types
* Follow design system patterns
* Include PropTypes
* Add Storybook story
* Include unit tests with React Testing Library
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Utilisation :&lt;/strong&gt; tapez &lt;code&gt;/your-prompt-name&lt;/code&gt; dans le chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bénéfice équipe :&lt;/strong&gt; tout le monde suit les mêmes bonnes pratiques. Fini les styles incohérents.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.10 Maîtriser la sélection de Code 🔍
&lt;/h2&gt;

&lt;p&gt;Utiliser &lt;code&gt;@selection&lt;/code&gt; ou mettre en surbrillance un bloc de code précis avant de poser une question afin d'obtenir des suggestions plus rapides et plus pertinentes.&lt;/p&gt;

&lt;p&gt;Par ailleurs la fonction la plus simple mais sous‑utilisée : glissez des fichiers directement dans Copilot Chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ce que vous pouvez glisser :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plusieurs fichiers à la fois
&lt;/li&gt;
&lt;li&gt;Des dossiers entiers
&lt;/li&gt;
&lt;li&gt;Des captures et images (NOUVEAU en 2025 !)
&lt;/li&gt;
&lt;li&gt;Des logs d’erreurs du terminal
&lt;/li&gt;
&lt;li&gt;Des sorties d’échecs de tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cas puissant — rapport de bug :&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prenez une capture du bug UI
&lt;/li&gt;
&lt;li&gt;Glissez la capture dans Copilot Chat
&lt;/li&gt;
&lt;li&gt;Tapez : « Crée un rapport de bug pour ce problème de rendu »
&lt;/li&gt;
&lt;li&gt;Copilot analyse l’image et génère une documentation de bug détaillée&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Astuce avancée :&lt;/strong&gt; glissez votre &lt;code&gt;package.json&lt;/code&gt; pour aider Copilot à comprendre vos dépendances et proposer du code compatible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BONUS :&lt;/strong&gt; stratégie « supprimer et redémarrer »&lt;/p&gt;

&lt;p&gt;Copilot utilise l’historique de conversation comme contexte. S’il donne des réponses hors sujet :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Supprimez les anciennes questions non pertinentes
&lt;/li&gt;
&lt;li&gt;Démarrez un nouveau thread via le bouton &lt;code&gt;+&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Utilisez les flèches haut/bas pour naviguer dans l’historique (comme dans le terminal)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cela garde la conversation ciblée et améliore la qualité des réponses d’environ 30 %.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check‑list de gains rapides pour cette semaine
&lt;/h3&gt;

&lt;p&gt;Avant de fermer cet article, engagez‑vous à tester ces trois points :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ajoutez un fichier &lt;code&gt;.instructions.md&lt;/code&gt; dans le répertoire &lt;code&gt;instructions&lt;/code&gt; à la racine de votre projet principal, avec votre style de code
&lt;/li&gt;
&lt;li&gt;Installez Copilot CLI et essayez la commande &lt;code&gt;/model&lt;/code&gt; avec Claude Sonnet 4.5
&lt;/li&gt;
&lt;li&gt;Ouvrez 4 à 5 fichiers liés la prochaine fois que vous écrivez du nouveau code et regardez les suggestions s’améliorer&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.11 Créer des issues à partir de captures d’écran 📸
&lt;/h2&gt;

&lt;p&gt;Vous avez un rapport de bug avec une capture d’écran ? Ne l’écrivez pas manuellement, laissez Copilot s’en charger. Voici comment :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Prenez une capture d’écran du bug (par ex., une icône mal alignée ou un problème de mise en page)&lt;/li&gt;
&lt;li&gt; Glissez-la dans la discussion Copilot sur &lt;a href="http://github.com/copilot" rel="noopener noreferrer"&gt;github.com/copilot&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt; Ajoutez une consigne comme :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Crée un nouveau ticket en utilisant le label 'bug'. Utilise cette capture et décris l’icône de flèche qui se chevauche. Applique le modèle de ticket UI de ce dépôt.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot lit l’image, génère un titre et une description clairs, applique les bons labels et utilise les modèles de tickets de votre dépôt. C’est plus rapide qu’une transcription manuelle et il repère souvent des détails que je pourrais manquer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Copilot peut déduire le contexte du ticket à partir de votre capture et de votre consigne ; pas besoin de tout expliciter.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.12 Utiliser Github Copilot partout… Mais tirer le meilleur du plugin dans VS Code 🌐
&lt;/h2&gt;

&lt;p&gt;Vous pouvez profiter de Github Copilot dans de nombreux IDE tels que Visual Studio Code, JetBrains, Visual Studio, Eclipse, XCode, Vim ou même Neovim. &lt;/p&gt;

&lt;p&gt;L’idée est de garder votre environnement familier tout en bénéficiant des fonctionnalités de Github Copilot.&lt;/p&gt;

&lt;p&gt;Néanmoins, les plugins VS Code pour Github Copilot sont souvent plus avancés et mis à jour plus fréquemment que pour les autres IDE.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; installez les plugins VS Code compatibles avec votre IDE préféré, et installez également &lt;strong&gt;VS Code&lt;/strong&gt; en parallèle. Vous profitez ainsi du confort de votre environnement habituel tout en accédant facilement aux dernières nouveautés disponibles dans VS Code.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Partie III : Écosystème et Agenticité Avancée
&lt;/h1&gt;

&lt;p&gt;Cette partie explore l'interopérabilité et les outils de niveau professionnel qui étendent Copilot au-delà de l'IDE.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.1 Le Protocole de contexte Modèle (MCP) 🚀
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Le &lt;strong&gt;MCP&lt;/strong&gt; (&lt;em&gt;Model Context Protocol&lt;/em&gt;) est un protocole d'interopérabilité — un peu comme un « USB-C pour les intégrations d'IA » — conçu pour étendre les capacités des &lt;strong&gt;modèles d’IA&lt;/strong&gt; et leur permettre de se connecter &lt;strong&gt;de manière sécurisée et structurée&lt;/strong&gt; à des &lt;strong&gt;outils, données et services externes&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Concrètement avec un MCP : L’IA peut &lt;strong&gt;accéder à des données réelles&lt;/strong&gt;, &lt;strong&gt;appeler vos APIs&lt;/strong&gt;, &lt;strong&gt;lire vos fichiers&lt;/strong&gt; ou &lt;strong&gt;agir sur vos outils&lt;/strong&gt;, selon des règles explicites.&lt;/p&gt;

&lt;p&gt;Il existe plus de 30 intégrations MCP officielles, couvrant des domaines comme :&lt;/p&gt;

&lt;p&gt;GitHub MCP propose un hub central pour la découverte et l'installation de serveurs MCP de partenaires (Figma, Postman, Terraform) &lt;a href="https://github.com/mcp" rel="noopener noreferrer"&gt;Github hub central mcp server&lt;/a&gt;.&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%2Fn1hg1gxqa7xrmzzogq97.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%2Fn1hg1gxqa7xrmzzogq97.png" alt="Registre des MCP server central" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Intégration/Produit&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Résumé&lt;/th&gt;
&lt;th&gt;Cas d'usage rapides&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Conversion fichiers → Markdown&lt;/td&gt;
&lt;td&gt;Utilitaire/Conversion&lt;/td&gt;
&lt;td&gt;Convertir PDF, Word, Excel, images, audio en Markdown.&lt;/td&gt;
&lt;td&gt;Markdown depuis PDF/Doc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub (assistants IA)&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;Gérer dépôts, issues, PR, workflows en langage naturel.&lt;/td&gt;
&lt;td&gt;Gérer issues/PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome DevTools&lt;/td&gt;
&lt;td&gt;DevTools&lt;/td&gt;
&lt;td&gt;Serveur MCP pour Chrome DevTools.&lt;/td&gt;
&lt;td&gt;Inspecter runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion (officiel)&lt;/td&gt;
&lt;td&gt;Productivité&lt;/td&gt;
&lt;td&gt;Serveur MCP officiel pour l’API Notion.&lt;/td&gt;
&lt;td&gt;Notes/DB Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure MCP Tools&lt;/td&gt;
&lt;td&gt;Cloud Integrations&lt;/td&gt;
&lt;td&gt;Outils Azure MCP pour connecter agents IA et services Azure.&lt;/td&gt;
&lt;td&gt;Azure services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform (HCP/Enterprise)&lt;/td&gt;
&lt;td&gt;IaC&lt;/td&gt;
&lt;td&gt;Générer Terraform plus précis et automatiser workflows.&lt;/td&gt;
&lt;td&gt;Infra as Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure DevOps&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;Dépôts, work items, builds, releases, tests, recherche de code.&lt;/td&gt;
&lt;td&gt;Repos/CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elasticsearch&lt;/td&gt;
&lt;td&gt;Recherche/Analytics&lt;/td&gt;
&lt;td&gt;Requêtes de recherche, mappings, ES&lt;/td&gt;
&lt;td&gt;QL, shards via NL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hugging Face&lt;/td&gt;
&lt;td&gt;IA/Modèles&lt;/td&gt;
&lt;td&gt;Accéder modèles, datasets, Spaces, articles, collections.&lt;/td&gt;
&lt;td&gt;Modèles/datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jira + Confluence (remote)&lt;/td&gt;
&lt;td&gt;Collaboration IT&lt;/td&gt;
&lt;td&gt;Connexion sécurisée Jira/Confluence avec LLM/IDE/plateformes d’agents.&lt;/td&gt;
&lt;td&gt;ITSM/Confluence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Expérimenter avec GitHub MCP
&lt;/h3&gt;

&lt;p&gt;Je vous encourage à essayer GitHub MCP par vous-même. Voici comment configurer un serveur MCP localement :&lt;br&gt;
&lt;a href="https://docs.github.com/fr/copilot/how-tos/provide-context/use-mcp/set-up-the-github-mcp-server" rel="noopener noreferrer"&gt;setup github mcp server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Une fois que GitHub MCP est lancé, vous pouvez le solliciter et l’utiliser.&lt;/p&gt;

&lt;p&gt;Dans mon cas, je veux ajouter un nouvel élément de technologie à &lt;a href="https://github.com/GoogleCloudPlatform/Template" rel="noopener noreferrer"&gt;https://github.com/GoogleCloudPlatform/Template&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Le prompt que j’utilise est le suivant :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the GitHub MCP.
Refers to https://github.com/GoogleCloudPlatform/Template,
- Reads the contribution.md, and
- Create a technology item for Perplexity LLM Model, and
- Make a unique branch for the new Technology Item and
- Open a git issue and pull request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il va alors utiliser Get File, Create Branch, Update File, Open Issue, Open Pull Request, et effectuer toutes les tâches nécessaires disponibles dans &lt;strong&gt;MCP Server : GitHub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Personnellement, j’interagis beaucoup avec les MCP suivants :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Azure DevOps MCP : Voir les éléments de travail, mettre à jour le statut des tâches (ex. : passer à "Code Review"), gérer les PR sans quitter VS Code, réduisant la commutation de contexte.&lt;/p&gt;

&lt;p&gt;Agent de Codage Teams : Déléguer des tâches à l'Agent via @GitHub  dans Microsoft Teams, qui exécute la tâche sur le dépôt et crée automatiquement une Pull Request.&lt;/p&gt;

&lt;p&gt;Chrome DevTools MCP : Utiliser l'Agent pour analyser la performance web (Largest Contentful Paint (LCP), Interaction to Next Paint (INP)) sur n'importe quelle URL.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.2 🚀 Qu’est‑ce que « Awesome GitHub Copilot » ? 📡
&lt;/h2&gt;

&lt;p&gt;Ce dépôt fournit une boîte à outils complète pour enrichir GitHub Copilot avec :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://github.com/github/awesome-copilot/blob/main/docs/README.agents.md" rel="noopener noreferrer"&gt;Awesome Agents&lt;/a&gt;&lt;/strong&gt; — Agents GitHub Copilot spécialisés qui s’intègrent aux serveurs MCP pour offrir des capacités étendues pour des workflows et outils spécifiques&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://github.com/github/awesome-copilot/blob/main/docs/README.prompts.md" rel="noopener noreferrer"&gt;Awesome Prompts&lt;/a&gt;&lt;/strong&gt; — Prompts ciblés et spécifiques à une tâche pour générer du code, de la documentation et résoudre des problèmes précis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://github.com/github/awesome-copilot/blob/main/docs/README.instructions.md" rel="noopener noreferrer"&gt;Awesome Instructions&lt;/a&gt;&lt;/strong&gt; — Normes de codage et bonnes pratiques exhaustives applicables à des motifs de fichiers ou à des projets entiers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://github.com/github/awesome-copilot/blob/main/docs/README.collections.md" rel="noopener noreferrer"&gt;Awesome Collections&lt;/a&gt;&lt;/strong&gt; — Collections organisées de prompts, d’instructions et de modes de chat autour de thèmes et workflows spécifiques&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Pourquoi utiliser « Awesome GitHub Copilot » ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Productivité&lt;/strong&gt; : des agents, prompts et instructions préconstruits font gagner du temps et assurent des résultats cohérents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bonnes pratiques&lt;/strong&gt; : bénéficiez de normes et patterns de codage sélectionnés par la communauté.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assistance spécialisée&lt;/strong&gt; : accédez à des conseils de niveau expert via des agents personnalisés spécialisés.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apprentissage continu&lt;/strong&gt; : restez à jour sur les derniers patterns et pratiques à travers les technologies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📖 Structure du dépôt
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/github/awesome-copilot#-repository-structure" rel="noopener noreferrer"&gt;Structure du dépôt Awesome&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── prompts/          # Prompts spécifiques aux tâches (.prompt.md)
├── instructions/     # Normes de codage et bonnes pratiques (.instructions.md)
├── agents/           # Personas IA et modes spécialisés (.agent.md)
├── collections/      # Collections organisées d’éléments liés (.collection.yml)
└── scripts/          # Scripts utilitaires pour la maintenance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Comment utiliser les ressources « Awesome GitHub Copilot » ?
&lt;/h3&gt;

&lt;h3&gt;
  
  
  🤖 Agents personnalisés
&lt;/h3&gt;

&lt;p&gt;Les agents personnalisés peuvent être utilisés dans Copilot Coding Agent (CCA), VS Code et Copilot CLI. Pour le CCA, lors de l’assignation d’un ticket à Copilot, sélectionnez l’agent personnalisé dans la liste fournie. Dans VS Code, vous pouvez activer l’agent personnalisé dans la session des agents, aux côtés des agents intégrés comme Plan et Agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 Prompts
&lt;/h3&gt;

&lt;p&gt;Utilisez la commande &lt;code&gt;/&lt;/code&gt; dans GitHub Copilot Chat pour accéder aux prompts :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/awesome-copilot create-readme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📋 Instructions
&lt;/h3&gt;

&lt;p&gt;Les instructions s’appliquent automatiquement aux fichiers selon leurs motifs et fournissent des conseils contextuels sur les normes de codage, les frameworks et les bonnes pratiques.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.3 Custom agents 🤖
&lt;/h2&gt;

&lt;p&gt;Un custom agent est un assistant IA personnalisé dans VS Code qui adopte une personnalité et un comportement spécifiques pour des tâches de développement précises. Par exemple, vous pouvez créer des agents pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un planificateur de projet&lt;/li&gt;
&lt;li&gt;Un réviseur de code sécurisé&lt;/li&gt;
&lt;li&gt;Un architecte de solutions&lt;/li&gt;
&lt;li&gt;Un testeur automatique&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chaque agent possède ses propres instructions, outils disponibles et comportements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi utiliser des Custom Agents ?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spécialisation des tâches
&lt;/h3&gt;

&lt;p&gt;Différentes tâches nécessitent différentes capacités. Un agent de planification peut n'avoir accès qu'à des outils de lecture pour éviter les modifications accidentelles, tandis qu'un agent d'implémentation aura tous les outils d'édition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instructions personnalisées
&lt;/h3&gt;

&lt;p&gt;Chaque agent peut avoir des instructions spécifiques qui définissent comment l'IA doit fonctionner, garantissant des réponses cohérentes et adaptées à chaque fois.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structure d'un fichier Custom Agent
&lt;/h2&gt;

&lt;p&gt;Les custom agents sont définis dans des fichiers &lt;code&gt;.agent.md&lt;/code&gt; (Markdown) avec cette structure :&lt;/p&gt;

&lt;h3&gt;
  
  
  En-tête (YAML frontmatter)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Générer un plan d'implémentation pour de nouvelles fonctionnalités&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Planificateur&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;githubRepo'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;search'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Claude Sonnet &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;span class="na"&gt;handoffs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Implémenter le plan&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;implementation&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Implémente le plan ci-dessus&lt;/span&gt;
    &lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Champs disponibles :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;description&lt;/code&gt; : Description brève de l'agent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt; : Nom de l'agent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools&lt;/code&gt; : Liste des outils disponibles&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model&lt;/code&gt; : Modèle IA à utiliser&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;handoffs&lt;/code&gt; : Transitions suggérées vers d'autres agents&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Corps du fichier
&lt;/h3&gt;

&lt;p&gt;Le corps contient les instructions en Markdown qui guident le comportement de l'agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Créer un Custom Agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Étape 1 : Créer le fichier
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ouvrez la liste des agents dans le Chat&lt;/li&gt;
&lt;li&gt;Sélectionnez &lt;strong&gt;Configure Custom Agents&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cliquez sur &lt;strong&gt;Create new custom agent&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choisissez l'emplacement :

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workspace&lt;/strong&gt; : dans &lt;code&gt;.github/agents&lt;/code&gt; (uniquement pour ce projet)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User profile&lt;/strong&gt; : pour tous vos projets&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Étape 2 : Définir l'agent
&lt;/h3&gt;

&lt;p&gt;Remplissez le fichier &lt;code&gt;.agent.md&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Génère un plan d'implémentation détaillé&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Plan&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;search'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;githubRepo'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Instructions de planification&lt;/span&gt;

Tu es en mode planification. Ta tâche est de générer un plan d'implémentation 
pour une nouvelle fonctionnalité.

Le plan doit inclure :
&lt;span class="p"&gt;-&lt;/span&gt; Vue d'ensemble
&lt;span class="p"&gt;-&lt;/span&gt; Exigences
&lt;span class="p"&gt;-&lt;/span&gt; Étapes d'implémentation
&lt;span class="p"&gt;-&lt;/span&gt; Tests nécessaires

Ne fais aucune modification de code, génère uniquement un plan.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Les Handoffs : enchaîner les agents
&lt;/h2&gt;

&lt;p&gt;Les handoffs permettent de créer des workflows guidés entre agents avec des boutons de transition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple de workflow :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Planification → Implémentation&lt;/strong&gt; : Générer un plan puis coder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implémentation → Révision&lt;/strong&gt; : Coder puis vérifier la qualité&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests échouants → Tests réussis&lt;/strong&gt; : Écrire les tests puis l'implémentation
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;handoffs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Commencer l'implémentation&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;implementation&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Implémente maintenant le plan ci-dessus.&lt;/span&gt;
    &lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;label&lt;/code&gt; : Texte du bouton&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent&lt;/code&gt; : Agent cible&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prompt&lt;/code&gt; : Texte à envoyer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;send&lt;/code&gt; : Envoyer automatiquement (true/false)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Outils disponibles
&lt;/h2&gt;

&lt;p&gt;Vous pouvez spécifier quels outils sont accessibles à chaque agent :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outils VS Code intégrés : &lt;code&gt;'search'&lt;/code&gt;, &lt;code&gt;'fetch'&lt;/code&gt;, &lt;code&gt;'githubRepo'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outils MCP : tous les outils d'un serveur avec &lt;code&gt;'nom-serveur/*'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outils d'extensions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exemple complet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Agent de révision de code se concentrant sur la sécurité&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Réviseur Sécurité&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;search'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Claude Sonnet &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;span class="na"&gt;handoffs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Corriger les problèmes&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;implementation&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Corrige les problèmes de sécurité identifiés ci-dessus.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Instructions de révision sécurité&lt;/span&gt;

Tu es un expert en sécurité applicative. Analyse le code pour :
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Vulnérabilités de sécurité**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Injections SQL
&lt;span class="p"&gt;   -&lt;/span&gt; XSS
&lt;span class="p"&gt;   -&lt;/span&gt; CSRF
&lt;span class="p"&gt;   -&lt;/span&gt; Fuites de données sensibles
&lt;span class="p"&gt;
2.&lt;/span&gt; &lt;span class="gs"&gt;**Bonnes pratiques**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Validation des entrées
&lt;span class="p"&gt;   -&lt;/span&gt; Gestion des erreurs
&lt;span class="p"&gt;   -&lt;/span&gt; Principe du moindre privilège

Pour chaque problème trouvé, fournis :
&lt;span class="p"&gt;-&lt;/span&gt; Description claire
&lt;span class="p"&gt;-&lt;/span&gt; Niveau de gravité
&lt;span class="p"&gt;-&lt;/span&gt; Suggestion de correction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Partager les Custom Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Au niveau de l'équipe
&lt;/h3&gt;

&lt;p&gt;Placez les fichiers dans &lt;code&gt;.github/agents&lt;/code&gt; de votre workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Au niveau de l'organisation
&lt;/h3&gt;

&lt;p&gt;Les agents peuvent être définis au niveau GitHub Organization pour être disponibles dans tous les projets. Activez l'option dans les paramètres :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;github.copilot.chat.customAgents.showOrganizationAndEnterpriseAgents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conseils pratiques
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Commencez simple&lt;/strong&gt; : Créez d'abord des agents avec des rôles clairs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limitez les outils&lt;/strong&gt; : Donnez uniquement les outils nécessaires à chaque agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instructions précises&lt;/strong&gt; : Plus les instructions sont claires, meilleurs sont les résultats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utilisez les handoffs&lt;/strong&gt; : Créez des workflows fluides entre agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testez et itérez&lt;/strong&gt; : Affinez vos agents au fil de l'utilisation&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.4 Maîtriser le GitHub Copilot CLI 🚀
&lt;/h2&gt;

&lt;p&gt;La GitHub Copilot CLI apporte les capacités IA de Copilot directement dans votre ligne de commande.&lt;/p&gt;

&lt;p&gt;Plutôt que de jongler entre votre IDE et votre navigateur, vous pouvez faire appel à Copilot directement dans votre terminal pour les cas d'usage suivants :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assistant IA dans le terminal, indépendant de l’éditeur
&lt;/li&gt;
&lt;li&gt;Exploration du projet (fichiers, dépendances, structure)
&lt;/li&gt;
&lt;li&gt;Génération et modification de code via des prompts en langage naturel
&lt;/li&gt;
&lt;li&gt;Exécution de commandes shell suggérées (avec confirmation)
&lt;/li&gt;
&lt;li&gt;Refactoring et automatisation de workflows multi-étapes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous pouvez utiliser Copilot CLI de deux manières :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mode interactif&lt;/strong&gt; (mode par défaut) : démarrez une session avec la commande &lt;code&gt;copilot&lt;/code&gt; et conversez en aller‑retour, en affinant les tâches au fil de l’eau. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mode programmatique&lt;/strong&gt; : pour des prompts ponctuels. Passez une requête directement avec &lt;code&gt;-p&lt;/code&gt; ou &lt;code&gt;--prompt&lt;/code&gt;, et Copilot répond en ligne. Pour les tâches impliquant la modification ou l’exécution de fichiers, vous pouvez &lt;a href="https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli#using-the-approval-options" rel="noopener noreferrer"&gt;activer les options d’approbation&lt;/a&gt; pour garder les choses &lt;a href="https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli#security-implications-of-automatic-tool-approval" rel="noopener noreferrer"&gt;sûres&lt;/a&gt; et cohérentes. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par exemple, vous pouvez demander :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copilot "create a bash script to check for uncommitted changes and push if clean"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ffpb0roin41orzrk88v0l.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%2Ffpb0roin41orzrk88v0l.png" alt="Prompt dans la CLI Github" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ou bien en mode programmatique :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copilot -p "create a bash script to check for uncommitted changes and push if clean"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot CLI écrira le script, expliquera ce qu’il fait, et vous demandera de confirmer avant de l’exécuter.&lt;/p&gt;

&lt;p&gt;Copilot CLI demandera par défaut toujours une confirmation avant de lire, modifier ou exécuter des fichiers. Vous gardez ainsi donc le contrôle de votre environnement. (Note : Exception si vous choisissez « &lt;strong&gt;Yes, and remember this folder for future sessions&lt;/strong&gt; » ou « &lt;strong&gt;Yes, and approve TOOL for the rest of the session&lt;/strong&gt; » lorsque c’est demandé—Copilot suivra alors ces instructions au lieu de vous reposer la question. Plus de détails dans notre kit de démarrage ci‑dessous !)&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%2Fu405ew6y2xn18tqy6rkm.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%2Fu405ew6y2xn18tqy6rkm.png" alt="Résultat prompt dans la CLI Github" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;  Vous pouvez sélectionner l’une de ces options :&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes, proceed&lt;/strong&gt; : Copilot peut accéder et utiliser les fichiers de cet emplacement uniquement pour cette session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yes, and remember this folder for future sessions&lt;/strong&gt; : les fichiers de ce dossier sont approuvés pour les sessions en cours et futures. En démarrant Copilot CLI depuis ce dossier, cette question ne vous sera plus posée (ne choisissez cette option que si vous êtes sûr qu’il sera toujours sans risque pour Copilot de travailler avec ces fichiers).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No, exit (Esc)&lt;/strong&gt; : mettre fin à votre session Copilot CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cas d’usage de GitHub Copilot CLI, refactoring et automatisation de workflows multi-étapes avec un agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’option &lt;code&gt;--allow-all-tools&lt;/code&gt; dans GitHub Copilot CLI permet d'autoriser Copilot à utiliser automatiquement tous les outils disponibles sur votre système, sans vous demander confirmation à chaque fois.&lt;/p&gt;

&lt;p&gt;Exemple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copilot --allow-all-tools -p "create a bash script to check for uncommitted changes and push if clean"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Partie IV : Qualité, sécurité et rôle humain (Les pièges à éviter)
&lt;/h1&gt;

&lt;p&gt;Cette section est dédiée à la responsabilité du développeur et aux erreurs critiques à éviter ⚠️.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1 Prendre les suggestions de Copilot pour des vérités 🤖
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Beaucoup de développeurs acceptent les suggestions de Copilot sans double vérification ✅❌.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; Le code généré par IA peut sembler correct mais contenir des bugs subtils 🐛, des problèmes de performance ⚡ ou des patterns obsolètes 📉.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Traitez la sortie de Copilot comme des extraits Stack Overflow : &lt;strong&gt;relisez, testez et refactorisez&lt;/strong&gt; avant de committer ✍️. Demandez-vous toujours : &lt;em&gt;« Est-ce que j’écrirais ceci si Copilot ne me l’avait pas suggéré ? »&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.2 Ignorer la sécurité du code 🔒
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Copilot peut générer du code non sécurisé (ex. requêtes SQL sans paramétrage, regex dangereuses, gestion faible des mots de passe).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; L’IA ne priorise pas intrinsèquement les bonnes pratiques de sécurité 🚨. Copier-coller aveuglément peut conduire à des vulnérabilités.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Appliquez &lt;strong&gt;les pratiques de codage sécurisé&lt;/strong&gt; : validez les entrées ✅, échappez les requêtes 🛡️, nettoyez les sorties ✨. Lancez une analyse statique (ex. SonarQube, plugins de sécurité ESLint) sur le code généré par Copilot.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.3 Utiliser Copilot comme béquille pour les fondamentaux 🏗️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; S’appuyer sur Copilot au lieu de comprendre le langage ou le framework sous-jacent 📚.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; Si vous ne savez pas &lt;em&gt;pourquoi&lt;/em&gt; le code fonctionne, vous aurez du mal à le déboguer 🔍 ou l’étendre plus tard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Utilisez Copilot comme &lt;strong&gt;assistant d’apprentissage&lt;/strong&gt; 🎓, pas comme substitut. Après avoir accepté une suggestion, faites une pause et expliquez-la (à vous-même ou en commentaire) avant de continuer.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.4 Surcompliquer des solutions simples ✂️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Copilot génère parfois des solutions verbeuses pour des problèmes qui pourraient être résolus en une ligne 📝.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; La sur-ingénierie alourdit votre codebase ⚖️ et rend la maintenance plus difficile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Gardez &lt;strong&gt;le jugement du développeur&lt;/strong&gt; dans la boucle 👨‍💻. Si la suggestion semble trop longue, demandez-vous s’il existe une solution plus élégante. Less is more.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.5 Ne pas fournir de contexte pour de meilleures suggestions 🗂️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Écrire des noms de fonctions ou des commentaires vagues, puis s’attendre à ce que Copilot « sache » ce que vous voulez.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; L’IA se nourrit de contexte. Sans contexte, les suggestions peuvent être hors sujet ou déroutantes ❓.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Rédigez &lt;strong&gt;des signatures de fonctions, commentaires et docstrings clairs&lt;/strong&gt; ✏️. Exemple : au lieu de &lt;code&gt;function processData()&lt;/code&gt;, utilisez &lt;code&gt;function normalizeUserInput(userData: string[]): string[]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.6 Ne pas garder Copilot dans le bon scope 🎯
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Utiliser Copilot dans de grands fichiers encombrés sans contexte guide 🗃️.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; Copilot puise le contexte dans le code proche. Si votre fichier est chaotique, les suggestions deviennent moins précises ⚠️.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Refactorez en modules plus petits et ciblés 🧩. Plus votre code est propre, plus Copilot devient pertinent.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.7 Zapper les tests parce que « Copilot l’a écrit » 🧪
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Supposer que la sortie de Copilot n’a pas besoin d’être testée en profondeur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; Les suggestions de l’IA peuvent introduire des cas limites que vous n’aviez pas anticipés 🚫.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Écrivez &lt;strong&gt;des tests unitaires, des tests d’intégration et des vérifications de cas limites&lt;/strong&gt; pour tout code généré par Copilot. Bonus : Utilisez Copilot lui-même pour rédiger des cas de test — puis affinez-les manuellement 🛠️.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion : Codez plus intelligemment, pas seulement plus vite
&lt;/h1&gt;

&lt;p&gt;GitHub Copilot n’est plus une autocomplétion ✨ : c’est un partenaire de développement capable d’orchestrer des tâches, d’analyser votre codebase et de s’intégrer à vos outils.  &lt;/p&gt;

&lt;p&gt;En combinant les fondamentaux (IDE vs CLI), les leviers de précision (slash commands, contexte, instructions, sélection) et l'agentique avancée (mode Agent 🤖, MCP 🧩, agents personnalisés 🛠️), vous passez de « coder plus vite » à « livrer mieux, avec maîtrise ».  &lt;/p&gt;

&lt;p&gt;La clé reste humaine 🧠 : cadrer le besoin, donner le bon contexte, et garder un œil critique sur la qualité, la sécurité et les tests.  &lt;/p&gt;

&lt;p&gt;En 2026, la différence viendra de ceux qui standardisent, automatisent et mesurent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan d’actions immédiates
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.instructions.md&lt;/code&gt; : formalisez vos normes d’équipe pour des sorties cohérentes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/tests&lt;/code&gt; et &lt;code&gt;/fix&lt;/code&gt; : sécurisez la qualité dès le flux quotidien.&lt;/li&gt;
&lt;li&gt;Commentaire‑d’abord : décrivez architecture et cas limites avant de coder.&lt;/li&gt;
&lt;li&gt;Contexte ciblé : ouvrez 3–5 fichiers pertinents, fermez le reste.&lt;/li&gt;
&lt;li&gt;Copilot CLI : installez‑le et utilisez‑le pour scripts, issues et PR.&lt;/li&gt;
&lt;li&gt;1 agent personnalisé : « Réviseur Sécurité » ou « Planificateur » + un handoff simple.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cap sur 2026 : standardisez, automatisez, mesurez. Faites de Copilot votre accélérateur — et de vos pratiques, votre avantage.&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%2Fg0ws4p3nh2xjtlt4dl0s.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%2Fg0ws4p3nh2xjtlt4dl0s.png" alt="Infographie bilan" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Explorez plus de contenus sur GitHub et Copilot
&lt;/h2&gt;

&lt;p&gt;Tout ce dont vous avez besoin pour maîtriser GitHub Copilot :&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation officielle
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot" rel="noopener noreferrer"&gt;Documentation GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/" rel="noopener noreferrer"&gt;Documentation complète GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  VS Code et Copilot
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot" rel="noopener noreferrer"&gt;VS Code Copilot Tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/copilot-customization" rel="noopener noreferrer"&gt;Personnalisation de Copilot dans VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/chat/copilot-chat" rel="noopener noreferrer"&gt;GitHub Copilot Chat dans VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/chat/chat-modes" rel="noopener noreferrer"&gt;Modes de chat personnalisés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/getstarted/settings" rel="noopener noreferrer"&gt;Paramètres VS Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ressources complémentaires
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/" rel="noopener noreferrer"&gt;Copilot Chat Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/customer-stories" rel="noopener noreferrer"&gt;Témoignages utilisateurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://the-github-podcast.simplecast.com/" rel="noopener noreferrer"&gt;Le podcast GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>adventoftech2025</category>
    </item>
    <item>
      <title>Quelle est la taille idéale d'une classe ?</title>
      <dc:creator>Sébastien Bertrand</dc:creator>
      <pubDate>Tue, 23 Dec 2025 09:00:00 +0000</pubDate>
      <link>https://dev.to/onepoint/quelle-est-la-taille-ideale-dune-classe--2jhg</link>
      <guid>https://dev.to/onepoint/quelle-est-la-taille-ideale-dune-classe--2jhg</guid>
      <description>&lt;p&gt;L'évaluation de la maintenabilité des programmes est un enjeu majeur pour l'industrie logicielle. En effet, selon &lt;a href="https://doi.org/10.1142/9789812389718_0005" rel="noopener noreferrer"&gt;Canfora et Cimitile (2001)&lt;/a&gt;, la maintenance représente entre 60% et 80% du coût total d'un programme, en incluant les évolutions et les corrections d'anomalies. Toujours selon ces auteurs, le facteur le plus déterminant est la compréhension du programme déjà écrit.&lt;/p&gt;

&lt;p&gt;De nos jours, l'approche classique d'évaluation de la maintenabilité repose sur l'apprentissage automatique. Cela consiste d'abord à compter un certain nombre d'éléments du code source qui nous intéressent, les fameuses métriques, puis à entrainer un algorithme pour prédire la maintenabilité à partir de ces métriques.&lt;/p&gt;

&lt;p&gt;Afin d'entraîner convenablement les algorithmes, il est nécessaire d'avoir une valeur de référence fiable, comme le jeu de données de &lt;a href="https://doi.org/10.1109/ICSME46990.2020.00035" rel="noopener noreferrer"&gt;Schnappinger et al (2020)&lt;/a&gt; basé sur des évaluations par des experts. Pour des raisons pratiques, il est plus simple pour les experts d'évaluer la maintenabilité au niveau des classes. La figure ci-dessous présente ce jeu de données. Elle représente la maintenabilité en fonction de la taille des classes, exprimée ici en nombre de lignes (LOC - Lines of Code), &lt;em&gt;unité universelle et absolument jamais contestée de la productivité&lt;/em&gt;. La meilleure maintenabilité est représentée par une valeur de zéro et la plus mauvaise est représentée par une valeur de trois. Les différents projets &lt;em&gt;Java&lt;/em&gt; d’où sont issus les points du jeu de données sont représentés.&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%2Fqcce9tdpl43x59d6hyue.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%2Fqcce9tdpl43x59d6hyue.png" alt="Figure qui présente la maintenabilité en fonction de la taille pour des classes _Java_, la figure montre clairement que plus les classes sont grandes, plus la maintenabilité est mauvaise." width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inutile d'investir 3 ans de recherche pour conclure à partir de cette figure que la taille d'une classe est le principal indicateur de sa maintenabilité. Lors de son doctorat, votre serviteur, que personne n'avait mis au courant, s'est intéressé à cette problématique. Il se trouve qu'un prédicteur basé uniquement sur le nombre de lignes de code obtient de meilleurs résultats que des experts humains évaluant la maintenabilité (&lt;a href="https://www.doi.org/10.13140/RG.2.2.12553.92009" rel="noopener noreferrer"&gt;Bertrand 2024, ch. 7.3&lt;/a&gt;). La logique est simple, selon le nombre de lignes de code de la classe &lt;em&gt;Java&lt;/em&gt; (LOC) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Si LOC &amp;lt; 80 ⇒ Parfaitement maintenable
2. Si LOC &amp;lt; 275 ⇒ Maintenable
3. Si LOC &amp;lt; 500 ⇒ Non maintenable
4. Sinon ⇒ Pas du tout maintenable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ce prédicteur vous permettra d'évaluer la maintenabilité de vos classes avec une grande fiabilité. Il n'est donc pas nécessaire de solliciter la précieuse expertise de vos architectes, probablement occupés à relire les écrits d'Ada Lovelace ou préparer leur dernière conférence sur Quarkus.&lt;/p&gt;

&lt;p&gt;Un tel résultat peut paraître absurde ! En effet, cela voudrait dire que découper nos classes &lt;em&gt;Java&lt;/em&gt; en plus petites classes suffirait à en garantir la maintenabilité. De ce point de vue, le couplage des classes entre elles ou la complexité algorithmique interne d'une classe n'a que peu d'importance.&lt;/p&gt;

&lt;p&gt;Toutefois, si on se réfère au célèbre &lt;a href="https://dl.acm.org/doi/10.5555/1388398" rel="noopener noreferrer"&gt;Clean Code de Robert C. Martin&lt;/a&gt;, on se rendra rapidement compte que de nombreuses règles concernent directement ou indirectement la taille :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les fonctions doivent être petites ;&lt;/li&gt;
&lt;li&gt;Le nombre idéal d'arguments d'une fonction est zéro ;&lt;/li&gt;
&lt;li&gt;Une fonction ne doit faire qu'une seule chose ;&lt;/li&gt;
&lt;li&gt;Les classes doivent être petites ;&lt;/li&gt;
&lt;li&gt;Les classes doivent avoir un petit nombre de variables d'instance ;&lt;/li&gt;
&lt;li&gt;Une classe ne doit avoir qu'une seule responsabilité.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ainsi, il est logique que la taille soit un bon prédicteur de la maintenabilité logicielle. En effet, lorsque le développeur rencontre une difficulté, technique ou fonctionnelle, il peut s'égarer dans le code et ajouter un peu trop de fonctionnalités à une classe ou adopter une solution structurellement sous-optimale. &lt;em&gt;Les développeurs n'écrivent pas du code pour rien&lt;/em&gt; ou pour le plaisir, une trop grande classe est le symptôme d'un problème sous-jacent qui impacte la maintenabilité.&lt;/p&gt;

&lt;p&gt;Ainsi, au vu des résultats expérimentaux, il est possible de considérer la taille idéale d'une classe &lt;em&gt;Java&lt;/em&gt;, c'est à dire d'une classe parfaitement maintenable qui implémente néanmoins un nombre optimal de fonctionnalités. Soit ω cette taille idéale pour une classe &lt;em&gt;Java&lt;/em&gt; :&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%2Fl04onngi711u6y12h85w.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%2Fl04onngi711u6y12h85w.png" alt="Formule ω_java = 80" width="181" height="40"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Évidemment, ceci dépend du langage de programmation. Par exemple, il est de notoriété publique que &lt;em&gt;Python&lt;/em&gt; est beaucoup plus concis que la plupart de ses concurrents. Ainsi, &lt;a href="https://doi.org/10.4233/uuid:dbb70852-e06b-40f7-b872-60047f962dbc" rel="noopener noreferrer"&gt;Raemaekers (2015)&lt;/a&gt; compare les langages à l'aide de leurs taux de compression, c'est-à-dire la capacité à exprimer une intention complexe, et du nombre d'instructions par points de fonction, une mesure de la verbosité brute. Raemaekers (ch. 7.5.1) présente la table ci-dessous, traduite pour votre plus grand confort.&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%2F1643855tanckfrox03xo.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%2F1643855tanckfrox03xo.png" alt="Tableau qui présente le taux de compression et le nombre d'instructions par points de fonction pour différents langages. En particulier : le taux de compression est 9.03 pour Java et 4.88 pour Python, le nombre d'instructions par point de fonction est 41.8 pour Java, 21.3 pour Python." width="377" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il est particulièrement intéressant de considérer &lt;em&gt;Python&lt;/em&gt;, langage de &lt;a href="https://www.cynicalturtle.net/kame/post/2020/12/24/Affordance-trompeuse-LA-DATA" rel="noopener noreferrer"&gt;LA DATA&lt;/a&gt; et échafaud de nos intelligences artificielles. Au vu de son adoption météorique par les développeurs, il fait peu de doute que &lt;em&gt;Python&lt;/em&gt; est le langage ultime. On peut alors se poser la question de la valeur ω pour ce dernier.&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%2Fr5efyjbkc9eyzg2dur4c.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%2Fr5efyjbkc9eyzg2dur4c.png" alt="Formule ω_ultime = δ × ω_java" width="304" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le coefficient δ est un coefficient de conversion de verbosité fonctionnelle de &lt;em&gt;Java&lt;/em&gt; vers &lt;em&gt;Python&lt;/em&gt;. Il est possible de le formuler comme l'isobarycentre des ratios des taux de compression ξ et des ratios du nombre d'instructions par point de fonction ψ.&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%2Fwvhz3rpentlsbl7tsb0e.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%2Fwvhz3rpentlsbl7tsb0e.png" alt="Formule du coefficient δ qui correspond à la moyenne des ratios des taux de compression et des ratios du nombre d'instructions par point de fonction." width="401" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En se basant sur les valeurs empiriques du tableau, le coefficient δ peut être évalué.&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%2Fjh8oga8i8wml1cywbg0m.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%2Fjh8oga8i8wml1cywbg0m.png" alt="Application numérique : δ = 0.525" width="708" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En réinjectant le coefficient de conversion de verbosité fonctionnelle dans notre équation de conversion, nous obtenons &lt;strong&gt;la réponse à la question ultime&lt;/strong&gt; : &lt;br&gt;&lt;em&gt;Quelle est la taille idéale d'une classe ?&lt;/em&gt;&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%2Fpeg2xv6phd70tdmczzvi.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%2Fpeg2xv6phd70tdmczzvi.png" alt="Formule finale ω_ultime = 42" width="206" height="34"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Post mortem : Toute ressemblance avec une démonstration mathématique complexe pour justifier une intuition que tout le monde avait déjà serait purement fortuite. Bien que tout soit véridique dans cet article, il souffre évidemment d'un biais de confirmation très prononcé… et cela a demandé beaucoup de travail !&lt;/em&gt;&lt;/p&gt;

</description>
      <category>adventoftech2025</category>
      <category>maintainability</category>
      <category>cleancode</category>
      <category>java</category>
    </item>
    <item>
      <title>Les européens ont-ils vraiment perdu la guerre du cloud ?</title>
      <dc:creator>nicolasT</dc:creator>
      <pubDate>Mon, 22 Dec 2025 08:00:00 +0000</pubDate>
      <link>https://dev.to/onepoint/les-europeens-ont-ils-vraiment-perdu-la-guerre-du-cloud--4a7c</link>
      <guid>https://dev.to/onepoint/les-europeens-ont-ils-vraiment-perdu-la-guerre-du-cloud--4a7c</guid>
      <description>&lt;p&gt;Le contexte géopolitique récent a relancé une question qui s'est posée à partir de 2013 : &lt;em&gt;est-ce que les européens ont perdu la guerre du cloud ?&lt;/em&gt;&lt;br&gt;
Autrement dit, peut-on se passer des hyperscalers américains pour travailler dans le cloud public ?&lt;/p&gt;

&lt;p&gt;Nous sommes en 2025, qu'en est-il ?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TL;DR&lt;br&gt;
Oui, ils ont perdus de nombreuses batailles... mais peut-être pas la guerre. La rebellion se réorganise.&lt;br&gt;
L’IA est l’occasion de relancer une dynamique en Europe.&lt;br&gt;
La solution pour les offres IaaS, PaaS, SaaS pourrait passer par une fédération des acteurs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  La naissance d’un empire
&lt;/h2&gt;

&lt;p&gt;Quand on évoque le "cloud public", bon nombre, pour ne pas dire tous, pensent immédiatement aux trois mastodontes américains. La raison ? La puissance marketing de ces derniers. Il faut reconnaitre que sur cet aspect, les américains semblent avoir une culture marketing que les européens n’arrivent pas à rattraper. Ajoutez à cela l’admiration toujours présente de la Silicon Valley qui place ces acteurs comme les fers de lance de l’IT.&lt;/p&gt;

&lt;p&gt;De leur côté, les européens paraissent avoir eu besoin de digérer cette nouvelle notion. Le cloud public n'est qu'une forme de maturité et une évolution du métier de l'hébergement Internet. Pourtant, ce terme marketing est vite devenu un élément différenciant pour les acteurs nord-américains. Les hébergeurs européens n’ont peut-être par perçu ce terme comme étant vecteur d’une évolution de leur métier.&lt;/p&gt;

&lt;p&gt;Par ailleurs, le marché, bien qu’admiratif, ne s’est pas rué sur ces nouvelles offres. Dans les premières années, les DSI avaient du mal à se projeter dans ce nouveau paradigme : quel coût à la fin du mois, de l’année ? Comment maitriser mon infra ? L’IaC (infrastructure as code) et l’éducation ont répondu à ces questions, à grand renfort de meet-ups sponsorisés et/ou présentant des démonstrations s’appuyant sur AWS.&lt;/p&gt;

&lt;p&gt;La seconde défaite européenne vient de la technologie. Là où les européens étaient très présents et sur un marché dynamique de l’hébergement Internet, les clouds sont arrivés avec une réponse technologique innovante : des API et des outils pour automatiser la gestion des infrastructures dynamiques. Dans le même temps, Heroku, encore un acteur américain, propose une solution allégée pour déployer les applications : un PaaS.&lt;/p&gt;

&lt;p&gt;Certains acteurs européens ont tenté de suivre, voir rattraper les solutions : les initiatives ratées Cloudwatt et Numergy de l’État français ; la tentative de résistance du &lt;a href="https://web.archive.org/web/20130726184317/https://www.lecloudgaulois.fr/" rel="noopener noreferrer"&gt;cloud gaulois&lt;/a&gt; ;&lt;br&gt;
&lt;a href="https://upsun.com/" rel="noopener noreferrer"&gt;platform.sh&lt;/a&gt;, PCextreme B.V. (racheté par &lt;a href="https://www.versio.eu/" rel="noopener noreferrer"&gt;versio&lt;/a&gt;), &lt;a href="https://www.digitalocean.com/" rel="noopener noreferrer"&gt;Digital Ocean&lt;/a&gt;, etc. Toutes ces initiatives n’ont pas réussi à faire de l’ombre à l’hégémonie naissante du futur trio omniprésent du cloud public, bien que proposant des solutions cohérentes, tant au niveau technique que financier.&lt;/p&gt;

&lt;p&gt;Le dernier rapport sur les parts de marché des fournisseurs de cloud du &lt;a href="https://www.srgresearch.com/" rel="noopener noreferrer"&gt;Synergy Research Group&lt;/a&gt; fait état de 63% occupées par le trio AWS, GCP et Azure. Derrière cette domination se trouvent d’autres acteurs, dont de grands noms de la tech américaine, ainsi que le fournisseur chinois Alibaba.&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%2Fjawmuekx14u8xpni1t9y.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%2Fjawmuekx14u8xpni1t9y.jpg" alt="CIS share trend : graphique montrant l’évolution des parts de marché des fournisseurs de cloud entre le dernier trimestre 2020 et le troisième trimestre 2025" width="800" height="594"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;small&gt;&lt;em&gt;source&lt;/em&gt; &lt;a href="https://www.srgresearch.com/articles/cloud-market-share-trends-big-three-together-hold-63-while-oracle-and-the-neoclouds-inch-higher" rel="noopener noreferrer"&gt;https://www.srgresearch.com/articles/cloud-market-share-trends-big-three-together-hold-63-while-oracle-and-the-neoclouds-inch-higher&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Derrière le terme "neoclouds" se trouvent de nouveaux acteurs : CoreWeave, Crusoe, Nebius et Lambda.&lt;/p&gt;

&lt;h2&gt;
  
  
  La menace fantôme
&lt;/h2&gt;

&lt;p&gt;Technologiquement, les acteurs de l'hébergement français paraissent avoir raté le virage du cloud. OVHcloud, acteur incontournable en France et en Europe, propose peu de services concurrents à AWS, GCP et Azure. Ceux proposés sont arrivés tardivement et ne semblent pas leur permettre d'être vus comme alternative.&lt;/p&gt;

&lt;p&gt;Pourtant, dès 2011, des acteurs de l'hébergement Internet se lancent dans la fourniture de services de cloud moderne. Ikoula propose des VMs avec une facturation à l'usage. Modèle clé des acteurs du cloud moderne, par lequel ils ont secoué le marché. &lt;a href="https://www.lemagit.fr/actualites/2240210201/Ikoula-fait-le-point-sur-son-cloud-Cloud-Stack" rel="noopener noreferrer"&gt;Ikoula récidive en 2013 avec une offre plus complète basée sur CloudStack&lt;/a&gt;. À l'époque, Gandi lance une offre de VPS concurrente. OVH, quant à lui, tarde à lancer son offre basée sur OpenStack. Digital Ocean émerge, avec une stratégie marketing agressive pour séduire les développeurs. Platform.sh se propose comme alternative à Heroku. PCextreme se crée aux Pays-Bas en s’appuyant également sur &lt;a href="https://cloudstack.apache.org/" rel="noopener noreferrer"&gt;CloudStack&lt;/a&gt;. Scality, qui se concentre sur le stockage objet, voit le jour en 2009, et lance un appel à une fédération d’acteurs, pour proposer rapidement une offre multizone.&lt;br&gt;
Il y a certainement d’autres initiatives à mentionner. Cependant, aucune n’arrive à se frayer un chemin face à ce qui se trame outre Atlantique. Amazon fait cavalier seul, ou presque. Malgré un départ en deux temps, Google et Microsoft réussissent à combler leur retard.&lt;/p&gt;

&lt;p&gt;Après s'être laissé dépasser / déborder par les américains, les européens se concentrent visiblement sur le marché public, sécuritaire et la régulation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un nouvel espoir
&lt;/h2&gt;

&lt;p&gt;Le &lt;strong&gt;cloud souverain&lt;/strong&gt;. Terme très utilisé parmi les régulateurs et autres personnalités politiques et représentants d’entreprises publiques. Le terme n’est pas nouveau, cependant, en France la première initiative (Cloudwatt et Numergy) fut un échec. Pardon, je devrais dire qu’elle n’a pas marché.&lt;br&gt;
Fort de cette expérience, cette fois les acteurs existants du marché de l’hébergement Internet sont contactés, comme OVH ou Online (ancien nom de Scaleway). Concrètement, peu de choses en sort, mis à part des initiatives orientées réglementation :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://web.archive.org/web/20200606164625/https://www.data-infrastructure.eu/GAIAX/Navigation/EN/Home/home.html" rel="noopener noreferrer"&gt;Gaia-X&lt;/a&gt;. L’idée première de cette initiative : fournir un standard pour favoriser l’émergence d’infrastructures fédérées.&lt;/li&gt;
&lt;li&gt;European Union Cybersecurity Certification Scheme for Cloud Services. Projet de loi définissant les exigences en matière de cybersécurité entre les différents membres de l'UE.&lt;/li&gt;
&lt;li&gt;SecNumCloud. Qualification de sécurité délivrée par l’ANSSI (Agence Nationale de la Sécurité des Systèmes d’Information).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comme toute rébellion, les choses ne se passent pas aussi facilement que prévu. Il ne faut pas attendre longtemps avant de voir &lt;a href="https://www.informatiquenews.fr/microsoft-google-amazon-sont-officiellement-membres-de-gaia-x-74989" rel="noopener noreferrer"&gt;Microsoft, Google ou Amazon entrer dans les discussions autour de Gaia-X&lt;/a&gt;. Ce projet est un tel succès que nombreux sont ceux à en avoir oublié son existence. &lt;a href="https://eurostack.eu/" rel="noopener noreferrer"&gt;Eurostack&lt;/a&gt; est lancée pour tenter d’apporter une réponse plus concrète.&lt;/p&gt;

&lt;p&gt;Les normes &lt;a href="https://www.enisa.europa.eu/publications/eucs-cloud-service-scheme" rel="noopener noreferrer"&gt;EUCS&lt;/a&gt; et &lt;a href="https://cyber.gouv.fr/secnumcloud-pour-les-fournisseurs-de-services-cloud" rel="noopener noreferrer"&gt;SecNumCloud&lt;/a&gt; sonnent la seconde vague de cette rébellion. Deux normes pour une même raison, l’une européenne, l’autre française. Bien entendu, la norme française est la plus contraignante. Encore une fois, les solutions d’envergures sont apportées via un modèle législatif.&lt;/p&gt;

&lt;p&gt;Est-ce suffisant pour faire basculer des parts de marché vers des acteurs européens ? Dans le cadre de solutions avec de fortes contraintes de sécurité et de gouvernance, certainement. Bien que, par leur nature, ces contraintes orientent d’elles-mêmes vers une offre dite souveraine. Encore que… &lt;a href="https://www.cnil.fr/fr/les-principaux-avis-et-recommandations-de-la-cnil-sur-la-plateforme-des-donnees-de-sante" rel="noopener noreferrer"&gt;la décision par dépit de la CNIL concernant le Health Data Hub&lt;/a&gt; montre que ce n’est pas si simple.&lt;/p&gt;

&lt;h2&gt;
  
  
  L’empire contre-attaque
&lt;/h2&gt;

&lt;p&gt;Oui, le marché européen du cloud public semble se contracter vers des offres de niche avec des contraintes fortes de souveraineté. En France, des partenariats "souverains" avec les opérateurs américains sont créés : &lt;a href="https://www.bleucloud.fr/" rel="noopener noreferrer"&gt;Bleu&lt;/a&gt; pour Capgemini / Orange avec Microsoft Azure ; &lt;a href="https://www.s3ns.io/" rel="noopener noreferrer"&gt;S3NS&lt;/a&gt; pour Thales avec Google Cloud.&lt;/p&gt;

&lt;p&gt;Tandis que le lobbying a fait son œuvre dans les commissions, la réponse technologique passerait par un aveu d’échec : nous avons trop de retard, alors créons une offre qui permettrait de fusionner les produits américains avec les contraintes légales françaises. Dans les deux partenariats, la promesse est que les données sont toutes hébergées en France, dans des datacenters opérés par des entreprises française. Pour ajouter une couche de confiance, les données sont chiffrées par des clés inaccessibles aux entreprises américaines parentes des solutions technologiques.&lt;/p&gt;

&lt;p&gt;Sur le papier, ça ressemble à un accord avec le meilleur des deux mondes. Oui, mais... un &lt;a href="https://www.clubic.com/actualite-591508-un-explosif-rapport-allemand-affirme-que-stocker-ses-donnees-en-europe-ne-suffit-plus-a-les-proteger-des-usa.html" rel="noopener noreferrer"&gt;rapport juridique à destination du Ministère fédéral de l’Intérieur allemand&lt;/a&gt; vient quelque peu confirmer mes doutes. Ces offres ne protègent pas vraiment des lois extraterritoriales américaines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le retour du Jedi (ou du jet AI)
&lt;/h2&gt;

&lt;p&gt;Les pannes récentes chez AWS, Google, Azure et CloudFlare démontrent une forte dépendance mondiale envers ces acteurs. Certains ont eu une prise de conscience de cette dépendance et regardent les alternatives. Ces alternatives existent et ne manquent pas. Par contre, elles sont souvent méconnues ou ne couvrent pas tout le périmètre technique que peuvent proposer le trio dominant.&lt;/p&gt;

&lt;p&gt;Mon analogie avec la trilogie Star Wars s’arrête, car nous n’avons pas un Jedi européen pour aider la rébellion à gagner cette guerre. Est-ce sans espoir pour autant ? Peut-être pas.&lt;/p&gt;

&lt;p&gt;Ma vision des choses et qu’il faut continuer de faire confiance aux acteurs européens. L’Europe ne possède pas (encore ?) d’hyperscaler pouvant proposer toute la panoplie de services que l’on trouve chez AWS, GCP ou Azure. Pourtant, rien qu’en France il existe des offres cohérentes. &lt;a href="https://www.ovhcloud.com/fr/" rel="noopener noreferrer"&gt;OVH cloud&lt;/a&gt; et &lt;a href="https://www.scaleway.com/fr/" rel="noopener noreferrer"&gt;Scaleway&lt;/a&gt;, par exemple, progressent fortement sur cet aspect. Leurs API permettent un usage dans la logique IaC. &lt;a href="https://numspot.com/" rel="noopener noreferrer"&gt;NumSpot&lt;/a&gt; se présente comme un nouveau challenger intéressant et ambitieux. &lt;a href="https://fr.outscale.com/" rel="noopener noreferrer"&gt;Outscale&lt;/a&gt; possède également un catalogue intéressant, bien que plus restreint. Mais est-ce bien important ? Qui a besoin de l’ensemble de ces solutions ?&lt;/p&gt;

&lt;p&gt;Il faut peut-être repenser l’adoption du cloud en se rapprochant de l’usage dont on a besoin. Une autre vision serait d’opter pour une stratégie cloud hybride ou multi-clouds.&lt;/p&gt;

&lt;p&gt;Les entreprises du continent asiatiques semblent plutôt se tourner vers leurs champions : Alibaba, Tencent, Huawei, etc. Leur socle technologique ? Des solutions open source, qui sont également utilisées chez les acteurs cités précédemments.&lt;/p&gt;

&lt;p&gt;Par ailleurs, l’IA est venue mélanger les cartes. Même si le marché est encore une fois dominé par des entreprises américaines, les européens ne sont pas en reste, notamment avec le français &lt;a href="https://mistral.ai/fr" rel="noopener noreferrer"&gt;Mistral AI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Et si
&lt;/h2&gt;

&lt;p&gt;Et si la solution européenne pour les offres IaaS, PaaS, SaaS passait par une fédération des acteurs ?&lt;br&gt;
Nous sommes en 2025 et l’IaC est devenu un standard dans la gestion des infrastructures. AWS, GCP et Azure proposent des API pour administrer leurs produits. Les solutions européennes aussi. Dans une stratégie multi-clouds il ne serait pas si complexe de répartir sur infrastructure sur les différents fournisseurs. Bien entendu, cela peut poser des défis au niveau de la connectivité et des performances. Nul doute que les architectes chevronnés sauront trouver les réponses !&lt;br&gt;
Restera le point contractuel et financier. À ce niveau, il faut peut-être regarder du côté des réflexions FinOps, certains outils permettent d’avoir une vision multi-clouds.&lt;/p&gt;

&lt;p&gt;Cette stratégie ne va peut-être pas vous convaincre. Alors à grand minima, nous avons besoin d’une cartographie des services clouds, à la manière du &lt;a href="https://landscape.cncf.io/" rel="noopener noreferrer"&gt;landscape de la CNCF&lt;/a&gt;. Mais ce sera sûrement le sujet d’un autre billet, plus court, je vous rassure ;)&lt;/p&gt;

</description>
      <category>adventoftech2025</category>
      <category>onepoint</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Se faire du pied… Sans se marcher sur les pieds : convergence entre test et accessibilité</title>
      <dc:creator>Henri Gauffriau</dc:creator>
      <pubDate>Sun, 21 Dec 2025 08:00:00 +0000</pubDate>
      <link>https://dev.to/onepoint/se-faire-du-pied-sans-se-marcher-sur-les-pieds-convergence-entre-test-et-accessibilite-4fah</link>
      <guid>https://dev.to/onepoint/se-faire-du-pied-sans-se-marcher-sur-les-pieds-convergence-entre-test-et-accessibilite-4fah</guid>
      <description>&lt;p&gt;Dans notre environnement de travail, nous avons la chance de pouvoir réunir sur nos projets des expertises complémentaires, trop souvent mises de côtés dans les contextes tendus, faute de temps ou de budget. C’est notamment le cas des tests et de l’accessibilité, encore trop fréquemment relégués au second plan alors qu’ils conditionnent directement la qualité, dont la robustesse et la durabilité des produits.&lt;br&gt;
Une fois réunis sur un même projet, nous avons rapidement constaté que nos métiers partageaient de nombreux points communs. Une grande partie du travail d’un expert en accessibilité consiste à réaliser des tests de conformité, tandis que, pour l’équipe test… c’est littéralement le cœur de son métier de devoir vérifier la présence d’un élément.&lt;br&gt;
Nous avons donc commencé à &lt;strong&gt;nous faire du pied&lt;/strong&gt;, avant de &lt;strong&gt;nous interroger sur nos périmètres respectifs&lt;/strong&gt; et sur la meilleure manière de &lt;strong&gt;travailler ensemble sans se marcher dessus&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tests et audits d’accessibilité : deux approches complémentaires
&lt;/h2&gt;

&lt;p&gt;Dans les projets dont l’objectif est de &lt;strong&gt;rendre les services accessibles&lt;/strong&gt;, il existe souvent une confusion entre les &lt;strong&gt;tests d’accessibilité&lt;/strong&gt; et les &lt;strong&gt;audits d’accessibilité&lt;/strong&gt;. Ces deux démarches ont pourtant des objectifs distincts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test d’accessibilité, vérifier par petit pas l’utilisabilité pour tous
&lt;/h3&gt;

&lt;p&gt;Les tests d’accessibilité accompagnent le développement d’une application pour garantir qu’elle reste utilisable par toutes et tous.&lt;br&gt;
Les Quality Analysts (QA) les mettent en place manuellement ou automatiquement, les exécutent, puis assurent le suivi des correctifs si nécessaire, comme ils le feraient pour une anomalie d’ergonomie, un problème fonctionnel ou une erreur de calcul. &lt;br&gt;
Ces tests permettent d’identifier, au fil de l’eau, les problèmes d’accessibilité détectables automatiquement ou testables sans expertise avancée. Une partie de ces tests repose sur les &lt;strong&gt;« Easy Checks »&lt;/strong&gt;, une série de vérifications simples qui assurent les bases de l’accessibilité : navigation au clavier, alternatives textuelles des images, hiérarchie des titres, cohérence des formulaires, etc.&lt;br&gt;
 Il existe des extensions navigateur et des outils permettant de détecter facilement les manques de conformité d’un site ou d’une application en matière d’accessibilité. L’équipe QA peut notamment s’appuyer sur : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;«WCAG Color Contrast Checker»&lt;/strong&gt; qui va permettre de vérifier que le contraste est suffisant et si non mettre en évidence ou cela doit être corrigé. &lt;/li&gt;
&lt;li&gt;Une autre extension intéressante, «&lt;strong&gt;Assistant RGAA»&lt;/strong&gt; qui liste les catégories (Image, Lien, Multimédia…) et les critères du &lt;strong&gt;Référentiel Général d’Amélioration de l’Accessibilité (RGAA)&lt;/strong&gt;. Elle donne entre autres les instructions pour tester et permet de mettre le critère sélectionné en Conforme, Non conforme…&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Audit d’accessibilité, évaluer la conformité d’un produit
&lt;/h2&gt;

&lt;p&gt;L’audit d’accessibilité, quant à lui, est une &lt;strong&gt;évaluation complète et structurée&lt;/strong&gt; d’un site, d’une application ou d’un service numérique. Il vise à vérifier sa conformité vis-à-vis des normes d’accessibilité. En France, on utilise le &lt;strong&gt;RGAA&lt;/strong&gt;, fondé sur les &lt;strong&gt;Web Content Accessibility Guidelines&lt;/strong&gt; &lt;strong&gt;(WCAG)&lt;/strong&gt;. &lt;br&gt;
Un audit RGAA consiste à analyser un échantillon représentatif de pages ou d’écrans pour vérifier le respect de &lt;strong&gt;106 critères de contrôle&lt;/strong&gt;, couvrant &lt;strong&gt;13 thématiques&lt;/strong&gt; : images, cadres, couleurs, multimédia, tableaux, liens, scripts, éléments obligatoires, structuration, présentation, formulaires, navigation et consultation.Chaque critère comprend en moyenne 2 à 3 tests. On estime que seulement &lt;strong&gt;20 à 30%&lt;/strong&gt; d’entre eux peuvent être automatisés. Bien que certains soient simples à exécuter, l’ensemble de la démarche demande une expertise spécifique et du temps.&lt;br&gt;
Les audits sont donc longs à réaliser et mobilisent &lt;strong&gt;des ressources peu disponibles&lt;/strong&gt;, surtout dans le contexte post &lt;a href="https://www.groupeonepoint.com/fr/publications/leuropean-accessibility-act-des-sanctions-renforcees-et-des-organes-de-controles-designes/" rel="noopener noreferrer"&gt;European Accessibility Act&lt;/a&gt;. On ne peut généralement pas en mener plusieurs par projet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qui fait quoi ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Réaliser des tests ou un audit uniquement en fin de projet n’est pas la bonne approche&lt;/strong&gt; : les erreurs sont déjà présentes et souvent accumulées. Les corriger à ce stade devient coûteux et chronophage. Ainsi, il est pertinent de les exécuter tout au long du projet, ce qui permet de détecter les erreurs au plus tôt et d’éviter l’effet « boule de neige » des anomalies répétées.&lt;br&gt;
C’est un peu comme dans le bâtiment : s’occuper de l’accessibilité une fois la construction terminée implique de casser des portes, d’ajouter des rampes ou des ascenseurs oubliés.&lt;br&gt;
Une approche plus efficace consiste à &lt;strong&gt;intégrer les bonnes pratiques dès le début du projet&lt;/strong&gt; — c’est ce qu’on appelle l’approche &lt;strong&gt;« Shift Left »&lt;/strong&gt;, qui vise à détecter et corriger les problèmes le plus tôt possible.&lt;br&gt;
Un autre point essentiel : &lt;strong&gt;l’accessibilité est l’affaire de tous&lt;/strong&gt;.&lt;br&gt;
La vérifier dès les premières étapes du projet permet d’embarquer l’ensemble des équipes et d’ancrer durablement les bons réflexes.&lt;br&gt;
Accompagnée par les experts accessibilité, &lt;strong&gt;l’équipe test intègre les tests d’accessibilité&lt;/strong&gt; dans son panel habituel.&lt;br&gt;
De son côté, &lt;strong&gt;l’équipe accessibilité&lt;/strong&gt; réalise des &lt;strong&gt;audits intermédiaires&lt;/strong&gt; pour identifier les problèmes non couverts par les tests classiques, puis un &lt;strong&gt;audit final&lt;/strong&gt; en fin de projet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les bénéfices
&lt;/h2&gt;

&lt;p&gt;Cette collaboration crée une véritable dynamique vertueuse :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les deux équipes &lt;strong&gt;s’enrichissent mutuellement&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;culture du test&lt;/strong&gt; apportée par l’équipe QA a permis aux experts accessibilité de gagner en efficacité, notamment sur l’automatisation.&lt;/li&gt;
&lt;li&gt;L’équipe accessibilité, quant à elle, a permis aux QA de &lt;strong&gt;monter en compétence&lt;/strong&gt; sur les enjeux d’accessibilité numérique.
C’est une approche &lt;strong&gt;gagnant-gagnant&lt;/strong&gt;, qui se traduit par :&lt;/li&gt;
&lt;li&gt;Moins d’anomalies détectées en fin de projet ;&lt;/li&gt;
&lt;li&gt;Une meilleure qualité globale du produit (performance, ergonomie, robustesse) ;&lt;/li&gt;
&lt;li&gt;Une culture commune autour de l’&lt;strong&gt;accessibilité numérique&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;Et une économie de temps et de moyens à long terme.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En définitive, cette collaboration entre QA et experts accessibilité constitue une première étape indispensable. Elle pose les fondations d’un produit plus inclusif, mais ne garantit pas à elle seule une expérience réellement accessible. La conformité, aussi importante soit-elle, ne reflète qu’une partie de la réalité vécue par les utilisateurs.&lt;br&gt;
C’est un peu comme dans le bâtiment : le fait d’avoir posé le plancher ne signifie pas que la maison est habitable.&lt;br&gt;
De la même manière, atteindre la conformité ne garantit pas une accessibilité complète. L’enjeu va au-delà du respect des critères : il s’agit de comprendre les usages, de tester en conditions réelles en s’appuyant sur un panel représentatif, d’anticiper les besoins, et d’inscrire durablement l’accessibilité dans la culture du projet. C’est là que commence la véritable démarche d’amélioration continue. &lt;/p&gt;

</description>
      <category>a11y</category>
      <category>qa</category>
      <category>testing</category>
    </item>
    <item>
      <title>Accroche philosophique dans le monde informatique.</title>
      <dc:creator>Damien LG</dc:creator>
      <pubDate>Sat, 20 Dec 2025 08:00:00 +0000</pubDate>
      <link>https://dev.to/onepoint/accroche-philosophique-dans-le-monde-informatique-52c8</link>
      <guid>https://dev.to/onepoint/accroche-philosophique-dans-le-monde-informatique-52c8</guid>
      <description>&lt;h2&gt;
  
  
  Les ponts
&lt;/h2&gt;

&lt;p&gt;Prenons comme définition simple de la philosophie la description suivante : "Ensemble des sciences et des disciplines ayant pour objet la connaissance rationnelle de la nature" &lt;a href="https://www.cnrtl.fr/definition/academie9/philosophie" rel="noopener noreferrer"&gt;1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;La philosophie aujourd'hui ne se limite plus à quelques hommes barbus se demandant si la notion de vide a du sens, ni à deux trois chroniqueurs de plateau semblant pouvoir s'exprimer sur n'importe quel sujet n'importe quand.&lt;br&gt;
La philosophie regroupe tout un ensemble de disciplines traitant de sujets tout aussi précis que variés. Que ça soit la philosophie de l'esprit, du langage, de la morale, politique ou encore des sciences, toutes ces branches travaillent à mettre en place des théories permettant de qualifier le plus justement possible le fonctionnement du monde et notre interaction avec.&lt;/p&gt;

&lt;p&gt;Tout d'abord, il faut bien souligner que l'informatique se repose sur des concepts fondamentaux pour la philosophie occidentale que sont les mathématiques et la logique. Mais ce ne sont pas les deux seules disciplines que nous pouvons appréhender dans cet univers.&lt;br&gt;
On peut déjà souligner qu'aujourd'hui l'informatique se déploie notamment sous formes de langages. PHP, Java, Rust, langage fonctionnel, langage objet, etc...&lt;/p&gt;

&lt;p&gt;Mais qu'est-ce qu'un langage ? Qu'est-ce que permet et produit la notion de langage ? Quelles sont les règles qui permettent de catégoriser tel ensemble comme étant un langage ou non ? Quelles sont les typologies de langage ? Est-ce qu'il est correct de parler de "langage machine" ?&lt;/p&gt;

&lt;p&gt;Au-delà de la terminologie, notre langage naturel et ses signifiants débordent sur le monde de l'informatique et son langage formel.&lt;br&gt;
Le fait de nommer des composants "master/slave" ou "agent" n'est pas anodin: par leurs histoires, ces mots véhiculent un imaginaire et un certain ensemble de règles, de structures, de signifiants et d'organisations associés. Et si vous doutez de l'impact du langage sur nos structures, demandez-vous pourquoi nous sommes désormais tous des talents et non plus des employés ou des salariés.&lt;/p&gt;

&lt;p&gt;Parce qu'au final la philosophie politique n'est pas très loin derrière. Quand nous soutenons l'open-source ou que nous mettons en place des licences restrictives, quand nous nous demandons qui a le droit de merger et sous quelles contraintes, quand nous définissons les responsabilités dans l'équipe, nous faisons de la politique.&lt;br&gt;
L'organisation de la production informatique est effectivement politique au sens où l'on se demande qui est légitime à décider, qui est responsable de la production et comment nous nous organisons collectivement.&lt;/p&gt;

&lt;p&gt;Bon, passons cette introduction ennuyeuse et allons chercher des cas plus concrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le software craftmanship
&lt;/h2&gt;

&lt;p&gt;Peut-on qualifier la production de code comme étant une forme d'art ?&lt;/p&gt;

&lt;p&gt;Après tout, nous avons bien eu le courant du "&lt;a href="https://manifesto.softwarecraftsmanship.org/#/fr-fr" rel="noopener noreferrer"&gt;software craftmanship&lt;/a&gt;" pouvant être traduit littéralement par "artisanat logiciel". Et lire le manifeste associé permet, à mon sens, de se rendre compte des réflexions à mener sur notre domaine et nos pratiques.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Pas seulement des logiciels opérationnels, mais aussi des logiciels &lt;strong&gt;bien conçus&lt;/strong&gt;"
&lt;/h3&gt;

&lt;p&gt;Qu'est-ce qu'un logiciel bien conçu ? Pourquoi parle-t-on de qualité logicielle ? Est-ce que répondre aux exigences du métier est suffisant ? Est-ce qu'il faut un minimum de test ? Peut-on calculer de façon objective cette qualité ? Beaucoup de proposition existent pour &lt;a href="https://theses.hal.science/tel-04939660" rel="noopener noreferrer"&gt;rationaliser l'évaluation de la qualité logicielle&lt;/a&gt; et se basent sur des critères techniques et objectivables tels que la longueur des méthodes.&lt;/p&gt;

&lt;p&gt;Dans ce cas à quoi servent les commentaires ? Pourquoi nous prenons nous la tête sur le nommage de variables ? Peut-être qu'une partie de la qualité de nos productions réside aussi dans sa qualité esthétique. Dans la manière dont nous avons rangé notre code, l'avons organisé et l'avons présenté pour que ceux qui passeront après nous (ou nous-mêmes) puissent s'y retrouver plus facilement.&lt;/p&gt;

&lt;p&gt;Mais si on commence à parler d'&lt;a href="https://www.radiofrance.fr/franceinter/podcasts/le-code-a-change/le-code-a-change-11-9775071" rel="noopener noreferrer"&gt;esthétique&lt;/a&gt; est-on toujours dans l'objectivité ? On parle de beau et d'art, domaines où l'on amène souvent sa propre subjectivité. Ce qui ouvre tout un nouveau débat, mais limite pour le moment notre capacité à juger objectivement la &lt;strong&gt;bonne&lt;/strong&gt; conception d'un logiciel.&lt;/p&gt;

&lt;p&gt;Ou peut être que nos logiciels doivent être perçus comme des œuvres collectives, dont les qualités résideront dans leurs capacités à être comprises, appréhendées, transmises et à évoluer dans le temps.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Pas seulement l'adaptation aux changements, mais aussi l'ajout constant de la &lt;strong&gt;valeur&lt;/strong&gt;"
&lt;/h3&gt;

&lt;p&gt;Aïe. La valeur. Vous savez calculer la valeur de votre code vous ?&lt;br&gt;
Combien vaut votre commit ? Quelle est votre valeur ajoutée ? Quelle est la valeur d'un logiciel ?&lt;/p&gt;

&lt;p&gt;Cette question ne concerne pas uniquement le code, mais est une &lt;a href="https://www.youtube.com/watch?v=MThrLMb2ZIs&amp;amp;t=3889s" rel="noopener noreferrer"&gt;vieille question de philosophie politique et économique&lt;/a&gt;. Est-ce que la valeur se détermine par l'échange ? C'est-à-dire, est-ce que la valeur de mon code réside seulement dans le prix que les gens sont prêts à payer pour ?&lt;/p&gt;

&lt;p&gt;La notion de valeur est rapidement entendue en son sens marchand et contractuel, mais dans ce cas tout code produit dans une relation marchande aurait exclusivement la valeur qui lui est financièrement attribuée. Un code de "mauvaise qualité" pourrait donc valoir plus qu'un code de "bonne qualité".&lt;/p&gt;

&lt;p&gt;Que faire de l'open source dans ce cas ? Que faire du code produit sur son temps libre ? N'a-t-il aucune valeur ? Où est-ce que sa valeur sera un reflet de l'effort mis dans sa production ? Un reflet de la force de travail engagé ?&lt;/p&gt;

&lt;p&gt;Et de la valeur pour qui ? La question de la valeur de notre production technique peut et doit s'inscrire dans une réflexion plus générale sur le système de production. Nous ne pouvons pas extraire notre domaine du fonctionnement général de la société.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pas seulement les individus et leurs interactions, mais aussi une communauté de &lt;strong&gt;professionnels&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Alors comment définir le terme "professionnels" ? Dans le sens le plus simple, on pourrait dire que l'on est professionnel à partir du moment où l'on en tire un revenu de la pratique. En ce sens, il suffit d'être employé à produire du code pour en être un professionnel.&lt;/p&gt;

&lt;p&gt;Mais est ce suffisant ? Nous avons souvent en tête une certaine de notion de compétence quand nous utilisons la notion de professionnel. Alors quelles sont les compétences d'un travailleur de l'informatique ? Comment pouvons-nous les qualifier ?&lt;/p&gt;

&lt;p&gt;Cette question a été mise en exergue durant la période de fort recrutement et de très fort afflux de reconversions dans ce secteur. Les formations proposaient une reconversion dans des temps restreints et la question devient donc : quelles sont les compétences nécessaires ?&lt;/p&gt;

&lt;p&gt;Qu'est-ce qui fait de nous des &lt;a href="https://dev.to/onepoint/une-approche-sociale-de-la-notion-de-developpeur-501o"&gt;développeurs&lt;/a&gt; ?&lt;/p&gt;

&lt;h3&gt;
  
  
  Pas seulement la collaboration avec les clients, mais aussi des partenariats &lt;strong&gt;productifs&lt;/strong&gt;.
&lt;/h3&gt;

&lt;p&gt;Re Aïe. La productivité. Je ne vais pas m'étendre trop sur le sujet, car ça rejoint le point sur la valeur et parce que j'ai déjà eu l'occasion de m'&lt;a href="https://dev.to/superdaminou/alerte-au-productivisme-trop-cest-trop-3de2"&gt;exprimer sur ce sujet&lt;/a&gt; (BOUM, auto promo, je suis influenceur).&lt;/p&gt;

&lt;p&gt;Profitons pour passer sur le sujet chaud du moment, Le sujet qui fait vibrer les foules et les porte-monnaies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les LLM
&lt;/h2&gt;

&lt;p&gt;L'apparition et le développement rapide des LLM me semble être aujourd'hui l'exemple le plus frappant d'une incapacité collective à s'arrêter 30sc pour réfléchir aux termes que nous utilisons et aux implications de nos choix.&lt;/p&gt;

&lt;p&gt;Les IA sont elles &lt;strong&gt;conscientes&lt;/strong&gt; ? Nous avons tous un avis très tranché sur la question. "Évidemment que oui, &lt;a href="https://arxiv.org/abs/2509.03518" rel="noopener noreferrer"&gt;certaines IA ont menti&lt;/a&gt;", "Évidemment que non, elles n'ont pas d'âme !".&lt;br&gt;
Alors que &lt;a href="https://www.polytechnique-insights.com/en/columns/neuroscience/can-neuroscience-solve-the-mystery-of-consciousness/" rel="noopener noreferrer"&gt;nous ne savons même pas qualifier correctement la notion de conscience&lt;/a&gt;. Si l'on considère la conscience comme une propriété émergente de tout un ensemble de fonctions, alors, on pourrait dire que oui. On pourrait argumenter que les opérations internes effectuées par les LLM produisent des effets similaires à nos opérations internes d'humain. Dans ce cas à partir de combien d'effets identiques serions-nous capables d'attribuer la notion de conscience aux LLM ?&lt;/p&gt;

&lt;p&gt;Ou alors, nous pouvons avoir une approche plus dualiste et proche de "l'élan de vie" qui dirait que nous, humains, avons un "p'tit truc en plus" qui fait de nous des êtres conscients, que cela est lié à la notion de vie et que l'on ne peut pas décemment attribuer de la conscience à des machines.&lt;/p&gt;

&lt;p&gt;Alors si vous trouvez que la notion de bien-être animal est déjà compliquée parce qu'on leur &lt;a href="https://www.inrae.fr/sites/default/files/pdf/esco-conscience-animale-resume-francais-8-pages.doc.pdf" rel="noopener noreferrer"&gt;attribue désormais une conscience&lt;/a&gt;, attendez qu'on se pose sérieusement la question pour des systèmes qui parle comme nous.&lt;/p&gt;

&lt;p&gt;La question est similaire pour la notion d'intelligence. Ces sujets sont &lt;a href="https://www.sciencedirect.com/science/article/pii/S0160289624000266#s0010" rel="noopener noreferrer"&gt;traités, étudiés&lt;/a&gt; et si ce terme peut être pertinent il est cependant nécessaire de correctement le définir au préalable. Car les termes que nous utilisons et leurs signifiants sous-jacents ne sont pas neutres et &lt;a href="https://arxiv.org/pdf/2107.14042" rel="noopener noreferrer"&gt;construisent notre rapport aux objets&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;J'aimerais aussi évoquer le rapport à la connaissance. L'épistémologie est la branche de la philosophie s'intéressant à la connaissance et à la capacité de dire "je sais".&lt;br&gt;
Jusqu'à peu, l'une des particularités  de nos systèmes informatiques était leurs propriétés fortement déterministes. À savoir que pour chaque donnée entrante les opérations effectuées étaient les mêmes et que la sortie serait toujours la même ou a minima toujours prédictible. Ça ne veut pas dire que nous n'introduisons pas une forme d'aléatoire, mais que cette partie est restreinte à certains cas d'usages.&lt;/p&gt;

&lt;p&gt;Ce que cela signifie, c'est aussi que sans savoir le fonctionnement interne de chacune de nos librairies, nous sommes en mesure de descendre dans la structure interne pour en étudier et comprendre le fonctionnement, en tout cas dans un monde tourné vers l'open-source. Ainsi, le travail et la compétence du développeur ne réside pas uniquement dans la production du code, mais aussi dans la connaissance et la compréhension du fonctionnement interne des outils qu'il manipule. Nous sommes capables de nous approprier les données entrantes, observer leurs parcours dans notre système et en comprendre la sortie produite grâce à son interaction avec ce système.&lt;/p&gt;

&lt;p&gt;Il faut rester vigilant et ne pas idéaliser non plus le développeur comme une entité tout sachante et maîtrisant l'ensemble de la chaîne. Nous sommes faillibles, nous partageons la connaissance, prenons des raccourcis et nous organisons comme nous pouvons pour construire notre connaissance, la partager et la faire évoluer.&lt;/p&gt;

&lt;p&gt;Les LLM transforment notre rapport à cette connaissance. Car deux fois le même appel avec les mêmes données peuvent produire deux résultats différents. Parce que nous avons des difficultés à analyser le fonctionnement interne ayant produit le résultat.&lt;/p&gt;

&lt;p&gt;Nous nous mettons petit à petit à déléguer la connaissance aux LLM sans même interroger l'origine de leurs connaissances. Et si le LLM se trompe ? Est-ce que ça a seulement du sens de dire qu'un LLM se trompe ?  Qui oriente les modèles ? Quelles sont leurs gestions ? D'où vient la donnée ?&lt;/p&gt;

&lt;p&gt;Nous intégrons cette technologie fabuleuse à toute vitesse parce que "il n'y a pas le choix" en évacuant le processus démocratique et de réflexion nécessaire à l'intégration de ce type de technologie et leurs impacts considérables sur notre organisation sociale. Nous avons passé ces deux dernières décennies à travailler et sensibiliser sur la collecte de données, les usages et détournement qui en sont faits pour, du jour au lendemain, nous jeter collectivement dans les bras de ces mêmes entreprises et en leur offrant nos données sur un plateau d'argent quand elles ne viennent pas &lt;a href="https://wjlta.com/2024/03/05/plot-twist-understanding-the-authors-guild-v-openai-inc-complaint/" rel="noopener noreferrer"&gt;directement les récupérer&lt;/a&gt; sans poser de questions.&lt;/p&gt;

&lt;p&gt;Si l'évolution des LLM est indéniable, si les LLM sont probablement des outils dont on commence à peine à appréhender les possibilités, il n'est pas nécessaire pour autant de tomber dans &lt;a href="https://futurism.com/sam-altman-imply-openai-building-god" rel="noopener noreferrer"&gt;le mysticisme religieux&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pour terminer et boucler avec le début de cet article, les Large &lt;strong&gt;Language&lt;/strong&gt; Model sont, comme leur nom l'indique, des modèles de langage. Et si il vous semblait quelque peu folklorique de faire le parallèle entre langage et C++ je vous invite à reconsidérer cette pensée dans ce nouveau contexte.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;La philosophie n'est pas qu'un moyen de se faire mousser à peu de frais et de paraître plus important que nous le sommes en citant des auteurs que nous ne comprenons pas. C'est un outil d'appréhension du réel et de mise en valeur des enjeux et implications de chaque possibilité d'interprétation.&lt;/p&gt;

&lt;p&gt;Philosopher sur l'IA et l'informatique, c'est prendre ces sujets au sérieux. Comprendre leurs implications et la façon dont nous nous inscrivons dans cette chaîne. Que faire du travail quand le cœur de ces technologies est de nous en soulager ? Comment organiser ce système quand nous en faisons l'un des piliers du fonctionnement de notre société ?&lt;/p&gt;

&lt;p&gt;Je ne suis pas philosophe et tout ce que je viens de dire doit être pris avec précaution, mais je suis un acteur, producteur du monde informatique et il me semble qu'il est de notre responsabilité d'utiliser notre compréhension de ces technologies pour proposer un débat public éclairé et constructif.&lt;/p&gt;

&lt;p&gt;Si nous considérons vraiment ces technologies comme révolutionnaires, alors il nous faut penser la révolution.&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%2Fn38u7qj66qiocv17tt5t.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%2Fn38u7qj66qiocv17tt5t.jpg" alt="Case BD Anouk Ricard, personnage se demandant si il faut réflechir avant d'écrire" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ressources diverses :
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.college-de-france.fr/fr/agenda/colloque/implications-philosophiques-de-ia" rel="noopener noreferrer"&gt;Implications philosophiques de l'IA | Collège de France&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.arthurperret.fr/articles/2025-06-20-congres-sfsic-ia-impasse-informationnelle.html" rel="noopener noreferrer"&gt;L’intelligence artificielle générative dans l’impasse informationnelle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=lJVjbyOEWOk" rel="noopener noreferrer"&gt;Une machine peut-elle penser ? (intelligence artificielle et fonctionnalisme) - Passe-science #62 - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=AwUpxjODogQ" rel="noopener noreferrer"&gt;Comment parler intelligemment d'intelligence ? - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plato.stanford.edu/entries/consciousness/" rel="noopener noreferrer"&gt;Consciousness (Stanford Encyclopedia of Philosophy)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=46jaSOhmH5w" rel="noopener noreferrer"&gt;"Beaucoup de gens étaient opposés au progrès" - François JARRIGE - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=OAYD4h3uaA0" rel="noopener noreferrer"&gt;Julien DE SANCTIS - Le déterminisme technologique n’est qu’illusion du prêt à penser - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://revue-passages.fr/2018/04/05/les-enjeux-philosophiques-de-linformatique/" rel="noopener noreferrer"&gt;Les enjeux philosophiques de l’informatique - Revue Passages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=pDPFnywbWDo" rel="noopener noreferrer"&gt;Introduction à la Philosophie de l'intelligence artificielle (Eric Lefevre Ardant - Sonia OUCHTAR) - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://formation.lefebvre-dalloz.fr/actualite/limpact-de-lia-sur-notre-cerveau-nos-soft-skills-et-notre-creativite" rel="noopener noreferrer"&gt;L'impact de l'IA sur notre cerveau, nos soft skills et notre créativité | Lefebvre Dalloz Compétences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.radiofrance.fr/franceinter/podcasts/le-code-a-change" rel="noopener noreferrer"&gt;Le Code a changé : podcast tech et numérique à écouter sur France Inter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=BrGd68Kz9xM" rel="noopener noreferrer"&gt;IA générative, histoire d’une dépossession annoncée - La terre au carré - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>adventoftech2025</category>
      <category>programming</category>
    </item>
    <item>
      <title>Release everything with JReleaser</title>
      <dc:creator>Kosmik</dc:creator>
      <pubDate>Fri, 19 Dec 2025 13:03:32 +0000</pubDate>
      <link>https://dev.to/onepoint/release-everything-with-jreleaser-5a97</link>
      <guid>https://dev.to/onepoint/release-everything-with-jreleaser-5a97</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://jreleaser.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;JReleaser&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The quick and effortless way to release your project!&lt;/p&gt;

&lt;p&gt;Java, Go, Node, Rust, Zig, Swift, Perl, Python, C/C++, C#, Elixir, Haskell, Ruby, Crystal, and more.&lt;/p&gt;

&lt;p&gt;— Official tag line&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;JReleaser is a tool that performs the most common steps related to releasing your application.&lt;/p&gt;

&lt;p&gt;Releasing is not just about publishing a package to an artifact repository. It could also mean signing and generating artifacts, assembling and publishing a changelog, announcing the release on your favorite hub, and even making some noise about it through mail, Zulip, or whatever you want.&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%2Fmk6623k55o7cxa3dcnuh.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%2Fmk6623k55o7cxa3dcnuh.png" alt="JReleaser workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this post, we will focus on releasing a Java application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, it's not just Maven 🫘!
&lt;/h2&gt;

&lt;p&gt;Each packager, each artifact repository has its own specificity.&lt;/p&gt;

&lt;p&gt;As &lt;em&gt;Maven Central&lt;/em&gt; is the ultimate goal for Java developers, and as it’s also one of the most complicated repositories, this is the one we will be looking at in this blog post. But of course, once you’ve done that, everything else will be a piece of cake 🧁!&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-requisite (tools ⚒️ and credentials 🔐)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PGP
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Generate your PGP key pair
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gpg --generate-key
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  That will prompt the following
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
&lt;/span&gt;&lt;span class="gp"&gt;disks) during the prime generation;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;this gives the random number
&lt;span class="go"&gt;generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
&lt;/span&gt;&lt;span class="gp"&gt;disks) during the prime generation;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;this gives the random number
&lt;span class="go"&gt;generator a better chance to gain enough entropy.
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: directory '/root/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/4C2428BC373276273A30B9D4FA30C263300AD893.rev'
public and secret key created and signed.

pub   ed25519 2025-11-18 [SC] [expires: 2028-11-17]
&lt;/span&gt;&lt;span class="gp"&gt;      4C2428BC373276273A30B9D4FA30C263300AD893 &amp;lt;1&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;uid                      Guess who's back ? &amp;lt;back_again@shady.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;sub   cv25519 2025-11-18 [E] [expires: 2028-11-17]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;This is your key identifier; keep it somewhere.
&lt;/li&gt;
&lt;/ol&gt;




&lt;/p&gt;
&lt;p&gt;You’ll be asked for a passphrase to protect your keypair. Choose wisely, and don’t tell anyone&lt;/p&gt;

&lt;p&gt;If you forget to save your key identifier, you can find it back using the &lt;code&gt;list-keys&lt;/code&gt; command :&lt;/p&gt;

&lt;p&gt;
  just show me !
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gpg &lt;span class="nt"&gt;--list-keys&lt;/span&gt;
&lt;span class="go"&gt;/root/.gnupg/pubring.kbx
------------------------
pub   ed25519 2025-11-18 [SC] [expires: 2028-11-17]
      4C2428BC373276273A30B9D4FA30C263300AD893
&lt;/span&gt;&lt;span class="gp"&gt;uid           [ultimate] Guess who's back ? &amp;lt;back_again@shady.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;sub   cv25519 2025-11-18 [E] [expires: 2028-11-17]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

&lt;h4&gt;
  
  
  Distribute it 🔑
&lt;/h4&gt;

&lt;p&gt;There are sereval public keyservers and amongst them the following are supported &lt;code&gt;keyserver.ubuntu.com&lt;/code&gt;, &lt;code&gt;keys.openpgp.org&lt;/code&gt;, &lt;code&gt;pgp.mit.edu&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The following command will make your key publicly available :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;gpg --keyserver keyserver.ubuntu.com -send-key 4C2428BC373276273A30B9D4FA30C263300AD893&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Replace with your own key&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Obtaining your maven central credentials.
&lt;/h3&gt;

&lt;p&gt;Login to &lt;a href="https://central.sonatype.com/" rel="noopener noreferrer"&gt;maven central&lt;/a&gt;, click on the top right menu item "View User Tokens", and generate a new token.&lt;/p&gt;

&lt;p&gt;You can specify its name and expiration date. Personally, I chose to go crazy for this :&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%2Frp9binxldwi7qtbn6e3p.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%2Frp9binxldwi7qtbn6e3p.png" alt="The name of the token is JReleaser"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Install JReleaser
&lt;/h3&gt;

&lt;p&gt;There are many ways &lt;a href="https://jreleaser.org/guide/latest/install.html" rel="noopener noreferrer"&gt;to install JReleaser&lt;/a&gt;, but my goto for local environment is to use &lt;a href="https://www.jbang.dev/" rel="noopener noreferrer"&gt;JBang&lt;/a&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;// Download, and install localy
jbang app install jreleaser@jreleaser

// Execute by using
&lt;/span&gt;&lt;span class="gp"&gt;jreleaser &amp;lt;command&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;args&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you prefere to run it without installing it, you can also use JBang :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;// Download, cache, and run
&lt;/span&gt;&lt;span class="gp"&gt;jbang jreleaser@jreleaser &amp;lt;command&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;args&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify your project descriptor
&lt;/h3&gt;

&lt;p&gt;Even though JReleaser will do it for you, you can always independently verify if your project descriptor has all the mandatory fields to be published by running :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;jbang pomchecker@kordamp check-maven-central
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please correct your descriptor accordingly and repeat the operation until everything is clean&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure your project
&lt;/h2&gt;

&lt;p&gt;This is a 2 steps process. You need to configure JReleaser but also your build process to generate all the necessary artefacts for publication.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Maven configuration
&lt;/h3&gt;

&lt;p&gt;Add a release profile to your &lt;code&gt;pom.xml&lt;/code&gt; :&lt;/p&gt;

&lt;p&gt;
  release profile
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;release&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;altDeploymentRepository&amp;gt;&lt;/span&gt;
            local::file:./target/staging-deploy ①
        &lt;span class="nt"&gt;&amp;lt;/altDeploymentRepository&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;defaultGoal&amp;gt;&lt;/span&gt;deploy&lt;span class="nt"&gt;&amp;lt;/defaultGoal&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-javadoc-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;attach-javadocs&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;jar&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;attach&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/attach&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-source-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;attach-sources&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;jar&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;attach&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/attach&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;You can of course change this value&lt;/li&gt;
&lt;/ol&gt;



&lt;/p&gt;

&lt;h3&gt;
  
  
  The Gradle configuration
&lt;/h3&gt;

&lt;p&gt;If you do use Gradle, I’m sure you know how to produce the equivalent configuration. I don’t.&lt;/p&gt;

&lt;h3&gt;
  
  
  The JReleaser configuration
&lt;/h3&gt;

&lt;p&gt;You can initialize your project configuration with the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;jbang jreleaser@jreleaser init
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate your project configuration file that you will have to amend following your needs.&lt;/p&gt;

&lt;p&gt;
  jreleaser.yaml
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Generated with JReleaser 1.21.0 at 2025-11-19T09:09:25.55515446Z&lt;/span&gt;
&lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0-SNAPSHOT&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Awesome App&lt;/span&gt;
  &lt;span class="na"&gt;longDescription&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Awesome App&lt;/span&gt;
  &lt;span class="na"&gt;authors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Duke&lt;/span&gt;
  &lt;span class="na"&gt;license&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Apache-2.0&lt;/span&gt;
  &lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;homepage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://acme.com/app&lt;/span&gt;
  &lt;span class="na"&gt;languages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;java&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;groupId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;com.acme&lt;/span&gt;
      &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;
  &lt;span class="na"&gt;inceptionYear&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2025&lt;/span&gt;

&lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;duke&lt;/span&gt;

&lt;span class="na"&gt;distributions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path/to/{{distributionName}}-{{projectVersion}}.zip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;distributions&lt;/code&gt; and &lt;code&gt;github&lt;/code&gt; can be removed if you only want &lt;code&gt;maven&lt;/code&gt; deployment, anyway you have to specify the maven deployment configuration by adding the following to your config file :&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="na"&gt;signing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;①&lt;/span&gt;
  &lt;span class="s"&gt;active&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ALWAYS&lt;/span&gt;
  &lt;span class="s"&gt;armored&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;②&lt;/span&gt;
  &lt;span class="s"&gt;maven&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mavenCentral&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;release-deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RELEASE&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://central.sonatype.com/api/v1/publisher&lt;/span&gt;
        &lt;span class="na"&gt;stagingRepositories&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;target/staging-deploy ③&lt;/span&gt;
    &lt;span class="na"&gt;nexus2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;snapshot-deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SNAPSHOT&lt;/span&gt;
        &lt;span class="na"&gt;snapshotUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://central.sonatype.com/repository/maven-snapshots/&lt;/span&gt;
        &lt;span class="na"&gt;applyMavenCentralRules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;snapshotSupported&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;closeRepository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;releaseRepository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;stagingRepositories&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;target/staging-deploy ③&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Lets JRelease do the artefact signing for you&lt;/li&gt;
&lt;li&gt;Which maven repository to use for &lt;strong&gt;release&lt;/strong&gt; and &lt;strong&gt;snapshot&lt;/strong&gt; deployments&lt;/li&gt;
&lt;li&gt;Where to find the artefacts locally. Must match the value used in your project configuration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You will have to specify a few secret variables, but for obvious security reasons, NOT in a versioned source file...&lt;/p&gt;

&lt;h2&gt;
  
  
  Specifying variables
&lt;/h2&gt;

&lt;p&gt;Most of the JReleaser needed credentials are gonna be common for all your project. So setting them globally for JReleaser is a good thing to do. I set them in the JReleaser defaut folder. By default &lt;code&gt;$HOME/.jreleaser/config.properties&lt;/code&gt; (accepted formats are &lt;code&gt;PROPERTIES&lt;/code&gt;, &lt;code&gt;YAML&lt;/code&gt;, &lt;code&gt;TOML&lt;/code&gt; and &lt;code&gt;JSON&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jreleaser.org/guide/latest/reference/environment.html#_env_files" rel="noopener noreferrer"&gt;For more on this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I choose &lt;code&gt;TOML&lt;/code&gt; and here what my file looks like :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;~/.jreleaser/config.toml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;JRELEASER_GPG_PUBLIC_KEY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"""-----BEGIN PGP PUBLIC KEY BLOCK-----

&amp;lt;place_your_public_key_here&amp;gt;
-----END PGP PUBLIC KEY BLOCK-----"""&lt;/span&gt; &lt;span class="err"&gt;①&lt;/span&gt;
&lt;span class="py"&gt;JRELEASER_GPG_SECRET_KEY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"""-----BEGIN PGP PRIVATE KEY BLOCK-----

&amp;lt;place_your_secret_key_here&amp;gt;
-----END PGP PRIVATE KEY BLOCK-----"""&lt;/span&gt;

&lt;span class="py"&gt;JRELEASER_DRAFT&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="err"&gt;②&lt;/span&gt;
&lt;span class="py"&gt;JRELEASER_GPG_PASSPHRASE&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"❤️ Eminem&amp;lt;3&amp;lt;3"&lt;/span&gt;
&lt;span class="py"&gt;JRELEASER_MAVENCENTRAL_RELEASE_DEPLOY_USERNAME&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"redacted"&lt;/span&gt;
&lt;span class="py"&gt;JRELEASER_MAVENCENTRAL_RELEASE_DEPLOY_TOKEN&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"redacted"&lt;/span&gt;
&lt;span class="py"&gt;JRELEASER_NEXUS2_SNAPSHOT_DEPLOY_USERNAME&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"redacted"&lt;/span&gt;
&lt;span class="py"&gt;JRELEASER_NEXUS2_SNAPSHOT_DEPLOY_TOKEN&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"redacted"&lt;/span&gt; &lt;span class="err"&gt;③&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Toml supports multiline string using triple double quotes: &lt;code&gt;"""&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;I only do draft release from local env&lt;/li&gt;
&lt;li&gt;Values obtained in obtaining-your-maven-central-credentials chapter. They are the same for &lt;strong&gt;maven central&lt;/strong&gt; and &lt;strong&gt;nexus2_snapshot&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One more thing, please. I prefere to only do dry run execution locally but that cannot be specified through file at the moment, so I export the value just before running the commands :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;export JRELEASER_DRY_RUN=true &amp;amp;&amp;amp; jreleaser full-release
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you’re happy, you can possibly unset the dry run property and relaunch, but I’d rather do the proper release from my &lt;em&gt;&lt;strong&gt;&lt;em&gt;CI&lt;/em&gt;&lt;/strong&gt;&lt;/em&gt;, which is Github for me at the moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running all this from Github actions
&lt;/h2&gt;

&lt;p&gt;Here is the minimal github workflow to release a maven application.&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Release&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;①&lt;/span&gt;
    &lt;span class="s"&gt;inputs&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;②&lt;/span&gt;
        &lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Release&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;version"&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;precheck&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;artefacts'&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Check&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;out&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;repository'&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ needs.precheck.outputs.HEAD }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Set&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Java'&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-java@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;distribution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;temurin&lt;/span&gt;
          &lt;span class="na"&gt;java-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;21&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;maven'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;artefacts'&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mvn -B -P release clean deploy&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Central&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jreleaser/release-action@v2 ③&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt;
          &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;full-release'&lt;/span&gt; &lt;span class="s"&gt;④&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;JRELEASER_GPG_PUBLIC_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GPG_PUBLIC_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;JRELEASER_GPG_SECRET_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GPG_PRIVATE_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;JRELEASER_GPG_PASSPHRASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GPG_PASSPHRASE }}&lt;/span&gt;
          &lt;span class="na"&gt;JRELEASER_MAVENCENTRAL_USERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SONATYPE_USERNAME }}&lt;/span&gt;
          &lt;span class="na"&gt;JRELEASER_MAVENCENTRAL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SONATYPE_PASSWORD }}&lt;/span&gt;
          &lt;span class="na"&gt;JRELEASER_NEXUS2_USERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SONATYPE_USERNAME }}&lt;/span&gt;
          &lt;span class="na"&gt;JRELEASER_NEXUS2_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SONATYPE_PASSWORD }} ⑤&lt;/span&gt;
          &lt;span class="na"&gt;JRELEASER_PROJECT_VERSION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.inputs.version }} ②&lt;/span&gt;
         &lt;span class="c1"&gt;#JRELEASER_DRAFT: true ⑥&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Manually triggered workflow&lt;/li&gt;
&lt;li&gt;The version to be released. It could also be retrieved from your maven project.&lt;/li&gt;
&lt;li&gt;Uses the JReleaser github action (Integration also exists with Gitlab, Gitea and many others)&lt;/li&gt;
&lt;li&gt;Runs the &lt;strong&gt;full-release&lt;/strong&gt; workflow&lt;/li&gt;
&lt;li&gt;All the values to be assign in your project secrets&lt;/li&gt;
&lt;li&gt;Wether or not do you want draft releases.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;We’ve only scratch the surface of what can be done with JReleaser. If you want a really full example, &lt;a href="https://jreleaser.org/guide/latest/examples/jreleaser.html" rel="noopener noreferrer"&gt;here’s how JReleaser releases itself&lt;/a&gt;, with JReleaser of course.&lt;/p&gt;

&lt;p&gt;But at least you know how to publish your artefacts to Maven Central 🗻 \o/ .&lt;/p&gt;

</description>
      <category>java</category>
      <category>jreleaser</category>
      <category>maven</category>
    </item>
    <item>
      <title>Diagram as Code en 2025 : Le repas de famille des outils</title>
      <dc:creator>Alexis</dc:creator>
      <pubDate>Fri, 19 Dec 2025 06:00:00 +0000</pubDate>
      <link>https://dev.to/onepoint/diagram-as-code-en-2025-le-repas-de-famille-des-outils-1gdp</link>
      <guid>https://dev.to/onepoint/diagram-as-code-en-2025-le-repas-de-famille-des-outils-1gdp</guid>
      <description>&lt;h2&gt;
  
  
  Le 'Diagram as Code' : pourquoi et comment en 2025 ?
&lt;/h2&gt;

&lt;p&gt;En tant qu'architectes, nous sommes confrontés à un défi récurrent : présenter un système de manière claire et maintenable sans y consacrer un temps infini.&lt;/p&gt;

&lt;p&gt;Notre joli gribouillis finit généralement sur une porte de frigo, admiré à quelques cérémonies matinales de standup meeting (au mieux), puis oublié dans une boite mail. &lt;br&gt;
Rarement tenu à jour, figé dans le temps tel une peinture rupestre de nos architectures primitives, parfois redécouvert au gré des fouilles de futurs archéologues.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Votre superbe diagramme d'architecture a un défaut majeur : à la seconde où vous l'exportez en PNG, il est déjà en voie d'obsolescence.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En 2025 j'ai expérimenté quelques solutions de diagramme &lt;em&gt;as code&lt;/em&gt;, dans l'objectif de trouver le meilleur ensemble de qualités pour mes missions d'architecture. Je vous ferai ici une synthèse de mes expérimentations.&lt;br&gt;
Chaque outil proposant un compromis différent, et chaque situation ne se prêtant pas à tous les compromis, vos conclusions pourront bien sûr diverger.&lt;/p&gt;

&lt;p&gt;Mon ambition est de vous démontrer que ce passage au code n'est pas qu'une mode technique ou une régression vers l'artisanat, mais une évolution nécessaire vers plus de rigueur et d'expressivité. L'écosystème a mûri : les outils actuels nous permettent enfin de combler le fossé entre la théorie du tableau blanc et la réalité du terrain, pour peu qu'on apprenne à leur parler.&lt;br&gt;
Et j'espère vous convaincre que le code est désormais le vecteur privilégié de la schématisation des architectures, tout comme le cloud a enfoncé la porte de l'&lt;em&gt;Infrastructure as Code&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Un objectif : partager, ou comment la méthode amplifie nos capacités d'expression
&lt;/h3&gt;

&lt;p&gt;Revenons un peu en arrière : comment matérialiser la pensée et l'échanger ? Par &lt;strong&gt;le langage&lt;/strong&gt; bien sûr.  &lt;br&gt;
&lt;strong&gt;Si le visuel montre, le langage démontre.&lt;/strong&gt; Il est le support premier de la pensée structurée. Ainsi pourquoi ne pas commencer par le langage au lieu de se lancer dans une représentation artistique ? &lt;/p&gt;

&lt;p&gt;Sommes-nous condamnés à le réduire à de simples carrés et des flèches, là où &lt;strong&gt;les mots&lt;/strong&gt; offrent une sémantique infiniment redéfinissable ?&lt;br&gt;
En interprétant le code, la machine nous impose une syntaxe explicite, dissipant les flous du langage naturel.&lt;/p&gt;

&lt;p&gt;Dès lors, pourquoi ne pas la laisser calculer les représentations optimales par une &lt;strong&gt;interprétation rigoureuse&lt;/strong&gt;, plutôt que de nous épuiser en tâtonnements manuels et approximations graphiques.&lt;br&gt;
Ce que nous verrons, c'est que le code permet aujourd'hui de produire (plutôt) aisément des représentations calculées, adaptables, reproductibles et intégrables à nos processus de traitement automatiques.&lt;/p&gt;
&lt;h4&gt;
  
  
  Structurer la pensée
&lt;/h4&gt;

&lt;p&gt;Ce premier point est aujourd'hui assez généralement accepté : nous documentons nos systèmes, partageons dans nos langues, pour structurer une connaissance reproductible chez le collègue, l'organisation à laquelle nous prenons part, mais aussi le futur soi.&lt;br&gt;
Le diagramme permettra de traiter de systèmes trop vastes pour être appréhendés d'un seul bloc, en explicitant les relations entre les éléments. &lt;br&gt;
Par cet exercice, nous faisons émerger des informations parfois implicites dans une expression explicite.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ce que l'on conçoit bien se modélise sans effort 😉&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Le passage au diagramme constitue un test de cohérence : l'échec de la représentation visuelle trahit souvent une lacune dans l'analyse fonctionnelle, qu'il faudra combler ou non, selon nos objectifs (on en reparle plus bas).&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%2Fo8o5zul4qa0j7uphx76q.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%2Fo8o5zul4qa0j7uphx76q.png" title="La structure des microservices Netflix en 2016 : on y comprend la forme générale du système" alt="La structure des microservices Netflix en 2016 : on y comprend la forme générale du système"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Standardiser la communication 
&lt;/h4&gt;

&lt;p&gt;Une pensée structurée "s'imprime" d'autant plus facilement que sa forme est intuitive, proche de notre culture ou nos standards.&lt;br&gt;
En utilisant des langages explicites, comme UML ou ArchiMate, on s'assure que "cette forme de carré avec cette couleur et ce symbole" veut dire la même chose pour tout le monde.&lt;br&gt;
Mais ces deux standards peinent encore à s'imposer : bien qu'apportant des éléments de rigueur intéressants, leurs outils manquent d'utilisabilité et de progressivité.&lt;br&gt;
Et c'est au moins un état de fait auquel tout le monde s'accordera : en 2025 nous ne partageons toujours pas de &lt;em&gt;lingua franca&lt;/em&gt; pour schématiser au quotidien. Nous nous en remettons souvent au tableau blanc avec une sémantique improvisée. &lt;br&gt;
Cette improvisation génère une dette de communication : chaque nouvel arrivant doit réapprendre le dialecte de la tribu, et le diagramme est conçu comme  un artefact personnel, non reproductible.&lt;/p&gt;

&lt;p&gt;Pour que la standardisation soit effective, elle nécessite adoption, et l'adoption est nécessairement progressive : généralement par le contact répété avec un outil suffisamment intuitif.&lt;br&gt;
Certains langages sont restés abstraits et peu répandus car conçus comme des idéaux, sans soucis d'ergonomie intrinsèque pour en développer l'utilisabilité, et leurs outillages butent aujourd'hui sur l'héritage de cette complexité.&lt;/p&gt;
&lt;h4&gt;
  
  
  Gérer la complexité par la séparation des enjeux : l'abstraction
&lt;/h4&gt;

&lt;p&gt;Les langages sont suffisamment complexes pour qu'on se permette d'économiser un peu de précieux cortex cérébral, en traitant avant tout les priorités et des objectifs. &lt;br&gt;
Nous éliminerons donc bien volontiers les détails inutiles pour nous concentrer sur les composants essentiels. &lt;/p&gt;

&lt;p&gt;Ici l'expérience de méthodologies sera utile. Et pour cela, citons le TOGAF, qui explicite certains concepts clés :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;La Vue (View) :&lt;/strong&gt;  ce que l'on voit réellement (le diagramme spécifique d'un système donné).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Le Point de Vue (Viewpoint) :&lt;/strong&gt;  la "perspective" ou la grille de lecture. Il définit &lt;strong&gt;pour qui&lt;/strong&gt; on dessine et &lt;strong&gt;pourquoi&lt;/strong&gt;. 
Ceci permet par exemple de présenter les informations à des publics différents selon les enjeux.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;"Imaginez un bâtiment (le Modèle). Le plan électrique est une &lt;em&gt;Vue&lt;/em&gt; destinée à l'électricien (&lt;em&gt;Point de vue&lt;/em&gt;), tandis que le plan de façade est une autre &lt;em&gt;Vue&lt;/em&gt; pour l'architecte des Bâtiments de France."&lt;/p&gt;
&lt;/blockquote&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%2F8b6rs8zq2uqfz0amh553.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%2F8b6rs8zq2uqfz0amh553.png" title="Tout est dans le TOGAF (et ça rend fou)" alt="Tout est dans le TOGAF (et ça rend fou)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nous pouvons imaginer un unique modèle, avec séparation de ses objectifs (points de vue) et de ses représentations (vues). &lt;br&gt;
Et cela nécessite dès lors au moins trois langages : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le langage pour &lt;strong&gt;Modéliser&lt;/strong&gt; rigoureusement (e.g., langages spécifiques de modélisation).&lt;/li&gt;
&lt;li&gt;Le langage pour représenter les &lt;strong&gt;Objectifs/Perspectives&lt;/strong&gt; (les Viewpoints TOGAF par exemple).&lt;/li&gt;
&lt;li&gt;Le langage &lt;strong&gt;Visuel&lt;/strong&gt; d'interprétation (UML, C4, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous conviendrez que trois langages, c'est beaucoup à apprendre. Profitons un peu de nos machines pour nous faciliter le traitement.&lt;br&gt;
Le "code" du Diagram as Code visera précisément à fusionner ou simplifier les langages 1 et 2 pour que la machine gère le dernier.&lt;/p&gt;
&lt;h3&gt;
  
  
  La puissance cachée du Code : Intégration, Git et IA
&lt;/h3&gt;

&lt;p&gt;Démystifions : le code n'est qu'un langage, dont la seule vertu est d'être &lt;a href="https://fr.wikipedia.org/wiki/Langage_formel" rel="noopener noreferrer"&gt;&lt;em&gt;formalisé&lt;/em&gt;&lt;/a&gt;, c'est à dire que sa structure est régulière : simple, non contextuelle, sans ambigüité, pour en permettre le traitement procédural par nos petits amis les ordinateurs.&lt;/p&gt;

&lt;p&gt;L'usage du code est donc avant tout de clarifier ce que nous attendons de la machine, et cela peut prendre des formes assez diverses. Certains d'entre vous auront développé en C#, Java ou encore Python…&lt;br&gt;
Votre bagage de développement sera bien sûr un avantage d'aisance, mais pour produire des diagrammes nous limiterons un peu la richesse syntaxique et essaierons de maximiser l'expressivité sémantique, c'est-à-dire : &lt;em&gt;utiliser peu de mots pour exprimer beaucoup&lt;/em&gt;.&lt;br&gt;
L'objectif étant que nos machines sachent quoi nous montrer sans débats byzantins sur le sens des mots, en ayant peu d'effort d'explication à fournir.&lt;/p&gt;

&lt;p&gt;C'est aussi là qu'un langage de code &lt;em&gt;intuitif&lt;/em&gt; prendra toute son importance : des mots clairs pour des concepts que nous côtoyons déjà c'est quand même bien plus simple à prendre en main pour exprimer ce que l'on veut voir.&lt;/p&gt;
&lt;h4&gt;
  
  
  Intégration aux pratiques : Versionning et "Diffability"
&lt;/h4&gt;

&lt;p&gt;Toute une industrie s'est construite autour du code et a abouti à des bonnes pratiques dont nous pouvons hériter. En utilisant du code, vous n'obtenez pas seulement une solution de dessin, mais tout un écosystème. L'avantage immédiat est la capacité à versionner avec &lt;strong&gt;Git&lt;/strong&gt;, mais le véritable gain réside dans la &lt;strong&gt;"diffability"&lt;/strong&gt; (la lisibilité des différences).&lt;/p&gt;

&lt;p&gt;Contrairement à un fichier &lt;code&gt;.drawio&lt;/code&gt; ou &lt;code&gt;.archimate&lt;/code&gt; (souvent constitués de milliers de lignes de XML indigeste où le simple déplacement d'une boîte de trois pixels modifie 50 lignes de coordonnées), les langages de diagramme &lt;em&gt;as code&lt;/em&gt; sont sémantiques. &lt;br&gt;
Lors d'une revue de ce code, vous ne voyez pas seulement que le fichier a changé, vous lisez l'intention : une ligne rouge indique &lt;code&gt;- user -&amp;gt; database&lt;/code&gt;, une ligne verte indique &lt;code&gt;+ user -&amp;gt; api -&amp;gt; database&lt;/code&gt; soulignant ce qui a été modifié.&lt;br&gt;
L'évolution de l'architecture devient &lt;strong&gt;auditable&lt;/strong&gt; ligne par ligne, permettant une véritable revue de conception asynchrone entre membres de l'équipe, avant même que le diagramme ne soit généré.&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%2Fw1j1invl79t0ng22n1d9.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%2Fw1j1invl79t0ng22n1d9.png" title="Un exemple de pull request sur Github.com" alt="Un exemple de pull request sur Github.com"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Intégration aux traitements automatiques
&lt;/h4&gt;

&lt;p&gt;Mais ce format textuel ouvre surtout la porte à l'industrialisation via l'&lt;strong&gt;Intégration et le Déploiement Continus (CI/CD)&lt;/strong&gt;. Puisque vos diagrammes sont désormais des sources compilables, ils s'intègrent naturellement à vos pipelines de build (GitHub Actions, GitLab CI, etc.) au même titre que votre code applicatif. &lt;/p&gt;

&lt;p&gt;Concrètement, imaginez qu'à chaque nouvelle fonctionnalité dans le code, votre traitement d'intégration vérifie la syntaxe, régénère automatiquement les rendus des diagrammes, et publie la mise à jour sur votre portail de documentation. Sans aucune intervention humaine, ou du moins elle devient limitée.&lt;br&gt;
C'est la garantie d'une &lt;strong&gt;documentation vivante&lt;/strong&gt; (&lt;em&gt;Living Documentation&lt;/em&gt;), enfin synchronisée avec la réalité du terrain, mettant un terme définitif aux schémas obsolètes copié-collés manuellement dans des documents Word oubliés.&lt;/p&gt;
&lt;h4&gt;
  
  
  Diagramme aidé par IA
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Et vous n'allez peut-être pas me croire mais récemment, ont émergé les…&lt;/em&gt; &lt;strong&gt;LLM et IA génératives&lt;/strong&gt; !😉 &lt;br&gt;
Et leur spécialité, c'est &lt;em&gt;précisément&lt;/em&gt; de générer du langage !&lt;br&gt;
Je vous enjoins chaleureusement à tester leurs capacités. La qualité des ébauches générées est souvent bluffante ; il ne reste généralement qu'à les retoucher.&lt;br&gt;
Exemple avec Mermaid : copiez votre classe Java ou votre description du système dans ChatGPT et demandez : &lt;em&gt;'Génère un diagramme de séquence Mermaid expliquant le flux de données de ce code'&lt;/em&gt;. Copiez le résultat dans le &lt;a href="https://www.mermaidchart.com/play" rel="noopener noreferrer"&gt;playground Mermaid&lt;/a&gt; : le résultat est immédiat.&lt;/p&gt;
&lt;h3&gt;
  
  
  Comment comparer
&lt;/h3&gt;

&lt;p&gt;On peut dégager quelques critères de cette introduction au principe du diagramme as code.&lt;/p&gt;
&lt;h4&gt;
  
  
  Critères d'Adoption et d'Usabilité (Prise en main)
&lt;/h4&gt;

&lt;p&gt;Ces critères sont primordiaux pour l'&lt;strong&gt;échange&lt;/strong&gt; et la &lt;strong&gt;collaboration&lt;/strong&gt; au quotidien.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critère&lt;/th&gt;
&lt;th&gt;Pourquoi est-ce important ?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Courbe d'Apprentissage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Facilité et rapidité pour une personne non familière avec l'outil à écrire un premier diagramme simple. Le DSL doit être &lt;strong&gt;intuitif&lt;/strong&gt; et non verbeux.  (Mermaid, D2) favorise l'adoption rapide, même par le non-développeur.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Facilité à se lancer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rapidité à démarrer un nouveau diagramme sans devoir gérer une structure de modèle complexe au préalable, et des outils à installer parfois très techniques. Les outils orientés "scénario" ou "micro-diagramme" (Mermaid) sont excellents ici, contrairement aux outils orientés "modèle unique" avec une application serveur (Structurizr).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Qualité du Rendu&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Un diagramme plaisant et clair est plus vendeur, plus partagé et plus souvent mis à jour.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Critères Techniques et Opérationnels (Intégration et Coût)
&lt;/h4&gt;

&lt;p&gt;Ces critères sont essentiels pour la &lt;strong&gt;documentation&lt;/strong&gt; et la &lt;strong&gt;maintenabilité&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critère&lt;/th&gt;
&lt;th&gt;Pourquoi est-ce important ?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Coût et Licence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Le coût d'utilisation de l'outil et de ses fonctionnalités (moteur de rendu, plugins, licences commerciales). Une solution &lt;em&gt;open source&lt;/em&gt; ou &lt;em&gt;gratuite&lt;/em&gt; favorise l'adoption à l'échelle de l'entreprise (PlantUML, Mermaid). Le coût de certaines fonctionnalités (e.g., Tala de D2) est un frein.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. Intégration dans l'Écosystème cible&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Disponibilité de plugins dans les outils quotidiens (VS Code, JetBrains, Confluence, GitHub/GitLab Markdown). Si l'équipe passe sa journée dans VS Code, un bon plugin PlantUML ou Mermaid est un must. Et une intégration aux produits IA/LLM, ça ne mangerait pas de pain !&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Critères Sémantiques (Rigueur et flexibilité)
&lt;/h4&gt;

&lt;p&gt;Ces critères jugent de l'équilibre entre la rigueur (TOGAF, C4) et le pragmatisme.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critère&lt;/th&gt;
&lt;th&gt;Pourquoi est-ce important ?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6. Rigueur sémantique flexible&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Le niveau de formalisme absent ou imposé (note basse) ou supporté avec flexibilité (note haute). Il doit pouvoir être adapté au contexte pour ne pas nuire à la prise en main.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7. Réutilisabilité&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Capacité à générer des vues filtrées à partir d'un unique modèle de référence qui peut être composé du travail de plusieurs contributeurs. Essentiel pour reformuler le même modèle à des publics différents sans redessiner, et pour collaborer brique par brique vers un système plus grand.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Petit arbre généalogique 2025 : présentation de quelques membres émérites
&lt;/h2&gt;

&lt;p&gt;Alors le diagramme et la modélisation, ce n'est pas nouveau et il existe déjà quantité d'outils, plus ou moins accessibles et intégrables à nos vies déjà bien chargées.&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%2F8e29ltosp2c1xlmf72fu.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%2F8e29ltosp2c1xlmf72fu.png" title="Voici un petit arbre à la généalogie arbitraire pour faire un petit tour de l'existant." alt="Voici un petit arbre à la généalogie arbitraire pour faire un petit tour de l'existant."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  👵 Mamie Archimate
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Archi is an open source modelling toolkit to create ArchiMate models and sketches. […] It is targeted toward all levels of Enterprise Architects and Modellers." &lt;a href="https://www.archimatetool.com/" rel="noopener noreferrer"&gt;Archi – Open Source ArchiMate Modelling&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Documentation Officielle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://www.archimatetool.com/downloads/archi/Archi%20User%20Guide.pdf" rel="noopener noreferrer"&gt;Archi%20User%20Guide.pdf&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Téléchargement de l'Outil&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.archimatetool.com" rel="noopener noreferrer"&gt;https://www.archimatetool.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fonctionnalité Clé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Analyse d'Impact&lt;/strong&gt; : La capacité de tracer un lien de "Réalisation" depuis un serveur physique jusqu'à un objectif métier stratégique pour évaluer les risques&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Démonstration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/archimate-models/archisurance" rel="noopener noreferrer"&gt;https://github.com/archimate-models/archisurance&lt;/a&gt; - Modèle complet de fusion d'entreprise&lt;br&gt;&lt;br&gt;&lt;em&gt;Note : Archi est un client lourd (Desktop). Les modèles ne peuvent être visualisés en ligne.&lt;/em&gt; D'autres outils permettent de modéliser à la façon de Archi, et sont consultables en ligne, comme ces exemples PlantUML : [Archimate-PlantUML \&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mamie fait de la modélisation rigoureuse, trace au cordeau des architectures formelles et permet, à partir d'un modèle unique, de produire des vues sur le contenu selon les couches TOGAF. &lt;br&gt;
Attention, ça ne devient intéressant que si l'on maitrise ses concepts et qu'on y produise un modèle exhaustif… Et séparer le modèle de la présentation, on l'a dit, c'est souvent bien pratique (MVC tu connais). Difficile en tout cas de s'y mettre progressivement, et pour débuter je vous conseille d'utiliser une &lt;a href="https://gbruneau.github.io/ArchiMate/" rel="noopener noreferrer"&gt;antisèche&lt;/a&gt;.&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%2F9mowwldepdpcl34rpsnm.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%2F9mowwldepdpcl34rpsnm.png" title="Exemple de diagramme Archimate réutilisant le modèle de données et proposant une vue en couche des différents points de vue" alt="Exemple de diagramme Archimate réutilisant le modèle de données et proposant une vue en couche des différents points de vue"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ma conclusion :&lt;/em&gt; si vous avez le temps de constituer un modèle bien à plat, c'est très puissant pour de l'architecture d'entreprise. Pour de l'architecture un peu moins abstraite, on aura du mal à trouver le temps de tenir ça à jour, surtout dans l'interface au clic…&lt;/p&gt;
&lt;h3&gt;
  
  
  ✏️ Tata Draw.io/Diagram.net
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"security-first diagramming for teams. […] You choose where to store your data. We don't store your diagram data." — &lt;em&gt;&lt;a href="https://www.diagrams.net/" rel="noopener noreferrer"&gt;Diagrams.net Main page&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Documentation Officielle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://www.drawio.com/doc/" rel="noopener noreferrer"&gt;https://www.drawio.com/doc/&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Éditeur en Ligne&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://app.diagrams.net/" rel="noopener noreferrer"&gt;app.diagrams.net&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fonctionnalité Clé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Agnosticisme de Plateforme&lt;/strong&gt; : Sauvegarde directe en XML, PNG, SVG ou HTML sur votre disque local ou repo Git, sans cloud intermédiaire.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Démonstration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.drawio.com/blog/sequence-diagrams" rel="noopener noreferrer"&gt;Blog - Create a sequence diagram&lt;/a&gt; - Exemples variés (Réseau, UML, BPMN) sinon : &lt;a href="https://www.drawio.com/example-diagrams" rel="noopener noreferrer"&gt;Example draw.io diagrams and templates&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;L'outil de diagramme intégrable un peu partout, disponible gratuitement sur le web, avec un export PNG qui intègre le xml qui a permis de le générer, et qui peut donc être réimporté. C'est assez canon pour balader son dessin. &lt;br&gt;
Son modèle de stockage est unique et constitue son "killer feature" pour les entreprises soucieuses de la confidentialité des données : l'outil adopte une approche "Bring Your Own Storage" (BYOS). Draw.io ne stocke pas vos diagrammes sur ses propres serveurs. Il agit comme une couche d'édition par-dessus vos fournisseurs de stockage existants : Google Drive, GitHub, OneDrive, Dropbox, ou simplement le système de fichiers local.&lt;br&gt;
Elle dispose aussi d'une base d'icônes et de symboles gigantesques, ce qui n'est d'ailleurs pas toujours facile à naviguer.&lt;/p&gt;

&lt;p&gt;Attention cependant, c'est tout au clic (ou presque) et il va falloir tracer des boites et des flèches en pagaille, puis tout réagencer.&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%2Fm0ox3jxufpkfswzem33n.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%2Fm0ox3jxufpkfswzem33n.png" title="Exemple de modélisation Draw.Io / Diagrams.net" alt="Exemple de modélisation Draw.Io / Diagrams.net"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ma conclusion :&lt;/em&gt; Pour les artistes qui ne veulent aucune limite, et ne rien risquer de leurs données : ça fait tout. Mais il va falloir bricoler… &lt;/p&gt;
&lt;h3&gt;
  
  
  🖱️ Mama yEd
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"yEd is a powerful desktop application that can be used to quickly and effectively generate high-quality diagrams. […] Its automatic layout algorithms arrange large data sets with just the press of a button." — &lt;em&gt;&lt;a href="https://www.yworks.com/products/yed" rel="noopener noreferrer"&gt;yWorks Official Doc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Documentation Officielle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://www.yworks.com/products/yed" rel="noopener noreferrer"&gt;https://www.yworks.com/products/yed&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Éditeur en Ligne&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.yworks.com/yed-live/" rel="noopener noreferrer"&gt;yEd Live&lt;/a&gt; (Version d'essai navigateur)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Téléchargement Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.yworks.com/downloads#yEd" rel="noopener noreferrer"&gt;https://www.yworks.com/downloads#yEd&lt;/a&gt; (Java Swing - version gratuite très limitée comparée à yEd Live !)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fonctionnalité Clé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Disposition automatique&lt;/strong&gt; : Transformer un chaos de 1000 nœuds en une structure hiérarchique lisible en un clic. Import direct depuis Excel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Démonstration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.yworks.com/pages/interactive-showcase-of-graph-layouts" rel="noopener noreferrer"&gt;https://www.yworks.com/pages/interactive-showcase-of-graph-layouts&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Comme sa sœur Draw.io, il va falloir bricoler laborieusement : placer des petites boites et les contourner avec des flèches en clicodrome. &lt;br&gt;
Ce dernier a au moins la présence d'esprit de structurer le dessin en hiérarchie (un graphe de noeuds xml), et de permettre (parfois) une disposition automatique avec son moteur d'arrangement. &lt;br&gt;
&lt;em&gt;Surtout si vous avez acheté une licence, coûteuse&lt;/em&gt;.  &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%2Fkwpazvr3382t4hsltn8z.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%2Fkwpazvr3382t4hsltn8z.png" title="Exemple d'utilisation de yEd Desktop (version gratuite): ce n'est plus mis à jour et ça commence à se ressentir. Tout se fait bien sûr avec votre pointeur." alt="Exemple d'utilisation de yEd Desktop (version gratuite): ce n'est plus mis à jour et ça commence à se ressentir. Tout se fait bien sûr avec votre pointeur."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ma conclusion :&lt;/em&gt; Si vous aimez cliquer, et avez le portefeuille bien rempli, ça peut être un bon outil mais peu confortable pour travailler avec efficience.&lt;/p&gt;
&lt;h3&gt;
  
  
  📜 L'ainé PlantUML
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"PlantUML is an open-source tool allowing users to create diagrams from a plain text language. […] It can be used within many other tools." — &lt;em&gt;&lt;a href="https://plantuml.com/" rel="noopener noreferrer"&gt;PlantUML.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Documentation Officielle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://plantuml.com/" rel="noopener noreferrer"&gt;PlantUML.com&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Téléchargement de l'Outil&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://plantuml.com/download" rel="noopener noreferrer"&gt;https://plantuml.com/download&lt;/a&gt; ou Image Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fonctionnalité Clé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Standard Library &amp;amp; Macros&lt;/strong&gt; : Support étendu pour C4 Model et icônes Cloud (AWS/Azure) via inclusions &lt;code&gt;!include&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Démonstration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.planttext.com/" rel="noopener noreferrer"&gt;https://www.planttext.com/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;C'est le top et le pionnier de cette génération, si vous aimez les DSL exotiques et verbeux. Il fait le pont entre la génération parentale et la fratrie "as code" de la famille. Les cas d'usages intégrés sont extrêmement divers, l'outil est flexible à l'envie et permet de tout customiser jusqu'aux options de disposition du Graphviz sous-jacent. &lt;/p&gt;

&lt;p&gt;Ses capacités sont très développées et gros point positif, il permet d'intégrer du code distant en le récupérant sur simple déclaration d'une URL, ce qui permet de réutiliser du PlantUML développé et diffusé par d'autres utilisateurs. &lt;br&gt;
Pour les téméraires, il est possible de se créer des définitions prédéfinies pour normaliser les diagrammes selon vos pratiques, et de les généraliser assez simplement.&lt;br&gt;
Par contre vous allez répéter des incantations toute la journée, et le résultat est souvent bien austère et peu vendeur. Je ne peux que vous conseiller de chercher des &lt;a href="https://github.com/isaaceindhoven/plantuml-styler" rel="noopener noreferrer"&gt;packs de styles&lt;/a&gt; pour le rendre plus appétissant.&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%2Fg0cp2vti8sczqbmzznu2.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%2Fg0cp2vti8sczqbmzznu2.png" title="Exemple de PlantUML: c'est quand même très technique, et le résultat est un peu décevant visuellement même si impressionnant de stabilité" alt="Exemple de PlantUML: c'est quand même très technique, et le résultat est un peu décevant visuellement même si impressionnant de stabilité"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ma conclusion :&lt;/em&gt; Cet outil est un excellent précurseur, mais il ne s'est pas débarrassé de tous les défauts du diagramme "dessiné" et cumule ceux du as-code avec un langage construit par accumulation de concepts.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧜‍♀️ Cousine Mermaid
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"JavaScript based diagramming and charting tool that renders Markdown-inspired text definitions to create and modify diagrams dynamically." — &lt;em&gt;&lt;a href="https://mermaid.js.org/intro/" rel="noopener noreferrer"&gt;Mermaid.js.org Intro&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Documentation Officielle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://mermaid.js.org/intro/syntax-reference.html" rel="noopener noreferrer"&gt;https://mermaid.js.org/intro/syntax-reference.html&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Téléchargement de l'Outil&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/mermaid-js/mermaid" rel="noopener noreferrer"&gt;NPM / GitHub&lt;/a&gt; (Mais souvent intégré nativement : GitHub, Notion, Obsidian)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fonctionnalité Clé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Rendu Natif&lt;/strong&gt; : Intégration transparente dans les fichiers Markdown (README.md) des plateformes de code (GitHub/GitLab).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Démonstration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://mermaid.live/" rel="noopener noreferrer"&gt;Mermaid Live Editor&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;C'est intégré dans pas mal de lecteurs Markdown, c'est plutôt joli, mais contrairement à la génération dessin, il va falloir se contenter des cas d'usages prédéfinis : à la façon de PlantUML finalement, dont la sirène s'est certainement bien inspirée !&lt;br&gt;
Le rendu est très propre tant qu'on ne rentre pas dans des graphes imbriqués un peu plus complexes. &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%2Fkaofdv73adyd2w38jqfz.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%2Fkaofdv73adyd2w38jqfz.png" title="Exemple MermaidURL utilisé pour cet article : brouillon via Gemini, affinage par moi-même et décoration par le LLM pour la bannière de ce chapitre." alt="Exemple MermaidURL utilisé pour cet article : brouillon via Gemini, affinage par moi-même et décoration par le LLM pour la bannière de ce chapitre."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ma conclusion :&lt;/em&gt; Parfait pour des petits diagrammes (la généalogie ci-dessus) avec des cas d'usages assez divers et particuliers (modélisation GIT!) , et de la génération par IA avec une syntaxe relativement accessible.&lt;/p&gt;
&lt;h3&gt;
  
  
  🌊 Le cadet D2
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"D2 is a domain-specific language (DSL) that turns text to diagrams. […] D2 is designed to be modern, hackable, and easy to read." — &lt;em&gt;&lt;a href="https://d2lang.com/tour/intro/" rel="noopener noreferrer"&gt;D2Lang.com Intro&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Documentation Officielle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://d2lang.com/tour/intro/" rel="noopener noreferrer"&gt;https://d2lang.com/tour/intro/&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Téléchargement de l'Outil&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://d2lang.com/tour/install" rel="noopener noreferrer"&gt;Install Guide (CLI)&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fonctionnalité Clé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Moteur TALA &amp;amp; SQL&lt;/strong&gt; : Moteur de disposition propriétaire optimisé pour l'esthétique et conversion automatique SQL vers ERD.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Démonstration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://play.d2lang.com/" rel="noopener noreferrer"&gt;https://play.d2lang.com/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Celui-là c'est un sous-marin. Peu discuté dans mon entourage (malgré des étoiles ⭐ Github), il a le mérite d'être très abouti visuellement, et de fournir une syntaxe très simple et raffinée.&lt;/p&gt;

&lt;p&gt;Avec son langage, il permet de définir des vues complexes composées selon trois modes : &lt;a href="https://d2lang.com/tour/layers/" rel="noopener noreferrer"&gt;layers&lt;/a&gt; (couches), &lt;a href="https://d2lang.com/tour/scenarios/" rel="noopener noreferrer"&gt;scénarios&lt;/a&gt; (variantes d'un même diagramme), et steps (&lt;a href="https://d2lang.com/tour/steps/" rel="noopener noreferrer"&gt;déroulé&lt;/a&gt;) mais dont l'export est assez limité (diapositives de svg ou pages de pdf…).&lt;br&gt;
Il propose aussi de sympathiques &lt;a href="https://d2lang.com/tour/globs/" rel="noopener noreferrer"&gt;sélecteurs globs&lt;/a&gt;qui permettent d'ajouter des relations, des styles, des attributs sur le modèle défini, plusieurs éléments à la fois. &lt;br&gt;
Enfin, il permet de composer du code avec des &lt;a href="https://d2lang.com/tour/nested-composition/" rel="noopener noreferrer"&gt;imports&lt;/a&gt; (syntaxe de chemin relatif vers un fichier par son nom) et des &lt;a href="https://d2lang.com/tour/vars/#spread-substitutions" rel="noopener noreferrer"&gt;operateurs&lt;/a&gt;, ce qui peut s'avérer assez puissant pour &lt;a href="https://d2lang.com/tour/version-visualization/" rel="noopener noreferrer"&gt;composer à partir de diagrammes existants&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Il s'avère un peu moins bon pour modéliser à l'échelle d'équipes en collaboration, où l'on voudra des espaces de travail dans lesquels faire respecter des conventions communes, réemployer du code commun, pour obtenir une capacité à généraliser la représentation et cartographier précisément des systèmes de manière uniforme.&lt;/p&gt;

&lt;p&gt;Son gros point fort (mais payant 🥲) c'est son &lt;a href="https://terrastruct.com/tala/" rel="noopener noreferrer"&gt;moteur de disposition Tala&lt;/a&gt; : la structuration automatique des diagrammes est extrêmement puissante et démêle (vraiment) au maximum vos plats de spaghettis, tout en fusionnant les flèches et en alignant correctement sans déformations.  Tout ça est développé pour l'IDE de diagrammes D2 Studio de Terrastruct, et distribué principalement en SaaS (onPrem possible) mais sous license.&lt;br&gt;
Il permet aussi du contrôle sur la direction de chaque sous graphe, résolvant une des limites de Graphviz (et donc PlantUML). &lt;br&gt;
C'est canon, mais ça coûte un peu cher, ce qui est généralement prohibitif pour l'adhésion par une équipe.&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%2Fuk5dbv16rlc3dabsxcft.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%2Fuk5dbv16rlc3dabsxcft.png" title="Exemple de diagramme D2 produit avec Tala : le routage des flèches et le positionnement automatiques sont les meilleurs que j'aie vu" alt="Exemple de diagramme D2 produit avec Tala : le routage des flèches et le positionnement automatiques sont les meilleurs que j'aie vu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un exemple plus orienté code : &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%2Fpe5hhykvxm68ubc22ugf.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%2Fpe5hhykvxm68ubc22ugf.png" title="Exemple de code D2 avec son rendu" alt="Exemple de code D2 avec son rendu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ma conclusion&lt;/em&gt; : D2 est l'un des outils les plus puissants, de par ses sélecteurs très flexibles et son rendu extrêmement propre. Il pèche un peu lorsque l'on passe en mode "projet" et que l'on tente de normaliser un peu nos divers diagrammes dans une base de diagrammes commune. À surveiller de près, mais son modèle de financement n'est pas idéal pour l'adoption.&lt;/p&gt;
&lt;h3&gt;
  
  
  📐 La benjamine Structurizr
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Allows you to create a software architecture model as code, and then visualize it using the C4 model. […] It's a way to create diagrams that are accurate and always up-to-date." — &lt;em&gt;&lt;a href="https://structurizr.com/" rel="noopener noreferrer"&gt;Structurizr.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Documentation Officielle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://docs.structurizr.com" rel="noopener noreferrer"&gt;https://docs.structurizr.com&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Téléchargement de l'Outil&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;[Structurizr Lite \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fonctionnalité Clé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Séparation Modèle-Vue&lt;/strong&gt; : Définition d'un modèle unique (C4) permettant de générer automatiquement de multiples vues cohérentes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Démonstration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://structurizr.com/dsl" rel="noopener noreferrer"&gt;https://structurizr.com/dsl&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Celle-là, elle a de la suite dans les idées et elle monte tranquillement. &lt;br&gt;
L'outil reprend strictement les concepts de l'architecture C4 (c'est développé par Simon Brown lui-même). On impose une séparation modèle/vue (mais pas contrôlable, c'est l'outil qui a ses vues type C4 fixées) et on sort une belle appli pour présenter notre système. &lt;/p&gt;

&lt;p&gt;C'est joli, mais un peu restrictif. L'approche C4 est intéressante mais impose une sémantique essentialiste comme le fait ArchiMate, ce qui peut limiter les usages pratiques : il y a un gros travail intellectuel d'apprentissage et d'abstraction pour créer son modèle de données pour cet outil.&lt;br&gt;
Pour définir des architectures et des systèmes de manière claire et simple, c'est excellent, mais difficile à intégrer (le résultat est dans une app entière) même s'il existe un générateur de site statique un peu primitif. &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%2Fhxgyja42ml9qix2s7ilf.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%2Fhxgyja42ml9qix2s7ilf.png" title="Exemple de diagramme produit par Structurizr" alt="Exemple de diagramme produit par Structurizr"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ma conclusion:&lt;/em&gt; Gros potentiel, qui mérite encore un peu de maturation. Pas adapté aux pratiques d'architecture "maison", c'est un outil relativement rigoureux et qui propose de faire de l'&lt;em&gt;architecture as code&lt;/em&gt; en intégrant aussi les &lt;em&gt;Architecture Decision Records&lt;/em&gt; (ADR) par exemple.&lt;/p&gt;
&lt;h3&gt;
  
  
  👶 Le nourrisson prodige : Like C4
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Architecture-as-code tool. […] Look at your architecture as a single model and generate different views from it.  &lt;em&gt;&lt;a href="https://likec4.dev/docs/" rel="noopener noreferrer"&gt;LikeC4.dev Docs&lt;/a&gt;&lt;/em&gt; &lt;br&gt;
Inspired by &lt;a href="https://c4model.com/" rel="noopener noreferrer"&gt;C4 Model&lt;/a&gt; and &lt;a href="https://github.com/structurizr/dsl" rel="noopener noreferrer"&gt;Structurizr DSL&lt;/a&gt;, but provides some flexibility. You customize or define your own notation, element types, and any number of nested levels in architecture model. &lt;a href="https://github.com/likec4/likec4" rel="noopener noreferrer"&gt;GitHub - likec4/likec4&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Documentation Officielle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://likec4.dev/docs/" rel="noopener noreferrer"&gt;https://likec4.dev/docs/&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Téléchargement de l'Outil&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;• &lt;strong&gt;CLI :&lt;/strong&gt; &lt;code&gt;npm install -g likec4&lt;/code&gt;&lt;br&gt;• &lt;strong&gt;IDE :&lt;/strong&gt; Extension VS Code (LikeC4), et un tas d'autres IDE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fonctionnalité Clé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Prédicats de Vue Dynamiques&lt;/strong&gt; : Génération automatique de diagrammes interactifs à partir d'un modèle unique ("Single Source of Truth"), permettant de filtrer ou d'inclure des composants via des requêtes logiques.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Démonstration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://template.likec4.dev/view/index" rel="noopener noreferrer"&gt;Site de démo&lt;/a&gt; et example : &lt;a href="https://likec4.dev/showcases/bigbank/" rel="noopener noreferrer"&gt;https://likec4.dev/showcases/bigbank/&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ce qui distingue réellement le petit dernier, c'est son pragmatisme. Contrairement à Structurizr qui impose le carcan strict du C4, LikeC4 offre une typologie flexible. Mais sa vraie force réside dans la &lt;strong&gt;génération de prédicats&lt;/strong&gt;.&lt;br&gt;
Au lieu de dessiner manuellement chaque vue, vous dites à l'outil : &lt;em&gt;"Affiche-moi le service 'Paiement' et tout ce qui interagit directement avec lui à deux niveaux de profondeur"&lt;/em&gt;. L'outil calcule alors la vue optimale et les liens implicites.&lt;br&gt;
Des métadonnées peuvent aussi être insérées un peu partout pour documenter les éléments et permettent de ne rien perdre de votre architecture, même si vous ne souhaitez pas afficher ces données directement.&lt;/p&gt;

&lt;p&gt;De plus, LikeC4 génère des composants React natifs. Votre diagramme n'est pas une image statique (PNG), mais un composant web interactif que vous pouvez embarquer directement dans votre documentation technique (Storybook, Docusaurus, ou site propre). C'est le pont tant attendu entre le code vivant et l'architecture documentée.&lt;br&gt;
Et contrairement à une image statique, et tout comme Structurizr : LikeC4 permet de "cliquer pour entrer" dans une boîte (en langage C4, passer du Context au Container, puis au Component). C'est le "Google Maps" de l'architecture, impossible à faire avec PlantUML ou Draw.io qui produisent des export statiques.&lt;/p&gt;

&lt;p&gt;

&lt;iframe src="https://player.vimeo.com/video/1147296526" width="710" height="399"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dernier atout : MCP&lt;/strong&gt;&lt;br&gt;
Avec le &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, LikeC4 ne parle plus seulement aux humains, &lt;a href="https://likec4.dev/tooling/mcp/" rel="noopener noreferrer"&gt;mais aussi aux machines&lt;/a&gt;. Cette fonctionnalité transforme vos diagrammes en une base de connaissance que vos assistants IA (comme Claude ou votre IDE) peuvent &lt;strong&gt;interroger&lt;/strong&gt;. Votre compagnon IA peut interagir avec le modèle, vous accompagner et comprend désormais la structure réelle et les relations de votre système pour vous assister avec précision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attention toutefois aux limites de la jeunesse et du paradigme.&lt;/strong&gt; &lt;br&gt;
En tant que "nouvel arrivant" de la bande, LikeC4 souffre encore d'un écosystème plus modeste comparé aux standards de facto comme PlantUML. Si l'outil est open-source, parier sur un DSL (Domain Specific Language) jeune comporte toujours un risque de &lt;strong&gt;pérennité&lt;/strong&gt; : si le maintien de l'outil s'arrête, votre base de connaissance architecturale devient orpheline, là où un fichier Mermaid est rendu nativement par GitHub ou GitLab sans outil tiers.&lt;/p&gt;

&lt;p&gt;De plus, son approche purement "Code-First" érige une &lt;strong&gt;barrière à l'entrée&lt;/strong&gt; non négligeable. Contrairement à un outil hybride, il exclut de facto les profils moins techniques (Product Owners, Business Analysts) de la contribution directe. Ils ne pourront pas "déplacer une boîte" pour corriger une incompréhension sans passer par un IDE et un commit Git. Enfin, sa grande flexibilité est une arme à double tranchant : là où Structurizr impose la rigueur du C4, LikeC4 vous laisse libre. Sans une discipline d'équipe sur le typage et le nommage, votre modèle "vivant" risque de devenir un "plat de spaghettis syntaxique", reproduisant dans la documentation la dette technique de votre code.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ma conclusion :&lt;/em&gt;&lt;br&gt;
Avec ses premiers commits en mars 2023, c'est du tout récent. Mais avec un rythme effréné : 163 releases, chacune apportant des petites nouveautés réjouissantes.&lt;br&gt;
Cet outil m'a convaincu de le soutenir, et pour cause, j'y retrouve les principales qualités que j'attends d'un outil de diagram as code :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un modèle unique pour une architecture, des vues customisables à loisir avec des sélecteurs&lt;/li&gt;
&lt;li&gt;La capacité à partager une specification des éléments, et partager des éléments de modèles avec des include (encore un peu sommaire mais ça fonctionne)&lt;/li&gt;
&lt;li&gt;Un potentiel explicatif énorme avec ses &lt;a href="https://likec4.dev/dsl/views/dynamic/#variants" rel="noopener noreferrer"&gt;vues dynamique "séquence"&lt;/a&gt; que je vous invite à &lt;a href="https://playground.likec4.dev/w/dynamic/" rel="noopener noreferrer"&gt;tester interactivement&lt;/a&gt;:  c'est bluffant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;iframe src="https://player.vimeo.com/video/1147297540" width="710" height="399"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparons l'ensemble
&lt;/h2&gt;

&lt;p&gt;Allez, petite photo de famille pour bien différencier tout ça. Et c'est plus facile à garder en souvenir !&lt;/p&gt;

&lt;p&gt;L'évaluation devra être pondérée par votre contexte :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Si l'objectif est la &lt;em&gt;collaboration&lt;/em&gt; rapide (tableaux blancs) :&lt;/strong&gt; Les critères de prise en main et esthétique prennent le dessus. &lt;strong&gt;Mermaid&lt;/strong&gt; ou &lt;strong&gt;D2&lt;/strong&gt; (sans Tala) sont d'excellents choix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Si l'objectif est la &lt;em&gt;documentation&lt;/em&gt; et la &lt;em&gt;maintenance&lt;/em&gt; :&lt;/strong&gt; Les critères opérationnels (technique et écosystème) sont les plus importants. &lt;strong&gt;Structurizr&lt;/strong&gt; ou &lt;strong&gt;Like C4&lt;/strong&gt; sont plus adaptés.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Si l'objectif est la &lt;em&gt;standardisation&lt;/em&gt; à l'échelle de l'entreprise (Rigueur) :&lt;/strong&gt; Le critère de modèle et sémantique est essentiel. &lt;strong&gt;ArchiMate&lt;/strong&gt; sera privilégié.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Tableau comparatif
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Outil&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Prise en Main&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Rigueur &amp;amp; Modèle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Atout Majeur&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Usage Recommandé&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;✏️ Draw.io&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dessin&lt;/td&gt;
&lt;td&gt;🟢 Immédiate&lt;/td&gt;
&lt;td&gt;🔴 Nulle&lt;/td&gt;
&lt;td&gt;Gratuité &amp;amp; Stockage (BYOS)&lt;/td&gt;
&lt;td&gt;Schémas libres / Tableau blanc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🖱️ yEd&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dessin&lt;/td&gt;
&lt;td&gt;🟠 Moyenne&lt;/td&gt;
&lt;td&gt;🔴 Structure de graphe&lt;/td&gt;
&lt;td&gt;Algorithmes de tri auto&lt;/td&gt;
&lt;td&gt;Du schéma libre avec un peu d'automatisation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;👵 ArchiMate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modélisation&lt;/td&gt;
&lt;td&gt;🔴 Très difficile&lt;/td&gt;
&lt;td&gt;🟠 Très normative&lt;/td&gt;
&lt;td&gt;Analyse d'impact &amp;amp; Normes&lt;/td&gt;
&lt;td&gt;Architecture d'Entreprise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;📜 PlantUML&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;🟠 Difficile&lt;/td&gt;
&lt;td&gt;🟠 Scénarisée&lt;/td&gt;
&lt;td&gt;Écosystème immense&lt;/td&gt;
&lt;td&gt;Ingénierie &amp;amp; Génération auto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🧜‍♀️ Mermaid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;🟢 Facile&lt;/td&gt;
&lt;td&gt;🟠 Scénarisée&lt;/td&gt;
&lt;td&gt;Support natif (Git/Notion)&lt;/td&gt;
&lt;td&gt;Documentation de proximité&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🌊 D2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;🟢 Intuitive&lt;/td&gt;
&lt;td&gt;🟠 Libre&lt;/td&gt;
&lt;td&gt;Esthétique &amp;amp; Moteur Tala&lt;/td&gt;
&lt;td&gt;Présentations &amp;amp; Slides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;📐Structurizr&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modélisation&lt;/td&gt;
&lt;td&gt;🟠 Difficile&lt;/td&gt;
&lt;td&gt;🟠 Normative&lt;/td&gt;
&lt;td&gt;Séparation Vue/Modèle&lt;/td&gt;
&lt;td&gt;Cartographie pérenne (C4 pur)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;👶 LikeC4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;🟢 Intuitive&lt;/td&gt;
&lt;td&gt;🟢 Flexible&lt;/td&gt;
&lt;td&gt;Vues Dynamiques, prise en main progressive&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Architecture Agile &amp;amp; Vivante&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Ma recommandation
&lt;/h3&gt;

&lt;p&gt;Aucun outil n'est donc encore pleinement satisfaisant pour tous les usages. &lt;br&gt;
Je vous propose d'en utiliser plusieurs, de trouver ceux qui apportent un bon compromis d'approche en limitant la courbe  d'apprentissage à l'aide de LLM, et en ne nécessitant pas trop d'investissement en formation au préalable.&lt;br&gt;
Pour moi, c'est vers ceux-ci que je me tournerais :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documenter les architectures en &lt;strong&gt;LikeC4&lt;/strong&gt; car il permet de partager quelques pratiques standardisées pour collaborer à l'aide de ses fichiers de spécification du modèle et ses imports entre projets. Le résultat est navigable et interactif, pratique pour partager avec le reste des équipes techniques et projet. Le tout progressivement. Vous pouvez commencer petit puis normaliser au fur et à mesure.&lt;/li&gt;
&lt;li&gt;Les diagrammes plus opportunistes et brouillons : sur &lt;strong&gt;mermaid&lt;/strong&gt; avec un LLM (&lt;em&gt;Gemini ou Github Copilot font du bon boulot&lt;/em&gt;) et éventuellement sur &lt;strong&gt;D2&lt;/strong&gt; pour les cas un peu plus complexes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion : Le retour du pragmatisme
&lt;/h2&gt;

&lt;p&gt;Une petite matrice de conclusion (Merci Gemini pour cette dernière petite génération 😉 J'ai juste eu à ajuster les pondérations !)&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%2Fftwlr4nfmx9x2vxwfhv8.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%2Fftwlr4nfmx9x2vxwfhv8.png" title="Matrice des différents outils, sur des axes liberté de dessin / structuration et manuel / traitement automatique" alt="Matrice des différents outils, sur des axes liberté de dessin / structuration et manuel / traitement automatique"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finalement, ne cherchons-nous pas simplement à démocratiser les concepts de TOGAF en les rendant enfin digestes ?&lt;/p&gt;

&lt;p&gt;Le mouvement du &lt;em&gt;Diagram as Code&lt;/em&gt; en 2025 n'est &lt;em&gt;pas qu'une affaire d'outils ou de syntaxe&lt;/em&gt;. C'est une tentative de réconcilier deux mondes qui s'ignoraient : les développeurs (qui vivent dans le code) et les architectes (qui vivent dans les concepts).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'outil parfait n'existe pas, mais la &lt;strong&gt;méthode&lt;/strong&gt; parfaite commence par l'abandon du dessin manuel non-maintenable.&lt;/li&gt;
&lt;li&gt;Commencez petit : un fichier Mermaid dans votre repo git &lt;em&gt;décrivant effectivement le code&lt;/em&gt; est infiniment plus explicatif qu'un diagramme ArchiMate complet mais périmé en 2 semaines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enfin un pari pour l'avenir ? Les outils tout-en-un vont s'effacer au profit des outils de code, accompagnés de LLM. &lt;br&gt;
Demain, cliquer sur une classe dans votre code ou un composant Spring générera la vue d'architecture LikeC4 correspondante en temps réel. &lt;br&gt;
En attendant, à vos claviers !&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>code</category>
      <category>adventoftech2025</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Alors, ça prompte ?</title>
      <dc:creator>damienb-opt</dc:creator>
      <pubDate>Thu, 18 Dec 2025 08:00:00 +0000</pubDate>
      <link>https://dev.to/onepoint/alors-ca-prompte--3e4l</link>
      <guid>https://dev.to/onepoint/alors-ca-prompte--3e4l</guid>
      <description>&lt;p&gt;Qui n'a jamais croisé au hasard d'une déambulation dominicale ce fameux pêcheur, et lancé au passage un "alors, ça mord ?" Evidemment cela implique de quitter quelques minutes ses sombres écrans pour découvrir le monde de la très très grosse donnée, tellement riche que le pixel, même OLED, n'a plus de sens.&lt;/p&gt;

&lt;p&gt;Pour ceux qui côtoient de réels collègues, pas ces succédanées d'interactions en "télétravail", il n'est pas rare de croiser de nouveaux pêcheurs 2.0, poussés par les hérauts des compétences molles à suivre une psychothérapie avec un canard en caoutchouc digitalisé. "Alors, ça prompte ?" est-on tenté de lancer !&lt;/p&gt;

&lt;p&gt;Après tout, nous sommes sommés de devenir promptement des prompteurs. Et ce serait pêcher par orgueil de ne pas suivre cette voie disruptive. Qui n'a jamais rêvé d'être &lt;a href="https://www.youtube.com/watch?v=e5pBTM34izo" rel="noopener noreferrer"&gt;l'écran qui transforme le présentateur en simple lecteur&lt;/a&gt; ? Le prompteur ne serait qu'un &lt;a href="https://www.cnrtl.fr/definition/lutrin" rel="noopener noreferrer"&gt;lutrin&lt;/a&gt; ? Mais non, ça c'est la liseuse, qui n'a rien d'une lectrice !&lt;/p&gt;

&lt;p&gt;Trêve de digressions et rentrons dans le vif du sujet : que se cache-t-il derrière cet apparent anglicisme ?&lt;/p&gt;

&lt;p&gt;Les plus séniors d'entre nous se rappellent de leurs cours de BASIC, et du fameux INPUT. Dans &lt;em&gt;&lt;a href="https://archive.org/details/an-introduction-to-programming-the-amstrad-cpc-464-and-664-ra-jw-penfoldacme/page/30/mode/2up" rel="noopener noreferrer"&gt;An Introduction to Programming the Amstrad CPC464 and 664&lt;/a&gt;&lt;/em&gt;, il est écrit à ce sujet (je jaunis) :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The problem with the INPUT statement is that the simple question mark does not give any indication of what sort of input is required. To ease this problem, Locomotive BASIC has provision to include a line of text in the INPUT statement, which is printed on the screen along with the question mark, as an input prompt. When this is used, using a semi-colon between the prompt and the name of the variable will cause the question mark to be printed. Using a commas will cause it to be suppressed.&lt;/p&gt;

&lt;p&gt;User-Friendly is a term that is much in use. It means making a program easy and pleasant to use. Input prompts are a vital part of this. They should clearly (and politely) indicate what the user is intended to type in. NAME? appearing on the screen would certainly indicate what is required, but is not very polite. “Please enter name” is better if the question mark is suppressed, otherwise “What is your name, please?” would be the best prompt to use.&lt;/p&gt;

&lt;p&gt;One should avoid being obsequeous. If I came across an input prompt “Would you mind entering your name, please?” I personally could not resist entering NO!&lt;/p&gt;

&lt;p&gt;It is very difficult to phrase input prompts to deal with multiple input statements, except at the very basic “enter three numbers” level.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et bien, ça promptait sévère en 1985 il y a 40 ans !&lt;/p&gt;

&lt;p&gt;Intéressons-nous à la traduction officielle de ce texte dans &lt;a href="https://archive.org/details/l-amstrad-avec-plaisiracme/page/34/mode/2up" rel="noopener noreferrer"&gt;l'édition française du livre&lt;/a&gt; (je jaunis encore) :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;L’instruction INPUT pose un problème : le point d’interrogation inscrit sur l'écran ne donne pas d'indication quant à la donnée demandée. Pour résoudre ce problème, Locomotive Basic peut insérer une ligne de texte dans l'instruction INPUT; cette ligne est inscrite avec le point d'interrogation. Lorsque l’on utilise cette possibilité, si on laisse un point-virgule entre la phrase et le nom de la variable, alors, le point d'interrogation apparaît. Sinon il est supprimé.&lt;/p&gt;

&lt;p&gt;Les programmeurs amateurs adorent écrire des programmes distrayants et faciles d’accès ; l'emploi des lignes de texte définies ci-dessus occupent alors une place très importante. Elles doivent indiquer clairement ce que l’on demande à l’utilisateur. Si NOM ? apparaît sur l’écran, vous comprendrez très bien le sens de la question, mais il est plus poli d’écrire “indiquez votre nom s’il vous plait” ; dans ce cas, le point d'interrogation est supprimé, sinon “Quel est votre nom s’il vous plaît ?”, serait la meilleure possibilité.&lt;/p&gt;

&lt;p&gt;Il faut toutefois éviter d’être pompeux : à la question “Auriez-vous l’amabilité de donner votre nom, s’il vous plaît ?”, il est difficile de résister à l’envie de répondre NON!&lt;/p&gt;

&lt;p&gt;Il est très difficile de créer des phrases explicitant des instructions INPUT multiples, si ce n’est les très simples “Donnez trois nombres”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Comment ça rien n'a été surligné ? Les mots &lt;em&gt;input&lt;/em&gt; et &lt;em&gt;prompt&lt;/em&gt; n'ont pas été traduits : la tournure des phrases a été légèrement modifiée pour éviter cet écueil. Mais que voulait dire prompter en cette année 1985 ? On peut regarder dans le &lt;a href="https://archive.org/details/penguinenglishdi0000unse_u0r2/page/650/mode/2up" rel="noopener noreferrer"&gt;Penguin English dictionary contemporain&lt;/a&gt; :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;prompt&lt;/strong&gt;: &lt;em&gt;v&lt;/em&gt; &lt;strong&gt;1&lt;/strong&gt; to move to action; incite &lt;strong&gt;2&lt;/strong&gt; to assist (somebody acting or reciting) by saying the next words of something forgotten or imperfectly learnt&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;prompt&lt;/strong&gt;: &lt;em&gt;adj&lt;/em&gt; &lt;strong&gt;1a&lt;/strong&gt; ready and quick to act as occasion demands &lt;strong&gt;b&lt;/strong&gt; punctual &lt;strong&gt;2&lt;/strong&gt; performed readily or immediately&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;prompt&lt;/strong&gt;: &lt;em&gt;n&lt;/em&gt; the act or an instance of prompting; a reminder&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On voit donc plusieurs sens. Pour l'adjectif, c'est le même que l'adjectif français &lt;em&gt;prompt&lt;/em&gt;, qui vient du latin &lt;em&gt;promptus&lt;/em&gt;. L'autre sens, celui de déclencher l'action, d'inciter, nous vient aussi du latin, d'un mot qui signifiait "mettre en avant", et que nous avons en français avec &lt;em&gt;promouvoir&lt;/em&gt;. Quand au sens du souffleur, il est dérivé du fait que le &lt;em&gt;prompter&lt;/em&gt; (en anglais) est toujours prêt (au sens de l'adjectif) à assister l'acteur.&lt;/p&gt;

&lt;p&gt;Alors, comment fallait-il traduire ce &lt;em&gt;prompt&lt;/em&gt; en 1985 ? Attend-on que l'utilisateur souffle une réponse à la machine, ou est-on en train de lui demander quelque chose ? On peut répondre promptement : &lt;em&gt;input prompt&lt;/em&gt;, on demande à l'utilisateur sa saisie. Les traductions officielles ont depuis consacré le mot &lt;em&gt;invite&lt;/em&gt; ou &lt;em&gt;invitation&lt;/em&gt; pour cette demande. Quelque part, c'est un peu gentillet, dans le sens où dans ces IHM, si l'utilisateur ne saisit rien, l'ordinateur ne fait rien ; c'est plus un ordre, "rentre #LADATA dans moi (&lt;em&gt;input&lt;/em&gt;) ou alors... je dors".&lt;/p&gt;

&lt;p&gt;40 ans plus tard, on en est exactement au même point. Un programme attend bêtement qu'un humain vienne saisir de #LADATA. Et propose, en boucle, de recommencer. Après ces décennies par contre, on a oublié que c'était la même bête mécanique qui était en jeu, et on s'est senti obligé de la nommer avec un faux néologisme bien digital. Alors, ça prompte ?&lt;/p&gt;

</description>
      <category>ux</category>
      <category>ai</category>
      <category>beginners</category>
      <category>adventoftech2025</category>
    </item>
  </channel>
</rss>
