<?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: Mathieu Ledru</title>
    <description>The latest articles on DEV Community by Mathieu Ledru (@matyo91).</description>
    <link>https://dev.to/matyo91</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F182978%2F61c41098-10ce-4833-acf3-b00cc42f852c.jpeg</url>
      <title>DEV Community: Mathieu Ledru</title>
      <link>https://dev.to/matyo91</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matyo91"/>
    <language>en</language>
    <item>
      <title>🤖 Veille Darkwood - 2026-06-20</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sat, 20 Jun 2026 05:01:24 +0000</pubDate>
      <link>https://dev.to/matyo91/veille-darkwood-2026-06-20-2ilb</link>
      <guid>https://dev.to/matyo91/veille-darkwood-2026-06-20-2ilb</guid>
      <description>&lt;h2&gt;
  
  
  Points saillants
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;VMAF v1: Good Is Not Good Enough

&lt;ul&gt;
&lt;li&gt;By Christos G. Bampis, Zhi Li, Kyle Swanson, Nil Fons Miret and Pavan MadhusudanaraoWill this encode look good to Netflix members? Does switching to a new codec improve quality at the same bitrate and by how much? What...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Thinking Fast &amp;amp; Slow for a Personalized Notification System

&lt;ul&gt;
&lt;li&gt;by Matthew Wood, Ishan Gupta, Kevin Mercurio, Devon Bryant, and Claire&amp;nbsp;DormanIn his seminal book “Thinking, Fast and Slow,” Daniel Kahneman describes two systems that drive human cognition: System 1, which operates auto...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A Human-Augmenting Agentic Workflow for Causal Inference

&lt;ul&gt;
&lt;li&gt;By Winston Chou, Adrien Alexandre, Lars Olds, Yi Zhang, Garrett Hagemann, and Nathan&amp;nbsp;KallusIntroductionImagine asking a data agent to analyze the causal relationship between two variables, such as the effect of watching...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data Projects: Managing Data Assets at Netflix Scale

&lt;ul&gt;
&lt;li&gt;By Amer Hesson, Marcelo Mayworm, James Mulcahy, and Brittany&amp;nbsp;TruongThe Problem: Managing Assets at Netflix&amp;nbsp;ScaleNetflix’s Data Platform is vast. We have millions of tables in our data warehouse and tens of thousands of...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Evolution of Cassandra Data Movement at Netflix

&lt;ul&gt;
&lt;li&gt;By Guil Pires, Jennifer Prince, Jose Camacho, Ken Kurzweil, Phanindra ChunduruBackgroundIn a previous post, we introduced Data Bridge, a unified management plane for batch Data Movement at Netflix. Historically, several...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/netflix-techblog/vmaf-v1-good-is-not-good-enough-60d7e4244ea8?source=rss-c3aeaf49d8a4------2" rel="noopener noreferrer"&gt;VMAF v1: Good Is Not Good Enough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/netflix-techblog/thinking-fast-slow-for-a-personalized-notification-system-4d89b26525cd?source=rss-c3aeaf49d8a4------2" rel="noopener noreferrer"&gt;Thinking Fast &amp;amp; Slow for a Personalized Notification System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/netflix-techblog/a-human-augmenting-agentic-workflow-for-causal-inference-4623f0a9c5af?source=rss-c3aeaf49d8a4------2" rel="noopener noreferrer"&gt;A Human-Augmenting Agentic Workflow for Causal Inference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/netflix-techblog/data-projects-managing-data-assets-at-netflix-scale-7ca25888591e?source=rss-c3aeaf49d8a4------2" rel="noopener noreferrer"&gt;Data Projects: Managing Data Assets at Netflix Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/netflix-techblog/the-evolution-of-cassandra-data-movement-at-netflix-6e13329c80a1?source=rss-c3aeaf49d8a4------2" rel="noopener noreferrer"&gt;The Evolution of Cassandra Data Movement at Netflix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Partenaires
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://groover.co/band/referral/2-MATHIEU-9034D/" rel="noopener noreferrer"&gt;Groover&lt;/a&gt;&lt;/strong&gt; — Groover a besoin de plus d'artistes comme toi. Offre -10 %, gagne 10 Grooviz – de quoi contacter 5 médias et pros gratuitement !&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://cursor.com/referral?code=GBXOAVWMKV50" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;&lt;/strong&gt; — Earn up to $250 every month by sharing Cursor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://refer.tella.com/mathieu-ledru" rel="noopener noreferrer"&gt;Tella&lt;/a&gt;&lt;/strong&gt; — Share Tella with friends &amp;amp; earn — votre ami obtient 20 % de réduction pendant 3 mois, vous recevez 20 $ par utilisateur parrainé.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.bonzai.pro/skillflix?bp=t_lg9Kxp" rel="noopener noreferrer"&gt;Bonzai Skillflix&lt;/a&gt;&lt;/strong&gt; — Formation et communauté tech — commission d'affiliation 40 %.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.bonzai.pro/bonzaipremium?bp=t_lg9Kxp" rel="noopener noreferrer"&gt;Bonzai Premium&lt;/a&gt;&lt;/strong&gt; — Abonnement mensuel (49 €), annuel (299 €), à vie (499 €).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚨 &lt;b&gt;Premium content.&lt;/b&gt;&lt;br&gt;⬆️ Upgrade to access full analysis.&lt;br&gt;👉 Subscribe here : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🤖 Veille Darkwood - 2026-06-19</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Fri, 19 Jun 2026 19:53:48 +0000</pubDate>
      <link>https://dev.to/matyo91/veille-darkwood-2026-06-19-38mo</link>
      <guid>https://dev.to/matyo91/veille-darkwood-2026-06-19-38mo</guid>
      <description>&lt;h2&gt;
  
  
  Points saillants
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Symfony AI Spotlight: One API to Rule Them All

&lt;ul&gt;
&lt;li&gt;Symfony AI is approaching its 1.0 release — so let’s take a tour. In this first post of this series, we introduce the Platform component — the foundation layer that connects your PHP application to the world of AI. The...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Symfony UX 3.2.0 and 2.36.1 released

&lt;ul&gt;
&lt;li&gt;Symfony UX 3.2.0 and 2.36.1 are now available. Both releases fix two security issues, one in UX Icons and one in UX Toolkit, so every application using these packages should upgrade as soon as possible. On top of the se...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CVE-2026-55877: XSS in symfony/ux-icons via unsanitized SVG content in local files and Iconify on-demand responses

&lt;ul&gt;
&lt;li&gt;Affected versions Symfony UX Icons versions &amp;gt;=2.17.0&amp;lt;2.36.1, &amp;gt;=3.0.0&amp;lt;3.2.0 are affected by this security issue. The issue has been fixed in Symfony UX Icons 2.36.1, 3.2.0. Description The ux_icon() Twig function is mark...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CVE-2026-55878: Path Traversal in symfony/ux-toolkit Allows Arbitrary File Write and Read via Crafted Recipe Manifest

&lt;ul&gt;
&lt;li&gt;Affected versions Symfony UX Toolkit versions &amp;gt;=2.32.0&amp;lt;2.36.1, &amp;gt;=3.0.0&amp;lt;3.2.0 are affected by this security issue. The issue has been fixed in Symfony UX Toolkit 2.36.1, 3.2.0. Description The ux:install console command...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🚨 &lt;b&gt;Premium content.&lt;/b&gt;&lt;br&gt;⬆️ Upgrade to access full analysis.&lt;br&gt;👉 Subscribe here : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🌊 Le mirage du Vibe-coding - démo, produit ou illusion (il n'y a pas de quatrième option)</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Thu, 18 Jun 2026 16:00:21 +0000</pubDate>
      <link>https://dev.to/matyo91/le-mirage-du-codage-dambiance-demo-produit-ou-illusion-il-ny-a-pas-de-quatrieme-option-14b9</link>
      <guid>https://dev.to/matyo91/le-mirage-du-codage-dambiance-demo-produit-ou-illusion-il-ny-a-pas-de-quatrieme-option-14b9</guid>
      <description>&lt;h2&gt;
  
  
  Introduction : l'effondrement de la barrière
&lt;/h2&gt;

&lt;p&gt;Le coût de production d'une ligne de code est devenu quasi nul. Nous sommes entrés dans une ère où les barrières à l'entrée dans le secteur du développement logiciel se sont effondrées. Il ne s'agit pas d'une évolution progressive, mais d'une défaillance structurelle des mécanismes traditionnels de sélection des développeurs. Historiquement, la complexité de la syntaxe et le travail manuel que représentait l'implémentation faisaient office de filtre. Aujourd'hui, ce filtre a disparu.&lt;/p&gt;

&lt;p&gt;Le développement logiciel n'est pas devenu simple. La simulation, en revanche, est devenue facile. &lt;/p&gt;

&lt;p&gt;Le paysage actuel est marqué par une dangereuse asymétrie&amp;nbsp;: l’IA réduit considérablement le coût de la génération de code, mais elle ne réduit pas – et ne peut pas réduire – le coût de la compréhension des systèmes logiciels complexes au même rythme. Nous assistons à l’industrialisation de la «&amp;nbsp;démo&amp;nbsp;», un phénomène où les artefacts visuels des logiciels sont produits à une vitesse qui dépasse largement l’intégrité architecturale nécessaire à leur maintien. &lt;/p&gt;

&lt;p&gt;Cela crée une illusion de «&amp;nbsp;code virtuel&amp;nbsp;». Pour un œil non averti, une URL fonctionnelle est indiscernable d'un système en production. Pour le marché, un ensemble de fonctionnalités déployé rapidement apparaît comme un avantage concurrentiel. En réalité, nous accumulons des risques systémiques à un rythme exponentiel. Si personne ne comprend votre environnement d'exécution, vous n'avez pas de produit. Vous avez une illusion qui se compile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Archétype n° 1 — Le codeur d'ambiance&amp;nbsp;: l'architecte de la surface
&lt;/h2&gt;

&lt;p&gt;Le &lt;strong&gt;Vibe Coder&lt;/strong&gt; est le principal bénéficiaire de la disparition des barrières à l'entrée. Cet archétype est souvent non technique ou semi-technique&amp;nbsp;; il utilise des outils de «&amp;nbsp;programmation intuitive&amp;nbsp;» comme Replit ou Lovable pour créer des logiciels par la seule force de son intention. Pour le Vibe Coder, le logiciel est un exercice esthétique. Si l'interface répond et que l'URL est résolue, le développement est considéré comme «&amp;nbsp;terminé&amp;nbsp;».&lt;/p&gt;

&lt;h3&gt;
  
  
  L'esthétique de la mise en œuvre
&lt;/h3&gt;

&lt;p&gt;Vibe Coder privilégie l'esthétique et la rapidité. L'entreprise peut « déployer » une application d'apparence fonctionnelle en quarante-huit heures et la partager en interne pour susciter immédiatement l'enthousiasme des parties prenantes. Cependant, cette rapidité est obtenue au détriment des piliers fondamentaux du génie logiciel&amp;nbsp;: les serveurs, les bases de données persistantes et les protocoles de sécurité. &lt;/p&gt;

&lt;p&gt;Le Vibe Coder fonctionne exclusivement dans le cadre d'un fonctionnement optimal. Son code est un assemblage de fragments qui répondent aux exigences immédiates d'une démo, mais ne possèdent aucune logique interne pour gérer l'entropie d'un environnement réel. Dans l'univers du Vibe Coder, une URL fonctionnelle est l'objectif final, sans tenir compte du fait qu'une URL n'est qu'un pointeur vers un noyau potentiellement vide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le mirage de l'achèvement
&lt;/h3&gt;

&lt;p&gt;Le danger des développeurs à l'esthétique tape-à-l'œil ne réside pas dans leur manque de compétences, mais dans leur confusion entre apparence et ingénierie. Ils créent des produits «&amp;nbsp;chouchous&amp;nbsp;» – des outils que la communauté adore car ils résolvent un problème superficiel – sans comprendre que «&amp;nbsp;la rentabilité vient après l'engouement&amp;nbsp;», et seulement si le produit fonctionne réellement. Lorsqu'une démonstration d'un développeur à l'esthétique tape-à-l'œil est prise pour un produit, cela crée un précédent dangereux pour l'organisation, laissant croire que le «&amp;nbsp;vrai&amp;nbsp;» travail d'ingénierie peut être négligé.&lt;/p&gt;

&lt;h2&gt;
  
  
  Archétype n° 2 — Le gestionnaire d'invites : l'orchestrateur du code anonyme
&lt;/h2&gt;

&lt;p&gt;Le &lt;strong&gt;Gestionnaire de sprints&lt;/strong&gt; est souvent un développeur chevronné qui est passé du rôle de programmeur à celui d'orchestrateur d'agents. Il utilise des LLM pour gérer les audits de sécurité, les frameworks de test et la génération de code standard à une vitesse impressionnante. Il livre rapidement. Il respecte les délais. C'est le héros du sprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  L'érosion de l'intention architecturale
&lt;/h3&gt;

&lt;p&gt;L'échec du gestionnaire de processus est subtil&amp;nbsp;: la perte de la maîtrise de l'architecture. En avançant à une vitesse fulgurante, il sacrifie le temps de réflexion nécessaire pour définir précisément ce qui est construit. L'architecture n'est pas un assemblage de fragments fonctionnels&amp;nbsp;; c'est une stratégie cohérente de gestion de l'état, des flux et des erreurs. &lt;/p&gt;

&lt;p&gt;Lorsque le code est généré par invite plutôt que conçu, l'&lt;strong&gt;architecture&lt;/strong&gt; sous-jacente commence à se dégrader. Le gestionnaire d'invites devient un simple passager dans son propre code, incapable de prendre en compte les interactions subtiles entre les modules générés. Il gère un système dont les invariants internes — les règles à ne jamais enfreindre — lui sont même inconnus. &lt;/p&gt;

&lt;h3&gt;
  
  
  L'illusion de la productivité
&lt;/h3&gt;

&lt;p&gt;Le responsable de la sécurité confond progrès visible et progrès technique. Il croit, à tort, que la présence d'«&amp;nbsp;agents de sécurité&amp;nbsp;» garantit la sécurité de son système. Les audits de sécurité automatisés constituent un minimum, non une garantie. Sans une compréhension approfondie de l'&lt;strong&gt;environnement d'exécution&lt;/strong&gt;, ce responsable bâtit une organisation superficielle&amp;nbsp;: il gaspille ressources et énergie pour s'imposer, tandis que les fondations techniques se dégradent. Il livre un code qu'il ne peut plus expliquer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Archétype n° 3 — L'ingénieur système&amp;nbsp;: le gardien de l'exécution
&lt;/h2&gt;

&lt;p&gt;L'&lt;strong&gt;ingénieur système&lt;/strong&gt; est le seul archétype à reconnaître l'illusion pour ce qu'elle est. Il utilise l'IA — et peut-être même plus efficacement que les autres — mais il conserve la maîtrise absolue du cœur du système. Pour l'ingénieur système, le code est la partie la moins importante du logiciel. Les éléments les plus importants sont les &lt;strong&gt;invariants&lt;/strong&gt;, les &lt;strong&gt;modes de défaillance&lt;/strong&gt; et l'&lt;strong&gt;observabilité&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Appropriation de la complexité
&lt;/h3&gt;

&lt;p&gt;L'ingénieur système sait que la difficulté de son métier n'a jamais été de faire apparaître quelque chose à l'écran. Le plus difficile est de garantir le bon fonctionnement du système lorsque les données doivent être stockées correctement, lorsque des cas particuliers surviennent et lorsque la maintenance du système s'impose six mois plus tard. &lt;/p&gt;

&lt;p&gt;Ils considèrent l'IA comme un stagiaire très performant, et non comme un architecte principal. Chaque ligne de code générée par l'IA est soumise à une validation rigoureuse par rapport aux &lt;strong&gt;invariants&lt;/strong&gt; du système. Ils se concentrent sur le &lt;strong&gt;comportement à l'exécution&lt;/strong&gt;&amp;nbsp;: comment le code se comporte réellement sous charge, dans un environnement distribué ou lors d'une panne réseau partielle. &lt;/p&gt;

&lt;h3&gt;
  
  
  Le manifeste de l'ingénierie
&lt;/h3&gt;

&lt;p&gt;Pour l'ingénieur système, une invite n'est pas de l'architecture. L'ingénierie est la discipline qui consiste à transformer une illusion générée par l'IA en quelque chose de réel. Ses priorités sont&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Invariants :&lt;/strong&gt; Définition des vérités constantes de l'état du système&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observabilité&amp;nbsp;:&lt;/strong&gt; Concevoir des systèmes qui expliquent leur propre état interne aux opérateurs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modes de défaillance&amp;nbsp;:&lt;/strong&gt; Anticiper les défaillances du système et concevoir une dégradation progressive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Évolutivité&amp;nbsp;:&lt;/strong&gt; Comprendre les limites théoriques des structures de données et des modèles de concurrence choisis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'ingénieur système est celui qui empêche le produit de sombrer dans le « marasme économique ». Il comprend que si l'IA peut générer le « quoi », l'humain doit toujours définir et justifier le « comment » et le « pourquoi ».&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi les managers se font avoir : la psychologie de la démo
&lt;/h2&gt;

&lt;p&gt;Le moment le plus dangereux du cycle de vie d'un produit est la première démonstration réussie. Les parties prenantes non techniques voient une interface utilisateur fonctionnelle sur une URL déployée et demandent immédiatement : « Pourquoi ne pouvons-nous pas simplement commercialiser cela ? ».&lt;/p&gt;

&lt;h3&gt;
  
  
  Le piège de la visibilité
&lt;/h3&gt;

&lt;p&gt;Les gestionnaires et les investisseurs en capital-risque sont naturellement enclins à réagir aux progrès visibles. À leurs yeux, si l'interface utilisateur est achevée à 90 %, le projet l'est aussi à 90 %. Ils ne voient ni le système dorsal inexistant, ni la base de données non chiffrée, ni les problèmes de concurrence dans le modèle de gestion des accès concurrents. &lt;/p&gt;

&lt;p&gt;Le mirage du codage Vibe exploite ce biais cognitif. Il présente le « visible » comme le « précieux ». Cette pression pousse les équipes d'ingénierie à « aller plus vite », ce qui ne fait qu'accélérer l'accumulation d'une complexité non maîtrisée. &lt;/p&gt;

&lt;h3&gt;
  
  
  Le chouchou contre le flambeur
&lt;/h3&gt;

&lt;p&gt;Sur le marché actuel, les dirigeants recherchent le succès immédiat, le produit chouchou de la communauté. Ils utilisent des démos pour lever des fonds, tels des flambeurs, dilapidant leurs liquidités dans la distribution. Mais sans la rigueur d'un ingénieur système, ces entreprises disparaissent en moins de 14 mois. La démo leur a permis d'obtenir le rendez-vous&amp;nbsp;; l'absence de produit a causé leur perte.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le coût caché de la complexité : la dette invisible
&lt;/h2&gt;

&lt;p&gt;L'IA amplifie la complexité. En réduisant les obstacles à la production de code, elle encourage la création de systèmes plus vastes et plus complexes que ce qu'un être humain, voire une équipe, peut appréhender pleinement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Érosion architecturale et dette technique
&lt;/h3&gt;

&lt;p&gt;Lorsque nous utilisons des agents pour «&amp;nbsp;avancer à toute vitesse&amp;nbsp;», nous négligeons souvent la phase de conception. Nous passons sous silence les exigences et les documents de conception dont l'humain et l'IA ont besoin pour bien comprendre l'objectif. Cela conduit à une &lt;strong&gt;érosion de l'architecture&lt;/strong&gt;, où la structure du système devient un assemblage disparate d'optimisations locales incohérentes à l'échelle globale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le mur de la concurrence et de la scalabilité
&lt;/h3&gt;

&lt;p&gt;L'IA est notoirement mauvaise pour raisonner sur la &lt;strong&gt;concurrence&lt;/strong&gt; et les &lt;strong&gt;modes de défaillance&lt;/strong&gt; dans les systèmes distribués. Elle peut générer une boucle d'événements, mais elle est incapable de prédire son comportement face à un problème de forte concurrence. Elle peut écrire une requête SQL, mais elle ne comprend pas les implications de cette requête en termes de &lt;strong&gt;scalabilité&lt;/strong&gt; sur un ensemble de données de plusieurs téraoctets. &lt;/p&gt;

&lt;p&gt;À mesure que le code source s'étoffe, la charge cognitive liée à la compréhension du système augmente de façon exponentielle. Le goulot d'étranglement se déplace&amp;nbsp;: il ne s'agit plus du nombre de lignes de code que l'on peut écrire, mais de la quantité d'informations du système existant que l'on peut assimiler simultanément.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'avenir de l'ingénierie : la compréhension comme valeur fondamentale
&lt;/h2&gt;

&lt;p&gt;L'avenir de la valeur du génie logiciel se déplace de la syntaxe vers l'orchestration système de haut niveau et les &lt;strong&gt;modèles d'exécution&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le passage à l'orchestration
&lt;/h3&gt;

&lt;p&gt;Dans un monde où le code est devenu une ressource courante, la valeur de l'ingénieur réside dans sa capacité à gérer les systèmes distribués, les boucles d'événements et les systèmes asynchrones. Le nouveau défi n'est plus d'écrire la fonction, mais de s'assurer que ses effets de bord sont observables et réversibles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le mandat d'observabilité
&lt;/h3&gt;

&lt;p&gt;Nous nous dirigeons vers un avenir où nous devrons gérer des logiciels que nous n'avons pas écrits. L'&lt;strong&gt;observabilité&lt;/strong&gt; devient ainsi la discipline d'ingénierie la plus cruciale. Si la lecture du code ne nous permet pas de le comprendre, nous devons l'observer s'exécuter. Cela exige une connaissance approfondie de la télémétrie, du traçage et de l'agrégation des journaux.&lt;/p&gt;

&lt;p&gt;Les ingénieurs qui réussiront seront ceux qui sauront définir les &lt;strong&gt;invariants&lt;/strong&gt; et utiliser l'IA pour concevoir les mécanismes qui les garantissent. Ils seront les architectes de systèmes robustes, non pas parce que chaque ligne de code est parfaite, mais parce que l'architecture du système est conçue pour résister à l'imperfection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Références et bibliographie
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sources primaires
&lt;/h3&gt;

&lt;p&gt;Karpathy, A. (2025, 2 février). &lt;a href="https://x.com/karpathy/status/1886192184808149380" rel="noopener noreferrer"&gt;Article sur X présentant le «&amp;nbsp;codage par vibrations&amp;nbsp;»&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT Technology Review. (16 avril 2025). &lt;a href="https://www.technologyreview.com/2025/04/16/1115135/what-is-vibe-coding-exactly/" rel="noopener noreferrer"&gt;Qu'est-ce que le codage vibratoire, exactement&amp;nbsp;?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bencoding. (2026, 20 avril). &lt;a href="https://bencoding.com/2026/04/20/demo-grade-vs-ship-grade-the-most-expensive-confusion-in-ai/" rel="noopener noreferrer"&gt;Démo vs IA opérationnelle&amp;nbsp;: la confusion la plus coûteuse en IA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uphack. (s.d.). &lt;a href="https://uphack.io/blog/post/the-illusion-of-building/" rel="noopener noreferrer"&gt;L'illusion du bâtiment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He, Y., et al. (2026). &lt;a href="https://arxiv.org/abs/2603.28592" rel="noopener noreferrer"&gt;La dette derrière le boom de l'IA : une étude empirique à grande échelle du code généré par l'IA en conditions réelles&lt;/a&gt;. &lt;em&gt;arXiv&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Winters, T., Manshreck, T. et Wright, H. (2020). &lt;em&gt;Le génie logiciel chez Google&amp;nbsp;: leçons tirées de la programmation au fil du temps&lt;/em&gt; (Chap.&amp;nbsp;10, Documents de conception). O'Reilly. &lt;a href="https://abseil.io/resources/swe-book/html/ch10.html" rel="noopener noreferrer"&gt;https://abseil.io/resources/swe-book/html/ch10.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Forsgren, N., Humble, J., et Kim, G. (2018). &lt;a href="https://itrevolution.com/product/accelerate/" rel="noopener noreferrer"&gt;&lt;em&gt;Accelerate&amp;nbsp;: la science du logiciel agile et du DevOps&lt;/em&gt;&lt;/a&gt;. IT Revolution Press.&lt;/p&gt;

&lt;p&gt;Stack Overflow. (31 juillet 2025). &lt;a href="https://stackoverflow.blog/2025/07/31/do-ai-coding-tools-help-with-imposter-syndrome-or-make-it-worse/" rel="noopener noreferrer"&gt;Les outils de programmation IA aident-ils à lutter contre le syndrome de l'imposteur ou l'aggravent-ils&amp;nbsp;?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CB Insights. (2025). &lt;a href="https://www.cbinsights.com/research/report/startup-failure-reasons-top/" rel="noopener noreferrer"&gt;Pourquoi les startups échouent&amp;nbsp;: principales raisons&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consultation Myriade. (2022). &lt;a href="https://www.myriadconsulting.fr/ressources/blog/frugalite-entreprises-innovantes/" rel="noopener noreferrer"&gt;Entreprises : comment résister aux crises grâce à la frugalité ?&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Littérature scientifique et technique
&lt;/h3&gt;

&lt;p&gt;Brooks, FP (1975). &lt;a href="https://archive.org/details/MythicalManMonth" rel="noopener noreferrer"&gt;&lt;em&gt;Le mythe du mois-homme&lt;/em&gt;&lt;/a&gt;. Addison-Wesley.&lt;/p&gt;

&lt;p&gt;Dijkstra, EW (1989). &lt;a href="https://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1036.html" rel="noopener noreferrer"&gt;Sur la cruauté de l'enseignement réel de l'informatique&lt;/a&gt;. &lt;em&gt;Communications of the ACM&lt;/em&gt;, 32(12). &lt;a href="https://doi.org/10.1145/76380.76381" rel="noopener noreferrer"&gt;https://doi.org/10.1145/76380.76381&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vogels, W. (2008). &lt;a href="https://queue.acm.org/detail.cfm?id=1466448" rel="noopener noreferrer"&gt;Eventually consistent&lt;/a&gt;. &lt;em&gt;ACM Queue&lt;/em&gt;, 6(6). &lt;a href="https://doi.org/10.1145/1466443.1466448" rel="noopener noreferrer"&gt;https://doi.org/10.1145/1466443.1466448&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DORA. (2023). &lt;a href="https://dora.dev/research/2023/dora-report/" rel="noopener noreferrer"&gt;&lt;em&gt;Rapport sur l'état du DevOps&lt;/em&gt;&lt;/a&gt;. Google Cloud.&lt;/p&gt;

&lt;p&gt;Amdahl, GM (1967). &lt;a href="https://www3.cs.stonybrook.edu/~rezaul/Spring-2012/CSE613/reading/Amdahl-1967.pdf" rel="noopener noreferrer"&gt;Validité de l'approche monoprocesseur pour l'obtention de capacités de calcul à grande échelle&lt;/a&gt;. &lt;em&gt;Actes de la conférence AFIPS&lt;/em&gt;. &lt;a href="https://doi.org/10.1145/1465482.1465560" rel="noopener noreferrer"&gt;https://doi.org/10.1145/1465482.1465560&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Le mirage du codage visuel est un chant de sirène pour l'ère moderne. Il promet les avantages de l'ingénierie sans l'effort de compréhension. Mais le logiciel n'est pas un média visuel&amp;nbsp;; c'est un média structurel. &lt;/p&gt;

&lt;p&gt;Il nous faut revenir aux fondamentaux&amp;nbsp;: &lt;strong&gt;exécution&lt;/strong&gt;, &lt;strong&gt;observabilité&lt;/strong&gt; et &lt;strong&gt;invariants&lt;/strong&gt;. Si nous continuons à confondre la démo avec le produit, nous ne bâtissons pas un avenir numérique&amp;nbsp;; nous construisons un cimetière numérique.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;« Si vos agents de codage disparaissaient demain, quelle part de votre code source comprendriez-vous encore vraiment ? »&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Diagnostic brutal
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sécurisé :&lt;/strong&gt; Vous pouvez expliquer chaque transition d'état de votre système et recréer le modèle mental de l'architecture à partir de zéro lors d'une session de tableau blanc.
&lt;strong&gt;Dangereux :&lt;/strong&gt; Vous vous fiez à l'IA pour expliquer le comportement de « votre » code lorsqu'un bug apparaît. Vous ne disposez d'aucun document de conception ni d'invariants enregistrés.
&lt;strong&gt;Dépendance critique&amp;nbsp;:&lt;/strong&gt; Vous ne pouvez ni déployer, ni déboguer, ni faire évoluer votre système sans qu’une fenêtre LLM soit ouverte. Vous êtes comme un passager dans un véhicule sans volant.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>🤖 Veille Darkwood - 2026-06-18</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Thu, 18 Jun 2026 08:24:54 +0000</pubDate>
      <link>https://dev.to/matyo91/veille-darkwood-2026-06-18-4ap8</link>
      <guid>https://dev.to/matyo91/veille-darkwood-2026-06-18-4ap8</guid>
      <description>&lt;h2&gt;
  
  
  Points saillants
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Utilitaire : Mailway redirige vos liens mailto dans la bonne app

&lt;ul&gt;
&lt;li&gt;Vous avez un Mac, mais vous jonglez entre plusieurs apps ou services de mail ? Sur macOS, cliquer sur une adresse mail ou sur un lien de contact, les fameux liens mailto, ouvre toujours l’app de mail définie par défaut....&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;La pénurie de RAM va bien peser sur les prix d'Apple

&lt;ul&gt;
&lt;li&gt;Apple a réussi ce qui ressemble à un miracle il y a peu. Alors que tout le monde augmentait le prix des appareils électroniques à cause de la flambée du cours de la RAM, la société a réussi à en augmenter la dotation à...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Apple : faut-il acheter maintenant avant que les prix augmentent&amp;nbsp;?

&lt;ul&gt;
&lt;li&gt;Il y a quelques semaines, Carl Pei s’était fait remarquer par une déclaration pour le moins abrupte : «&amp;nbsp;Si vous songez à remplacer votre téléphone, le meilleur moment, c'était hier&amp;nbsp;». Sous ses airs de provocation, le pa...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nouvelle Google Home&amp;nbsp;: une enceinte connectée taillée pour Gemini

&lt;ul&gt;
&lt;li&gt;Après plusieurs années à vivre dans l'ombre de la marque Nest, Google Home fait son retour. Nouvelle enceinte, nouveau design, nouvel assistant : Google profite de l'occasion pour confier les clés de la maison connectée...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🚨 &lt;b&gt;Premium content.&lt;/b&gt;&lt;br&gt;⬆️ Upgrade to access full analysis.&lt;br&gt;👉 Subscribe here : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🤖 Veille Darkwood - 2026-06-17</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Wed, 17 Jun 2026 19:26:45 +0000</pubDate>
      <link>https://dev.to/matyo91/veille-darkwood-2026-06-17-2a9k</link>
      <guid>https://dev.to/matyo91/veille-darkwood-2026-06-17-2a9k</guid>
      <description>&lt;h2&gt;
  
  
  Points saillants
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;HE.SHE.THEY. Embarks on East Asian Pride Month Tour

&lt;ul&gt;
&lt;li&gt;The HE.SHE.THEY Asia Tour is the LGBTQ+ outfit’s biggest to date, and it kicked off with the largest-ever Pride event in Nepal. HE.SHE.THEY has cemented itself as one of the world’s most prominent LGBTQ+ nightlife brand...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Party Crashers? No Worry! These New Games Handle Up To 6+ Players!

&lt;ul&gt;
&lt;li&gt;by Steph Hodge How about some games that will play with a higher player count? Here are a whole bunch of releases coming soon that will handle up to 6 or more players![imageid=9389228 medium rep]▪️ Synapses Games announ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Designer Diary: boop. Shuffle

&lt;ul&gt;
&lt;li&gt;by Scott Brady Three years later and I am no better at keeping ongoing notes about my design journey than I was when I penned the Designer Diary for boop. I usually become so focused on my projects that I’ve never found...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Life on a canal boat, 18 months in!

&lt;ul&gt;
&lt;li&gt;Last year the electric van I'd been living in for three years was destroyed in a crash on the motorway. Thankfully I'd just bought a canal boat, or I would be homeless.Living in a tiny electric van for three yearsIn Oct...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>🤖 Veille Darkwood - 2026-06-16</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Tue, 16 Jun 2026 10:32:46 +0000</pubDate>
      <link>https://dev.to/matyo91/veille-darkwood-2026-06-16-4e2p</link>
      <guid>https://dev.to/matyo91/veille-darkwood-2026-06-16-4e2p</guid>
      <description>&lt;h2&gt;
  
  
  Points saillants
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;New in Symfony 8.1: Tui Component

&lt;ul&gt;
&lt;li&gt;Contributed by Fabien Potencier in #63778 A new generation of terminal tools (AI coding assistants, log viewers, interactive dashboards, file managers, etc.) share something the Console component was never meant to do:...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fragments: June 16

&lt;ul&gt;
&lt;li&gt;“Prag Dave” Thomas (co-author of the outstanding “Pragmatic Programmer”) has loved programming since he was young. Programming was how I could express myself. I wasn’t an artist. When I sing, dogs howl. When I draw, fri...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Symfony: The Fast Track, now in nine languages

&lt;ul&gt;
&lt;li&gt;Earlier this week, I announced the Symfony 8.1 edition of The Fast Track. If you made it to the end of that post, you read that the book was available in five languages. That line is already out of date, and I could not...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>😶‍🌫️ This person does not exist - PHP synchrone à l'orchestration asynchrone avec Flow</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sat, 13 Jun 2026 14:25:19 +0000</pubDate>
      <link>https://dev.to/matyo91/this-person-does-not-exist-php-synchrone-a-lorchestration-asynchrone-avec-flow-2bk5</link>
      <guid>https://dev.to/matyo91/this-person-does-not-exist-php-synchrone-a-lorchestration-asynchrone-avec-flow-2bk5</guid>
      <description>&lt;p&gt;Vous devez télécharger dix images depuis une API distante. Entre chaque requête, vous attendez une seconde pour respecter un rate limit. Chaque image suit le même chemin : fetch, hash, sauvegarde, reporting.&lt;/p&gt;

&lt;p&gt;Le code ressemble à une boucle &lt;code&gt;for&lt;/code&gt; familière. Il fonctionne. Mais pendant qu'une image télécharge, les neuf autres attendent. Pendant qu'une fibre dort sur un &lt;code&gt;sleep()&lt;/code&gt;, tout le processus est figé. Les unités de travail sont indépendantes — seule l'orchestration les traite comme si elles ne l'étaient pas.&lt;/p&gt;

&lt;p&gt;C'est le problème concret que nous avons isolé dans le projet &lt;a href="https://github.com/matyo91/flow-thispersondoesnotexist" rel="noopener noreferrer"&gt;&lt;code&gt;flow-thispersondoesnotexist&lt;/code&gt;&lt;/a&gt; : une commande Symfony minimale qui récupère plusieurs images depuis ThisPersonDoesNotExist et les sauvegarde sur disque.&lt;/p&gt;

&lt;p&gt;L'objectif n'était pas de télécharger des images plus rapidement.&lt;/p&gt;

&lt;p&gt;L'objectif était de comprendre comment faire évoluer une exécution séquentielle vers une orchestration asynchrone avec &lt;a href="https://github.com/darkwood-com/darkwood" rel="noopener noreferrer"&gt;&lt;code&gt;darkwood/flow&lt;/code&gt;&lt;/a&gt; — sans changer la logique métier, en changeant le modèle d'exécution.&lt;/p&gt;

&lt;p&gt;La transition se résume en deux commits :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fae47e8&lt;/code&gt; — commande &lt;code&gt;app:fetch-thispersondoesnotexist&lt;/code&gt;, boucle synchrone&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;c61c929&lt;/code&gt; — même commande, orchestrée par Flow et &lt;code&gt;FiberDriver&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un seul fichier change entre les deux : &lt;code&gt;src/Command/FetchThisPersonDoesNotExistCommand.php&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le point de départ : une boucle synchrone
&lt;/h2&gt;

&lt;p&gt;La première version (&lt;code&gt;fae47e8&lt;/code&gt;) utilise une boucle &lt;code&gt;for&lt;/code&gt; classique. Fetch, hash, sauvegarde et reporting sont exécutés inline ; un &lt;code&gt;sleep(1)&lt;/code&gt; bloque le processus entre chaque téléchargement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$savedFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Download %d/%d'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchImage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$checksum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;computeChecksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;generateFilename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$checksum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$outputPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;saveFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$outputPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$checksum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;\strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;\RuntimeException&lt;/span&gt; &lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FAILURE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$savedFiles&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$outputPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;note&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Waiting %d second(s) before next download...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DOWNLOAD_DELAY_SECONDS&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="nb"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DOWNLOAD_DELAY_SECONDS&lt;/span&gt;&lt;span class="p"&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;Le fonctionnement est linéaire : télécharger, traiter, attendre, passer à l'image suivante. Chaque étape bloque entièrement le processus — y compris le &lt;code&gt;sleep()&lt;/code&gt;, qui immobilise le programme même quand aucun travail utile n'est en cours.&lt;/p&gt;

&lt;p&gt;Cette approche est facile à comprendre, mais elle gaspille les temps d'attente I/O : tant qu'une image n'est pas terminée, aucune autre ne peut avancer.&lt;/p&gt;

&lt;p&gt;À noter : la version synchrone conservait aussi une méthode alternative &lt;code&gt;fetchImageViaFileGetContents()&lt;/code&gt;. Elle sera supprimée dans la version Flow — les streams explicites (&lt;code&gt;fopen&lt;/code&gt;) sont préférés pour la suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observer le workflow caché
&lt;/h2&gt;

&lt;p&gt;Derrière la boucle se cache un pipeline répété pour chaque image :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fetch Image → Save Image → Report Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image #1 : Fetch → Save → Report
Image #2 : Fetch → Save → Report
Image #3 : Fetch → Save → Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque image est une unité de travail autonome. La question devient alors : pourquoi attendre la fin complète de l'image #1 avant de démarrer l'image #2 ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Avant / Après : le changement architectural
&lt;/h2&gt;

&lt;p&gt;Avant l'introduction de Flow, l'exécution est strictement séquentielle :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image 1 → Fetch → Save → Sleep
Image 2 → Fetch → Save → Sleep
Image 3 → Fetch → Save → Sleep
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Après, les unités de travail sont planifiées indépendamment et traversent un pipeline commun :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image 1 ─┐
Image 2 ─┼─&amp;gt; Flow Pipeline (Fetch → Save + Report) ─&amp;gt; résultats
Image 3 ─┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le &lt;code&gt;for&lt;/code&gt; ne pilote plus l'exécution étape par étape. Il enqueue des &lt;strong&gt;Ip&lt;/strong&gt; (unités de travail). Flow orchestre leur passage dans le pipeline ; &lt;code&gt;await()&lt;/code&gt; synchronise à la fin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduire Flow
&lt;/h2&gt;

&lt;p&gt;La dépendance &lt;code&gt;darkwood/flow&lt;/code&gt; est ajoutée au projet avant la commande (&lt;code&gt;e71899a&lt;/code&gt;). La version &lt;code&gt;c61c929&lt;/code&gt; l'utilise enfin pour orchestrer le travail.&lt;/p&gt;

&lt;p&gt;Les imports introduits :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Flow\Driver\FiberDriver&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Flow\ExceptionInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Flow\FlowFactory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Flow\Ip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque image devient une unité de travail indépendante.&lt;/p&gt;

&lt;p&gt;Dans Flow, cette unité est représentée par un &lt;strong&gt;Ip&lt;/strong&gt; (Instruction Pointer) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$flow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le pipeline est décrit sous forme d'étapes avec &lt;code&gt;FlowFactory&lt;/code&gt; et un générateur :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$driver&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;FiberDriver&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$savedFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="nv"&gt;$flow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FlowFactory&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$savedFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$driver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$driver&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ExceptionInterface&lt;/span&gt; &lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\RuntimeException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$savedFiles&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$outputPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;saveAndReport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$savedFiles&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$outputPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$outputPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$driver&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$flow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$flow&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;await&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;\RuntimeException&lt;/span&gt; &lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$exception&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FAILURE&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;Conceptuellement, cela revient à écrire :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ip($index)
 ↓
Fetch Image        ← étape async (fiber + delay)
 ↓
Save + Report      ← étape suivante, reçoit le string image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque image traverse exactement le même pipeline.&lt;/p&gt;

&lt;p&gt;Les responsabilités sont extraites en méthodes dédiées :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fetchImage(int $index, FiberDriver $driver): string&lt;/code&gt; — téléchargement, avec suspension cooperative&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;saveAndReport(string $image, ?string $fileOverride): string&lt;/code&gt; — hash, sauvegarde, reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La gestion d'erreur quitte la boucle : un &lt;code&gt;errorJob&lt;/code&gt; sur l'étape fetch relance une &lt;code&gt;RuntimeException&lt;/code&gt;, capturée une seule fois autour de &lt;code&gt;await()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remplacer l'attente bloquante
&lt;/h2&gt;

&lt;p&gt;Le changement le plus important concerne la gestion du temps d'attente.&lt;/p&gt;

&lt;p&gt;Dans la version synchrone, le délai est &lt;strong&gt;global et bloquant&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;int&lt;/span&gt; &lt;span class="no"&gt;DOWNLOAD_DELAY_SECONDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// dans la boucle, entre chaque image :&lt;/span&gt;
&lt;span class="nb"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DOWNLOAD_DELAY_SECONDS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans la version Flow, le délai est &lt;strong&gt;par fibre et cooperative&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;int&lt;/span&gt; &lt;span class="no"&gt;DELAY_MIN_SECONDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;int&lt;/span&gt; &lt;span class="no"&gt;DELAY_MAX_SECONDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// dans fetchImage(), avant le téléchargement :&lt;/span&gt;
&lt;span class="nv"&gt;$delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;random_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DELAY_MIN_SECONDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DELAY_MAX_SECONDS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;note&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'#%d: suspending fiber for %ds before download...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$delay&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nv"&gt;$driver&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$delay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;$driver-&amp;gt;delay()&lt;/code&gt; suspend uniquement la fibre en cours. Les autres fibres continuent :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image #1 attend (delay 2s)
Image #2 télécharge
Image #3 sauvegarde
Image #4 démarre son delay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avec &lt;code&gt;--count=5&lt;/code&gt;, le temps total se rapproche du &lt;code&gt;max(delays + fetch)&lt;/code&gt; plutôt que de leur somme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les Fibers comme fondation d'exécution
&lt;/h2&gt;

&lt;p&gt;Sous le capot, &lt;code&gt;FiberDriver&lt;/code&gt; s'appuie sur les Fibers de PHP 8.1 : une Fiber peut être suspendue puis reprise plus tard, ce qui permet d'exécuter plusieurs traitements indépendants avec une écriture proche du PHP classique.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$driver&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;FiberDriver&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque image dispose de sa propre Fiber. Lorsqu'une Fiber attend (&lt;code&gt;$driver-&amp;gt;delay()&lt;/code&gt;), les autres continuent leur progression. Le logging reflète ce comportement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#2: suspending fiber for 2s before download...
#2: downloading (other fibers may run while this one waits)...
#2: fetch complete in 1.34s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flow ne remplace pas les Fibers : il les utilise via un driver. Le choix du driver détermine &lt;em&gt;comment&lt;/em&gt; le pipeline s'exécute ; la description du pipeline reste identique.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le point de synchronisation
&lt;/h2&gt;

&lt;p&gt;Le &lt;code&gt;for&lt;/code&gt; enqueue les unités de travail :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$flow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&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;&lt;code&gt;await()&lt;/code&gt; devient le point de synchronisation unique :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$flow&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;await&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Planifier Ip(1)
Planifier Ip(2)
Planifier Ip(3)
…
await() — barrière finale
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La responsabilité de l'orchestration est déplacée vers Flow. Le &lt;code&gt;for&lt;/code&gt; ne fait plus le travail : il &lt;strong&gt;enqueue&lt;/strong&gt; des unités. Flow les exécute en parallèle ; &lt;code&gt;await()&lt;/code&gt; attend que tout le pipeline soit terminé.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi conserver les Streams PHP ?
&lt;/h2&gt;

&lt;p&gt;Le projet utilise volontairement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FETCH_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;stream_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$stream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;plutôt que &lt;code&gt;file_get_contents()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;L'objectif n'est pas de réinventer un client HTTP.&lt;/p&gt;

&lt;p&gt;L'objectif est de rester proche des primitives PHP — le commentaire du code le dit explicitement :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Preferred for Flow experimentation: the resource handle is the primitive that can later be wired to stream_select(), non-blocking mode, or fibers.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ces primitives pourront ensuite évoluer vers :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;stream_set_blocking&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;stream_select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou être intégrées dans des drivers plus avancés (Amp, React, Swoole — tous supportés par &lt;code&gt;darkwood/flow&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Les streams constituent une base naturelle pour expérimenter les modèles asynchrones en PHP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limiter la concurrence (étape suivante)
&lt;/h2&gt;

&lt;p&gt;Dans ce POC, toutes les images partent en parallèle (jusqu'à &lt;code&gt;--count&lt;/code&gt; fibres actives).&lt;/p&gt;

&lt;p&gt;Pour un usage production, Flow propose des stratégies comme &lt;code&gt;MaxIpStrategy&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Flow\IpStrategy\MaxIpStrategy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$job1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$errorJob1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MaxIpStrategy&lt;/span&gt;&lt;span class="p"&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;L'exemple officiel du package (&lt;code&gt;examples/flow.php&lt;/code&gt;) utilise &lt;code&gt;MaxIpStrategy(2)&lt;/code&gt; pour plafonner le nombre de jobs simultanés sur chaque étape.&lt;/p&gt;

&lt;p&gt;Ce n'est pas encore branché dans &lt;code&gt;flow-thispersondoesnotexist&lt;/code&gt;, mais c'est le levier naturel pour du rate limiting sans retomber dans du &lt;code&gt;sleep()&lt;/code&gt; séquentiel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un modèle applicable bien au-delà des images
&lt;/h2&gt;

&lt;p&gt;L'exemple ThisPersonDoesNotExist est volontairement simple. Le même schéma se retrouve dans les pipelines Darkwood :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scraping YouTube     → Lister → Télécharger / transcrire → Sauvegarder
Traitement vidéo     → Générer assets → Encoder → Persister
Agent IA             → Lire → Transformer → Publier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans tous les cas : des unités de travail indépendantes qui traversent une succession d'étapes. Flow ne cherche pas à exécuter une tâche — il orchestre des flux de tâches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Récapitulatif de la migration
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;fae47e8&lt;/code&gt; (synchrone)&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;c61c929&lt;/code&gt; (Flow)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Boucle&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;for&lt;/code&gt; avec fetch/save inline&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;for&lt;/code&gt; enqueue + &lt;code&gt;$flow-&amp;gt;await()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Délai&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sleep(1)&lt;/code&gt; global&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;$driver-&amp;gt;delay()&lt;/code&gt; par fibre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Erreurs&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;try/catch&lt;/code&gt; dans la boucle&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;errorJob&lt;/code&gt; + &lt;code&gt;catch&lt;/code&gt; sur &lt;code&gt;await()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fetch&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fetchImage()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fetchImage($index, $driver)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Save&lt;/td&gt;
&lt;td&gt;inline&lt;/td&gt;
&lt;td&gt;&lt;code&gt;saveAndReport()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrence&lt;/td&gt;
&lt;td&gt;aucune&lt;/td&gt;
&lt;td&gt;fibres parallèles via &lt;code&gt;FiberDriver&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Ce que Flow n'est pas
&lt;/h2&gt;

&lt;p&gt;Avant de conclure, une clarification utile pour éviter les confusions courantes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow n'est pas une event loop.&lt;/strong&gt; Il ne gère pas directement un cycle &lt;code&gt;select&lt;/code&gt; / &lt;code&gt;poll&lt;/code&gt; sur des descripteurs I/O.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow n'est pas une implémentation de Fibers.&lt;/strong&gt; Les Fibers sont une primitive PHP 8.1. Flow les orchestre via des drivers, mais ne les remplace pas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow n'est pas un runtime.&lt;/strong&gt; Il ne modifie pas le modèle d'exécution de PHP. Il s'exécute dans un processus PHP standard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow n'est pas un substitut à Amp, ReactPHP ou Swoole.&lt;/strong&gt; Ces bibliothèques fournissent des runtimes et des boucles d'événements. Flow peut s'appuyer dessus — &lt;code&gt;AmpDriver&lt;/code&gt;, &lt;code&gt;ReactDriver&lt;/code&gt;, &lt;code&gt;SwooleDriver&lt;/code&gt; — sans entrer en concurrence avec elles.&lt;/p&gt;

&lt;p&gt;Ce que Flow apporte, c'est un modèle d'&lt;strong&gt;orchestration&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;décrire des &lt;strong&gt;unités de travail&lt;/strong&gt; (Ip)&lt;/li&gt;
&lt;li&gt;composer des &lt;strong&gt;pipelines&lt;/strong&gt; d'étapes (&lt;code&gt;yield&lt;/code&gt; dans &lt;code&gt;FlowFactory&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;déléguer l'&lt;strong&gt;exécution&lt;/strong&gt; à un driver choisi (&lt;code&gt;FiberDriver&lt;/code&gt;, &lt;code&gt;AmpDriver&lt;/code&gt;, &lt;code&gt;ReactDriver&lt;/code&gt;, &lt;code&gt;SwooleDriver&lt;/code&gt;, …)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le modèle d'orchestration est séparé du modèle d'exécution. On peut décrire un pipeline une fois, puis changer de driver selon le contexte — CLI avec Fibers, worker Swoole, service React — sans réécrire la logique métier.&lt;/p&gt;

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

&lt;p&gt;Le passage du synchrone vers l'asynchrone n'est pas avant tout une question de performance.&lt;/p&gt;

&lt;p&gt;C'est un changement de modèle mental :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Avant : exécuter l'opération A, puis B, puis C — et attendre entre chaque étape.

Après : décrire un pipeline, enqueue des unités de travail,
        laisser l'orchestrateur planifier l'exécution.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La boucle &lt;code&gt;for&lt;/code&gt; devient un producteur d'Ip. Les étapes fetch et save deviennent des jobs chaînés. &lt;code&gt;await()&lt;/code&gt; remplace la succession de &lt;code&gt;sleep()&lt;/code&gt;. La logique métier (télécharger, hasher, sauvegarder) reste la même ; ce qui change, c'est &lt;em&gt;qui&lt;/em&gt; décide quand chaque étape s'exécute.&lt;/p&gt;

&lt;p&gt;C'est exactement le modèle dont Darkwood a besoin pour ses pipelines à venir : scraping YouTube et extraction de transcripts, traitement média dans MediaBundle, agents IA multi-étapes, orchestration de workflows longue durée. Des unités indépendantes, des étapes composables, un point de synchronisation explicite.&lt;/p&gt;

&lt;p&gt;Le projet ThisPersonDoesNotExist en est la démonstration minimale : un seul fichier, un pipeline à deux étapes, un driver — suffisant pour illustrer la transition sans en masquer la portée.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pour aller plus loin
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dépôt du POC : &lt;a href="https://github.com/matyo91/flow-thispersondoesnotexist" rel="noopener noreferrer"&gt;&lt;code&gt;flow-thispersondoesnotexist&lt;/code&gt;&lt;/a&gt; — commits &lt;code&gt;fae47e8&lt;/code&gt; → &lt;code&gt;c61c929&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Package : &lt;code&gt;darkwood/flow&lt;/code&gt; — exemple &lt;code&gt;examples/flow.php&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;L'article de Frédéric Bouchery retrace l'histoire de la programmation asynchrone en PHP, depuis les streams introduits dans PHP 4.3 jusqu'aux Fibers modernes de PHP 8.1 : &lt;a href="https://f2r.github.io/fr/asynchrone.html" rel="noopener noreferrer"&gt;https://f2r.github.io/fr/asynchrone.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>🚀 Darkwood v8.1.0 disponible</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 07 Jun 2026 13:18:33 +0000</pubDate>
      <link>https://dev.to/matyo91/darkwood-v810-disponible-2kah</link>
      <guid>https://dev.to/matyo91/darkwood-v810-disponible-2kah</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/darkwood-com/darkwood/releases/edit/v8.1.0" rel="noopener noreferrer"&gt;Darkwood v8.1.0&lt;/a&gt; vient d'être publié.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⬆️ Mise à jour vers Symfony v8.1.0&lt;/li&gt;
&lt;li&gt;✨ Ajouter le recteur dans les outils&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🏷️ Journal des modifications complet &lt;a href="https://github.com/darkwood-com/darkwood/compare/v8.0.13...v8.1.0" rel="noopener noreferrer"&gt;v8.0.13...v8.1.0&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Darkwood-com v1.0.6 disponible</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 07 Jun 2026 11:33:58 +0000</pubDate>
      <link>https://dev.to/matyo91/darkwood-com-v106-disponible-5e46</link>
      <guid>https://dev.to/matyo91/darkwood-com-v106-disponible-5e46</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.6" rel="noopener noreferrer"&gt;Darkwood-com v1.0.6&lt;/a&gt; vient d'être publié.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⬆️ Mise à jour vers Symfony 8.1&lt;/li&gt;
&lt;li&gt;✨ Ajouter Navi&lt;/li&gt;
&lt;li&gt;🔐 Ajouter du contenu premium&lt;/li&gt;
&lt;li&gt;🚀 Ajouter une section de publication de blog et des émojis&lt;/li&gt;
&lt;li&gt;✨ Réaction à l'ajout d'un article API&lt;/li&gt;
&lt;li&gt;🔥 Nettoyage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Journal des modifications complet &lt;a href="https://github.com/darkwood-com/darkwood-com/compare/v1.0.5...v1.0.6" rel="noopener noreferrer"&gt;v1.0.5...v1.0.6&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💫 Le Grand BBQ Polytech Paris-Saclay 2026 : trente ans de transformations technologiques</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 07 Jun 2026 07:17:02 +0000</pubDate>
      <link>https://dev.to/matyo91/le-grand-bbq-polytech-paris-saclay-2026-trente-ans-de-transformations-technologiques-29je</link>
      <guid>https://dev.to/matyo91/le-grand-bbq-polytech-paris-saclay-2026-trente-ans-de-transformations-technologiques-29je</guid>
      <description>&lt;p&gt;Le samedi 6 juin 2026, les anciens élèves de &lt;a href="https://www.polytech.universite-paris-saclay.fr" rel="noopener noreferrer"&gt;Polytech Paris-Saclay&lt;/a&gt; se sont réunis à la Maison de l’Ingénieur à Orsay pour le traditionnel Grand BBQ organisé par l’association des Alumni.&lt;/p&gt;

&lt;p&gt;Chaque année, cet événement permet aux différentes promotions de se retrouver autour d’un moment simple : discuter, partager des souvenirs et revoir celles et ceux avec qui une partie de leur parcours d’ingénieur s’est construite.&lt;/p&gt;

&lt;p&gt;Polytech Paris-Saclay est l’école d’ingénieur interne à l’Université Paris-Saclay et fait partie du réseau Polytech depuis 2010, considéré comme le premier réseau français de formation d’ingénieurs.&lt;/p&gt;

&lt;p&gt;Installée au cœur du plateau de Saclay, l’école forme aujourd’hui près de 1000 élèves ingénieurs autour de quatre grandes spécialités :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;électronique et informatique pour l’embarqué&lt;/li&gt;
&lt;li&gt;informatique et ingénierie mathématique&lt;/li&gt;
&lt;li&gt;matériaux, mécanique et énergie&lt;/li&gt;
&lt;li&gt;photonique et systèmes optroniques&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Une école avant l’école
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-06-02-bbq-polytech-paris-saclay/ifips.png" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-06-02-bbq-polytech-paris-saclay/ifips.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’établissement s’appuie également sur une vingtaine de laboratoires de recherche et un important réseau d’entreprises partenaires, dans un environnement où se croisent recherche scientifique, ingénierie et innovation technologique.&lt;/p&gt;

&lt;p&gt;L’édition 2026 du Grand BBQ réunissait notamment plusieurs promotions anniversaires, avec une attention particulière portée aux diplômés de 1986, 1996, 2006 et 2016.&lt;/p&gt;

&lt;p&gt;Dès l’arrivée sur le campus, quelque chose frappait immédiatement : le contraste entre les générations présentes.&lt;/p&gt;

&lt;p&gt;Avant de devenir Polytech Paris-Saclay, l’établissement portait le nom de NFI-FIIFO, la Formation d’Ingénieur en Informatique de la faculté d’Orsay.&lt;/p&gt;

&lt;p&gt;À cette époque, l’école ne ressemblait pas encore à une grande école d’ingénieurs telle qu’on l’imagine aujourd’hui.&lt;/p&gt;

&lt;p&gt;Pas de véritable bâtiment.&lt;br&gt;
Pas de campus structuré.&lt;br&gt;
Pas de salle informatique moderne.&lt;br&gt;
Parfois même pas assez de budget pour le ménage.&lt;/p&gt;

&lt;p&gt;Les étudiants suivaient leurs cours dans les locaux de l’IUT d’Orsay, dans un environnement encore très expérimental. La Maison de l’Ingénieur n’existait pas encore réellement. Sa construction fut retardée après la découverte d’une villa gallo-romaine sur le site prévu pour les fondations. Certains anciens évoquaient une époque où l’école ne disposait pas encore réellement de locaux dédiés, où les cours étaient parfois répartis entre plusieurs bâtiments et où l’informatique fonctionnait avec des moyens bien plus limités qu’aujourd’hui.&lt;/p&gt;

&lt;p&gt;Et pourtant, malgré ces contraintes, quelque chose était déjà là.&lt;/p&gt;

&lt;p&gt;Une culture.&lt;/p&gt;

&lt;p&gt;D’autres échangeaient naturellement autour des sujets actuels :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;intelligence artificielle&lt;/li&gt;
&lt;li&gt;cloud computing&lt;/li&gt;
&lt;li&gt;cybersécurité&lt;/li&gt;
&lt;li&gt;simulation&lt;/li&gt;
&lt;li&gt;calcul distribué&lt;/li&gt;
&lt;li&gt;ou encore évolution des métiers du numérique&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au fil des discussions, une idée revenait souvent :&lt;br&gt;
les technologies changent rapidement, mais certaines fondations restent étonnamment stables.&lt;/p&gt;

&lt;p&gt;Curiosité technique.&lt;br&gt;
Capacité d’adaptation.&lt;br&gt;
Culture scientifique.&lt;br&gt;
Et volonté de construire des systèmes capables d’évoluer avec leur époque.&lt;/p&gt;

&lt;p&gt;L’organisation de la journée était assurée par le bureau des Alumni de Polytech Paris-Saclay, avec notamment une session de prises de parole organisée en début d’après-midi pour les promotions anniversaires.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entre mémoire étudiante et évolution technologique
&lt;/h2&gt;

&lt;p&gt;La partie la plus marquante de l’après-midi fut probablement la série de discours réalisés par les anciennes promotions.&lt;/p&gt;

&lt;p&gt;Au-delà de l’aspect nostalgique, ces prises de parole retraçaient surtout plusieurs décennies d’évolution de l’enseignement informatique et du paysage technologique français.&lt;/p&gt;

&lt;p&gt;Les anciens élèves évoquaient une époque où l’école portait encore un autre nom, avant les regroupements successifs ayant conduit à la création de l’IFIPS puis à l’intégration au réseau Polytech.&lt;/p&gt;

&lt;p&gt;À travers les souvenirs racontés, on découvre surtout une autre manière d’apprendre l’informatique.&lt;/p&gt;

&lt;p&gt;Les promotions des années 80 et 90 décrivaient un environnement beaucoup plus artisanal :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;peu de moyens matériels&lt;/li&gt;
&lt;li&gt;peu de machines&lt;/li&gt;
&lt;li&gt;peu de locaux dédiés&lt;/li&gt;
&lt;li&gt;des ressources limitées&lt;/li&gt;
&lt;li&gt;des temps de calcul longs&lt;/li&gt;
&lt;li&gt;et une forte culture débrouillarde&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Certains rappelaient que la Maison de l’Ingénieur n’existait même pas encore au début de leur cursus.&lt;br&gt;
Les cours étaient alors répartis entre plusieurs bâtiments du campus d’Orsay, dans une période où les infrastructures informatiques universitaires restaient encore en construction.&lt;/p&gt;

&lt;p&gt;Un autre sujet revenait régulièrement dans les discussions :&lt;br&gt;
les débuts d’Internet.&lt;/p&gt;

&lt;p&gt;Les anciens parlaient des premières architectures TCP/IP, des calculs réalisés sous MATLAB, des travaux autour des réseaux neuronaux ou encore des contraintes techniques qui imposaient une véritable rigueur dans l’utilisation des ressources machines.&lt;/p&gt;

&lt;p&gt;À une époque où quelques secondes d’animation pouvaient nécessiter des heures de calcul, l’informatique se pratiquait dans un rapport beaucoup plus direct aux limites matérielles.&lt;/p&gt;

&lt;p&gt;Les discours mettaient également en avant un élément souvent oublié aujourd’hui :&lt;br&gt;
la dimension humaine des écoles d’ingénieurs.&lt;/p&gt;

&lt;p&gt;Plusieurs anciens racontaient la création d’associations étudiantes, l’organisation de galas, de séjours au ski ou d’événements destinés à donner une identité collective à des promotions qui cherchaient encore leur place dans le paysage des grandes écoles françaises.&lt;/p&gt;

&lt;p&gt;Cette volonté de “faire exister l’école” revenait souvent dans les témoignages.&lt;/p&gt;

&lt;p&gt;Et avec le recul, ces initiatives racontent aussi l’évolution du rôle de l’ingénieur lui-même.&lt;/p&gt;

&lt;p&gt;L’ingénieur moderne n’est plus uniquement un technicien spécialisé.&lt;br&gt;
Il évolue désormais dans des environnements où la communication, l’adaptation et la collaboration deviennent aussi importantes que les compétences purement techniques.&lt;/p&gt;

&lt;p&gt;Les parcours évoqués pendant les discours reflétaient parfaitement cette diversité :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;défense&lt;/li&gt;
&lt;li&gt;aérospatial&lt;/li&gt;
&lt;li&gt;banque&lt;/li&gt;
&lt;li&gt;industrie&lt;/li&gt;
&lt;li&gt;recherche&lt;/li&gt;
&lt;li&gt;administration&lt;/li&gt;
&lt;li&gt;international&lt;/li&gt;
&lt;li&gt;entrepreneuriat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;À travers ces trajectoires très différentes, un point commun restait visible :&lt;br&gt;
la capacité de l’informatique à évoluer constamment, tout en conservant certaines bases fondamentales.&lt;/p&gt;

&lt;p&gt;Les technologies changent rapidement.&lt;br&gt;
Les outils se transforment.&lt;br&gt;
Les usages explosent.&lt;/p&gt;

&lt;p&gt;Mais les fondations scientifiques évoquées dans les discours — mathématiques, réseaux, algorithmique, calcul, modélisation — restent encore aujourd’hui au cœur des systèmes modernes.&lt;/p&gt;

&lt;p&gt;Photo des promotions anniversaire&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-06-02-bbq-polytech-paris-saclay/resized_photo1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-06-02-bbq-polytech-paris-saclay/resized_photo1.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Une évolution qui dépasse les générations
&lt;/h2&gt;

&lt;p&gt;Ce qui ressort finalement de cette journée, ce n’est pas uniquement la nostalgie des anciennes promotions.&lt;/p&gt;

&lt;p&gt;C’est surtout la manière dont plusieurs générations d’ingénieurs ont traversé différentes transformations majeures de l’informatique :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;les débuts des réseaux&lt;/li&gt;
&lt;li&gt;l’arrivée d’Internet&lt;/li&gt;
&lt;li&gt;la démocratisation du web&lt;/li&gt;
&lt;li&gt;l’explosion du mobile&lt;/li&gt;
&lt;li&gt;le cloud computing&lt;/li&gt;
&lt;li&gt;l’industrialisation des infrastructures&lt;/li&gt;
&lt;li&gt;et désormais l’accélération autour de l’intelligence artificielle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En écoutant les échanges entre anciens élèves, on réalise rapidement que chaque génération a eu l’impression de vivre une période de rupture technologique.&lt;/p&gt;

&lt;p&gt;Pour certains, cette rupture fut Internet.&lt;br&gt;
Pour d’autres, le web.&lt;br&gt;
Aujourd’hui, elle prend la forme de l’IA générative et des nouveaux usages qui l’accompagnent.&lt;/p&gt;

&lt;p&gt;Et pourtant, malgré ces évolutions successives, les discours rappelaient une réalité assez simple :&lt;br&gt;
les fondamentaux restent souvent les mêmes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comprendre un système&lt;/li&gt;
&lt;li&gt;Analyser un problème&lt;/li&gt;
&lt;li&gt;Modéliser&lt;/li&gt;
&lt;li&gt;Optimiser&lt;/li&gt;
&lt;li&gt;Construire&lt;/li&gt;
&lt;li&gt;Tester&lt;/li&gt;
&lt;li&gt;S’adapter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les outils évoluent énormément, mais la logique d’ingénierie reste étonnamment stable.&lt;/p&gt;

&lt;p&gt;Cette continuité se ressent particulièrement dans un environnement comme le plateau de Saclay, où se croisent depuis des décennies :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recherche scientifique&lt;/li&gt;
&lt;li&gt;industrie&lt;/li&gt;
&lt;li&gt;ingénierie&lt;/li&gt;
&lt;li&gt;et innovation technologique&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C’est un moment où différentes époques de l’informatique se rencontrent physiquement au même endroit.&lt;/p&gt;

&lt;p&gt;Des générations qui ont connu les débuts des stations Unix échangent avec des ingénieurs travaillant aujourd’hui sur des infrastructures cloud ou des systèmes IA modernes.&lt;/p&gt;

&lt;p&gt;Et au milieu de ces discussions, une chose devient évidente :&lt;br&gt;
l’évolution technologique ne remplace pas réellement les générations précédentes.&lt;/p&gt;

&lt;p&gt;Elle s’appuie sur elles.&lt;/p&gt;

&lt;p&gt;Les systèmes modernes existent aussi grâce aux fondations construites par celles et ceux qui expérimentaient déjà les réseaux, les modèles mathématiques ou les architectures distribuées il y a plusieurs décennies.&lt;/p&gt;

&lt;p&gt;Et evenement rappel finalement quelque chose d’assez rare dans l’industrie technologique actuelle :&lt;br&gt;
l’informatique possède déjà sa propre mémoire collective.&lt;/p&gt;

&lt;p&gt;Et cette mémoire continue de se transmettre, année après année, entre les promotions qui se succèdent sur le campus de Polytech Paris-Saclay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Des trajectoires radicalement différentes
&lt;/h2&gt;

&lt;p&gt;Trente ans plus tard, les parcours des anciens élèves sont devenus extrêmement variés.&lt;/p&gt;

&lt;p&gt;Certains travaillent dans le luxe.&lt;br&gt;
D’autres dans la défense, la banque, l’aérospatial ou l’administration.&lt;/p&gt;

&lt;p&gt;Certains sont partis vivre au Mexique, en Suède ou en Suisse.&lt;br&gt;
L’un a ouvert un SPA.&lt;br&gt;
Un autre a construit un simulateur d’Airbus A320 en LEGO.&lt;/p&gt;

&lt;p&gt;Le discours rappelle quelque chose d’essentiel :&lt;br&gt;
une école d’ingénieur ne produit pas des trajectoires identiques.&lt;/p&gt;

&lt;p&gt;Elle crée une base commune à partir de laquelle chacun construit son propre chemin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qu’il reste trente ans après
&lt;/h2&gt;

&lt;p&gt;Le moment le plus fort du discours arrive probablement à la fin, lorsque les anciens s’adressent aux jeunes diplômés :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Osez changer de poste, osez être vous-même, osez avoir vos propres convictions.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Le message est simple.&lt;br&gt;
Les carrières ne sont pas linéaires.&lt;br&gt;
Les parcours techniques non plus.&lt;/p&gt;

&lt;p&gt;Et peut-être que c’est précisément cela qui relie toutes ces générations :&lt;br&gt;
la capacité à continuer à construire malgré l’incertitude.&lt;/p&gt;

&lt;p&gt;En regardant ces promotions se retrouver trente ans plus tard, une autre évidence apparaît.&lt;/p&gt;

&lt;p&gt;Les technologies changent.&lt;br&gt;
Les frameworks changent.&lt;br&gt;
Les langages changent.&lt;br&gt;
L’intelligence artificielle transforme déjà l’industrie.&lt;/p&gt;

&lt;p&gt;Mais certaines choses restent identiques :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la curiosité&lt;/li&gt;
&lt;li&gt;la débrouillardise&lt;/li&gt;
&lt;li&gt;la volonté de créer&lt;/li&gt;
&lt;li&gt;et les liens humains construits autour de cette aventure commune qu’est l’informatique&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Merci
&lt;/h2&gt;

&lt;p&gt;Merci aux promotions pour leurs témoignages.&lt;br&gt;
Merci aux anciens professeurs et aux équipes de Polytech Paris-Saclay.&lt;br&gt;
Et merci aux organisateurs du Grand BBQ Alumni d’avoir permis à toutes ces histoires de se reconnecter, le temps d’un après-midi.&lt;/p&gt;

&lt;p&gt;Dans une industrie obsédée par la nouveauté permanente, cette journée rappelait finalement une chose simple : derrière chaque rupture technologique se trouvent souvent plusieurs générations d’ingénieurs qui ont construit les fondations bien avant qu’elles deviennent visibles.&lt;/p&gt;

&lt;p&gt;Parce qu’au final, derrière les technologies,&lt;br&gt;
ce sont surtout des générations de personnes qui continuent d’exister ensemble.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-06-02-bbq-polytech-paris-saclay/resized_IMG_4870.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-06-02-bbq-polytech-paris-saclay/resized_IMG_4870.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🌟 HeroClip - Transformez vos conversations en flux de travail de génération vidéo</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sat, 06 Jun 2026 07:04:28 +0000</pubDate>
      <link>https://dev.to/matyo91/heroclip-transformez-vos-conversations-en-flux-de-travail-de-generation-video-5bk5</link>
      <guid>https://dev.to/matyo91/heroclip-transformez-vos-conversations-en-flux-de-travail-de-generation-video-5bk5</guid>
      <description>&lt;p&gt;HeroClip - Et si créer des vidéos était aussi simple qu'une conversation&amp;nbsp;?&lt;/p&gt;

&lt;p&gt;Créer des vidéos avec l'IA devrait être magique.&lt;br&gt;
Mais aujourd'hui, c'est souvent une corvée.&lt;br&gt;
On ouvre un outil pour écrire les instructions.&lt;br&gt;
Un autre pour générer les visuels.&lt;br&gt;
Un autre pour monter les scènes.&lt;br&gt;
Un autre pour ajouter des transitions.&lt;br&gt;
Un autre pour exporter le résultat final.&lt;br&gt;
Et après tout ça&amp;nbsp;?&lt;br&gt;
On passe encore des heures à peaufiner.&lt;br&gt;
Et si on abordait le problème différemment&amp;nbsp;?&lt;br&gt;
Et si créer une vidéo ressemblait plus à une conversation avec un créatif&amp;nbsp;?&lt;br&gt;
C'est l'idée derrière &lt;strong&gt;HeroClip&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  De la conversation à la vidéo
&lt;/h1&gt;

&lt;p&gt;HeroClip est une application intégrée directement à ChatGPT.&lt;br&gt;
Au lieu d'apprendre à utiliser un logiciel complexe, il suffit de partir d'une idée.&lt;br&gt;
Par exemple&amp;nbsp;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;«&amp;nbsp;Créer un teaser de 12&amp;nbsp;secondes pour le lancement de mon produit.»&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;C'est tout.&lt;br&gt;
À partir de là, HeroClip construit votre expérience vidéo de manière conversationnelle.&lt;br&gt;
L'application propose d'abord plusieurs pistes créatives.&lt;br&gt;
Vous pouvez les parcourir comme sur les réseaux sociaux&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lancement cinématographique&lt;/li&gt;
&lt;li&gt;storytelling viral TikTok&lt;/li&gt;
&lt;li&gt;récit émotionnel&lt;/li&gt;
&lt;li&gt;publicité futuriste&lt;/li&gt;
&lt;li&gt;révélation minimaliste.
Dès qu'une piste vous semble pertinente, HeroClip génère automatiquement le storyboard.
Puis la vidéo elle-même.
Et le plus intéressant&amp;nbsp;?
Vous pouvez poursuivre l'histoire naturellement, au fil de la conversation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Une autre façon de créer du contenu
&lt;/h1&gt;

&lt;p&gt;La plupart des outils vidéo IA sont encore conçus comme des logiciels traditionnels.&lt;br&gt;
Chronologies.&lt;br&gt;
Boutons.&lt;br&gt;
Panneaux.&lt;br&gt;
Éditeurs complexes.&lt;br&gt;
HeroClip explore une autre voie&amp;nbsp;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;L'IA comme partenaire créatif.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Au lieu d'imposer des flux de travail techniques aux utilisateurs, l'application se concentre sur&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;les idées&lt;/li&gt;
&lt;li&gt;la narration&lt;/li&gt;
&lt;li&gt;l'itération&lt;/li&gt;
&lt;li&gt;et la dynamique.
Vous restez immergé dans la conversation tout au long du processus.
Pas de changement d'outils.
Pas de processus de montage complexe.
Aucune configuration technique.
Juste la créativité en mouvement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Un flux de travail créatif intuitif
&lt;/h1&gt;

&lt;p&gt;Nous avons rapidement compris que la créativité est rarement linéaire.&lt;br&gt;
On ne sait généralement pas exactement ce qu'on veut du premier coup.&lt;br&gt;
C'est pourquoi HeroClip propose des variantes.&lt;br&gt;
L'application suggère plusieurs interprétations de votre idée pour vous permettre d'explorer rapidement différentes pistes avant de générer des ressources vidéo coûteuses.&lt;br&gt;
L'expérience est ainsi beaucoup plus fluide&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;découvrir des idées&lt;/li&gt;
&lt;li&gt;choisir une ambiance&lt;/li&gt;
&lt;li&gt;affiner le récit&lt;/li&gt;
&lt;li&gt;poursuivre l'histoire.
Le processus ressemble davantage à un brainstorming avec un directeur artistique qu'à l'utilisation d'un logiciel de montage traditionnel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Une narration IA plutôt que la création de prompts
&lt;/h1&gt;

&lt;p&gt;La création de prompts est un outil puissant.&lt;br&gt;
Mais elle est aussi épuisante.&lt;br&gt;
La plupart des gens ne souhaitent pas passer des heures à apprendre comment structurer des prompts pour chaque scène.&lt;br&gt;
HeroClip simplifie cette complexité.&lt;br&gt;
L'objectif est simple&amp;nbsp;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;se concentrer sur l'histoire, pas sur les outils.&lt;br&gt;
L'application gère&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;les variantes&lt;/li&gt;
&lt;li&gt;les storyboards&lt;/li&gt;
&lt;li&gt;les flux de travail de génération&lt;/li&gt;
&lt;li&gt;la continuité visuelle&lt;/li&gt;
&lt;li&gt;et la création itérative de scènes.
Vous, vous vous concentrez sur votre intention créative.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Conçu pour l'ère du contenu court
&lt;/h1&gt;

&lt;p&gt;Internet est de plus en plus axé sur la vidéo.&lt;br&gt;
TikTok.&lt;br&gt;
Instagram Reels.&lt;br&gt;
YouTube Shorts.&lt;br&gt;
Teasers de produits.&lt;br&gt;
Image de marque personnelle.&lt;br&gt;
Micro-récits.&lt;br&gt;
La demande de contenu court explose.&lt;br&gt;
Mais produire du contenu en continu est difficile.&lt;br&gt;
HeroClip a été conçu pour répondre à cette nouvelle réalité&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;itération rapide&lt;/li&gt;
&lt;li&gt;expérimentation rapide&lt;/li&gt;
&lt;li&gt;flux de travail conversationnels&lt;/li&gt;
&lt;li&gt;boucles de continuation infinies.
L'idée n'est pas simplement de générer une seule vidéo.
Il s'agit d'aider les créateurs à générer des histoires en continu.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Pourquoi ChatGPT change tout
&lt;/h1&gt;

&lt;p&gt;HeroClip n'est pas seulement rendu possible par la génération vidéo par IA.&lt;br&gt;
C'est l'émergence des applications conversationnelles.&lt;br&gt;
Avec ChatGPT Apps et MCP (Model Context Protocol), les conversations elles-mêmes deviennent des expériences logicielles interactives.&lt;br&gt;
La conversation n'est plus seulement du texte.&lt;br&gt;
Elle devient&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;une interface&lt;/li&gt;
&lt;li&gt;un moteur de workflow&lt;/li&gt;
&lt;li&gt;une mémoire créative&lt;/li&gt;
&lt;li&gt;et un environnement narratif.
Ceci ouvre des perspectives inédites pour la conception logicielle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  La vision
&lt;/h1&gt;

&lt;p&gt;HeroClip est toujours en développement.&lt;br&gt;
Mais la vision se précise&amp;nbsp;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La création de contenu doit être intuitive et conversationnelle.&lt;br&gt;
Non technique.&lt;br&gt;
Non fragmentée.&lt;br&gt;
Non noyée sous des menus et des chronologies.&lt;br&gt;
Vous devriez pouvoir&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;décrire une idée&lt;/li&gt;
&lt;li&gt;explorer des pistes créatives&lt;/li&gt;
&lt;li&gt;générer du contenu&lt;/li&gt;
&lt;li&gt;poursuivre l'histoire&lt;/li&gt;
&lt;li&gt;et publier plus rapidement que jamais.
Le tout, au fil d'une conversation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  L'avenir des outils créatifs
&lt;/h1&gt;

&lt;p&gt;Nous pensons que la prochaine génération d'outils créatifs sera différente des logiciels traditionnels.&lt;br&gt;
Ils seront plus collaboratifs.&lt;br&gt;
Plus intuitifs.&lt;br&gt;
Plus adaptatifs.&lt;br&gt;
Moins «&amp;nbsp;logiciels de montage&amp;nbsp;».&lt;br&gt;
Plus «&amp;nbsp;partenaires créatifs&amp;nbsp;».&lt;br&gt;
HeroClip est une expérience dans ce sens.&lt;br&gt;
Et ce n'est que le début&lt;/p&gt;

</description>
    </item>
    <item>
      <title>📍 Une journée à Rotterdam</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Tue, 02 Jun 2026 08:53:20 +0000</pubDate>
      <link>https://dev.to/matyo91/une-journee-a-rotterdam-1ibi</link>
      <guid>https://dev.to/matyo91/une-journee-a-rotterdam-1ibi</guid>
      <description>&lt;p&gt;Après la première journée passée à la TwitchCon Rotterdam 2026, j’ai décidé de consacrer mon dimanche à découvrir simplement la ville.&lt;/p&gt;

&lt;p&gt;Le programme était finalement assez simple :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotterdam Centraal&lt;/li&gt;
&lt;li&gt;balade dans le centre-ville&lt;/li&gt;
&lt;li&gt;Markthal&lt;/li&gt;
&lt;li&gt;Cube Houses&lt;/li&gt;
&lt;li&gt;promenade en bateau&lt;/li&gt;
&lt;li&gt;zoo&lt;/li&gt;
&lt;li&gt;puis retour vers Zuidplein avant le bus du soir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et honnêtement, Rotterdam se prête très bien à ce genre de journée sans pression.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arrivée à Rotterdam Centraal
&lt;/h2&gt;

&lt;p&gt;La journée a commencé à Rotterdam Centraal.&lt;/p&gt;

&lt;p&gt;Même sans être passionné par les gares, celle-ci impressionne immédiatement :&lt;br&gt;
grande, moderne, très propre et surtout extrêmement fluide.&lt;/p&gt;

&lt;p&gt;On sent que Rotterdam est une ville pensée autour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;des transports&lt;/li&gt;
&lt;li&gt;du vélo&lt;/li&gt;
&lt;li&gt;des piétons&lt;/li&gt;
&lt;li&gt;et des déplacements rapides.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depuis la gare, beaucoup de lieux intéressants sont accessibles facilement à pied ou en tram.&lt;/p&gt;

&lt;h2&gt;
  
  
  Découverte du centre-ville
&lt;/h2&gt;

&lt;p&gt;Le centre-ville de Rotterdam est très différent d’Amsterdam.&lt;/p&gt;

&lt;p&gt;Les rues sont plus larges, les bâtiments plus modernes et l’ambiance plus calme que ce à quoi je m’attendais.&lt;/p&gt;

&lt;p&gt;On alterne constamment entre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;immeubles récents&lt;/li&gt;
&lt;li&gt;zones commerçantes&lt;/li&gt;
&lt;li&gt;cafés&lt;/li&gt;
&lt;li&gt;places ouvertes&lt;/li&gt;
&lt;li&gt;et architecture contemporaine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La ville donne une impression très agréable pour marcher sans forcément avoir un itinéraire précis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le Markthal
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4846.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4846.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le Markthal est probablement l’un des endroits les plus connus de Rotterdam.&lt;/p&gt;

&lt;p&gt;L’immense bâtiment en arche attire immédiatement l’attention.&lt;/p&gt;

&lt;p&gt;À l’intérieur :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stands de nourriture&lt;/li&gt;
&lt;li&gt;spécialités locales&lt;/li&gt;
&lt;li&gt;cafés&lt;/li&gt;
&lt;li&gt;street food&lt;/li&gt;
&lt;li&gt;touristes&lt;/li&gt;
&lt;li&gt;habitants&lt;/li&gt;
&lt;li&gt;photographes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’endroit est vivant en permanence.&lt;/p&gt;

&lt;p&gt;Le plafond couvert d’illustrations géantes donne une vraie identité au lieu, et l’ambiance mélange à la fois marché local et attraction touristique.&lt;/p&gt;

&lt;p&gt;C’est aussi un très bon endroit pour faire une pause pendant une journée de visite.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4845.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4845.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Les maisons cubiques
&lt;/h2&gt;

&lt;p&gt;Juste à côté du Markthal se trouvent les célèbres Cube Houses.&lt;/p&gt;

&lt;p&gt;Même en les ayant déjà vues en photo, le résultat est surprenant en vrai.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4850.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4850.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ces maisons inclinées donnent complètement une identité particulière au quartier.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4855.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4855.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Autour, il y a beaucoup :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;de visiteurs&lt;/li&gt;
&lt;li&gt;de cafés&lt;/li&gt;
&lt;li&gt;de petites boutiques&lt;/li&gt;
&lt;li&gt;et de gens simplement installés à observer le quartier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4856.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4856.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le vieux port juste à côté apporte aussi une ambiance beaucoup plus calme et agréable.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4851.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4851.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Balade en bateau
&lt;/h2&gt;

&lt;p&gt;L’un des moments les plus agréables de la journée a probablement été la promenade en bateau.&lt;/p&gt;

&lt;p&gt;Voir Rotterdam depuis l’eau permet vraiment de comprendre la ville différemment :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;les ponts&lt;/li&gt;
&lt;li&gt;les immeubles modernes&lt;/li&gt;
&lt;li&gt;les anciens docks&lt;/li&gt;
&lt;li&gt;les zones portuaires&lt;/li&gt;
&lt;li&gt;les grands bâtiments récents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le contraste entre les espaces industriels et les nouveaux quartiers est très visible.&lt;/p&gt;

&lt;p&gt;Et surtout, cela rappelle à quel point Rotterdam reste une ville profondément liée à son port.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4840.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4840.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4841.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4841.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4842.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4842.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4843.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4843.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4844.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4844.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le zoo de Rotterdam
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4860.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-05-31-rotterdam/resized_IMG_4860.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’après-midi s’est poursuivi avec une visite du zoo de Rotterdam.&lt;/p&gt;

&lt;p&gt;Le parc est immense et très bien entretenu.&lt;/p&gt;

&lt;p&gt;On y trouve différentes zones thématiques avec :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;animaux africains&lt;/li&gt;
&lt;li&gt;espaces tropicaux&lt;/li&gt;
&lt;li&gt;aquarium&lt;/li&gt;
&lt;li&gt;oiseaux&lt;/li&gt;
&lt;li&gt;grands espaces extérieurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’ambiance est assez calme malgré le nombre de visiteurs.&lt;/p&gt;

&lt;p&gt;Après l’agitation de la TwitchCon la veille, c’était aussi un bon moyen de ralentir un peu le rythme avant le retour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zuidplein et retour vers Ahoy
&lt;/h2&gt;

&lt;p&gt;En fin de journée, direction Zuidplein.&lt;/p&gt;

&lt;p&gt;Le quartier autour du Rotterdam Ahoy avait une ambiance très différente de la veille pendant la TwitchCon :&lt;br&gt;
beaucoup plus calme, avec les visiteurs qui commencent progressivement à repartir.&lt;/p&gt;

&lt;p&gt;C’était assez étrange de revoir les alentours du salon après toute l’énergie du samedi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impression générale
&lt;/h2&gt;

&lt;p&gt;Cette deuxième journée a montré une autre facette de Rotterdam.&lt;/p&gt;

&lt;p&gt;Au-delà de l’architecture moderne, la ville est surtout agréable à vivre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;facile à parcourir&lt;/li&gt;
&lt;li&gt;bien organisée&lt;/li&gt;
&lt;li&gt;très accessible à pied&lt;/li&gt;
&lt;li&gt;avec beaucoup d’espaces ouverts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et finalement, le mélange entre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;centre-ville moderne&lt;/li&gt;
&lt;li&gt;vieux port&lt;/li&gt;
&lt;li&gt;grands bâtiments&lt;/li&gt;
&lt;li&gt;espaces verts&lt;/li&gt;
&lt;li&gt;transports efficaces&lt;/li&gt;
&lt;li&gt;et ambiance internationale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;rend Rotterdam très différente des autres villes néerlandaises.&lt;/p&gt;

&lt;p&gt;C’était probablement la meilleure façon de terminer ce week-end TwitchCon.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
