<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archives des Tech - EKITE</title>
	<atom:link href="https://ekite.info/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>https://ekite.info/category/tech/</link>
	<description>Vos défis, notre passion</description>
	<lastBuildDate>Fri, 10 Jul 2026 08:00:29 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://ekite.info/wp-content/uploads/2023/06/cropped-favicon2-150x150.png</url>
	<title>Archives des Tech - EKITE</title>
	<link>https://ekite.info/category/tech/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Mon Agi&#8217;lille 2026</title>
		<link>https://ekite.info/2026/07/10/mon-agilille-2026/</link>
		
		<dc:creator><![CDATA[Johan Dufour]]></dc:creator>
		<pubDate>Fri, 10 Jul 2026 07:57:10 +0000</pubDate>
				<category><![CDATA[Agilité]]></category>
		<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=4901</guid>

					<description><![CDATA[<p>Hey ! Les 24 et 25 juin derniers a eu lieu le dernier Agi’lille, par Nord Agile. Quand j’écris dernier, c’est le vrai dernier, l’ultime édition. L’association a pris la décision de terminer sur une bonne note. En effet, en 2026, les évènements autour de la démarche agile n’ont pas le vent en poupe. Entre annulations [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2026/07/10/mon-agilille-2026/">Mon Agi&rsquo;lille 2026</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hey !</p>
<p>Les 24 et 25 juin derniers a eu lieu le dernier Agi’lille, par <a href="https://www.linkedin.com/company/nord-agile/" target="_blank" rel="noopener">Nord Agile</a>. Quand j’écris dernier, c’est le vrai dernier, l’ultime édition. L’association a pris la décision de terminer sur une bonne note.</p>
<p>En effet, en 2026, les évènements autour de la démarche agile n’ont pas le vent en poupe. Entre annulations pures et simples et changement de perspectives (thématique, formats, etc.), il y a une vraie évolution en cours. Pour des raisons variables, que je n’analyserai pas ici.</p>
<p>Toujours est-il que le contexte défavorable a eu un effet sur notre évènement local : l’édition d’Agi’lille en 2026 sera bien la dernière, c’est certain. Il était temps de célébrer ses 17 itérations !</p>
<p>Nous avons dû adapter un certain nombre de choses pour rendre cela viable et stimulant.</p>
<h3>Agi’lille &#8211; mon rôle</h3>
<p>Chez Nord Agile, je suis membre du bureau et j’ai un rôle de contributeur fort sur la partie sponsoring de l’Agi’lille depuis 4 ans.</p>
<p>Pour des raisons personnelles, j’ai volontairement lâché la bride en début d’année, et je tenais à remercier Nabil Boulehrouz et Maxime Viaene pour leur investissement sans faille. Merci les potos, vous avez vraiment assuré dans un contexte compliqué.</p>
<p>Avec du recul, il est clair que cette année a été particulièrement difficile pour trouver des sponsors prêts à nous financer, malgré les efforts de la <em>team</em>. Un certain nombre d’acteurs historiques n’ont pas renouvelé leur engagement, et cela s’est bien vu dans notre projection et dans l’organisation. Il y a eu des promesses non tenues, des sponsorings de dernière minute, des non-réponses à nos sollicitations, mais aussi des personnes qui étaient à fond avec nous malgré tout.</p>
<p>Sur la projection, avec des financements plus limités que les années précédentes, il a fallu faire des concessions sur des éléments de budget. Et sur ce que nous pouvions offrir aux sponsors.</p>
<p>Sur l’organisation, ayant peu de sponsors présents physiquement, il fallait occuper l’espace. Avec un atrium à animer, nous avons opté pour une solution simple : les stands sponsors ont été complétés par des partenaires. <a href="https://www.linkedin.com/company/eckko-studio" target="_blank" rel="noopener">Eckko Studio</a> avec son set pour tourner des podcasts, <a href="https://www.linkedin.com/company/ludinord-pro/" target="_blank" rel="noopener">LudiNord Pro</a> pour animer des sessions de jeux sérieux, un photobooth pour immortaliser la présence des participants et le stand des communautés locales &#8211; <a href="https://www.linkedin.com/company/agile-tech-community-lille" target="_blank" rel="noopener">Agile &amp; Tech Community Lille</a>.</p>
<h3>Agi’lille &#8211; la der des ders en vrai</h3>
<p>Après une arrivée assez tôt le mardi pour démarrer la préparation et faire un pique-nique improvisé avec Nico T., Nabil et Max, nous avons commencé à prendre possession des lieux. C’était relativement calme, avec de la latence, des arrivées tardives, mais tout le monde avait l’air relax. Peut-être plus qu’avant. Est-ce que c’était l’effet « On lâche tout » ?</p>
<p>Le mardi soir, et assez naturellement, tout a l’air prêt.</p>
<p>Dès le jour J, tout se met en place facilement. Le feu de camp animé par Nico motive les organisateurs et bénévoles. C’est parti pour la dernière !</p>
<p>L’organisation tourne bien, les gens sont autonomes, les réflexes et nouveautés sont assimilés.</p>
<p>Cette première journée était plus « tranquille », n’ayant rien à faire en matière d’animation. J’ai pu en profiter. Je me suis retrouvé, comme d’habitude, à discuter, à aller à droite et à gauche, ou à être embarqué pour tourner un podcast. Des discussions par milliers. Des têtes connues et des découvertes. L’enrichissement humain.</p>
<p>Je me suis même retrouvé à faire la tournée des cookies pour les participants.</p>
<p>La fin de journée est vite arrivée : apéro, soirée de l’évènement au Napoléon à Lille.</p>
<p>La deuxième journée a été plus vive. Déjà, parce qu’il y avait une table ronde Keikenchiba à animer avec Nico, puis un REX du PAF (j’étais plus en mode observateur) et enfin, notre <em>talk</em> EKITE « Le Clash : Numérique Responsable VS Numérique Balek &#8211; qui gagne ? »</p>
<p>Cette dernière session a été très cool. Entre 40 et 50 personnes dans un super amphi. J’ai pris beaucoup de plaisir à faire cette présentation avec Claude et Romain V. ; c’était fluide, un vrai retour d’expérience utile, avec des retours très positifs.</p>
<div id="attachment_4903" style="width: 778px" class="wp-caption alignnone"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-4903" class="wp-image-4903 size-large" src="https://ekite.info/wp-content/uploads/2026/07/IMG_3607-768x1024.jpg" alt="Crédit photo : Caroline Buytaert" width="768" height="1024" /><p id="caption-attachment-4903" class="wp-caption-text">Crédit photo : <a href="https://ekite.info/author/carolinebuytaert/" target="_blank" rel="noopener">Caroline Buytaert</a></p></div>
<p>J’ai hâte de rejouer ce <em>talk</em> ailleurs ! Parce qu’il y a une utilité perceptible dans les retours.</p>
<p>Bref, quel honneur d’avoir été <em>speaker</em> sur le dernier <em>talk</em> du dernier Agi’lille</p>
<p>Merci à l’ensemble des organisateurs et des bénévoles, aux <em>speakers</em> de qualité, aux partenaires et aux participant.e.s. Vous avez été formidables.</p>
<h3>Et la suite ?</h3>
<p>Nord Agile n’a pas encore décidé ce qu’il allait se passer. Forte de plus de 20 membres, l’association a un travail à faire pour le futur et je ne peux pas parler en son nom. Quoi qu’il en soit, je serai dans les discussions, les débats et les choix.</p>
<p>De mon côté, j’ai des certitudes et des convictions. Ce genre d’évènement me pousse à faire plus et à évoluer. Le marché est difficile, les tendances bougent, le futur est incertain.</p>
<p>Dans un monde VICA, j’estime que ma place est de proposer mon énergie et mon style dans un nouveau mouvement. Quelque chose de plus global. Quelque chose de plus tranchant. Quelque chose qui pulse. Quelque chose qui fédère toujours plus.</p>
<p>Mais à l’heure où j’écris ces mots, trop de pistes sont possibles. Il va falloir faire des choix, expérimenter, définir la bonne échelle, avec les bonnes personnes. Pas si simple. Mais très stimulant.</p>
<p>L’Agi’lille était une belle aventure et je suis fier d’en avoir fait partie sous différents angles depuis 2018. Je remercie les personnes avec qui tout cela a été construit.</p>
<p>De nouvelles aventures nous attendent, j’en suis certain !</p>
<p>L’article <a href="https://ekite.info/2026/07/10/mon-agilille-2026/">Mon Agi&rsquo;lille 2026</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4901</post-id>	</item>
		<item>
		<title>Mon DevLille 2026</title>
		<link>https://ekite.info/2026/07/10/mon-devlille-2026/</link>
		
		<dc:creator><![CDATA[Johan Dufour]]></dc:creator>
		<pubDate>Fri, 10 Jul 2026 07:49:53 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=4905</guid>

					<description><![CDATA[<p>Hey ! Être investi dans de multiples communautés, c’est mon dada. J’estime que participer activement aux évènements se situant hors du cadre professionnel classique – à savoir les missions – est essentiel pour de nombreuses raisons. Cela me permet d’ouvrir mes horizons, de maintenir et d’élargir mon réseau, de revoir de superbes personnes qui courent aussi tout le [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2026/07/10/mon-devlille-2026/">Mon DevLille 2026</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hey !</p>
<p>Être investi dans de multiples communautés, c’est mon dada. J’estime que participer activement aux évènements se situant hors du cadre professionnel classique – à savoir les missions – est essentiel pour de nombreuses raisons.</p>
<p>Cela me permet d’ouvrir mes horizons, de maintenir et d’élargir mon réseau, de revoir de superbes personnes qui courent aussi tout le long de l’année.</p>
<p>J’ai participé à un moment classique du mois de juin : le DevLille !</p>
<h2>DevLille &#8211; mon rôle ?</h2>
<p>Je ne suis pas dans l’organisation du DevLille. Cependant, j’y ai contribué de plusieurs manières.</p>
<h3>Le tremplin, c’est quoi ?</h3>
<p>Avant l’évènement, le DevLille organise un tremplin pour les <span style="font-style: normal !msorm;"><em>speakers</em></span> en herbe. Organisé par Craft Records, en collaboration Cloud Nord et Nord Agile (pour la première fois), le tremplin est un temps spécifique où des <span style="font-style: normal !msorm;"><em>speakers</em></span> juniors (en général, qui n’ont jamais été <span style="font-style: normal !msorm;"><em>speakers</em></span>) proposent des sujets afin d’être sélectionnés pour un Meetup auquel ils auront la chance de participer.</p>
<p>À la fin du Meetup, l’audience vote pour ses 3 talks préférés. Chaque évènement porteur de la démarche (à savoir le DevLille, le Cloud Nord et l’Agi’lille) sélectionne un des 3 sujets à embarquer dans son programme.</p>
<p>Cette année, ce sont 6 personnes qui ont bénéficié de ce format et d’un accompagnement complet.</p>
<p>J’ai eu la chance d’être <span style="font-style: normal !msorm;"><em>coach speaker</em></span>. Jolie reconnaissance !</p>
<p>J’ai donc accompagné <a href="https://www.linkedin.com/in/hanna-chernihina-177066177/">Hanna</a>, jeune développeuse ukrainienne, pour son tout premier <span style="font-style: normal !msorm;"><em>talk</em></span>. Avec une fréquence hebdomadaire, j’ai pu lui prodiguer des conseils pour qu’elle puisse animer sa première conférence. Posture, support, contenu, tout y passe pour optimiser sa présentation.</p>
<p>Cela s’est très bien passé, et même si Hannah n’a pas été sélectionnée, elle a appris des choses et cela lui a donné envie de prolonger l’expérience dans les mois à venir.</p>
<h3>Jour J &#8211; MC sur une salle</h3>
<p>J’aime bien la scène, être <span style="font-style: normal !msorm;"><em>speaker</em></span>, parler devant des gens. Cela me renvoie aux années où j’étais une personne réservée qui préférait se cacher dans un coin de la salle pour se faire oublier (c’était il y a longtemps).</p>
<p>Emmanuel Demey m’a donc proposé, un peu à l’arrache – ça tombe bien, j’aime ça ah ah – d’être maître de cérémonie d’une salle lors d’un après-midi. Mon rôle était simple : annoncer la personne qui présentera sa conférence sur scène.</p>
<p>Mon naturel m’a poussé à tenter quelques blagues (y a eu des bides et des sourires) et à créer une ambiance très dynamique. J’ai baigné dans le hip-hop et pour moi, le MC a une image bien particulière : il amène une atmosphère, du mouvement, du punch. C’est ce que j’ai essayé de faire, en « chauffant » la salle.</p>
<p>Ce qui est très cool, c’est que ça a fonctionné visiblement. J’ai eu pas mal de bons retours : les gens étaient contents de l’énergie que je mettais à créer une amorce positive pour accueillir chaleureusement les <span style="font-style: normal !msorm;"><em>speakers</em></span>.</p>
<h3>Jour J 2 &#8211; Double stand !</h3>
<p>Le reste de mon temps a été partagé entre le stand d’EKITE et celui des communautés.</p>
<p>Sur le stand d’EKITE, plein d’animations ont été proposées : le podcast de Romain, le Space Shooter, un jeu vidéo avec scanette codé par Vincent et Benjamin, les apéros de Jean-Luc, etc.</p>
<div style="width: 1428px" class="wp-caption aligncenter"><img decoding="async" src="https://lh3.googleusercontent.com/pw/AP1GczPldcunOhtTGGLYAuAmwnixAF1uJnVUfUzD9KilOIfS2dAg9a31zEryoLGI_c4vCqL0sc7GWfJpgrAkHc7LgSHhw_jjqxJn6eYnzhqqz0dv_5JW2Kvt-VmHFDXD7nruP0D5burpnhekx_vmMWDDanmJoQ=w1418-h945-s-no-gm?authuser=1" alt="Romain &amp; David en plein enregistrement !Crédit Photo : Nicolas Detrez" width="1418" height="945" /><p class="wp-caption-text">Romain &amp; David en plein enregistrement ! Crédit Photo : Nicolas Detrez</p></div>
<p>Aucun podcast pour moi cette fois-ci (j’ai largement pu y contribuer en tant qu’invité sur d’autres évènements), mais un accompagnement simple sur le stand EKITE : de la discussion avec les loulous de notre boîte et quelques discussions avec les personnes qui visitaient le stand.</p>
<p><a href="https://www.linkedin.com/company/ekite/">EKITE</a> &amp; <a href="https://www.linkedin.com/company/agile-tech-community-lille/">Agile &amp; Tech Community Lille</a></p>
<p><iframe title="Post intégré" src="https://www.linkedin.com/embed/feed/update/urn:li:share:7473068817414336512?collapsed=1" width="504" height="634" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h3>Conclusion &#8211; au cœur de la technosphère lilloise</h3>
<p>Les gens qui me connaissent par cœur savent ce qu’il se passe lors de ce genre d’évènements : je passe le plus clair de mon temps à discuter avec de nombreuses personnes, à virevolter entre les discussions sur un stand, entre 2 conférences, à la sortie de la pause, etc.</p>
<blockquote><p>Bonus : la soirée « officieuse » était très cool, cela m’a permis de me reconnecter avec plein de personnes que j’apprécie. Spéciale dédicace aux personnes de chez JetDev, Adalov, Hoppr, SII, etc.</p></blockquote>
<div id="attachment_4917" style="width: 1034px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-4917" class="size-large wp-image-4917" src="https://ekite.info/wp-content/uploads/2026/07/DEVLILLE-NCLSPROD-00527-1024x683.jpg" alt="" width="1024" height="683" srcset="https://ekite.info/wp-content/uploads/2026/07/DEVLILLE-NCLSPROD-00527-980x653.jpg 980w, https://ekite.info/wp-content/uploads/2026/07/DEVLILLE-NCLSPROD-00527-480x320.jpg 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /><p id="caption-attachment-4917" class="wp-caption-text">EKITE x Clever Cloud &#8211; Crédit photo : Nicolas Detrez</p></div>
<p>L’article <a href="https://ekite.info/2026/07/10/mon-devlille-2026/">Mon DevLille 2026</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4905</post-id>	</item>
		<item>
		<title>Pimp My Framework x Mistral</title>
		<link>https://ekite.info/2026/07/10/pimp-my-framework-x-mistral/</link>
		
		<dc:creator><![CDATA[Johan Dufour]]></dc:creator>
		<pubDate>Fri, 10 Jul 2026 07:29:29 +0000</pubDate>
				<category><![CDATA[IA]]></category>
		<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=4716</guid>

					<description><![CDATA[<p>Hello ! Il y a quelques mois, avec Caroline, nous avons inventé un format d’atelier pour aider les équipes à construire leur propre cadre de travail : Pimp My Framework. Celui-ci fait désormais partie de notre proposition de valeur et nous pouvons accompagner différentes organisations si elles le désirent. Cependant, en l’état, j’avais le sentiment [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2026/07/10/pimp-my-framework-x-mistral/">Pimp My Framework x Mistral</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hello !</p>
<p>Il y a quelques mois, avec <a href="https://ekite.info/author/carolinebuytaert/">Caroline</a>, nous avons inventé un format d’atelier pour aider les équipes à construire leur propre cadre de travail : <a href="https://ekite.info/2025/01/20/pimp-my-framework-lhistoire/">Pimp My Framework</a>. Celui-ci fait désormais partie de notre proposition de valeur et nous pouvons accompagner différentes organisations si elles le désirent.</p>
<p>Cependant, en l’état, j’avais le sentiment de passer au travers d’une chose : comment optimiser l’utilisation de ce genre d&rsquo;ateliers pour des organisations à but non lucratif ? Cela me frustrait, d’autant plus que je suis proche de l’Open Source depuis très longtemps (1997) et que le partage de pratiques est dans mon ADN. Il fallait remédier à cela.</p>
<p>C’est pour cela que j’ai travaillé sur une manière différente de mettre à disposition la puissance de ce format.</p>
<h3>LLM x PMF</h3>
<p>Au départ, l’idée était de réaliser une bibliothèque de <em>prompts</em> destinée à être partagée à qui le désirait. Mais il s’est vite avéré que cette direction n’était pas la bonne, pour de multiples raisons.</p>
<p>Déjà, parce que chaque prompt devait être réadapté par rapport à un contexte d’équipe unique. La valeur ajoutée n’était pas si forte finalement.</p>
<p>Ensuite, peu importe le LLM choisi, il n’a pas le contexte de <em>Pimp My Framework</em> (sa description, son déroulé, ses ajustements liés à l’expérimentation terrain, etc.). Le LLM va faire avec ce qu’il trouve sur internet et en soi, ce n’est pas ce que je désirais faire. Mon but, c’était bien d’infuser l’esprit de <em>Pimp My Framework</em> pour répondre à des problématiques concrètes.</p>
<p>La solution n’était pas dans la bibliothèque de <em>prompts</em>.</p>
<h3>Un Agent ?</h3>
<p>Après avoir joué avec Mistral, qui est mon LLM préféré désormais – par conviction personnelle – j’ai commencé à m&rsquo;intéresser à la création « d’agent ». Enfin, ce sont plus des assistants que des agents en réalité.</p>
<p>En gros, on décrit le comportement de l’agent, on l’alimente avec une source de données précise et l’« agent » Mistral va réagir de manière contextuelle.</p>
<p>Pour <em>Pimp My Framework</em>, il faudrait juste lui expliquer qu’il est le spécialiste de l’atelier et qu’il sache de quoi il parle avec des données pertinentes.</p>
<p>J’ai donc écrit un comportement de ce genre pour mon agent « PMF IA » :</p>
<h4><strong>Instructions :</strong></h4>
<pre class="EnlighterJSRAW" data-enlighter-language="raw">Tu es un agent en charge d’aider des équipes à détecter des moyens pour régler des problèmes d’organisations. 

Tu es un accompagnant agnostique : tu places les valeurs avant les moyens existants. 

Tes références : 
- Le Cœur de l’Agilité (https://heartofagile.com/?lang=fr)
- Le Manifeste Agile (https://agilemanifesto.org/iso/fr/manifesto.html) 

Ton moyen central pour aider les gens s’appelle « Pimp My Framework ». 

C’est un atelier qui propose un moment de co-construction avec une équipe. À partir des problématiques (ou de problématiques « standards » que nous avons toujours en poche), il est possible d’élaborer un framework (cadre de travail) totalement adapté à la situation dans l’équipe. 

Les caractéristiques : 

Durée : 1 h 30 / 2 h 
Nombre de participants : 20 à 30 (4 à 6 équipes) 
2 minutes de pitch pour le final 
50 points au démarrage 
Des règles fun pour gagner des points (ou les perdre, ahah) 

Les grandes étapes : 
- Découverte des problématiques dans votre équipe (à travers une grille pour vous aider à les identifier ou déjà préremplies) 
- Session de découverte des moyens à mettre en place 
- Définition des moyens à mettre en place, des soft skills associés et des KPIs liés (sous forme de roadmap) 

Tu fais la distinction entre une problématique précise et une situation plus générale. 
Si tu détectes un irritant ou un problème précis, tu t’adaptes en proposant un moyen ajusté. 
Si tu détectes une situation plus large, tu affines le format de Pimp My Framework en fonction des irritants et problématiques. 

Tu proposes toujours une suite concrète à exploiter.
</pre>
<h4><strong>Garde-fous :</strong></h4>
<pre class="EnlighterJSRAW" data-enlighter-language="raw">Il faut que tu adoptes un jargon compréhensible par le grand public. 
Pas de mots en anglais, pas d’anglicismes, pas de mots spécifiques de la culture tech. 

Garde en tête que tu es un artisan de la facilitation. Donc, tu proposes des moyens personnalisés.</pre>
<h4><strong>Connaissances :</strong></h4>
<p>La bibliothèque avec les ressources concernant <em>Pimp My Framework</em>.</p>
<p><a href="https://ekite.info/wp-content/uploads/2026/04/Pimp-My-Framework-template-2025-custom-sept.-25.pdf">Pimp My Framework &#8211; template 2025 &#8211; custom sept. 25</a> | <a href="https://ekite.info/wp-content/uploads/2026/04/Evaluation-des-Soft-Skills-–-v2.pdf">Evaluation des Soft Skills – v2</a> | <a href="https://ekite.info/wp-content/uploads/2026/04/Regles-du-jeu.pdf">Regles du jeu</a> | <a href="https://ekite.info/wp-content/uploads/2026/04/megaskills.pdf">megaskills</a> | <a href="https://ekite.info/wp-content/uploads/2026/04/Fiche-equipe.pdf">Fiche équipe</a></p>
<h4>Conclusion :</h4>
<p>Après plusieurs itérations de description de comportement, le résultat est satisfaisant : il respecte bien l’atelier initial, son articulation tout en aidant à travers des conseils liés au contexte décrit dans le <em>prompt</em>. Et il projette sur une suite à donner.</p>
<h3>Et concrètement ?</h3>
<p>Vous pouvez tester en décrivant vos situations réelles ou avec des situations plus ou moins génériques pour tester.</p>
<h4>Exemple de prompt générique :</h4>
<pre class="EnlighterJSRAW" data-enlighter-language="raw">Mon équipe est composée de développeurs front et back, et je comprends qu’ils n’arrivent pas à s’accorder ! En clair, les objectifs sont rarement atteints et la collaboration est poussive. 

Comment peux-tu m’aider ?</pre>
<p>? Si vous avez des feedbacks à propos de cet article ou cet agent, sentez-vous libre de me contacter.</p>
<p>L’article <a href="https://ekite.info/2026/07/10/pimp-my-framework-x-mistral/">Pimp My Framework x Mistral</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4716</post-id>	</item>
		<item>
		<title>DINO JAM 5</title>
		<link>https://ekite.info/2026/04/08/dino-jam-5/</link>
		
		<dc:creator><![CDATA[philippegourmelon]]></dc:creator>
		<pubDate>Wed, 08 Apr 2026 14:00:33 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=4654</guid>

					<description><![CDATA[<p>Depuis plusieurs années déjà, et après avoir pu participer à une Ludumdare, j’aimerais apprendre à faire des jeux vidéo. Malheureusement le manque d’occasions ne m’a pas permis de pouvoir y investir le temps que j’aurais voulu. Alors cette fois c’est à moi de provoquer l’occasion, comme pour tout projet, l’important c’est de trouver un objectif.  C’est là que ça m’est venu?: pourquoi ne pas se lancer dans une jam?? Une limite de temps, un thème imposé, de quoi se motiver justement?! Je [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2026/04/08/dino-jam-5/">DINO JAM 5</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Depuis </span><span class="NormalTextRun SCXW200081761 BCX0">plusieurs</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">années</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">déjà</span><span class="NormalTextRun SCXW200081761 BCX0">, et </span><span class="NormalTextRun SCXW200081761 BCX0">après</span><span class="NormalTextRun SCXW200081761 BCX0"> avoir pu participer </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> une </span><span class="NormalTextRun SCXW200081761 BCX0">Ludumdare</span><span class="NormalTextRun SCXW200081761 BCX0">, j</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">aimerais</span><span class="NormalTextRun SCXW200081761 BCX0"> apprendre </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> faire des jeux </span><span class="NormalTextRun SCXW200081761 BCX0">vidéo</span><span class="NormalTextRun SCXW200081761 BCX0">. Malheureusement le manque d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">occasions ne m</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">a pas permis de pouvoir y investir le temps que </span><span class="NormalTextRun SCXW200081761 BCX0">j’aurais voulu</span><span class="NormalTextRun SCXW200081761 BCX0">. Alors cette fois c</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> moi de provoquer l</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">occasion, comme pour tout projet</span><span class="NormalTextRun SCXW200081761 BCX0">,</span><span class="NormalTextRun SCXW200081761 BCX0"> l</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">important c</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est de trouver un objectif.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">C</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est </span><span class="NormalTextRun SCXW200081761 BCX0">là</span><span class="NormalTextRun SCXW200081761 BCX0"> que </span><span class="NormalTextRun SCXW200081761 BCX0">ça</span><span class="NormalTextRun SCXW200081761 BCX0"> m</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est venu</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: pourquoi </span><span class="NormalTextRun SCXW200081761 BCX0">ne </span><span class="NormalTextRun SCXW200081761 BCX0">pas se lancer dans une </span><span class="NormalTextRun SCXW200081761 BCX0">jam</span><span class="NormalTextRun SCXW200081761 BCX0">??</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">U</span><span class="NormalTextRun SCXW200081761 BCX0">ne limite de temps, un </span><span class="NormalTextRun SCXW200081761 BCX0">thème</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">imposé</span><span class="NormalTextRun SCXW200081761 BCX0">, de quoi se motiver justement</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">! Je me rends sur itch.io, </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> la recherche des </span><span class="NormalTextRun SCXW200081761 BCX0">jams</span><span class="NormalTextRun SCXW200081761 BCX0"> qui </span><span class="NormalTextRun SCXW200081761 BCX0">commencent</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">bientôt</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: la </span><span class="NormalTextRun SCXW200081761 BCX0">voilà</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">! La DINO JAM 5. </span><span class="NormalTextRun SCXW200081761 BCX0">Thème</span><span class="NormalTextRun SCXW200081761 BCX0"> principal</span><span class="NormalTextRun SCXW200081761 BCX0">?:</span><span class="NormalTextRun SCXW200081761 BCX0"> les dinosaures, avec en plus un </span><span class="NormalTextRun SCXW200081761 BCX0">thème</span><span class="NormalTextRun SCXW200081761 BCX0"> secret </span><span class="NormalTextRun SCXW200081761 BCX0">annoncé</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">le jour du top </span><span class="NormalTextRun SCXW200081761 BCX0">départ</span><span class="NormalTextRun SCXW200081761 BCX0">. Je faisais </span><span class="NormalTextRun SCXW200081761 BCX0">partie</span><span class="NormalTextRun SCXW200081761 BCX0"> de ces </span><span class="NormalTextRun SCXW200081761 BCX0">enfants-là</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: incollable sur les dinosaures, une dizaine de </span><span class="NormalTextRun SCXW200081761 BCX0">visionnages</span><span class="NormalTextRun SCXW200081761 BCX0"> de </span><span class="NormalTextRun SCXW200081761 BCX0">«?</span><span class="NormalTextRun SCXW200081761 BCX0">Sur la terre des dinosaures</span><span class="NormalTextRun SCXW200081761 BCX0">?»</span><span class="NormalTextRun SCXW200081761 BCX0">?!</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">E</span><span class="NormalTextRun SCXW200081761 BCX0">spérons</span><span class="NormalTextRun SCXW200081761 BCX0"> que </span><span class="NormalTextRun SCXW200081761 BCX0">ça</span><span class="NormalTextRun SCXW200081761 BCX0"> me </span><span class="NormalTextRun SCXW200081761 BCX0">permettra</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">de partir avec un temps d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">avance.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Reste </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> choisir le moteur</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">:</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">UNITY</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: </span><span class="NormalTextRun SCXW200081761 BCX0">après</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun CommentStart CommentHighlightPipeRest CommentHighlightRest CommentImportant SCXW200081761 BCX0">l’annonce</span><span class="NormalTextRun CommentHighlightRest CommentImportant SCXW200081761 BCX0"> </span><span class="NormalTextRun CommentHighlightPipeRest SCXW200081761 BCX0">de leur nouvelle politique de tarification</span><span class="NormalTextRun SCXW200081761 BCX0">,</span><span class="NormalTextRun SCXW200081761 BCX0"> je ne les porte plus tellement dans mon </span><span class="NormalTextRun SCXW200081761 BCX0">cœur</span><span class="NormalTextRun SCXW200081761 BCX0">.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">UNREAL</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: </span><span class="NormalTextRun SCXW200081761 BCX0">l</span><span class="NormalTextRun SCXW200081761 BCX0">es </span><span class="NormalTextRun SCXW200081761 BCX0">trois semaines</span><span class="NormalTextRun SCXW200081761 BCX0"> de la </span><span class="NormalTextRun SCXW200081761 BCX0">jam</span><span class="NormalTextRun SCXW200081761 BCX0"> ne me </span><span class="NormalTextRun SCXW200081761 BCX0">suffiraient</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">pas </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">apprendre</span><span class="NormalTextRun SCXW200081761 BCX0"> les bases</span><span class="NormalTextRun SCXW200081761 BCX0">.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">GODOT</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: </span><span class="NormalTextRun SCXW200081761 BCX0">o</span><span class="NormalTextRun SCXW200081761 BCX0">n en entend de plus en plus parler ces </span><span class="NormalTextRun SCXW200081761 BCX0">dernières</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">années</span><span class="NormalTextRun SCXW200081761 BCX0">, </span><span class="NormalTextRun SCXW200081761 BCX0">présentée</span><span class="NormalTextRun SCXW200081761 BCX0"> comme </span><span class="NormalTextRun SCXW200081761 BCX0">la solution</span><span class="NormalTextRun SCXW200081761 BCX0"> </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">full open source</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">par rapport à</span><span class="NormalTextRun SCXW200081761 BCX0"> UNITY, le nouveau joujou des devs </span><span class="NormalTextRun SCXW200081761 BCX0">indépendants</span><span class="NormalTextRun SCXW200081761 BCX0">…</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">Intéressant</span><span class="NormalTextRun SCXW200081761 BCX0">…</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Qu</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est</span><span class="NormalTextRun SCXW200081761 BCX0">-ce</span><span class="NormalTextRun SCXW200081761 BCX0"> qu</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">il a de si particulier ce moteur pour attirer les nouveaux </span><span class="NormalTextRun SCXW200081761 BCX0">développeurs</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">indépendants</span><span class="NormalTextRun SCXW200081761 BCX0"> vers lui</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">?</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Sur </span><span class="NormalTextRun SCXW200081761 BCX0">son</span><span class="NormalTextRun SCXW200081761 BCX0"> site on peut lire</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">un moteur par les </span><span class="NormalTextRun SCXW200081761 BCX0">game</span><span class="NormalTextRun SCXW200081761 BCX0"> devs, pour les </span><span class="NormalTextRun SCXW200081761 BCX0">game</span><span class="NormalTextRun SCXW200081761 BCX0"> devs.</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> Le moteur </span><span class="NormalTextRun SCXW200081761 BCX0">étant</span><span class="NormalTextRun SCXW200081761 BCX0"> totalement </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">open source</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">, les </span><span class="NormalTextRun SCXW200081761 BCX0">développeurs</span><span class="NormalTextRun SCXW200081761 BCX0"> sont </span><span class="NormalTextRun SCXW200081761 BCX0">encouragés</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> ajouter </span><span class="NormalTextRun SCXW200081761 BCX0">eux-mêmes</span><span class="NormalTextRun SCXW200081761 BCX0"> au moteur les </span><span class="NormalTextRun SCXW200081761 BCX0">fonctionnalités</span><span class="NormalTextRun SCXW200081761 BCX0"> dont ils ont besoin pour leur </span><span class="NormalTextRun SCXW200081761 BCX0">création</span><span class="NormalTextRun SCXW200081761 BCX0">. Sous </span><span class="NormalTextRun SCXW200081761 BCX0">licence</span><span class="NormalTextRun SCXW200081761 BCX0"> MIT</span><span class="NormalTextRun SCXW200081761 BCX0">,</span><span class="NormalTextRun SCXW200081761 BCX0"> le GODOT </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">engine</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> peut </span><span class="NormalTextRun SCXW200081761 BCX0">être</span><span class="NormalTextRun SCXW200081761 BCX0"> librement </span><span class="NormalTextRun SCXW200081761 BCX0">utilisé</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">et </span><span class="NormalTextRun SCXW200081761 BCX0">redistribué</span><span class="NormalTextRun SCXW200081761 BCX0"> sans payer ni abonnement ni royalties. Si vous </span><span class="NormalTextRun SCXW200081761 BCX0">créez</span><span class="NormalTextRun SCXW200081761 BCX0"> un jeu dans </span><span class="NormalTextRun SCXW200081761 BCX0">ce</span><span class="NormalTextRun SCXW200081761 BCX0"> moteur c</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est le </span><span class="NormalTextRun SCXW200081761 BCX0">vôtre</span><span class="NormalTextRun SCXW200081761 BCX0">, </span><span class="NormalTextRun SCXW200081761 BCX0">et ce</span><span class="NormalTextRun SCXW200081761 BCX0">,</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">jusqu</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> la </span><span class="NormalTextRun SCXW200081761 BCX0">dernière</span><span class="NormalTextRun SCXW200081761 BCX0"> ligne de code.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Une librairie d’assets, eux aussi sous licence MIT, est intégrée ; ils peuvent dont être librement incorporés à vos projets.</span><span class="NormalTextRun SCXW200081761 BCX0"> Les </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">assets</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> comprennent des scripts </span><span class="NormalTextRun SCXW200081761 BCX0">add</span><span class="NormalTextRun SCXW200081761 BCX0">&#8211;</span><span class="NormalTextRun SCXW200081761 BCX0">ons</span><span class="NormalTextRun SCXW200081761 BCX0">,</span><span class="NormalTextRun SCXW200081761 BCX0"> outils</span><span class="NormalTextRun SCXW200081761 BCX0"> et </span><span class="NormalTextRun SCXW200081761 BCX0">autres pouvant</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">être</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun CommentStart CommentHighlightPipeRest CommentHighlightRest CommentImportant SCXW200081761 BCX0">inclus</span><span class="NormalTextRun CommentHighlightRest CommentImportant SCXW200081761 BCX0"> </span><span class="NormalTextRun CommentHighlightPipeRest SCXW200081761 BCX0">a</span><span class="NormalTextRun SCXW200081761 BCX0">ux</span><span class="NormalTextRun SCXW200081761 BCX0"> projets GODOT.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Le moteur permet de coder </span><span class="NormalTextRun SCXW200081761 BCX0">le langage</span><span class="NormalTextRun SCXW200081761 BCX0"> de son choix, mais propose </span><span class="NormalTextRun SCXW200081761 BCX0">également</span><span class="NormalTextRun SCXW200081761 BCX0"> son </span><span class="NormalTextRun SCXW200081761 BCX0">langage</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">intégré</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">:</span><span class="NormalTextRun SCXW200081761 BCX0"> le </span><span class="NormalTextRun SCXW200081761 BCX0">GDScript</span><span class="NormalTextRun SCXW200081761 BCX0">. Le </span><span class="NormalTextRun SCXW200081761 BCX0">GDScript</span><span class="NormalTextRun SCXW200081761 BCX0"> s</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">inspire du python dans sa </span><span class="NormalTextRun SCXW200081761 BCX0">syntaxe</span><span class="NormalTextRun SCXW200081761 BCX0">, la philosophie de </span><span class="NormalTextRun SCXW200081761 BCX0">celui-</span><span class="NormalTextRun SCXW200081761 BCX0">ci</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">:</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">développer</span><span class="NormalTextRun SCXW200081761 BCX0"> des jeux </span><span class="NormalTextRun SCXW200081761 BCX0">vidéo</span><span class="NormalTextRun SCXW200081761 BCX0"> en tapant le moins de code possible.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Le </span><span class="NormalTextRun SCXW200081761 BCX0">GD</span><span class="NormalTextRun SCXW200081761 BCX0">Script</span><span class="NormalTextRun SCXW200081761 BCX0"> est un langage </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> ty</span><span class="NormalTextRun SCXW200081761 BCX0">page dyn</span><span class="NormalTextRun SCXW200081761 BCX0">amique, et porte donc les avantages de ce</span><span class="NormalTextRun SCXW200081761 BCX0"> dernier</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">:</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></p>
<ul>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">p</span><span class="NormalTextRun SCXW200081761 BCX0">lus facile d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">accès?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">p</span><span class="NormalTextRun SCXW200081761 BCX0">lus facile </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">écrire</span><span class="NormalTextRun SCXW200081761 BCX0"> et modifier</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">p</span><span class="NormalTextRun SCXW200081761 BCX0">eu</span><span class="NormalTextRun SCXW200081761 BCX0"> d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">encombrement et donc plus facile </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> lire pour les </span><span class="NormalTextRun SCXW200081761 BCX0">débutants</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">p</span><span class="NormalTextRun SCXW200081761 BCX0">as de compilation</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">t</span><span class="NormalTextRun SCXW200081761 BCX0">emps d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">exécution</span><span class="NormalTextRun SCXW200081761 BCX0"> minimal</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">t</span><span class="NormalTextRun SCXW200081761 BCX0">ypage</span><span class="NormalTextRun SCXW200081761 BCX0"> ad hoc</span><span class="NormalTextRun SCXW200081761 BCX0">.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
</ul>
<p><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Mais on y retrouve aussi </span><span class="NormalTextRun SCXW200081761 BCX0">s</span><span class="NormalTextRun SCXW200081761 BCX0">es</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">inconvénients</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">:</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></p>
<ul>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">m</span><span class="NormalTextRun SCXW200081761 BCX0">oins performant</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">p</span><span class="NormalTextRun SCXW200081761 BCX0">lus difficile </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> refacto</span><span class="NormalTextRun SCXW200081761 BCX0">riser</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">les erreurs </span><span class="NormalTextRun SCXW200081761 BCX0">qui </span><span class="NormalTextRun SCXW200081761 BCX0">seraient</span><span class="NormalTextRun SCXW200081761 BCX0"> normalement </span><span class="NormalTextRun SCXW200081761 BCX0">captées</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> la compilation le sont seulement au </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">runtime</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> puisque l</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">analyse du typage est moins stricte</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">moindre</span><span class="NormalTextRun SCXW200081761 BCX0"> de </span><span class="NormalTextRun SCXW200081761 BCX0">flexibilité</span><span class="NormalTextRun SCXW200081761 BCX0"> pour la </span><span class="NormalTextRun SCXW200081761 BCX0">complétion</span><span class="NormalTextRun SCXW200081761 BCX0"> de code</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">du au</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">typage de certaines </span><span class="NormalTextRun SCXW200081761 BCX0">variables</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">au </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">run</span><span class="NormalTextRun SCXW200081761 BCX0">time</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
</ul>
<p><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Maintenant que mon choix est fait, c</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est parti pour la </span><span class="NormalTextRun SCXW200081761 BCX0">jam</span><span class="NormalTextRun SCXW200081761 BCX0">. C</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est un </span><span class="NormalTextRun SCXW200081761 BCX0">évènement</span><span class="NormalTextRun SCXW200081761 BCX0"> en ligne, donc on se rejoint tous sur </span><span class="NormalTextRun SCXW200081761 BCX0">D</span><span class="NormalTextRun SCXW200081761 BCX0">iscord, et on attend tous avec impatience </span><span class="NormalTextRun SCXW200081761 BCX0">le thème secret</span><span class="NormalTextRun SCXW200081761 BCX0">…</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Une fois le top </span><span class="NormalTextRun SCXW200081761 BCX0">départ</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">donné</span><span class="NormalTextRun SCXW200081761 BCX0">, j</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">apprends</span><span class="NormalTextRun SCXW200081761 BCX0"> que le </span><span class="NormalTextRun SCXW200081761 BCX0">thème</span><span class="NormalTextRun SCXW200081761 BCX0"> de la </span><span class="NormalTextRun SCXW200081761 BCX0">jam</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">porte </span><span class="NormalTextRun SCXW200081761 BCX0">sur</span><span class="NormalTextRun SCXW200081761 BCX0"> les dinosaures aquatiques. Pas de chance, </span><span class="NormalTextRun SCXW200081761 BCX0">sur </span><span class="NormalTextRun SCXW200081761 BCX0">les quelques </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">sp</span><span class="NormalTextRun SCXW200081761 BCX0">rites</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> et </span><span class="NormalTextRun SCXW200081761 BCX0">décors</span><span class="NormalTextRun SCXW200081761 BCX0"> que j</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">ai pu </span><span class="NormalTextRun SCXW200081761 BCX0">préparer</span><span class="NormalTextRun SCXW200081761 BCX0">, aucun ne rentre dans le </span><span class="NormalTextRun SCXW200081761 BCX0">thème</span><span class="NormalTextRun SCXW200081761 BCX0">…</span><span class="NormalTextRun SCXW200081761 BCX0"> J</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">ai bien un </span><span class="NormalTextRun SCXW200081761 BCX0">ptéranodon</span><span class="NormalTextRun SCXW200081761 BCX0"> qui aurait pu </span><span class="NormalTextRun SCXW200081761 BCX0">pêcher</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">quelques poissons</span><span class="NormalTextRun SCXW200081761 BCX0"> mais je n</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">avais pas du tout ce genre de jeu en </span><span class="NormalTextRun SCXW200081761 BCX0">tête</span><span class="NormalTextRun SCXW200081761 BCX0">. On repart donc de </span><span class="NormalTextRun SCXW200081761 BCX0">zéro</span><span class="NormalTextRun SCXW200081761 BCX0">.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Première</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">étape</span><span class="NormalTextRun SCXW200081761 BCX0">?:</span><span class="NormalTextRun SCXW200081761 BCX0"> trouver un concept</span><span class="NormalTextRun SCXW200081761 BCX0">.</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">Je</span><span class="NormalTextRun SCXW200081761 BCX0"> commence </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> plancher sur un concept d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">aquarium interactif</span><span class="NormalTextRun SCXW200081761 BCX0">,</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> produire quelques </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">sprites</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">, </span><span class="NormalTextRun SCXW200081761 BCX0">à </span><span class="NormalTextRun SCXW200081761 BCX0">imaginer les </span><span class="NormalTextRun SCXW200081761 BCX0">différentes</span><span class="NormalTextRun SCXW200081761 BCX0"> interactions entre eux.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Je me lance sur un tuto de base de jeux en 2D, rien </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> voir avec mon concept</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun CommentStart CommentHighlightPipeClicked CommentHighlightClicked CommentImportant SCXW200081761 BCX0">ini</span><span class="NormalTextRun CommentHighlightClicked CommentImportant SCXW200081761 BCX0">tial</span><span class="NormalTextRun CommentHighlightClicked CommentImportant SCXW200081761 BCX0"> </span><span class="NormalTextRun CommentHighlightPipeClicked SCXW200081761 BCX0">mais je me dis que je trouverai bien un moyen.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Au bout de quelques jours les autres participants </span><span class="NormalTextRun SCXW200081761 BCX0">commencent</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">déjà</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> parler du </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">core</span><span class="NormalTextRun SCXW200081761 BCX0"> gameplay</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> et de menus </span><span class="NormalTextRun SCXW200081761 BCX0">terminés</span><span class="NormalTextRun SCXW200081761 BCX0">. De mon </span><span class="NormalTextRun SCXW200081761 BCX0">côté</span><span class="NormalTextRun SCXW200081761 BCX0"> j</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">arrive </span><span class="NormalTextRun SCXW200081761 BCX0">à prendre</span><span class="NormalTextRun SCXW200081761 BCX0"> l</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">outil en main assez rapidement, le tuto a vite </span><span class="NormalTextRun SCXW200081761 BCX0">été</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">assimilé</span><span class="NormalTextRun SCXW200081761 BCX0">. Je prends conscience néanmoins </span><span class="NormalTextRun SCXW200081761 BCX0">que</span><span class="NormalTextRun SCXW200081761 BCX0"> ce qui va me prendre le plus de temps</span><span class="NormalTextRun SCXW200081761 BCX0">,</span><span class="NormalTextRun SCXW200081761 BCX0"> ce sont la production des </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">sprites</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> et </span><span class="NormalTextRun SCXW200081761 BCX0">les </span><span class="NormalTextRun SCXW200081761 BCX0">différentes animations pour rendre tout ça vivant.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">L</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">heure tourne et je n</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">ai toujours pas pu sortir de </span><span class="NormalTextRun SCXW200081761 BCX0">première</span><span class="NormalTextRun SCXW200081761 BCX0"> version du jeu</span><span class="NormalTextRun SCXW200081761 BCX0">…</span><span class="NormalTextRun SCXW200081761 BCX0"> De l</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">autre </span><span class="NormalTextRun SCXW200081761 BCX0">côté,</span><span class="NormalTextRun SCXW200081761 BCX0"> les autres ont </span><span class="NormalTextRun SCXW200081761 BCX0">déjà</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">commencé</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">leurs premières soumissions</span><span class="NormalTextRun SCXW200081761 BCX0">. Les personnes bossant en </span><span class="NormalTextRun SCXW200081761 BCX0">équipe</span><span class="NormalTextRun SCXW200081761 BCX0"> sortent </span><span class="NormalTextRun SCXW200081761 BCX0">même</span><span class="NormalTextRun SCXW200081761 BCX0"> des projets assez ambitieux, que vous pouvez retrouver [ici](https://itch.io/jam/dinojam5/entries).</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Et </span><span class="NormalTextRun SCXW200081761 BCX0">malgré</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">tous</span><span class="NormalTextRun SCXW200081761 BCX0"> mes efforts, impossible de soumettre mon jeu avant la fin de la jam</span><span class="NormalTextRun SCXW200081761 BCX0">…</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">J</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">ai </span><span class="NormalTextRun SCXW200081761 BCX0">malgré</span><span class="NormalTextRun SCXW200081761 BCX0"> tout pu apprendre comment </span><span class="NormalTextRun SCXW200081761 BCX0">développer</span><span class="NormalTextRun SCXW200081761 BCX0"> un jeu en GODOT</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">:</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Le moteur </span><span class="NormalTextRun SCXW200081761 BCX0">fonctionne</span><span class="NormalTextRun SCXW200081761 BCX0"> sur un </span><span class="NormalTextRun SCXW200081761 BCX0">système</span><span class="NormalTextRun SCXW200081761 BCX0"> de </span><span class="NormalTextRun SCXW200081761 BCX0">scènes</span><span class="NormalTextRun SCXW200081761 BCX0">, chacune </span><span class="NormalTextRun SCXW200081761 BCX0">représentant</span><span class="NormalTextRun SCXW200081761 BCX0"> les </span><span class="NormalTextRun SCXW200081761 BCX0">différentes</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">entités</span><span class="NormalTextRun SCXW200081761 BCX0"> du jeu. </span><span class="NormalTextRun SCXW200081761 BCX0">Ça</span><span class="NormalTextRun SCXW200081761 BCX0"> peut </span><span class="NormalTextRun SCXW200081761 BCX0">être</span><span class="NormalTextRun SCXW200081761 BCX0"> un personnage, un ennemi, un menu ou </span><span class="NormalTextRun SCXW200081761 BCX0">la</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">scène</span><span class="NormalTextRun SCXW200081761 BCX0"> principale du jeu.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Prenons l</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">exemple d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">un personnage</span><span class="NormalTextRun SCXW200081761 BCX0">.</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">La</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">scène</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">pourra</span><span class="NormalTextRun SCXW200081761 BCX0"> contenir</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">:</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></p>
<ul>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">la </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">hitbox</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: les limites dans </span><span class="NormalTextRun SCXW200081761 BCX0">lesquelles</span><span class="NormalTextRun SCXW200081761 BCX0"> on </span><span class="NormalTextRun SCXW200081761 BCX0">considère</span><span class="NormalTextRun SCXW200081761 BCX0"> que le personnage entre en collision avec </span><span class="NormalTextRun SCXW200081761 BCX0">une</span><span class="NormalTextRun SCXW200081761 BCX0"> autre </span><span class="NormalTextRun SCXW200081761 BCX0">entité</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">le </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">sprite</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> (2D), le </span><span class="NormalTextRun SCXW200081761 BCX0">modèle</span><span class="NormalTextRun SCXW200081761 BCX0"> (3D)</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: la partie visible</span><span class="NormalTextRun SCXW200081761 BCX0"> de la </span><span class="NormalTextRun SCXW200081761 BCX0">scène</span><span class="NormalTextRun SCXW200081761 BCX0">?;</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span></span></li>
<li><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">la </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">p</span><span class="NormalTextRun SCXW200081761 BCX0">hysic</span><span class="NormalTextRun SCXW200081761 BCX0"> box</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: la </span><span class="NormalTextRun SCXW200081761 BCX0">représentation</span><span class="NormalTextRun SCXW200081761 BCX0"> physique de la </span><span class="NormalTextRun SCXW200081761 BCX0">scène</span><span class="NormalTextRun SCXW200081761 BCX0">, ce </span><span class="NormalTextRun SCXW200081761 BCX0">qui</span><span class="NormalTextRun SCXW200081761 BCX0"> permettra </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> la </span><span class="NormalTextRun SCXW200081761 BCX0">scène</span><span class="NormalTextRun SCXW200081761 BCX0"> d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">être</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">influencée</span><span class="NormalTextRun SCXW200081761 BCX0"> par la physique du jeu. </span><span class="NormalTextRun SCXW200081761 BCX0">Être</span><span class="NormalTextRun SCXW200081761 BCX0"> soumise </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> la </span><span class="NormalTextRun SCXW200081761 BCX0">gravité</span><span class="NormalTextRun SCXW200081761 BCX0">, </span><span class="NormalTextRun SCXW200081761 BCX0">rebondir</span><span class="NormalTextRun SCXW200081761 BCX0"> sur une surface, en </span></span></li>
</ul>
<p><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">bref </span><span class="NormalTextRun SCXW200081761 BCX0">modéliser</span><span class="NormalTextRun SCXW200081761 BCX0"> les forces pouvant </span><span class="NormalTextRun SCXW200081761 BCX0">être</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">appliquées</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> l</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">objet.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Ces </span><span class="NormalTextRun SCXW200081761 BCX0">différentes</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">entités</span><span class="NormalTextRun SCXW200081761 BCX0"> servent d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">interface</span><span class="NormalTextRun SCXW200081761 BCX0"> visuelle ou comportementale</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> notre personnage</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Elles exposent des </span><span class="NormalTextRun SCXW200081761 BCX0">propriétés</span><span class="NormalTextRun SCXW200081761 BCX0"> qui permettent de configurer ces </span><span class="NormalTextRun SCXW200081761 BCX0">entités</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: leur </span><span class="NormalTextRun SCXW200081761 BCX0">poids</span><span class="NormalTextRun SCXW200081761 BCX0">, leur position, leur vitesse de </span><span class="NormalTextRun SCXW200081761 BCX0">déplacement</span><span class="NormalTextRun SCXW200081761 BCX0">.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Elles</span><span class="NormalTextRun SCXW200081761 BCX0"> exposent aussi des </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">triggers</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">: les </span><span class="NormalTextRun SCXW200081761 BCX0">façons</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">dont</span><span class="NormalTextRun SCXW200081761 BCX0"> on peut interagir avec ces </span><span class="NormalTextRun SCXW200081761 BCX0">entités</span><span class="NormalTextRun SCXW200081761 BCX0">. Par exemple</span><span class="NormalTextRun SCXW200081761 BCX0">,</span><span class="NormalTextRun SCXW200081761 BCX0"> un </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">trigger</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0"> de collision</span><span class="NormalTextRun SCXW200081761 BCX0"> appelle une </span><span class="NormalTextRun SCXW200081761 BCX0">méthode</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">décrivant</span><span class="NormalTextRun SCXW200081761 BCX0"> le comportement de notre </span><span class="NormalTextRun SCXW200081761 BCX0">entité</span><span class="NormalTextRun SCXW200081761 BCX0"> lorsqu</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">elle entre en </span><span class="NormalTextRun SCXW200081761 BCX0">collision avec</span><span class="NormalTextRun SCXW200081761 BCX0"> une autre </span><span class="NormalTextRun SCXW200081761 BCX0">entité</span><span class="NormalTextRun SCXW200081761 BCX0">. Cette </span><span class="NormalTextRun SCXW200081761 BCX0">méthode</span><span class="NormalTextRun SCXW200081761 BCX0"> pourrait par exemple se comporter </span><span class="NormalTextRun SCXW200081761 BCX0">différemment</span><span class="NormalTextRun SCXW200081761 BCX0"> lors de la collision avec un mur de brique ou un mur de bois.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">S</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">il fallait </span><span class="NormalTextRun SCXW200081761 BCX0">résumer</span><span class="NormalTextRun SCXW200081761 BCX0"> cette </span><span class="NormalTextRun SCXW200081761 BCX0">expérience</span><span class="NormalTextRun SCXW200081761 BCX0"> en un mot, c</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est </span><span class="NormalTextRun SCXW200081761 BCX0">très</span><span class="NormalTextRun SCXW200081761 BCX0"> clairement </span><span class="NormalTextRun SCXW200081761 BCX0">«?</span><span class="NormalTextRun SCXW200081761 BCX0">intense</span><span class="NormalTextRun SCXW200081761 BCX0">?»</span><span class="NormalTextRun SCXW200081761 BCX0">. On imagine assez difficilement </span><span class="NormalTextRun SCXW200081761 BCX0">tous</span><span class="NormalTextRun SCXW200081761 BCX0"> les tenants et </span><span class="NormalTextRun SCXW200081761 BCX0">aboutissants</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">de la </span><span class="NormalTextRun SCXW200081761 BCX0">création</span><span class="NormalTextRun SCXW200081761 BCX0"> d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">un jeu </span><span class="NormalTextRun SCXW200081761 BCX0">vidéo</span><span class="NormalTextRun SCXW200081761 BCX0">. </span><span class="NormalTextRun SCXW200081761 BCX0">Malgré</span><span class="NormalTextRun SCXW200081761 BCX0"> la </span><span class="NormalTextRun SCXW200081761 BCX0">facilité</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">utilisation de GODOT et les </span><span class="NormalTextRun SCXW200081761 BCX0">fonctionnalités</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">générales</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">pré-implémentées</span><span class="NormalTextRun SCXW200081761 BCX0">, cela </span><span class="NormalTextRun SCXW200081761 BCX0">prend</span><span class="NormalTextRun SCXW200081761 BCX0"> quand </span><span class="NormalTextRun SCXW200081761 BCX0">même</span><span class="NormalTextRun SCXW200081761 BCX0"> pas mal de temps de configurer toutes les interactions possibles entre nos </span><span class="NormalTextRun SCXW200081761 BCX0">différentes</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">scènes</span><span class="NormalTextRun SCXW200081761 BCX0">, les comportements internes de chacune. Le fait de participer </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> une jam en solitaire est un </span><span class="NormalTextRun SCXW200081761 BCX0">peu</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">décourageant</span><span class="NormalTextRun SCXW200081761 BCX0">, surtout lorsqu</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">on doit faire </span><span class="NormalTextRun SCXW200081761 BCX0">des </span><span class="NormalTextRun SCXW200081761 BCX0">tâches</span><span class="NormalTextRun SCXW200081761 BCX0"> dont on est loin d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">être</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">spécialiste</span><span class="NormalTextRun SCXW200081761 BCX0">.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW200081761 BCX0"><span class="SCXW200081761 BCX0"> </span><br class="SCXW200081761 BCX0" /></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">Néanmoins,</span><span class="NormalTextRun SCXW200081761 BCX0"> c</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">est une excellente </span><span class="NormalTextRun SCXW200081761 BCX0">expérience</span><span class="NormalTextRun SCXW200081761 BCX0"> pour se motiver </span><span class="NormalTextRun SCXW200081761 BCX0">à </span><span class="NormalTextRun SCXW200081761 BCX0">apprendre rapidement un nouveau </span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">skill</span></span><span class="TextRun SCXW200081761 BCX0" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW200081761 BCX0">, </span><span class="NormalTextRun SCXW200081761 BCX0">la</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">fenêtre</span><span class="NormalTextRun SCXW200081761 BCX0"> de temps courte obligeant </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> s</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">acharner sur le sujet, tout en </span><span class="NormalTextRun SCXW200081761 BCX0">évitant</span><span class="NormalTextRun SCXW200081761 BCX0"> d</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">en arriver </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> se </span><span class="NormalTextRun SCXW200081761 BCX0">dégouter</span><span class="NormalTextRun SCXW200081761 BCX0">. Je participerai probablement </span><span class="NormalTextRun SCXW200081761 BCX0">à</span><span class="NormalTextRun SCXW200081761 BCX0"> une nouvelle </span><span class="NormalTextRun SCXW200081761 BCX0">jam</span><span class="NormalTextRun SCXW200081761 BCX0"> mais cette fois en </span><span class="NormalTextRun SCXW200081761 BCX0">équipe</span><span class="NormalTextRun SCXW200081761 BCX0">, </span><span class="NormalTextRun SCXW200081761 BCX0">après</span><span class="NormalTextRun SCXW200081761 BCX0"> tout c</span><span class="NormalTextRun SCXW200081761 BCX0">’</span><span class="NormalTextRun SCXW200081761 BCX0">était</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">déjà</span><span class="NormalTextRun SCXW200081761 BCX0"> ma </span><span class="NormalTextRun SCXW200081761 BCX0">deuxième</span><span class="NormalTextRun SCXW200081761 BCX0"> </span><span class="NormalTextRun SCXW200081761 BCX0">participation</span><span class="NormalTextRun SCXW200081761 BCX0">?</span><span class="NormalTextRun SCXW200081761 BCX0">!</span></span><span class="EOP SCXW200081761 BCX0" data-ccp-props="{}"> </span></p>
<blockquote><p><strong>Liens Utiles : </strong></p>
<ul>
<li>[Dino JAM 5](https://itch.io/jam/dinojam5)</li>
<li>[Submissions](https://itch.io/jam/dinojam5/entries)</li>
<li>[Jam resuts](https://itch.io/jam/dinojam5/results)</li>
<li>[Repo du jeu cree](https://github.com/Feuzme/dodge-the-dinos)</li>
</ul>
</blockquote>
<p>L’article <a href="https://ekite.info/2026/04/08/dino-jam-5/">DINO JAM 5</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4654</post-id>	</item>
		<item>
		<title>? J&#8217;ai vibe codé mon app en 5 jours : entre magie et consommation</title>
		<link>https://ekite.info/2026/02/08/jai-vibe-code-mon-app-en-5-jours/</link>
		
		<dc:creator><![CDATA[Vianney LEMAN]]></dc:creator>
		<pubDate>Sun, 08 Feb 2026 14:55:10 +0000</pubDate>
				<category><![CDATA[IA]]></category>
		<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=4458</guid>

					<description><![CDATA[<p>L’article <a href="https://ekite.info/2026/02/08/jai-vibe-code-mon-app-en-5-jours/">? J&rsquo;ai vibe codé mon app en 5 jours : entre magie et consommation</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="et_pb_section et_pb_section_0 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_0">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_0  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_0  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><h2><b>Une sacrée aventure</b></h2>
<p><span style="font-weight: 400;">Bon, on va se dire les choses franchement : après des années de <strong>frustration</strong> en tant que CEO à avoir des idées sans pouvoir les coder, quand j’ai vu arriver l’IA, je me suis dit qu’enfin je pourrais moi aussi <strong>transformer mes idées en projet sans savoir coder </strong>! </span></p>
<p><span style="font-weight: 400;">J’ai passé 5 jours à « vibe coder » avec plein de bonnes intentions. C&rsquo;était une expérience avec des hauts et des bas, mais <strong>pour la première fois, MES idées devenaient du code</strong>. Et ça a marché. Je vous partage tout ça.</span></p>
<p>&nbsp;</p>
<h2><b>Suivez cet article en vidéo</b></h2>
<p><span style="font-weight: 400;">Vivez cet article avec moi en <strong>3 vidéos</strong>, disponibles ici:</span></p>
<table style="height: 150px; width: 837px;">
<tbody>
<tr style="height: 51px;">
<td style="height: 51px; width: 262.413px; text-align: center;"><a href="https://www.youtube.com/watch?v=UWQDMwGgsR4"><span style="font-weight: 400;">Vibe coding story 1: <strong>La préparation!</strong></span></a></td>
<td style="width: 287.538px; text-align: center;"><a href="https://www.youtube.com/watch?v=C4Zvl2JajqU"><b><span style="font-weight: 400;">Vibe coding story 2: <strong>On génère notre app</strong></span></b></a></td>
<td style="width: 268.25px; text-align: center;"><a href="https://www.youtube.com/watch?v=Bfz0dL1zz-Y"><b><span style="font-weight: 400;">Vibe coding story 3: <strong>Les conclusions</strong></span></b></a></td>
</tr>
<tr style="height: 99px;">
<td style="height: 99px; width: 262.413px; text-align: center;"><a href="https://www.youtube.com/watch?v=UWQDMwGgsR4"><img loading="lazy" decoding="async" class="alignnone wp-image-4473" src="https://ekite.info/wp-content/uploads/2025/11/VIBE-CODING-1-PREPARATION-300x169.jpg" alt="" width="225" height="127" /></a></td>
<td style="width: 287.538px; text-align: center;"><a href="https://www.youtube.com/watch?v=C4Zvl2JajqU"><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignnone wp-image-4474" src="https://ekite.info/wp-content/uploads/2025/11/VIBE-CODING-2-GENERATION-300x169.jpg" alt="" width="225" height="127" /></span></a></td>
<td style="width: 268.25px; text-align: center;"><a href="https://www.youtube.com/watch?v=Bfz0dL1zz-Y"><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignnone wp-image-4475" src="https://ekite.info/wp-content/uploads/2025/11/VIBE-CODING-3-CONCLUSIONS-300x169.jpg" alt="" width="225" height="127" /></span></a></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><b>Le déclic : la frustration de CEO</b></h2>
<p><i><span data-contrast="auto">Flashback</span></i><span data-contrast="auto">?: dans une ancienne vie, j’étais CEO de ma boîte. Et ma plus grosse frustration??</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Je voyais TOUT?: les </span><i><span data-contrast="auto">user journeys</span></i><span data-contrast="auto">, les </span><i><span data-contrast="auto">features</span></i><span data-contrast="auto">, les versions, les écrans de mon produit… Je savais exactement ce qu’il me fallait.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Mais voilà?: </span><b><span data-contrast="auto">je ne savais pas coder</span></b><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">C’était frustrant. Être dépendant des devs, ne pas avoir assez de budget pour avoir une vraie équipe… J’avais l’impression d’avoir une Ferrari dans la tête et un vélo pour avancer.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Et puis?</span><b><span data-contrast="auto">l’IA est arrivée</span></b><span data-contrast="auto">. Elle s’est?</span><b><span data-contrast="auto">améliorée</span></b><span data-contrast="auto">. Et maintenant, apparemment,?</span><b><span data-contrast="auto">elle sait coder</span></b><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">L’idée du?</span><b><i><span data-contrast="auto">vibe coding</span></i></b><span data-contrast="auto">?c’est de «?</span><b><span data-contrast="auto">parler naturellement à une IA qui code tes idées pour toi</span></b><span data-contrast="auto">?». Pas forcément besoin de plan précis, pas de structure rigide. Tu lances ton idée, l’</span><b><span data-contrast="auto">IA code, ça bug, vous corrigez ensemble</span></b><span data-contrast="auto">, et hop on recommence. </span><b><span data-contrast="auto">Qu’est-ce qui pourrait mal se passer??</span></b><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Pour la première fois de ma vie, je pouvais passer de l’idée au code. Direct. Et?</span><b><span data-contrast="auto">itérer</span></b><span data-contrast="auto">?plusieurs fois?</span><b><span data-contrast="auto">par heure</span></b><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Alors vous me connaissez, en tant que </span><i><span data-contrast="auto">product owner</span></i><span data-contrast="auto">, je me suis préparé, j’ai créé un plan précis, étape par étape… que je n’ai pas du tout suivi?! L’IA est imprévisible, je me suis laissé porter et même emporté. Ça fait partie de l’expérience… et bizarrement… ça marchait.?</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<p><i><span data-contrast="auto">Alors oui, j’ai découvert après coup que le?</span></i><b><i><span data-contrast="auto">context engineering</span></i></b><i><span data-contrast="auto">?existe et que c’est plus efficace. Mais pour un ex-CEO frustré qui voulait juste voir ses idées prendre vie… le </span></i><span data-contrast="auto">vibe coding</span><i><span data-contrast="auto">, c’était une première libération. </span></i><i><span data-contrast="auto">?</span></i><span data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<h2><b>Avant de commencer Mon setup</b></h2>
<h3></h3>
<h3><strong>Les outils que j’ai utilisés?: </strong></h3>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-4468 " src="https://ekite.info/wp-content/uploads/2025/11/2025-11-13-09_36_52--1024x294.jpg" alt="" width="724" height="208" /></p>
<ul>
<li style="font-weight: 400;" aria-level="1">
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Cursor</span></b><span data-contrast="auto">?: l’IDE avec IA intégrée le plus connu (plan pro + 5?US$ de crédits Anthropic = 40?US$ au total).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Claude</span></b><span data-contrast="auto">?: mon architecte personnel (plan pro 20?US$).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">ChatGPT?</span></b><span data-contrast="auto">: mon illustrateur (plan gratuit).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">GitHub</span></b><span data-contrast="auto">?: pour stocker mon code (de qualité discutable) –?</span><a href="https://github.com/ekit3/PO-Bingo"><span data-contrast="none">Voir le repo PO Bingo</span></a><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Petit conseil?: prenez directement le plan pro de Cursor. Moi j’ai voulu faire le malin avec la version gratuite… double passage en caisse et galères en prime?!</span><span data-ccp-props="{}"> </span></li>
</ul>
<p>&nbsp;</p>
<h2><strong>? Le workflow qui a (presque) tout changé </strong></h2>
<h3><img loading="lazy" decoding="async" class="alignnone wp-image-4465 " src="https://ekite.info/wp-content/uploads/2025/11/Vibe-coding-workflow-plan-1024x848.jpg" alt="" width="747" height="619" /></h3>
<p>&nbsp;</p>
<h3><b><span data-contrast="auto">Étape 1?: L’idéation avec Claude</span></b><span data-ccp-props="{}"> </span></h3>
<p><span data-contrast="auto">L’idée était simple?: créer une app à la Duolingo pour apprendre des choses utiles aux </span><i><span data-contrast="auto">product owners</span></i><span data-contrast="auto"> pendant 3 minutes par jour.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Alors c’est ce que j’ai demandé à </span><a href="http://claude.ai/"><span data-contrast="none">Claude.ai</span></a><span data-contrast="auto">. Sans rien d’autre.</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Des specs techniques?? Je ne suis pas développeur.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Des écrans dessinés?? Je ne suis pas designer.</span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Un nom d’application?? J’en avais des milliers.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Des </span><i><span data-contrast="auto">user journeys</span></i><span data-contrast="auto">?? Mon idée était trop vague.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Je voulais surtout</span><b><span data-contrast="auto">?voir où tout ça allait nous emmener</span></b><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Et je n’ai pas été déçu?! Claude m’a sorti?:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">une architecture complète?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">les technos à utiliser (React, Vite, Tailwind… que je ne connais pas)?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">des suggestions de </span><i><span data-contrast="auto">features</span></i><span data-contrast="auto"> auxquelles je n’avais même pas pensé.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">C’était dingue?: mon idée floue devenait un vrai projet structuré. En direct. J’avais l’impression que quelqu’un travaillait avec moi sur mes idées, comme une équipe?!</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Mon retour d’expérience</span></b><span data-contrast="auto">?: l’IA est géniale pour transformer une idée vague en plan concret. Mais attention, j’ai perdu 1?heure parce qu’elle m’a fait rêver à partir sur des choses géniales mais beaucoup trop complexes. Même avec une idée floue, donnez le maximum de contexte.</span><span data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<h3><b>Étape 2 : La préparation (un si beau plan jamais exécuté)</b></h3>
<table>
<tbody>
<tr style="height: 51px;">
<td style="height: 51px; width: 262.413px; text-align: center;"><a href="https://www.youtube.com/watch?v=UWQDMwGgsR4"><img loading="lazy" decoding="async" class="alignnone wp-image-4473" src="https://ekite.info/wp-content/uploads/2025/11/VIBE-CODING-1-PREPARATION-300x169.jpg" alt="" width="225" height="127" /></a></td>
<td style="width: 287.538px; text-align: center;"><span style="font-weight: 400;"><strong><span style="color: #ff0000;">Vivez cette étape en live avec la vidéo</span></strong> </span></p>
<p><a href="https://www.youtube.com/watch?v=UWQDMwGgsR4"><span style="font-weight: 400;">Vibe coding story 1: <strong>La préparation!</strong></span></a></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span data-contrast="auto">PO organisé et pour bien préparer cette expérience, j’ai créé?:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">un </span><i><span data-contrast="auto">workflow</span></i><span data-contrast="auto"> en 7 étapes?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">une liste des outils d’IA que j’allais utiliser à chaque étape.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Ce </span><i><span data-contrast="auto">workflow</span></i><span data-contrast="auto"> précis me permettait de construire une application de A à Z en passant par toutes les étapes critiques sans rien oublier.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Ça, c’est dans la théorie, car l’IA m’a emmené autre part. C’est à la fois très bien, car ça ouvre des portes, mais aussi très mal, </span>ça m’a facilement détourné de là où je voulais aller.</p>
<p>&nbsp;</p>
<p><b><span data-contrast="auto">Mon retour d’expérience</span></b><span data-contrast="auto">?: ici j’ai fait exprès de ne pas recadrer pour voir où est-ce que cela nous emmenait, ça faisait partie de la découverte et de ce que je voulais vivre. Et partager. Les phrases «?Parfait?!?», «?Super?!?», «?Très bonne idée?!?», «?Tu as totalement raison?!?», etc. que l’IA génère pour des interactions positives sont trompeuses et participent au fait de dévier de là où je voulais aller au départ.</span><span data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<h3><b>Étape 3 : L&rsquo;exécution avec Cursor (le vrai vibe coding commence)</b></h3>
<table>
<tbody>
<tr style="height: 51px;">
<td style="height: 51px; width: 262.413px; text-align: center;"><a href="https://www.youtube.com/watch?v=C4Zvl2JajqU"><img loading="lazy" decoding="async" class="alignnone wp-image-4474" src="https://ekite.info/wp-content/uploads/2025/11/VIBE-CODING-2-GENERATION-300x169.jpg" alt="" width="225" height="127" /></a></td>
<td style="width: 287.538px; text-align: center;"><span style="font-weight: 400;"><strong><span style="color: #ff0000;">Vivez cette étape en live avec la vidéo</span></strong> </span></p>
<p><a href="https://www.youtube.com/watch?v=C4Zvl2JajqU"><span style="font-weight: 400;">Vibe coding story 2: <strong>On génère notre app</strong></span></a></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span data-contrast="auto">C’est là que ça devient dingue. Cursor génère le code, et moi je regarde, fasciné (au début) puis un peu inquiet (avec de l’expérience).</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<h4><b><span data-contrast="auto">Premier impression?: bluffant </span></b><b><span data-contrast="auto">?</span></b><span data-ccp-props="{}"> </span></h4>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Il explique TOUT en langage humain</span></b><span data-contrast="auto">?– «?Je crée un composant pour afficher les questions.?», «?J’ajoute une logique pour </span><i><span data-contrast="auto">tracker</span></i><span data-contrast="auto"> les bonnes réponses.?»</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Le debug simple</span></b><span data-contrast="auto">?– Quand ça plantait (70?% du temps), il créait des pages de debug spécifiques juste pour isoler le problème.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Le dialogue constant</span></b><span data-contrast="auto">?– «?Peux-tu vérifier si tu vois un bouton bleu???», «?Est-ce que le texte s’affiche maintenant???»</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Un gain de temps monstrueux</span></b><span data-contrast="auto"> – par exemple, si je lui disais?: «?Il me faut 200 questions pour PO avec 3 niveaux de difficulté?», 5 minutes plus tard, j’avais ma base de données complète, formatée, catégorisée. J’aurais mis 5 jours à faire ça à la main.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Il sait me contredire?</span></b><span data-contrast="auto">– Quand mon idée ne semble pas bonne, il me le dit (avec beaucoup de pommade) mais il le fait.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-ccp-props="{}"> </span></p>
<h4><b><span data-contrast="auto">Deuxième impression?: vortex à temps </span></b><b><span data-contrast="auto">??</span></b><span data-ccp-props="{}"> </span></h4>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Parfois 15 minutes d’attente où tu pars chercher un café (ou deux).</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Dans 70?% des cas, le code généré est buggé.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Dans 20?% des cas, le code généré casse autre chose.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Les allers-retours constants?: code ? test ? bug ? fix ? test ? bug…</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Ses phrases mettent toujours l’utilisateur en avant et elles deviennent lourdes?: «?Incroyable?!?»?; «?Super idée?!?»?; «?Mais oui c’est génial?!?»</span><span data-ccp-props="{}"> pour la 100ème fois fait l&rsquo;effet inverse.</span></li>
</ul>
<p><span data-ccp-props="{}"> </span></p>
<h4><b><span data-contrast="auto">Troisième impression?: vortex à tune </span></b><b><span data-contrast="auto">?</span></b><span data-ccp-props="{}"> </span></h4>
<p><span data-contrast="auto">On ne va pas se le cacher, c’est pas donné. Avec mes différentes galères, j’ai dû payer?:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">un abonnement pro à Cursor?: 20?US$ /mois?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">un abonnement pro à Claude?: 20?US$ /mois (inutile pour Cursor mais je ne savais pas)?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">des crédits pour accéder aux API d’Anthropic pour utilisation de Claude dans Cursor Pro (20?US$),</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">soit un total de 60?US$ pour comprendre comment tout ça fonctionne. Une leçon chèrement apprise.</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Mon retour d’expérience</span></b><span data-contrast="auto">?: prenez simplement?</span><b><span data-contrast="auto">Cursor Pro</span></b><span data-contrast="auto">, Claude et d’autres IA sont intégrées, pas besoin du reste.</span></p>
<p>&nbsp;</p>
<h4><b><span data-contrast="auto">Impression finale</span></b><span data-ccp-props="{}"> </span></h4>
<p><span data-contrast="auto">Pour la première fois depuis que j’ai quitté mon rôle de CEO, j’ai pu créer quelque chose de A à Z. Pas une idée complexe avec 50 specs, juste un «?Duolingo pour PO?» qui est devenu réalité. Sans intermédiaire. Sans attendre. Juste moi, une idée vague, et une IA qui structure et code. Et rien que ça, c’est fou.</span><span data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<h4><b><span data-contrast="auto">?</span></b><b><span data-contrast="auto"> Les vraies leçons</span></b></h4>
<p><b><span data-contrast="auto">Ce qui marche vraiment?:</span></b><span data-ccp-props="{}"> </span></p>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Le contexte est ROI</span></b><span data-contrast="auto">?– Sans bon contexte, l’IA fait n’importe quoi.</span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Les prompts optimisés</span></b><span data-contrast="auto">?– Je prompte ? Je demande à une IA d’optimiser ce prompt ? Je demande à une IA d’implémenter ce prompt.?</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">La structure avant tout</span></b><span data-contrast="auto">?– Mes fichiers de structure (architecture, vision, base de données, etc.) ont sauvé le projet.</span><span data-ccp-props="{}"> </span></li>
</ol>
<p><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Ce qui m’a surpris?:</span></b><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">L’IA debug mieux que moi (elle isole, teste, corrige).</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">C’est ultra addictif (j’ai bossé des soirées entières).</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Les erreurs sont des opportunités d’apprentissage et vous rendent plus précis.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">L’IA pose RAREMENT des questions</span></b><span data-contrast="auto">?– Elle ne vérifie pas ses assomptions et son code, même si elle n’a rien compris.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">L’IA structure tes idées floues</span></b><span data-contrast="auto">?– Tu dis «?Duolingo pour PO?», elle te sort un plan complet.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Le piège à éviter?:</span></b><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">L’IA ne te dira jamais?: «?Attends, t’es sûr de ton truc???». Elle exécute. Point. Si tu dis «?fais-moi un bouton qui supprime tout?», elle le fait. Sans confirmation. Sans </span><i><span data-contrast="auto">warning</span></i><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<h4><b><span data-contrast="auto">Mon retour d’expérience</span></b><span data-contrast="auto">?:</span><span data-ccp-props="{}"> </span></h4>
<p><span data-contrast="auto">Faites des sessions de planification. Il existe maintenant un mode «?planification?» pour préparer un sujet avec la base de code à disposition avant de commencer à coder. Durant la préparation, demandez à l’IA de créer un document et pendant le développement de se baser sur ce document.</span><span data-ccp-props="{}"> </span><span data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<h3><b><span data-contrast="auto">Mes workflows finaux?</span></b><span data-ccp-props="{}"> </span></h3>
<h4><b><span data-contrast="auto">Workflow général</span></b><span data-ccp-props="{}"> </span></h4>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Donnez à Claude un MAX de détails sur votre projet.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Demandez quels documents sont indispensables pour commencer le projet.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Travaillez avec lui sur ces documents et demandez-lui de choisir des technologies connues des LLM.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Mettez ces documents dans votre projet (dossier «?docs?» par exemple).</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Dans Cursor, dites-lui de se référer à ces documents avant tout développement.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Avant de demander quelque chose de complexe, demandez à une IA de vous poser des questions et de faire un prompt optimisé.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Mettez ce prompt optimisé dans Cursor et laissez-le travailler.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Si bug ? capture d’écran + prompt de correction avec l’attendu ? Cursor corrige ? Vous testez.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Demandez-lui de commit / merge &amp; répéter.</span><span data-ccp-props="{}"> </span></li>
</ol>
<p><span data-ccp-props="{}"> </span></p>
<h4><b><span data-contrast="auto">Workflow nouvelle fonction</span></b><span data-ccp-props="{}"> </span></h4>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Parlez de votre fonction à une IA ou dans le mode «?Planification?» de Cursor.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Demandez-lui de vous poser des questions si des choses ne sont pas claires.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Demandez-lui de créer un plan ou un prompt optimisé.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Donnez ce prompt à Cursor et regardez-le le générer.</span><span data-ccp-props="{}"> </span></li>
</ol>
<p><span data-ccp-props="{}"> </span></p>
<h4><b><span data-contrast="auto">Workflow débuggage</span></b><span data-ccp-props="{}"> </span></h4>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Faites une capture d’écran du bug.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Détaillez où il se situe (quelle page, quelle partie, titre de la section, etc.).</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Donnez l’état actuel.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Donnez l’état attendu.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Mettez en avant les choses qu’il ne doit PAS toucher.</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Donnez ce prompt à Cursor et regardez-le le corriger.</span><span data-ccp-props="{}"> </span></li>
</ol>
<p><span data-ccp-props="{}"> </span></p>
<h3><b><i><span data-contrast="auto">Vibe coding</span></i></b><b><span data-contrast="auto"> vs </span></b><b><i><span data-contrast="auto">context engineering</span></i></b><b><span data-contrast="auto">?: la vraie différence</span></b><span data-ccp-props="{}"> </span></h3>
<p><span data-contrast="auto">Mettons les choses au clair. Ce que j’ai fait n’est?</span><b><span data-contrast="auto">pas du</span></b><span data-contrast="auto">?</span><b><i><span data-contrast="auto">vibe coding</span></i></b><span data-contrast="auto">?c’est plutôt du?</span><b><i><span data-contrast="auto">context engineering</span></i></b><span data-contrast="auto">?car?:</span><span data-ccp-props="{}"> </span></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">j’avais préparé des documents en amont avec l’aide d’une IA?:</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">base de données?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">vision du projet?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">technologies à utiliser en </span><i><span data-contrast="auto">front</span></i><span data-contrast="auto"> et </span><i><span data-contrast="auto">back</span></i><span data-contrast="auto">?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">architecture,</span><span data-ccp-props="{}"> </span></li>
</ul>
</li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">cela a permis à l’IA d’avoir tout le contexte du projet?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">ce qui a énormément réduit le nombre de bugs et d’hallucinations?;</span><span data-ccp-props="{}"> </span></li>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">cela m’a fait gagner beaucoup de temps et beaucoup de crédit.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p>&nbsp;</p>
<h2><b>Mon analyse perso</b></h2>
<table>
<tbody>
<tr style="height: 51px;">
<td style="height: 51px; width: 262.413px; text-align: center;"><a href="https://www.youtube.com/watch?v=Bfz0dL1zz-Y"><img loading="lazy" decoding="async" class="alignnone wp-image-4475" src="https://ekite.info/wp-content/uploads/2025/11/VIBE-CODING-3-CONCLUSIONS-300x169.jpg" alt="" width="225" height="127" /></a></td>
<td style="width: 287.538px; text-align: center;"><span style="font-weight: 400;"><strong><span style="color: #ff0000;">Vivez cette étape en live avec la vidéo</span></strong> </span></p>
<p><a href="https://www.youtube.com/watch?v=Bfz0dL1zz-Y"><span style="font-weight: 400;">Vibe coding story 3: <strong>Les conclusions</strong></span></a></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h3><b><span data-contrast="auto">Les points forts?:</span></b><span data-ccp-props="{}"> </span></h3>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">C’est incroyable de pouvoir faire des apps sans savoir coder</span></b><span data-contrast="auto">?– Sérieux, après des années de frustration, voir mon idée devenir réalité… magique?!</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">L’IA = Guide bienveillant</span></b><span data-contrast="auto">?– Elle vous prend par la main, vous explique, vous rassure quand ça plante.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">Ça se debug «?tout seul?»</span></b><span data-contrast="auto">?– L’IA analyse, isole le problème, propose la solution. Vous validez, ça roule.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">Un coéquipier qui bosse H24</span></b><span data-contrast="auto">?– Pas de pause-café, pas de congé, juste focus sur VOS idées</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><i><span data-contrast="auto">Learning by doing</span></i></b><span data-contrast="auto">?– Vous comprenez enfin ce que font vos devs.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">Rapidité de prototypage</span></b><span data-contrast="auto">?– 5 jours vs 5 mois avec une équipe classique.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<h3><b><span data-contrast="auto">Les limites?:</span></b><span data-ccp-props="{}"> </span></h3>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><i><span data-contrast="auto">Workflow</span></i></b><b><span data-contrast="auto"> de départ?? Oublié direct</span></b><span data-contrast="auto">?– J’ai commencé avec un plan, puis j’ai </span><i><span data-contrast="auto">vibé</span></i><span data-contrast="auto">… chaos total.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">Ça fait parfois n’importe quoi</span></b><span data-contrast="auto">?– Genre vraiment n’importe quoi. Des fois on se demande si l’IA a fumé.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">L’IA = Guide énervant</span></b><span data-contrast="auto">?– Quand elle ne comprend pas après 5 reformulations, on veut la secouer.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">Faut être ULTRA précis</span></b><span data-contrast="auto">?– On oublie un détail?? Elle fait l’inverse de ce qu’on veut.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">Zéro question de sa part</span></b><span data-contrast="auto">?– Elle suppose, elle code. Même si c’est pas du tout ce qu’on voulait.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">Prix élevé</span></b><span data-contrast="auto">?– 40? partis (Cursor Pro + crédits). Pour un proto, ça pique.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">70?% buggé au départ</span></b><span data-contrast="auto">?– Oui, 70?%. Les 30?% qui marchaient, c’était déjà un miracle.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">La qualité du code??</span></b><span data-contrast="auto">?– Aucune idée, mais probablement pas terrible.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">?</span><span data-contrast="auto">?</span><b><span data-contrast="auto">La dette technique</span></b><span data-contrast="auto">?– On en reparle dans 6 mois.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<h4><b><span data-contrast="auto">Le vrai bilan?:</span></b><span data-ccp-props="{}"> </span></h4>
<p><span data-contrast="auto">Malgré les galères, le ratio effort/résultat est dingue. Oui c’est frustrant, oui c’est cher, oui ça bug. Mais j’ai codé une app fonctionnelle en 5 jours sans savoir coder?!</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<h3><b><span data-contrast="auto">Ma vision?: plus il y aura d’IA plus il y aura de développeurs.</span></b><span data-ccp-props="{}"> </span></h3>
<p><span data-contrast="auto">Vous pensez que l’IA prendra le travail des développeurs?? Après cette expérience, c’est sûr que non.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Le travail des développeurs va peut-être un peu évoluer, mais il est absolument essentiel pour cadrer, pour comprendre, pour corriger, pour orienter et bien plus encore, car aujourd’hui c’est clair,?</span><b><span data-contrast="auto">ce n’est pas prêt pour la production</span></b><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Le </span><i><span data-contrast="auto">vibe coding</span></i><span data-contrast="auto"> et le </span><i><span data-contrast="auto">context engineering</span></i><span data-contrast="auto">, c’est très intéressant pour un</span><b><span data-contrast="auto">?projet personnel</span></b><span data-contrast="auto">?qui n’aurait de toute façon?</span><b><span data-contrast="auto">pas eu les moyens d’embaucher des développeurs</span></b><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Mais dans la vraie vie et en production chez des clients, vous ne POUVEZ PAS l’utiliser pour une seule et bonne raison?: on ne peut pas lui faire confiance. Sans confiance, pas d’utilisation et donc pas de production.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<h3><b><span data-contrast="auto">Qu’en disent les développeurs??</span></b><span data-ccp-props="{}"> </span></h3>
<p><span data-contrast="auto">J’ai demandé à des développeurs d’</span><b><span data-contrast="auto">analyser la base de code</span></b><span data-contrast="auto">?(</span><a href="https://github.com/ekit3/PO-Bingo"><span data-contrast="none">disponible sur GitHub</span></a><span data-contrast="auto">)?et même de tester par eux-mêmes le </span><i><span data-contrast="auto">vibe coding</span></i><span data-contrast="auto"> et en résumé?: ils ont pété un câble.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">«?Je n’ai pas confiance.?»</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Entre les fois où l’IA ne respectait pas ce qu’on lui demandait, où elle crée des classes qui s’appellent littéralement </span><i><span data-contrast="auto">Hello World</span></i><span data-contrast="auto"> et qui sont inutiles, quand elle modifie une partie du code de manière arbitraire ou qu’elle en supprime d’autres soi-disant non utilisées, quand on lui dit qu’elle se trompe mais qu’elle continue quand même, quand elle fait des erreurs de débutant avec des classes, dans des classes, dans des classes en Java… C’est risible.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Mais très utile pour certains cas.</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Créer la structure pour développer?:?</span></b><span data-contrast="auto">par contre, un cas d’utilisation intéressant est pour lancer un dev?: lui donner le ticket Jira et lui demander de créer toute la structure nécessaire en prenant exemple sur une autre partie du code, ça, ça marche très bien et ça fait gagner beaucoup de temps, car la structure est faite?; le dev peut commencer en quelques minutes au lieu de quelques heures.</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Créer des scripts?:?</span></b><span data-contrast="auto">pour créer des scripts, l’IA crée exactement le même code que ce que le développeur avait en tête. Sauf qu’elle a mis deux minutes à le faire, alors que le dev aurait mis quatre heures.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<h4><b><span data-contrast="auto">Mes conseils pour vous lancer?:</span></b><span data-ccp-props="{}"> </span></h4>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Commencez petit</span></b><span data-contrast="auto">?: si vous avez une grande idée, découpez-la en petits bouts.</span><span data-ccp-props="{}"> </span></li>
</ol>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Pour le </span></b><b><i><span data-contrast="auto">context engineering</span></i></b><span data-contrast="auto">?: préparez vos docs AVANT (vision, archi, </span><i><span data-contrast="auto">features</span></i><span data-contrast="auto">)</span><span data-ccp-props="{}"> </span></li>
</ol>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Pour le </span></b><b><i><span data-contrast="auto">vibe coding</span></i></b><span data-contrast="auto">?: lancez-vous direct, découvrez en route.</span><span data-ccp-props="{}"> </span></li>
</ol>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Acceptez l’échec</span></b><span data-contrast="auto">?: mon app a planté 47 fois (et c’était du </span><i><span data-contrast="auto">context engineering</span></i><span data-contrast="auto">?!)</span><span data-ccp-props="{}"> </span></li>
</ol>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><b><span data-contrast="auto">Optimisez les prompts</span></b><span data-contrast="auto">?: économisez vos crédits.</span><span data-ccp-props="{}"> </span></li>
</ol>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="6" data-aria-level="1"><b><span data-contrast="auto">Choisissez votre style</span></b><span data-contrast="auto">?:</span><span data-ccp-props="{}"> </span></li>
</ol>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="2"><span data-contrast="auto">Vous êtes PO/structuré?? ? </span><i><span data-contrast="auto">context engineering</span></i><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="?" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:&#091;8226&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;?&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="2"><span data-contrast="auto">Vous voulez explorer?? ? </span><i><span data-contrast="auto">vibe coding</span></i><span data-ccp-props="{}"> </span></li>
</ul>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:&#091;65533,0&#093;,&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="7" data-aria-level="1"><b><span data-contrast="auto">Préparez le café</span></b><span data-contrast="auto">?: le code ne s’écrit pas instantanément, c’est plus long que ce que vous pensez.</span><span data-ccp-props="{}"> </span></li>
</ol>
<p><span data-ccp-props="{}"> </span></p>
<h4><b><span data-contrast="auto">Le mot de la fin</span></b><span data-ccp-props="{}"> </span></h4>
<p><span data-contrast="auto">Après cette expérience, je ne vois plus le développement de la même façon.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Est-ce que je vais remplacer mes développeurs?? Non?! Sauvez-moi, surtout pas.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">J’ai eu le sentiment d’avoir besoin d’un développeur pour savoir ce que l’IA faisait et je me suis retrouvé plusieurs fois démuni face à des choix techniques.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Est-ce que je comprends mieux leur taf?? Carrément.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Mais surtout?: j’ai enfin cassé cette barrière qui me frustrait depuis des années. Je suis enfin passé de l’autre côté pour comprendre le développement et l’IA.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Le?</span><b><i><span data-contrast="auto">context engineering</span></i></b><span data-contrast="auto">?(ce que j’ai fait sans le savoir), c’est parfait pour un ex-CEO/PO habitué à structurer. Vous préparez vos docs, vous donnez le contexte, l’IA exécute. C’est rassurant, c’est efficace, ça limite les bugs.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Le?</span><b><span data-contrast="auto">vrai </span></b><b><i><span data-contrast="auto">vibe coding</span></i></b><span data-contrast="auto">?? Je ne l’ai pas encore testé. Mais maintenant que je sais que je PEUX créer, j’ai envie d’essayer. Partir sans filet, juste avec une idée et voir où ça mène.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Pour un P.O. structuré, le </span><i><span data-contrast="auto">context engineering</span></i><span data-contrast="auto"> c’est génial. Pour explorer et s’amuser, le </span><i><span data-contrast="auto">vibe coding</span></i><span data-contrast="auto"> doit être dingue. Pour du sérieux en production?? Embauchez des vrais devs même s’ils sont augmentés par l’IA…</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">La prochaine fois?? Je pense créer une équipe d’agents IA qui travaillent entre eux et je suis déjà en train d’expérimenter sur le sujet. Est-ce que ce sera un prochain article?? Peut-être… </span><span data-contrast="auto">?</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Alors voilà, j’ai créé une app sans savoir coder. Et vous savez quoi?? Vous pouvez le faire aussi.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<p><i><span data-contrast="auto">Envie de tester?? Commencez par un petit projet en mode </span></i><span data-contrast="auto">vibe coding</span><i><span data-contrast="auto">. C’est fun et formateur. Puis passez au </span></i><span data-contrast="auto">c</span><i><span data-contrast="auto">ontext </span></i><span data-contrast="auto">e</span><i><span data-contrast="auto">ngineering quand vous serez à l’aise. Et n’oubliez pas?: en </span></i><span data-contrast="auto">vibe coding</span><i><span data-contrast="auto">, c’est normal que ce soit le bordel au début.</span></i><span data-ccp-props="{}"> </span></p>
<p><i><span data-contrast="auto">Des questions?? Des retours d’expérience?? N’hésitez pas à nous écrire?!</span></i><span data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><b>Bonus: Quelques prompts</b></h2>
<p><span id="more-4458"></span></p>
<table data-tablestyle="MsoNormalTable" data-tablelook="1184" aria-rowcount="4">
<tbody>
<tr aria-rowindex="1">
<td data-celllook="0"><b><span data-contrast="auto">Objectif</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><b><span data-contrast="auto">Prompt</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr aria-rowindex="2">
<td data-celllook="0"><span data-contrast="auto">Brainstorming</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Je voudrais faire une application qui permet d’apprendre Jira en 3 minutes par jour.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Cette application est destinée aux </span><i><span data-contrast="auto">product owners</span></i><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Son but est de proposer différents types d’exercices pour apprendre aux PO à utiliser les fonctions de Jira basiques et de plus en plus poussées.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Elle doit être simple et fun à utiliser.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Brainstormons ensemble sur le sujet.</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr aria-rowindex="3">
<td data-celllook="0"><span data-contrast="auto">Évoquer Duolingo et recentrer</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Merci pour ces idées?! J’avais plus en tête une application super simple et </span><i><span data-contrast="auto">gamifiée</span></i><span data-contrast="auto"> comme Duolingo?! Mais adaptée aux PO. J’avais pensé à un parcours d’apprentissage qui commence par les bases de Jira jusqu’aux fonctions avancés, qu’en penses-tu??</span><span data-ccp-props="{}"> </span></td>
</tr>
<tr aria-rowindex="4">
<td data-celllook="0"><span data-contrast="auto">Demander un logo</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Je vais demander à ChatGPT de me générer un logo pour l’application, fais-moi un prompt optimisé avec tout le contexte qui explique le nom. Je veux laisser toute la créativité à ChatGPT.</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<p><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Structure du MVP</span></b><span data-ccp-props="{}"> </span></p>
<table data-tablestyle="MsoNormalTable" data-tablelook="1184" aria-rowcount="2">
<tbody>
<tr aria-rowindex="1">
<td data-celllook="0"><b><span data-contrast="auto">Objectif</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><b><span data-contrast="auto">Prompt</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr aria-rowindex="2">
<td data-celllook="0"><span data-contrast="auto">Génération de la structure du MVP</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">OK maintenant avançons sur la structure que nous voulons pour notre MVP (pas le contenu des exercices, nous ferons ça plus tard). Propose-là-moi.</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<p><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Prototype initial</span></b><span data-ccp-props="{}"> </span></p>
<table data-tablestyle="MsoNormalTable" data-tablelook="1184" aria-rowcount="2">
<tbody>
<tr aria-rowindex="1">
<td data-celllook="0"><b><span data-contrast="auto">Objectif</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><b><span data-contrast="auto">Prompt</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr aria-rowindex="2">
<td data-celllook="0"><span data-contrast="auto">Générer le prototype de mon app en React</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">Créez la version fonctionnelle initiale de PO?Bingo à partir des fichiers de contexte fournis.</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<p><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Workflow git</span></b><span data-ccp-props="{}"> </span></p>
<table data-tablestyle="MsoNormalTable" data-tablelook="1184" aria-rowcount="2">
<tbody>
<tr aria-rowindex="1">
<td data-celllook="0"><b><span data-contrast="auto">Objectif</span></b><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><b><span data-contrast="auto">Prompt</span></b><span data-ccp-props="{}"> </span></td>
</tr>
<tr aria-rowindex="2">
<td data-celllook="0"><span data-contrast="auto">Générer un workflow git</span><span data-ccp-props="{}"> </span></td>
<td data-celllook="0"><span data-contrast="auto">J’aimerais créer un fichier de </span><i><span data-contrast="auto">rules</span></i><span data-contrast="auto"> dans Cursor en </span><i><span data-contrast="auto">markdown</span></i><span data-contrast="auto"> qui gère proprement le </span><i><span data-contrast="auto">versionning</span></i><span data-contrast="auto">. J’aimerais aussi faire en sorte que chaque nouvelle </span><i><span data-contrast="auto">feature</span></i><span data-contrast="auto"> soit dans une branche à part (que je peux voir sur Versel pour tester). Une fois testée, j’aimerais qu’elle soit mise dans la branche principale. Créer un fichier où j’injecte des commandes </span><i><span data-contrast="auto">custom</span></i><span data-contrast="auto"> et simples et ensuite Cursor lance tout automatiquement.</span><span data-ccp-props="{}"> </span></td>
</tr>
</tbody>
</table>
<p><span data-ccp-props="{}"> </span></div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>
<p>L’article <a href="https://ekite.info/2026/02/08/jai-vibe-code-mon-app-en-5-jours/">? J&rsquo;ai vibe codé mon app en 5 jours : entre magie et consommation</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4458</post-id>	</item>
		<item>
		<title>Prompt engineering avancé avec Github Copilot : Guider l&#8217;IA avec les fichiers Markdown custom</title>
		<link>https://ekite.info/2025/10/15/prompt-engineering-avance-avec-github-copilot-guider-lia-avec-les-fichiers-markdown-custom/</link>
		
		<dc:creator><![CDATA[Maxime Montagne]]></dc:creator>
		<pubDate>Wed, 15 Oct 2025 14:01:45 +0000</pubDate>
				<category><![CDATA[IA]]></category>
		<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=4201</guid>

					<description><![CDATA[<p>Introduction :  Pré-requis pour cette article et les exemples fournis : dernière versions LTS de Java (article écrit en juillet 2025 donc Java 21), l&#8217;IDE sera IntellIJ Ultimate et Github Copilot avec une licence pro. Les instructions sont décrites pour un projet Java qui utilise Spring Boot 3.5.4 et une documentation OpenAPI/Swagger. L&#8217;ensemble des instructions [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2025/10/15/prompt-engineering-avance-avec-github-copilot-guider-lia-avec-les-fichiers-markdown-custom/">Prompt engineering avancé avec Github Copilot : Guider l&rsquo;IA avec les fichiers Markdown custom</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Introduction : </strong></p>
<p>Pré-requis pour cette article et les exemples fournis : dernière versions LTS de Java (article écrit en juillet 2025 donc Java 21), l&rsquo;IDE sera IntellIJ Ultimate et Github Copilot avec une licence pro. Les instructions sont décrites pour un projet Java qui utilise Spring Boot 3.5.4 et une documentation OpenAPI/Swagger. L&rsquo;ensemble des instructions et du code utilisées pour cet exemple sont disponibles sur le repo Git du projet : <a href="https://github.com/ekit3/prompt-engineering-example">https://github.com/ekit3/prompt-engineering-example</a></p>
<p>Les modèles d&rsquo;IA générative sont extrêmement puissants, mais ils ont des limites. Ils s&rsquo;appuient fortement sur le contexte et la qualité des instructions qu&rsquo;ils reçoivent. Un prompt mal formulé peut mener à des résultats génériques, voire inutilisables. À l&rsquo;inverse, un prompt bien conçu peut transformer l&rsquo;IA en un collaborateur incroyablement efficace, capable de générer du code complexe qui s&rsquo;intègre parfaitement à votre base de code existante. Historiquement, le Prompt Engineering se faisait principalement via des commentaires directs dans le code et les fichiers ouverts. Cependant, avec l&rsquo;émergence de techniques plus avancées comme l&rsquo;utilisation de fichiers Markdown custom, le Prompt Engineering prend une nouvelle dimension, permettant une guidance plus structurée à l&rsquo;échelle d&rsquo;un projet, d&rsquo;une organisation ou de l&rsquo;entreprise !</p>
<p>Pour des outils comme GitHub Copilot, le Prompt Engineering consiste à :</p>
<ul>
<li>Guider l&rsquo;IA explicitement : Lui fournir des instructions claires sur ce que vous attendez, au-delà de ce qu&rsquo;elle pourrait deviner.</li>
<li>Affiner le contexte : S&rsquo;assurer que l&rsquo;IA dispose de toutes les informations nécessaires pour comprendre votre intention et générer du code qui correspond à vos besoins spécifiques.</li>
<li>Optimiser les résultats : Minimiser les suggestions hors de propos, incorrectes ou non conformes aux standards de votre projet.</li>
</ul>
<p>Dans cet article, nous utiliserons donc un exemple d&rsquo;un projet Java simple mais qui renferme une bibliothèque complète d&rsquo;instructions pour GitHub Copilot déjà prête à l&#8217;emploi !</p>
<h4><strong>1 &#8211; Comprendre le Prompt Engineering </strong></h4>
<p>Le Prompt Engineering est l&rsquo;art de concevoir et d&rsquo;affiner les instructions ou requêtes données à une IA générative. L&rsquo;objectif est d&rsquo;obtenir les réponses les plus précises, pertinentes et utiles possibles de la part de l&rsquo;IA. Cette discipline ne se limite pas à la simple saisie d&rsquo;un texte, mais s&rsquo;apparente à une communication stratégique avec une entité non humaine.</p>
<p>Dans le contexte du développement logiciel, le Prompt Engineering est crucial pour exploiter le plein potentiel des assistants de codage comme GitHub Copilot. Il permet de transformer une simple suggestion de code en une solution complète et conforme aux standards de votre projet. Les ingénieurs du logiciel appliquent le Prompt Engineering pour :</p>
<ul>
<li><b>Fournir un contexte riche</b> : L&rsquo;IA ne peut générer que du code basé sur ce qu&rsquo;elle « voit ». Un prompt efficace lui donne des informations sur l&rsquo;architecture, les conventions de nommage, les dépendances et les objectifs fonctionnels.</li>
<li><b>Limiter les résultats non pertinents</b> : Un prompt bien formulé inclut des contraintes et des exemples, ce qui réduit le nombre de suggestions inutiles ou incorrectes.</li>
<li><b>Assurer la cohérence</b> : L&rsquo;IA peut imiter des styles de code, mais elle a besoin de directives claires pour s&rsquo;aligner sur les normes de formatage et de conception de votre équipe.</li>
</ul>
<h4><strong>2 &#8211; Les fichiers Markdown custom (MDC) : une nouvelle approche du contexte</strong></h4>
<p>Historiquement, le Prompt Engineering se faisait de manière ponctuelle, en ajoutant des commentaires de code (<code>//</code> ou <code>/**</code>) ou en gardant des fichiers de référence ouverts à côté de la fenêtre de code. Bien que cette approche soit fonctionnelle, sa portée et sa réutilisation sont très limitées.</p>
<p>Les fichiers Markdown custom (MDC), souvent nommés <code>copilot-instructions.md</code>, <code>style-guide.md</code>, ou <code>testing-guidelines.md</code>, représentent une évolution de cette approche. Ces fichiers permettent de stocker des instructions structurées, détaillées et réutilisables à la racine ou dans des répertoires clés de votre projet.</p>
<p>Cette méthode offre plusieurs avantages majeurs :</p>
<ul>
<li><b>Centralisation des règles</b> : Toutes les règles de codage, de sécurité, d&rsquo;architecture ou de conception sont centralisées. L&rsquo;IA peut les consulter et les appliquer de manière cohérente à l&rsquo;échelle du projet.</li>
<li><b>Contexte étendu</b> : Un fichier MDC peut contenir des informations sur l&rsquo;ensemble de l&rsquo;application, ce qui permet à l&rsquo;IA d&rsquo;avoir une vision plus globale et de générer du code qui s&rsquo;intègre mieux.</li>
<li><b>Maintenabilité</b> : Les instructions sont versionnées avec le code (via Git). Si les standards de l&rsquo;équipe changent, il suffit de mettre à jour le fichier MDC.</li>
</ul>
<h4><strong>3 &#8211; Appliquer le MDC à un projet Java dans IntelliJ avec GitHub Copilot</strong></h4>
<p>Maintenant, appliquons cette nouvelle approche à notre exemple de projet Java. Comme le montre la capture d&rsquo;écran ci-dessous, notre projet est structuré pour maximiser l&rsquo;efficacité de l&rsquo;IA. Au sein du répertoire <code>.github</code>, nous avons un dossier <code>agent</code> qui contient l&rsquo;ensemble de nos fichiers Markdown custom (MDC) :</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4300 aligncenter" src="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-16.30.30.png" alt="" width="271" height="346" srcset="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-16.30.30.png 271w, https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-16.30.30-235x300.png 235w" sizes="auto, (max-width: 271px) 100vw, 271px" /></p>
<ul>
<li><code>coding-standards.mdc</code> : Ce fichier définit les règles de formatage et de style de code que l&rsquo;IA doit suivre.</li>
<li><code>structure.mdc</code> : Il contient les directives d&rsquo;organisation des fichiers et des modules, garantissant que tout nouveau code sera placé au bon endroit.</li>
<li><code>api-interaction.mdc</code> : Ce fichier guide l&rsquo;agent sur la manière d&rsquo;interagir avec les API, par exemple en décrivant comment gérer les erreurs ou les process de développement.</li>
<li><code>testing-guidelines.mdc</code> : Ce document fournit les instructions pour la création de tests unitaires et d&rsquo;intégration, en spécifiant les frameworks et les méthodologies à utiliser.</li>
</ul>
<p><b>Comment cela fonctionne ?</b></p>
<p>Le fichier <code>copilot-instructions.md</code> agit comme un <b>manifeste central</b>. Il ne contient pas les règles elles-mêmes, mais il fait référence aux autres fichiers MDC. C&rsquo;est une stratégie clé : elle permet de garder les instructions organisées et de les réutiliser. Par exemple, au lieu de répéter les règles de test dans chaque fichier, <code>copilot-instructions.md</code> dit simplement à l&rsquo;IA « pour les tests, reporte-toi au fichier <code>testing-guidelines.mdc</code>« . Voici un extrait du contenu de ce fichier :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="md">## 3. Review &amp; Completion
- **Testing:** Think through user flows and edge cases. Describe manual and automated tests as appropriate. Follow the rules defined in `.github/agent/testing-guidelines.mdc`.</pre>
<div></div>
<p>Passons maintenant à la pratique : nous allons voir comment utiliser ces instructions directement dans IntelliJ pour interagir avec notre projet et l&rsquo;analyser.</p>
<p>Dans la fenêtre « Github Copilot Chat », dans l&rsquo;onglet <strong>« Ask »</strong> en cliquant sur <b>« + »</b>, vous pouvez sélectionner manuellement un ou plusieurs fichiers <code>.mdc</code> pour guider l&rsquo;agent (ou simplement faire un glisser/déposer des fichiers). Par exemple, si vous voulez que l&rsquo;IA audit l&rsquo;ensemble du projet et propose éventuellement des améliorations, vous pouvez ajouter l&rsquo;ensemble des fichiers comme ceci et lui demander d&rsquo;analyser tout le code à travers ces instructions. N&rsquo;oubliez pas de choisir le model IA qui vous convient :</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-4302 aligncenter" src="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-16.52.07.png" alt="" width="621" height="249" srcset="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-16.52.07.png 621w, https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-16.52.07-480x192.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 621px, 100vw" /></p>
<p>De cette manière, l&rsquo;agent ne se contente pas de suggestions génériques. Il utilise les règles précises que vous avez définies pour générer un code qui correspond parfaitement aux standards de votre projet. Analysons un extrait des résultats :</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-4308 aligncenter" src="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.05.22.png" alt="" width="983" height="541" srcset="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.05.22.png 983w, https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.05.22-980x539.png 980w, https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.05.22-480x264.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 983px, 100vw" /></p>
<p>Comme nous pouvons le voir, le rapport de l&rsquo;agent confirme que notre projet respecte les standards définis. Il valide l&rsquo;organisation des fichiers, les conventions de nommage et la séparation des responsabilités. Cela prouve que les instructions claires que nous lui avons fournies sont efficaces et pertinentes.</p>
<p>Pour compléter l&rsquo;exemple, j&rsquo;ai volontairement ajouter un package « python » avec un service Java inutile qui contient quelques warning comme ceci :</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-4310 aligncenter" src="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.08.45.png" alt="" width="714" height="363" srcset="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.08.45.png 714w, https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.08.45-480x244.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 714px, 100vw" /></p>
<p>Voyons ensemble le résultat du nouvel analyse par GitHub Copilot :</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-4311 aligncenter" src="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.09.20.png" alt="" width="775" height="556" srcset="https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.09.20.png 775w, https://ekite.info/wp-content/uploads/2025/08/Capture-decran-2025-08-20-a-17.09.20-480x344.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 775px, 100vw" /></p>
<p>Ce rapport illustre la capacité de l&rsquo;agent à identifier des problèmes concrets dans le code, de la structure des packages aux erreurs de syntaxe, et à proposer des solutions directes pour les corriger. Il agit comme un véritable auditeur de code, garantissant la qualité et la cohérence du projet.</p>
<h4><strong>4 &#8211; Bilan : avantages, défis et bonnes pratiques du MDC</strong></h4>
<p><b>Avantages</b></p>
<ul>
<li><b>Cohérence du code :</b> En centralisant les règles de style et d&rsquo;architecture, vous assurez que tout le code généré ou modifié par l&rsquo;IA respecte les conventions de l&rsquo;équipe, ce qui réduit les erreurs et facilite la revue de code.</li>
<li><b>Gain de productivité :</b> L&rsquo;agent agit comme un pair-programmeur toujours disponible, générant du code pertinent et conforme dès la première suggestion. Le développeur passe ainsi moins de temps à corriger des suggestions inutiles ou à chercher des informations sur les standards du projet.</li>
<li><b>Intégration et formation :</b> Les fichiers MDC servent de documentation vivante pour les nouveaux arrivants. Ils peuvent se familiariser rapidement avec les normes de l&rsquo;équipe en consultant ces fichiers, sans avoir besoin d&rsquo;un mentorat constant.</li>
<li><b>Qualité du code :</b> L&rsquo;audit automatique et continu du code par l&rsquo;agent permet de détecter et de corriger des problèmes de structure ou de syntaxe avant même qu&rsquo;ils ne soient poussés dans le dépôt, améliorant ainsi la robustesse et la maintenabilité du code.</li>
</ul>
<p><strong>Défis</strong></p>
<ul>
<li><b>Investissement initial :</b> La création et la maintenance des fichiers MDC demandent du temps et des efforts. Pour que la méthode soit efficace, les instructions doivent être précises et à jour.</li>
<li><b>Complexité de l&rsquo;agent :</b> Une sur-spécification des règles peut parfois limiter la créativité et la flexibilité de l&rsquo;IA, la rendant moins utile pour des tâches complexes. Il faut trouver le bon équilibre entre la guidance et l&rsquo;autonomie.</li>
<li><b>Dépendance de l&rsquo;outil :</b> Bien que l&rsquo;approche soit de plus en plus standard, l&rsquo;efficacité peut varier selon les outils et les versions de l&rsquo;IA.</li>
</ul>
<p><strong>Bonnes pratiques :</strong></p>
<ul>
<li><b>Commencez simple :</b> Créez d&rsquo;abord des fichiers MDC pour les règles les plus importantes (style de code, structure de base), puis enrichissez-les au fur et à mesure que votre projet évolue.</li>
<li><b>Mettez à jour vos MDCs :</b> Considérez-les comme des documents vivants, soumis au même processus de revue et de versionnage que votre code.</li>
<li><b>Soyez précis et clair :</b> Utilisez un langage direct et des exemples de code dans vos instructions. L&rsquo;IA interprète mieux les directives claires.</li>
<li><b>Testez et itérez :</b> N&rsquo;hésitez pas à expérimenter avec vos prompts pour voir comment l&rsquo;agent réagit. C&rsquo;est en itérant que vous trouverez la meilleure façon d&rsquo;optimiser les résultats.</li>
</ul>
<p><strong>Conclusion<br />
</strong>L&rsquo;utilisation des fichiers MDC transforme l&rsquo;IA générative en un véritable collaborateur d&rsquo;équipe. Cette approche assure la cohérence du code, accélère les processus de développement et sert de guide pour les nouveaux membres. Bien qu&rsquo;elle demande un investissement initial pour la rédaction des instructions, le gain en productivité et en qualité du code surpasse largement ce coût. En maintenant ces fichiers à jour, vous créez un standard de projet qui est compris et appliqué par tous, y compris votre agent d&rsquo;IA.<strong><br />
</strong></p>
<p>L’article <a href="https://ekite.info/2025/10/15/prompt-engineering-avance-avec-github-copilot-guider-lia-avec-les-fichiers-markdown-custom/">Prompt engineering avancé avec Github Copilot : Guider l&rsquo;IA avec les fichiers Markdown custom</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4201</post-id>	</item>
		<item>
		<title>Quand un delivery manager en costume et T-shirt DBZ infiltre le DEVOXX 2025…</title>
		<link>https://ekite.info/2025/04/24/quand-un-delivery-manager-en-costume-et-t-shirt-dbz-infiltre-le-devoxx-2025/</link>
		
		<dc:creator><![CDATA[Romain ROZEWICZ]]></dc:creator>
		<pubDate>Thu, 24 Apr 2025 17:53:04 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=3917</guid>

					<description><![CDATA[<p>Je ne suis ni dev sénior, ni CTO, ni speaker star. Je suis delivery manager. Et pourtant, cette année, j’ai eu l’immense plaisir (et le petit frisson de fierté) de représenter Argios au BullShit IT Awards du DEVOXX Paris 2025. Résultat : un pass 3 jours, un badge speaker, et une place dans la grande [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2025/04/24/quand-un-delivery-manager-en-costume-et-t-shirt-dbz-infiltre-le-devoxx-2025/">Quand un delivery manager en costume et T-shirt DBZ infiltre le DEVOXX 2025…</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="" data-start="245" data-end="640">Je ne suis ni dev sénior, ni CTO, ni speaker star. Je suis delivery manager. Et pourtant, cette année, j’ai eu l’immense plaisir (et le petit frisson de fierté) de représenter Argios au <em data-start="431" data-end="451">BullShit IT Awards</em> du DEVOXX Paris 2025. Résultat : un pass 3 jours, un badge speaker, et une place dans la grande famille des talks&#8230; alors que je venais surtout avec ma casquette d’explorateur du terrain.</p>
<p class="" data-start="642" data-end="1046">Pas question de passer incognito : j’étais probablement l’un des seuls en costume, planqué sous un T-shirt Dragon Ball Z, fidèle à moi-même. Et justement, j’ai vu dans cette opportunité une chance unique d’aller tâter le pouls de la communauté tech — parisienne, mais pas que — en sortant le micro pour une série d’interviews façon micro-trottoir, dans le cadre de mon podcast <a href="https://youtube.com/playlist?list=PLK_UEIuWtFOABurBCcQT8a4r-cicUFFbe&amp;si=Z1xzbWJ_EsrILb_K"><em data-start="1019" data-end="1045">Technologies en Pratique</em></a>.</p>
<p data-start="642" data-end="1046"><img loading="lazy" decoding="async" class="aligncenter wp-image-3919 size-large" src="https://ekite.info/wp-content/uploads/2025/04/20250416_182605-1024x577.jpg" alt="" width="1024" height="577" srcset="https://ekite.info/wp-content/uploads/2025/04/20250416_182605-980x552.jpg 980w, https://ekite.info/wp-content/uploads/2025/04/20250416_182605-480x270.jpg 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></p>
<h3 class="" data-start="92" data-end="151"><strong data-start="96" data-end="151">Chapitre 1 : Arrivée au Palais des Congrès de Paris</strong></h3>
<p class="" data-start="153" data-end="419">Pour rejoindre le DEVOXX, rien de plus simple : prenez le RER E depuis Gare du Nord. Pas de changement, ligne directe, et vous arrivez directement dans le Grand Palais. À croire que l’événement a été pensé pour les techs pressés — ou pour les lillois bien organisés.</p>
<p class="" data-start="421" data-end="780">Dès l’entrée, tout est bien rodé. Je me présente à l’accueil avec mon invitation speaker, et me voilà officiellement équipé : tour de cou DEVOXX… et surtout, mon badge violet. Ce badge, c’est mon <em data-start="617" data-end="628">Multipass</em>. Comme dans <em data-start="641" data-end="663">Le Cinquième Élément</em>. Il ouvre toutes les portes : les salles de conf, les espaces réservés, les coulisses. Une vraie clé de l’événement.</p>
<p class="" data-start="782" data-end="965">Direction vestiaire et bagagerie pour déposer tout le matos vidéo. J’ai prévu de quoi faire des interviews propres : micros, perche, batterie, trépied… bref, pas venu les mains vides.</p>
<p class="" data-start="967" data-end="1307">Le DEVOXX, c’est sur deux étages, et il y a une multitude de salles de conférences. Le plus compliqué, ce n’est pas de trouver quelque chose d’intéressant… c’est de choisir. Tout a l’air passionnant, ça donne envie de se dédoubler. Mais bon, j’avais un plan : aller à la rencontre des exposants, tendre le micro, et laisser la magie opérer.</p>
<p class="" data-start="967" data-end="1307"><img loading="lazy" decoding="async" class="aligncenter wp-image-3922 size-full" src="https://ekite.info/wp-content/uploads/2025/04/20250416_164912.jpg" alt="" width="1925" height="1084" srcset="https://ekite.info/wp-content/uploads/2025/04/20250416_164912.jpg 1925w, https://ekite.info/wp-content/uploads/2025/04/20250416_164912-1280x721.jpg 1280w, https://ekite.info/wp-content/uploads/2025/04/20250416_164912-980x552.jpg 980w, https://ekite.info/wp-content/uploads/2025/04/20250416_164912-480x270.jpg 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1925px, 100vw" /></p>
<h3 class="" data-start="80" data-end="109"><strong data-start="84" data-end="109">Chapitre 2 : Repérage</strong></h3>
<p class="" data-start="111" data-end="366">Le Palais des Congrès, c’est… grand. Très grand. On parle de plusieurs étages, de halls interminables, de recoins que tu découvres presque par accident. Et c’est justement au 2? étage que se cache l’un de mes terrains de jeu préférés : l’espace exposants.</p>
<p class="" data-start="368" data-end="783">Mon objectif est clair : aller à la rencontre de ceux qui développent les outils qu’on utilise chez EKITE au quotidien. Les voir en vrai, leur poser des questions simples mais directes, et comprendre leur vision, leurs enjeux, leur délire technique. Et tant qu’à y être, me laisser aussi surprendre par des technos ou des projets que je ne connais pas encore. L’idée, c’est de mixer entre valeur sûre et découverte.</p>
<p class="" data-start="785" data-end="1096">Les allées sont longues, et déjà bien animées. Des stands à perte de vue, des gens qui discutent tech comme d’autres parleraient de vin, des badges qui clignotent dans tous les sens. L’ambiance est pro, mais détendue. Ça bouillonne, ça connecte, ça pitche, ça code en live. Et moi, je sens que ça va être super.</p>
<p data-start="785" data-end="1096"><img loading="lazy" decoding="async" class="aligncenter wp-image-3926 size-full" src="https://ekite.info/wp-content/uploads/2025/04/20250416_200527.jpg" alt="" width="1934" height="1089" srcset="https://ekite.info/wp-content/uploads/2025/04/20250416_200527.jpg 1934w, https://ekite.info/wp-content/uploads/2025/04/20250416_200527-1280x721.jpg 1280w, https://ekite.info/wp-content/uploads/2025/04/20250416_200527-980x552.jpg 980w, https://ekite.info/wp-content/uploads/2025/04/20250416_200527-480x270.jpg 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1934px, 100vw" /></p>
<h3 class="" data-start="130" data-end="179"><strong data-start="134" data-end="179">Chapitre 3 : Premier interview – Michelin</strong></h3>
<p class="" data-start="181" data-end="389">Quand on me dit <em data-start="197" data-end="207">Michelin</em>, je pense bagnoles, F1, gomme qui accroche et guide rouge. Pas forcément tech. Et pourtant… me voilà nez à nez avec un stand Michelin, en plein cœur de l’espace exposants du DEVOXX.</p>
<p class="" data-start="391" data-end="689">Je n’ai pas prévu de parler de pneus — même si, entre nous, je suis fan de voiture et de Formule 1. Non, là je suis venu pour parler tech. Avec des vrais techs. Et je tombe sur Jérémy FLAGEL, tech lead chez Michelin, qui accepte direct de jouer le jeu et de représenter fièrement sa boîte au micro.</p>
<p class="" data-start="691" data-end="1022">Bonne pioche. Jérémy est détendu, clair, passionné. Il incarne bien cette génération de tech leads qui savent mêler exigence et accessibilité. L’interview se déroule tranquillement, sans stress, en mode conversation. On parle d’architecture, d’usage terrain, de contraintes industrielles… et franchement, ça casse les idées reçues.</p>
<p class="" data-start="1024" data-end="1110">Oui, il y a de la vraie tech chez Michelin. Et elle mérite clairement d’être entendue.</p>
<p class="" data-start="1024" data-end="1110"><img loading="lazy" decoding="async" class="aligncenter wp-image-3927 size-full" src="https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-184003.png" alt="" width="2870" height="1612" /></p>
<h3 class="" data-start="131" data-end="164"><strong data-start="135" data-end="164">Chapitre 4 : Clever Cloud</strong></h3>
<p class="" data-start="166" data-end="301">Nouvelle cible : <strong data-start="183" data-end="199">Clever Cloud</strong>. Et pas n’importe qui au micro : Steven Leroux, le big boss de la tech. CTO de la boîte. Rien que ça.</p>
<p class="" data-start="303" data-end="598">Steven m’accorde de son temps malgré un petit handicap du moment — il s’est blessé récemment et se déplace avec une béquille. Mais vous ne la verrez pas à l’image : à peine le micro sorti, il l’a balancée par terre, comme pour dire <em data-start="535" data-end="563">« l’interview, c’est sacré »</em>. Autant dire que le ton est donné.</p>
<p class="" data-start="600" data-end="967">Steven, c’est du solide. Clair, précis, pas là pour faire du bullshit. Il sait où il va, il connaît son sujet sur le bout des doigts, et surtout, il sait le partager. On parle techno bien sûr, mais aussi vision, stratégie, et tendances à venir chez Clever Cloud. Il a ce truc rare : la capacité à rendre limpide des sujets complexes, sans jamais perdre en profondeur.</p>
<p class="" data-start="969" data-end="1149">Je sens qu’il a l’habitude des projecteurs, mais il garde une énergie sincère. C’est pro, c’est vivant, et pour moi, c’est exactement le genre de moment que je venais chercher ici.</p>
<p data-start="969" data-end="1149"><img loading="lazy" decoding="async" class="aligncenter wp-image-3930 size-full" src="https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-184740.png" alt="" width="2320" height="1502" srcset="https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-184740.png 2320w, https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-184740-1280x829.png 1280w, https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-184740-980x634.png 980w, https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-184740-480x311.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 2320px, 100vw" /></p>
<h3 class="" data-start="165" data-end="195"><strong data-start="169" data-end="195">Chapitre 5 : JetBrains</strong></h3>
<p class="" data-start="197" data-end="332">Bingo ! Là, c’est pas un, mais deux développeurs de chez <strong data-start="254" data-end="267">JetBrains</strong> que j’arrive à avoir au micro : Louis et Joffrey. Jackpot total.</p>
<p class="" data-start="334" data-end="636">Mais ça n’a pas été simple. Avant d’en arriver là, j’ai dû passer par la case négociation avec la responsable marketing. Et je peux vous dire qu’elle protège bien ses équipes. Normal : JetBrains, c’est du sérieux. Mon podcast n’est pas un média officiel, je ne suis pas journaliste, je suis juste… moi.</p>
<p class="" data-start="638" data-end="983">Alors je lui dis : <em data-start="657" data-end="747">« Je suis entrepreneur, delivery manager, et surtout passionné par notre secteur : l’IT. »</em> Ces quelques mots ont suffi à désamorcer la méfiance. Elle a vu que je n’étais pas là pour piéger ou faire du buzz, mais pour partager. Résultat : une belle interview, posée, humaine, technique, avec deux devs très pros et accessibles.</p>
<p class="" data-start="985" data-end="1132">Et en bonus, j’ai même réussi à glisser une petite blague pendant l’enregistrement. Si vous tendez bien l’oreille… vous verrez si elle fait mouche.</p>
<p data-start="985" data-end="1132"><img loading="lazy" decoding="async" class="aligncenter wp-image-3933 size-full" src="https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-185157.png" alt="" width="2867" height="1602" /></p>
<h3 class="" data-start="206" data-end="232"><strong data-start="210" data-end="232">Chapitre 6 : Sonar</strong></h3>
<p class="" data-start="234" data-end="440">J’ai une longue histoire avec <strong data-start="264" data-end="273">Sonar</strong>. Cet outil, je l’utilise depuis plus de 15 ans. Alors forcément, en venant au DEVOXX, je m’étais fixé un objectif : interviewer quelqu’un de chez eux. Pas négociable.</p>
<p class="" data-start="442" data-end="738">Sauf que ça n’a pas été une promenade de santé. Premier essai : la personne ne sait pas me répondre. Deuxième essai : <em data-start="560" data-end="615">“Attendez, c’est peut-être bidule qui peut faire ça.”</em> Troisième : <em data-start="628" data-end="675">“Ah non, finalement, faut voir avec Sylvain.”</em> Quatrième tentative… jackpot. C’est bon, j’ai <strong data-start="722" data-end="728">la</strong> personne.</p>
<p class="" data-start="740" data-end="815">Sylvain, donc. Grand timide. Et aussi… plus grand que moi. Il faut le dire.</p>
<p class="" data-start="817" data-end="1257">Je sens direct qu’il est pas super à l’aise avec le micro. Alors je reviens à ma méthode : désamorçage. <em data-start="921" data-end="1115">« Je ne suis pas un média, je ne viens pas faire une interview pour buzzer. Je suis un passionné d’IT, un utilisateur de Sonar de la première heure. Je viens juste partager une belle histoire. »</em> Et je lui raconte justement <em data-start="1144" data-end="1149">mon</em> histoire avec Sonar, les projets où il m’a sauvé la vie, les bugs évités, la dette technique tenue à l’œil…</p>
<p class="" data-start="1259" data-end="1428">Petit à petit, Sylvain se détend. Il sourit. Et finalement, on y va. Une interview honnête, sans fioriture, avec quelqu’un de sincère. Une belle boucle bouclée pour moi.</p>
<p data-start="1259" data-end="1428"><img loading="lazy" decoding="async" class="aligncenter wp-image-3935 size-full" src="https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-190658-e1745514625102.png" alt="" width="3552" height="1798" /></p>
<h3 class="" data-start="164" data-end="192"><strong data-start="168" data-end="192">Chapitre 7 : MongoDB</strong></h3>
<p class="" data-start="194" data-end="443">Décidément, après <strong data-start="212" data-end="221">Sonar</strong>, j’ai droit au même scénario avec <strong data-start="256" data-end="267">MongoDB</strong> : plusieurs tentatives, plusieurs détours… mais au final, j’ai réussi. Et cette fois, c’est grâce à la gentillesse de <strong data-start="386" data-end="401">Cécile Chen</strong> que j’ai pu interviewer <strong data-start="426" data-end="442">Loïc Formont</strong>.</p>
<p class="" data-start="445" data-end="634">Encore un grand timide — et encore un plus grand que moi (je commence à croire que c’est un critère). Pas très à l’aise avec l’exercice. Alors je dégaine mon arme secrète : l’auto-dérision.</p>
<p class="" data-start="636" data-end="877">Je lui dis : <em data-start="649" data-end="725">“Je vais t’interviewer comme un tonton relou qui comprend rien à la tech.”</em> Ce qui, soyons honnêtes, n’est pas entièrement faux. Et là, ça le fait marrer. La pression retombe, l’ambiance se détend, et on lance l’enregistrement.</p>
<p class="" data-start="879" data-end="1044">Au final, c’était l’exo parfait pour lui : parler simplement de ce qu’il fait, vulgariser, partager. Une interview authentique, sans chichi, exactement comme j’aime.</p>
<p class="" data-start="1046" data-end="1228">Cerise sur le gâteau : Loïc vient aussi au <strong data-start="1089" data-end="1101">Devlille</strong> cette année. Du coup, je lui ai glissé une invitation pour un futur épisode de <em data-start="1181" data-end="1206">La Voix de l’Innovation</em>. L’histoire continue.</p>
<p data-start="1046" data-end="1228"><img loading="lazy" decoding="async" class="aligncenter wp-image-3937 size-full" src="https://ekite.info/wp-content/uploads/2025/04/Capture-decran-2025-04-24-192157.png" alt="" width="3840" height="2040" /></p>
<h3 class="" data-start="115" data-end="147"><strong data-start="119" data-end="147">Conclusion : déjà fini ?</strong></h3>
<p class="" data-start="149" data-end="181">C’est passé à une vitesse folle.</p>
<p class="" data-start="183" data-end="448">Trois jours de DEVOXX, c’est intense. Il y a tellement de choses à voir, à découvrir, à comprendre… Tellement de personnes à croiser, à écouter, à interviewer. Des passionnés de la tech, comme on les aime. Authentiques, accessibles, fiers de ce qu’ils construisent.</p>
<p class="" data-start="450" data-end="833">J’ai vécu ces journées comme une immersion dans le cœur battant de notre secteur. J’y suis allé avec un micro, une envie de partager, et l’énergie d’un delivery manager en T-shirt DBZ et costume. Et je repars avec des rencontres marquantes, des échanges riches, et surtout une confirmation : la tech, quand elle est humaine, curieuse et ouverte, c’est vraiment ce qui me fait vibrer.</p>
<p class="" data-start="835" data-end="857">Vivement la prochaine.</p>
<p class="" data-start="835" data-end="857"><img loading="lazy" decoding="async" class="wp-image-3938 size-medium aligncenter" src="https://ekite.info/wp-content/uploads/2025/04/20250417_140101-169x300.jpg" alt="" width="169" height="300" /> <img loading="lazy" decoding="async" class="aligncenter wp-image-3939 size-medium" src="https://ekite.info/wp-content/uploads/2025/04/20250418_100116-300x169.jpg" alt="" width="300" height="169" /> <img loading="lazy" decoding="async" class="aligncenter wp-image-3940 size-medium" src="https://ekite.info/wp-content/uploads/2025/04/20250416_173247-300x169.jpg" alt="" width="300" height="169" /> <img loading="lazy" decoding="async" class="wp-image-3941 size-medium aligncenter" src="https://ekite.info/wp-content/uploads/2025/04/20250417_153038-169x300.jpg" alt="" width="169" height="300" /></p>
<p>L’article <a href="https://ekite.info/2025/04/24/quand-un-delivery-manager-en-costume-et-t-shirt-dbz-infiltre-le-devoxx-2025/">Quand un delivery manager en costume et T-shirt DBZ infiltre le DEVOXX 2025…</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3917</post-id>	</item>
		<item>
		<title>Concevoir un portfolio avec Framer</title>
		<link>https://ekite.info/2024/12/12/concevoir-un-portfolio-avec-framer/</link>
		
		<dc:creator><![CDATA[Clément Riquet]]></dc:creator>
		<pubDate>Thu, 12 Dec 2024 11:08:01 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[UX]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=2833</guid>

					<description><![CDATA[<p>Introduction Dans un monde de plus en plus axé sur le numérique, avoir un portfolio en ligne est essentiel pour tout professionnel créatif. En tant que designer, il est très important d&#8217;avoir un portfolio pour mettre en avant ses expériences passées et présentes, ses passions, ses envies, etc. Le fait est que, en tant que [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2024/12/12/concevoir-un-portfolio-avec-framer/">Concevoir un portfolio avec Framer</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3><b>Introduction</b></h3>
<p>Dans un monde de plus en plus axé sur le numérique, avoir un portfolio en ligne est essentiel pour tout professionnel créatif.</p>
<p>En tant que designer, il est très important d&rsquo;avoir un portfolio pour mettre en avant ses expériences passées et présentes, ses passions, ses envies, etc. Le fait est que, en tant que bon UI designer qui se respecte, les connaissances en développement sont présentes, mais la mise en place est fastidieuse, chronophage et le résultat est trop souvent en deçà des attentes. Heureusement, aujourd’hui certaines entreprises nous offrent la possibilité de nous faciliter la vie avec des outils no-code et nous proposent des solutions plus ou moins personnalisables. Et au fil de mes recherches, un outil revenait très souvent au centre de l’attention : Framer.</p>
<p>Dans cet article, nous plongerons dans les entrailles de Framer pour découvrir ce dont il est réellement capable et s’il répond bel et bien à toutes ses belles promesses.</p>
<h3></h3>
<h3><b>Framer, qu&rsquo;est-ce que c&rsquo;est ?</b></h3>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-2843" src="https://ekite.info/wp-content/uploads/2024/04/Banner-article-300x159.jpg" alt="" width="560" height="297" /></p>
<p>Avant de plonger dans la création de notre portfolio, jetons un coup d&rsquo;œil à ce qu&rsquo;est Framer. Il s’agit d’une puissante plateforme de prototypage qui permet aux concepteurs de créer des prototypes interactifs et réalistes pour diverses applications et interfaces utilisateur.</p>
<p>Framer propose de nombreuses fonctionnalités qui facilitent la conception :</p>
<ul>
<li>Des composants intelligents : il offre une conception simplifiée, élément par élément et sans lignes de code.</li>
<li>Des modèles prédéfinis : grâce à une bibliothèque regroupant des modèles (application mobile, lecteur musical, etc.), des options d’interactions, de superpositions, de transitions ou encore d’effets, il est facile de mettre en œuvre vos idées.</li>
<li>Des tests utilisateurs : la solution propose des options d’arrière-plans et de cadres à personnaliser, permettant de présenter votre travail. Il suffit ensuite de partager un lien pour rendre votre prototype accessible à des utilisateurs tiers.</li>
<li>Un espace collaboratif : il est possible de donner accès à tous les acteurs de la conception. L’outil offre la possibilité d’intégrer des collaborateurs externes et de contrôler les accès ainsi que les partages.</li>
<li>Récemment, Framer a intégré OpenAI, ce qui permet de créer rapidement des landing pages à partir de divers templates personnalisables.</li>
</ul>
<h3></h3>
<h3><b>Prise en main</b></h3>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-2844" src="https://ekite.info/wp-content/uploads/2024/04/Capture-decran-2024-04-26-a-01.22.33-300x178.png" alt="" width="539" height="320" /></p>
<p>Pour commencer, familiarisons-nous avec l&rsquo;interface de Framer et les outils disponibles pour créer notre portfolio.</p>
<p>L’interface de Framer présente des similitudes frappantes avec de nombreux autres outils de création tels que Figma. Elle est particulièrement conviviale et intuitive, évitant les pièges rencontrés dans d&rsquo;autres outils où l&rsquo;utilisateur est submergé par une surcharge d&rsquo;informations dès le début de son parcours, ce qui rend son utilisation rapidement ardue.</p>
<p>L’interface se divise en trois parties principales :</p>
<ol>
<li>Le canva au centre de l’écran : C&rsquo;est ici que se trouve notre projet, avec la possibilité de définir dès le début les breakpoints pour visualiser le responsive et corriger d&rsquo;éventuelles erreurs.</li>
<li>Une barre latérale (à gauche) : Elle offre trois options principales (les différentes pages, les calques et les éléments graphiques) et est toujours visibles pour faciliter la navigation.</li>
<li>Une barre latérale (à droite) : C&rsquo;est ici que nous trouvons toutes les options de mise en page et d&rsquo;animations. Elle utilise les termes familiers de CSS pour éviter toute confusion et offre une grande variété d&rsquo;options de personnalisation de base.</li>
</ol>
<h3></h3>
<h3><b>Présentation du projet</b></h3>
<p>Bon, maintenant que nous avons posé les bases, il est temps de nous plonger dans la création de ce portfolio. J’ai décidé de rester relativement simple en mettant en place une page d’accueil et une page détaillant chaque projet.</p>
<p>Dès mes premiers pas sur Framer, j’ai pu constater sa facilité de prise en main et à quel point il se rapproche des nombreuses fonctionnalités que nous retrouvons sur Figma en termes de mise en page.</p>
<p>Au début du projet, je pensais importer directement mon projet Figma dans Framer et apporter les modifications nécessaires pour rendre la maquette viable. Cependant, je me suis rapidement rendu compte qu&rsquo;il n&rsquo;était pas si difficile de créer directement dans Framer (Presque moins difficile que de préparer correctement un fichier figma). C&rsquo;est donc ce que j&rsquo;ai fait pour l&rsquo;ensemble du projet.</p>
<h3></h3>
<h3>Animations</h3>
<p>Ce qui m’a particulièrement attiré chez Framer, c’est la promesse de pouvoir créer des animations complexes sans se prendre la tête avec des montagnes de code ou d&rsquo;autres solutions bien trop compliquées à prendre en main.</p>
<p>Et encore une fois, j&rsquo;ai été impressionné par la facilité d&rsquo;utilisation de ces options. Pour créer des animations, nous disposons d&rsquo;un volet « Effets » qui se divise en deux parties :</p>
<ul>
<li>Les animations liées à une interaction (clic, survol, glisser-déposer)</li>
<li>Les animations liées au défilement (vitesse de défilement, transformations au défilement et animations au défilement)</li>
</ul>
<p>Cela peut sembler limité, cependant, c&rsquo;est amplement suffisant pour offrir une personnalisation pratiquement infinie et précise. J&rsquo;ai pu mettre en place une grande variété d&rsquo;animations au sein de mon portfolio, et tout s&rsquo;est déroulé parfaitement et facilement.</p>
<h3></h3>
<h3>Parti CMS</h3>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-2846" src="https://ekite.info/wp-content/uploads/2024/04/Capture-decran-2024-04-26-a-01.23.49-300x178.png" alt="" width="544" height="323" /></p>
<p>Pour la création des pages projet de mon portfolio, j’ai pu explorer la partie CMS de Framer. Celle-ci est particulièrement bien conçue et nous propose de créer différentes « Collections » (bases de données). Pour les remplir, nous avons plusieurs possibilités :</p>
<ul>
<li>Remplir manuellement via l’interface en ajoutant des champs de différents types (image, texte, ID, etc.).</li>
<li>Importer un fichier CSV contenant l’intégralité de notre base de données. Cette option fonctionne très bien mais ne permet pas d&rsquo;importer des images (sauf si celles-ci sont hébergées).</li>
</ul>
<p>Grâce à cela, nous avons pu nous lancer dans la création de notre modèle de page projet, et, une fois de plus, Framer nous a grandement facilité la tâche en proposant une interface parfaite. Lorsque nous ajoutons un élément et que nous souhaitons le rendre dynamique, il suffit de cliquer sur le petit plus à côté des options de personnalisation pour définir la bonne donnée.</p>
<p>En définitive, cette partie du site a pu être réalisée extrêmement rapidement.</p>
<h3></h3>
<h3>Framer x Figma</h3>
<p>Une des nombreuses possibilités offertes par Framer est la capacité de récupérer directement les maquettes réalisées dans Figma pour les importer dans Framer et les éditer directement. C’est cette fonctionnalité qui m’a particulièrement attiré sur le logiciel car la promesse est folle : transformer des maquettes en site fonctionnel en un simple copier-coller.</p>
<p>Dans les faits, c’est effectivement bluffant. Après avoir utilisé le plugin Framer dans Figma, je me retrouve avec une page identique directement dans Framer. Toutefois, il faut faire particulièrement attention à la création de la maquette au préalable, car Framer doit pouvoir comprendre les différents éléments et leur comportement attendu. Cela nécessite donc de prêter une attention particulière aux contraintes et aux auto-layout que nous mettrons en place dans notre projet.</p>
<p>Par exemple, voici une grille sans aucun auto-layout ni contraintes. Évidemment, Framer ne parvient pas à identifier les éléments, ce qui nous donne un résultat absolument non responsive et inutilisable.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-2848" src="https://ekite.info/wp-content/uploads/2024/04/Capture-decran-2024-04-26-a-01.31.50-300x178.png" alt="" width="523" height="234" /></p>
<p>Et voici la version avec tout bien fait.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-2847" src="https://ekite.info/wp-content/uploads/2024/04/Capture-decran-2024-04-26-a-01.32.41-300x178.png" alt="" width="521" height="309" /></p>
<h3></h3>
<h3>Résultat</h3>
<p>Et voilà, nous arrivons à la fin de la création de ce portfolio, et pour être tout à fait honnête, je suis bluffé par la qualité de l’outil, sa facilité de prise en main et les possibilités qui me semblent aujourd’hui presque infinies.</p>
<p>Dans le cadre de cet article, j’ai fait le choix de ne pas utiliser une version payante pour m’assurer de sa viabilité, et je n’ai absolument pas été limité par celle-ci, à l&rsquo;exception de trois choses :</p>
<ul>
<li>L’URL n’est pas personnalisable.</li>
<li>Il n’est pas possible d’importer des vidéos.</li>
<li>Un blason “Made in Framer” trône fièrement en bas à droite en position fixe.</li>
</ul>
<p>Voici ce à quoi ressemble donc le portfolio pour le moment !</p>
<p>[videopress SASO4nzL]</p>
<h3></h3>
<h3>En conclusion</h3>
<p>En conclusion, je pense que Framer est l’outil idéal, particulièrement adapté aux designers. Tout au long de la création de mon portfolio et de l&rsquo;apprentissage de l&rsquo;outil, je n’ai à aucun moment eu l’impression de perdre mon temps. Chaque fois que je rencontrais une difficulté, j’ai eu la merveilleuse surprise de découvrir toute la documentation proposée par Framer et par la communauté, qui s’avère être particulièrement active. Cela en fait, selon moi, l’outil le plus apte à répondre aux attentes des designers web.</p>
<p>L’article <a href="https://ekite.info/2024/12/12/concevoir-un-portfolio-avec-framer/">Concevoir un portfolio avec Framer</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2833</post-id>	</item>
		<item>
		<title>Terraform custom provider</title>
		<link>https://ekite.info/2024/11/20/terraform-custom-provider/</link>
		
		<dc:creator><![CDATA[Yohann Gueguin]]></dc:creator>
		<pubDate>Wed, 20 Nov 2024 07:46:25 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=1570</guid>

					<description><![CDATA[<p>Terraform, provider personnalisé ou comment consommer de l&#8217;API autrement Terraform est devenu un outil incontournable dans le monde du DevOps, plus particulièrement dans l&#8217;univers de l&#8217;infrastructure as code. Dans cet article, nous mettrons en évidence une autre manière de penser l&#8217;utilisation de Terraform, le « service as code ». On oublie souvent que Terraform fonctionne grâce aux [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2024/11/20/terraform-custom-provider/">Terraform custom provider</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Terraform, provider personnalisé ou comment consommer de l&rsquo;API autrement</h1>
<div>
<div>Terraform est devenu un outil incontournable dans le monde du DevOps, plus particulièrement dans l&rsquo;univers de l&rsquo;infrastructure as code.</div>
<div>Dans cet article, nous mettrons en évidence une autre manière de penser l&rsquo;utilisation de Terraform, le « service as code ». On oublie souvent que Terraform fonctionne grâce aux différentes APIs fournies par des tiers. Mais comment tout cela fonctionne ? C&rsquo;est ce que nous verrons ici. À la fin de cet article, vous aurez développé un provider Terraform simple et connecté à une API basique.</div>
<div>
<p>Pour mieux appréhender cet article, il est préférable d’être déjà initié à Terraform et de manière plus générale d&rsquo;avoir une connaissance de l’infrastructure as code. Ne vous inquiétez pas, même si vous n’êtes pas familier avec ces concepts, nous commencerons tout de même par des petits rappels, qui vous permettront de suivre ce guide pas à pas.</p>
<p>&nbsp;</p>
<div>
<h2>Petits rappels</h2>
<h3>Terraform</h3>
<div>
<div>Terraform est un outil qui permets de créer, mettre à jour et versionner vos infrastructures de manière sécurisée et efficiente. Une infrastructure composée de ressources cloud, comme des bases de données, des machines virtuelles ou n’importe quel service de votre fournisseur cloud préféré.</div>
<div>
<p>Il peut aussi déployer des ressources « maison », via du développement custom, qui seront propres à vos besoins et c&rsquo;est justement tout l&rsquo;objet de cet article !</p>
<p>&nbsp;</p>
<div>
<h3>Terraform provider</h3>
</div>
<div>
<div>Les providers Terraform vous permettront d&rsquo;intéragir avec un service tiers (ex : GCP, GitHub, etc&#8230;). On pourrait comparer les providers Terraform avec des librairies dans les langages de développement. Ces interactions seront réalisées via les différentes ressources fournies par ces providers, par exemple le provider Terraform de GitHub fournit une ressource « github_team » qui permet de créer, modifier ou supprimer une team GitHub.</div>
<div>Si vous n&rsquo;avez jamais manipulé Terraform, je vous conseille d&rsquo;aller voir ce <a href="https://github.com/ekit3/terraform-scaleway">guide</a> dans un premier temps avant de continuer celui-ci.</div>
<div></div>
<div></div>
</div>
</div>
</div>
</div>
<div>
<h2>Mais à quoi bon un provider custom ?</h2>
<div>Comme je l&rsquo;ai dit en introduction, on peut voir Terraform comme une autre manière de consommer de l&rsquo;API. Dans la plupart des cas, quand on veut consommer une API, que ce soit pour de la lecture ou de l&rsquo;écriture, on développera soit une autre API, soit un batch. Ce qui demande déjà (selon les besoins) une certaine expertise et un certain nombre de resources (temps, matériels, humains). Cela peut vite devenir un frein à la consommation de vos services.</div>
<div>Avec un provider propre à vos services, vous offrez la possibilité à vos utilisateurs de consommer directement et simplement votre ou vos APIs, le code Terraform étant très descriptif.</div>
<div>En plus de cela vous bénéficiez des autres avantages de Terraform, l&rsquo;état de votre utilisation des services correspond à votre code. La persistance de l&rsquo;état des objets créés plus tôt est pratique dans les cas de DRP par exemple.</div>
<div></div>
</div>
</div>
<div>
<div>
<h2>J’en veux un, comment je fais ?</h2>
<div>Ici nous réaliserons un guide pas à pas, pour développer ce fameux provider custom. Pour cela dans le repository git, il y a un fichier docker-compose.yml qui vous permettra de lancer une base de données, une API et une application web pour visualiser le contenu de cette base de données.</div>
<div>Cette API n&rsquo;est qu&rsquo;un simple CRUD sur un objet « Cour », qui possède plusieurs champs : un nom, une durée et une description.</div>
<div></div>
</div>
<div>
<div>
<h3>Prérequis</h3>
<p>&#8211; <a href="https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli">Terraform CLI</a><br />
&#8211; <a href="https://docs.docker.com/compose/install/#scenario-one-install-docker-desktop">Docker Compose</a><br />
&#8211; <a href="https://go.dev/doc/install">Golang</a></p>
<p>&nbsp;</p>
</div>
</div>
<div>
<div>
<h3>On code !! ??????</h3>
<div>Hashicorp fournit différentes librairies pour faciliter le développement de providers Terraform, il fournit également des repositories d&rsquo;exemples qui permettent de commencer rapidement le développement d&rsquo;un provider et tout un ensemble de guides très complets.</div>
</div>
</div>
<div>
<h4>Pas à pas</h4>
<p>Dans un premier temps, on se crée un petit répertoire tout propre, et on y clone le projet</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">mkdir demo-custom-provider &amp;&amp; cd demo-custom-provider
git clone git@github.com:ekit3/terraform-custom-provider.git</pre>
<p>Vous retrouvez dans ce repo différentes choses,</p>
<ul>
<li>un dossier « custom-provider »: qui contient le résultat final du provider que l&rsquo;on développera dans le dossier « final-code », mais aussi un boilerplate pour vous permettre de commencer le guide, dans le dossier &lsquo;ressource&rsquo;</li>
<li>un dossier « docs »: qui contient le code du provider et des exemples Terraform pour chaque étape que l&rsquo;on réalisera, en quelque sorte : les solutions</li>
<li>et pour finir, une API et un front qui vont de pair avec le docker-compose.</li>
</ul>
<p>Le front ne sert qu&rsquo;à visualiser les actions, qui seront exécutées par le provider Terraform, même si on pourrait se contenter des résultats des commandes Terraform. Mais voir le résultat sur un front vous fera prendre conscience que vous pouvez bien créer n&rsquo;importe quelle ressource. L&rsquo;API quant à elle est <strong>OBLIGATOIRE, </strong>vu qu&rsquo;un provider Terraform fonctionne forcément avec une API. N&rsquo;hésitez pas à utiliser une de vos propres APIs, et à adapter les bouts de code qui suivront celle ci.</p>
</div>
</div>
</div>
<p>Dans un premier temps, placez-vous dans le dossier, « custom-provider/resources/terraform-provider-courses », il s&rsquo;agit du boilerplate de départ.<br />
<em><br />
Explication du contenu de ce dossier.<br />
</em>Le dossier « courses » contient le premier fichier de code go pour notre futur provider. Celui-ci initialise un provider, mais vide !</p>
<pre class="EnlighterJSRAW" data-enlighter-language="golang">package courses

import (
    "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

// Provider -
func Provider() *schema.Provider {
    return &amp;schema.Provider{
        ResourcesMap:   map[string]*schema.Resource{},
        DataSourcesMap: map[string]*schema.Resource{},
    }
}
</pre>
<p>Le fichier « main.go », est le point d&rsquo;entrée de notre provider.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">package main

import (
    "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
    "github.com/hashicorp/terraform-plugin-sdk/v2/plugin"

    "terraform-provider-courses/courses"
)

func main() {
    plugin.Serve(&amp;plugin.ServeOpts{
        ProviderFunc: func() *schema.Provider {
            return courses.Provider()
        },
    })
}</pre>
<p>Le dossier « terraform », contient le code Terraform qui appelera notre custom provider.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">terraform {
  required_providers {
    courses = {
      version = "0.1"
      source  = "hashicorp.com/ekite/courses"
    }
  }
}

provider "courses" {}</pre>
<p>Le « Makefile », qui lui nous permettra de build et installer notre provider sur notre machine. Vous remarquerez que les informations décrites dans ce fichier correspondent à l&rsquo;appel du provider, dans le fichier ci-dessus.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">TEST?=$$(go list ./... | grep -v 'vendor')
HOSTNAME=hashicorp.com
NAMESPACE=ekite
NAME=courses
BINARY=terraform-provider-${NAME}
VERSION=0.1
OS_ARCH=darwin_amd64

default: install

build:
    go build -o ${BINARY}

release:
    GOOS=darwin GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_darwin_amd64
    GOOS=freebsd GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_freebsd_386
    GOOS=freebsd GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_freebsd_amd64
    GOOS=freebsd GOARCH=arm go build -o ./bin/${BINARY}_${VERSION}_freebsd_arm
    GOOS=linux GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_linux_386
    GOOS=linux GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_linux_amd64
    GOOS=linux GOARCH=arm go build -o ./bin/${BINARY}_${VERSION}_linux_arm
    GOOS=openbsd GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_openbsd_386
    GOOS=openbsd GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_openbsd_amd64
    GOOS=solaris GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_solaris_amd64
    GOOS=windows GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_windows_386
    GOOS=windows GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_windows_amd64

install: build
    mkdir -p ~/.terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAME}/${VERSION}/${OS_ARCH}
    mv ${BINARY} ~/.terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAME}/${VERSION}/${OS_ARCH}

test: 
    go test -i $(TEST) || exit 1                                                   
    echo $(TEST) | xargs -t -n4 go test $(TESTARGS) -timeout=30s -parallel=4                    

testacc: 
    TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m</pre>
<p>Nous allons maintenant build cette première version de notre provider, pour ce faire placez vous dans le dossier « custom-provider/resources/terraform-provider-courses »</p>
<p>On initialise notre module go. Le nom choisi ici doit matcher le nom choisi dans le &lsquo;main.go&rsquo; au niveau des imports.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">go mod init terraform-provider-courses</pre>
<p>On installe les dépendances, de notre module</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">go mod tidy</pre>
<p>Après cela, nous pouvons utiliser notre Makefile pour build et installer notre module</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">make build &amp;&amp; make install</pre>
<div>
<h1><img loading="lazy" decoding="async" class="alignnone wp-image-2361 size-large" src="https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_1-1024x247.png" alt="" width="1024" height="247" srcset="https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_1-980x236.png 980w, https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_1-480x116.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></h1>
<p>Vous pouvez ouvrir une autre console et vous placer dans le dossier « terraform ». Nous allons vérifier le build et l&rsquo;install de ce provider.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">terraform init
terraform plan</pre>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-2363 size-large" src="https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_2-1024x645.png" alt="" width="1024" height="645" srcset="https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_2-980x617.png 980w, https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_2-480x302.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></p>
<p>Nous avons donc notre custom provider configuré et fonctionnel, même si pour le moment il ne fait pas grand chose !</p>
<p>Nous allons maintenant entrer dans le vif du sujet, mais allons-y étape par étape. Nous commençons par développer une première « data » Terraform qui correspondra à l&rsquo;ensemble des cours renvoyés par l&rsquo;API. Pour rappel Terraform a deux types d&rsquo;objets qu&rsquo;on manipule à travers les providers:</p>
<ul>
<li>les ressources, qui correspondent aux objets que vous créez. Par exemple, une adresse IP ou un repository GitHub.</li>
<li>les datas, qui correspondent à des informations renvoyées par un provider. Par exemple, une data qui contiendra la liste des membres d&rsquo;une équipe GitHub.</li>
</ul>
<p>Commençons par lancer notre docker-compose.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">docker-compose up -d</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">Ces routes sont disponibles dans l'api,
GET   http://localhost:4000/cours, renvoie une liste de cours
POST http://localhost:4000/cours, crée un cour avec ce body 
{
    "name": "Petit intervention",
    "time": 60,
    "summary": "intervention sur sujet tech"
}
PUT http://localhost:4000/cours/651fc2f3970d6264792bf49e, avec le même body que pour le POST
DELETE http://localhost:4000/cours/65201115d9a28e309a48d610, qui supprime le cours.</pre>
<p>Vous pouvez maintenant copier coller les fichiers du dossier « docs/providers/step1 », dans le dossier « custom-provider/resources/terraform-provider-courses/courses »</p>
<p>Le fichier, « data_source_courses.go », contient la définition de notre data source pour les cours.<br />
Il existe deux méthodes importantes. « dataSourceCourses », qui est le point d&rsquo;entré pour terraform pour comprendre comment interagir avec cette « data ». Dans cette méthode vous avez deux options, « ReadContext », qui prend en valeur la fonction qui sera exécutée pour renvoyer la valeur de cette data, et « Schema », qui sert à définir le schéma de la donnée renvoyée par le provider.<br />
Dans ce même fichier, vous avez la méthode « dataSourceCoursesRead », qui sera appelée pour récupérer la data. Dans celle-ci vous remarquerez que ce n&rsquo;est qu&rsquo;un bout de code qui fait un appel à notre API (cf ligne 57). Autre ligne intéressante, la ligne 79. Sur celle-ci, nous voyons que nous associons un id à notre data, primordial à Terraform ! Je vous invite maintenant à builder la version 0.2 de votre provider (n&rsquo;oubliez pas de monter la version dans le Makefile !)<br />
Vous trouverez également les fichiers Terraform pour tester cette nouvelle version. Utilisez les fichiers dans le dossier docs, example1.tf. Vous pouvez créer un ou plusieurs cours via l&rsquo;API. Utilisez les commandes suivantes pour installer la nouvelle version du module et lancer le plan Terraform. Vous pouvez l&rsquo;apply si vous le souhaitez. (/!\ pour la suite, si vous appliquez des objects entre différentes versions du provider ou si vous relancez le docker compose, n&rsquo;oubliez pas de clean vos states Terraform, pour repartir de zéro)</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">terraform init --upgrade
terraform plan</pre>
<h3><img loading="lazy" decoding="async" class="alignnone wp-image-2371 size-large" style="color: #666666; font-size: 14px;" src="https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_3-1024x448.png" alt="" width="1024" height="448" srcset="https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_3-980x429.png 980w, https://ekite.info/wp-content/uploads/2024/01/wordpress_custom_tf_3-480x210.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></h3>
<p>Maintenant nous nous attaquons à la création de ressources! Nous commençons par la création d&rsquo;un cours!<br />
Comme pour l&rsquo;étape précédente, vous pouvez prendre les fichiers dans les ressources step2 et example2!</p>
<p>Comme vous pouvez le constater le main.tf ne va pas changer, seul le provider.tf va subir une modification. En plus de la partie data, nous rajoutons maintenant notre ressource « ekite_cour », qui va nous permettre de créer, récupérer, mettre à jour ou supprimer un cours dans notre API.<br />
C&rsquo;est la méthode dataSourceCour(), qui va contenir toutes les méthodes nécessaires aux actions d&rsquo;une ressource Terraform, celle-ci implémentant les méthodes fournies par Hashicorp.<br />
On peut voir que la méthode DataSourceCour(), renvoie un objet *schema.Resource qui prend en paramètre des méthodes de « Contexte », qui implémentent le code qui va être lié aux actions sur la ressource. C&rsquo;est pour cela qu&rsquo;on en retrouve une pour Create Read Update Delete.<br />
Dans ces méthodes, je vais seulement implémenter des calls à mon API, et le code nécessaire à Terraform pour garantir la consistance des ressources maintenues par ce provider. Ce code n&rsquo;étant que le set d&rsquo;un id à la ressource Terrafom, qui lui permet de l&rsquo;identifier dans son backend Terraform.<br />
On peut voir que j&rsquo;utilise la variable « d » qui correspond à la ressource qu&rsquo;on est en train de manipuler. Je peux récupérer les différentes valeurs poussées dans la définition de la ressource.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">package courses

import (
    "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

// Provider -
func Provider() *schema.Provider {
    return &amp;schema.Provider{
        ResourcesMap: map[string]*schema.Resource{
            "ekite_cour": dataSourceCour(),
        },
        DataSourcesMap: map[string]*schema.Resource{
            "ekite_courses": dataSourceCourses(),
        },
    }
}
</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">package courses

import (
    "bytes"
    "context"
    "encoding/json"
    "log"
    "net/http"

    "github.com/hashicorp/terraform-plugin-sdk/v2/diag"

    "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

type Cour struct {
    Id      string `json:"_id"`
    Name    string `json:"name"`
    Time    int    `json:"time"`
    Summary string `json:"summary"`
}

func dataSourceCour() *schema.Resource {
    return &amp;schema.Resource{
        CreateContext: resourceCourCreate,
        ReadContext:   resourceCourRead,
        UpdateContext: resourceCourUpdate,
        DeleteContext: resourceCourDelete,

        Schema: map[string]*schema.Schema{
            "_id": &amp;schema.Schema{
                Type:     schema.TypeString,
                Optional: true,
            },
            "name": &amp;schema.Schema{
                Type:     schema.TypeString,
                Required: true,
            },
            "time": &amp;schema.Schema{
                Type:     schema.TypeInt,
                Required: true,
            },
            "summary": &amp;schema.Schema{
                Type:     schema.TypeString,
                Required: true,
            },
        },
    }
}

func resourceCourCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {

    var diags diag.Diagnostics

    name := d.Get("name").(string)
    time := d.Get("time").(int)
    summary := d.Get("summary").(string)

    data := map[string]interface{}{
        "name":    name,
        "time":    time,
        "summary": summary,
    }

    jsonData, err := json.Marshal(data)

    resp, err := http.Post("http://localhost:4000/cours", "application/json", bytes.NewBuffer(jsonData))

    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    cour := &amp;Cour{}
    err = json.NewDecoder(resp.Body).Decode(&amp;cour)
    if err != nil {
        return diag.FromErr(err)
    }
    // THIS IS MANDATORY FOR TERRAFORM TO BE ABLE TO GARANT CONSISTENCY OF YOUR RESOURCES
    d.SetId(cour.Id)
    return diags
}

func resourceCourRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {

    return nil
}

func resourceCourUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {

    return nil
}

func resourceCourDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {

    return nil
}
</pre>
<p>&nbsp;</p>
<p>Vu que dans cette étape nous n&rsquo;implémentons que la méthode de création, si vous vous amusez à éditer ou supprimer la ressource, rien ne se passera, même pas une erreur ! Par contre, vos states Terraform seront complètement corrompus. Si c&rsquo;est le cas n&rsquo;hésitez pas à tout supprimer et réinitialiser votre workspace Terraform. Pour créer la ressource, comme d&rsquo;habitude, montez la version, réinstallez votre provider local, votre petit « terraform init &#8211;upgrade » et prenez le contenu du fichier exemple2.tf. Vous venez de mettre en place la création d&rsquo;une ressource par Terraform.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">terraform {
  required_providers {
    courses = {
      version = "0.0.2"
      source  = "hashicorp.com/ekite/courses"
    }
  }
}

resource "ekite_cour" "mon_cour" {
  provider = courses
  name = "Cour créé depuis terraform"
  time = 60
  summary = "Un simple exemple"
}
</pre>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-2586" src="https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.14.41-1024x455.png" alt="" width="1024" height="455" srcset="https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.14.41-980x435.png 980w, https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.14.41-480x213.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></p>
<p>Maintenant vous pouvez soit aller directement à l&rsquo;étape 4, qui finit par implémenter la suppression de ressource, soit passer par la 3 qui commence par implémenter les méthodes de lecture et de mise à jour. Dans mon cas je vais aller à l&rsquo;étape 4 et expliquer le code final qui comprend les deux.<br />
Donc maintenant je voudrais pouvoir éditer mes ressources Terraform, et pour ce faire je pensais qu&rsquo;implémenter la méthode « resourceCourUpdate » suffirait. Mais non, cela dépend de la méthode « read », puisque Terraform, avant de mettre à jour votre ressource, va aller la lire dans votre système d&rsquo;information.<br />
La méthode de lecture a été la plus simple a implémenter, dans le sens où il n&rsquo;y pas de spécificité propre à Terraform, comme on la vu précédemment avec le set de l&rsquo;id dans la méthode de create. En revanche, dans la méthode d&rsquo;update, nous retrouvons une instruction spécifique à Terraform, « d.Set(« last_updated », time.Now().Format(time.RFC850)) ». Celle-ci est indispensable à Terraform. Encore une fois pour garantir la persistance et la cohérence de vos ressources Terraform. Du côté du delete, on retrouve la même idée que pour le create, mais ici nous allons juste supprimer l&rsquo;id de notre ressource.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">package courses

import (
    "bytes"
    "context"
    "encoding/json"
    "log"
    "net/http"
    "time"

    "github.com/hashicorp/terraform-plugin-sdk/v2/diag"

    "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

type Cour struct {
    Id      string `json:"_id"`
    Name    string `json:"name"`
    Time    int    `json:"time"`
    Summary string `json:"summary"`
}

func dataSourceCour() *schema.Resource {
    return &amp;schema.Resource{
        CreateContext: resourceCourCreate,
        ReadContext:   resourceCourRead,
        UpdateContext: resourceCourUpdate,
        DeleteContext: resourceCourDelete,

        Schema: map[string]*schema.Schema{
            "_id": &amp;schema.Schema{
                Type:     schema.TypeString,
                Optional: true,
            },
            "name": &amp;schema.Schema{
                Type:     schema.TypeString,
                Required: true,
            },
            "time": &amp;schema.Schema{
                Type:     schema.TypeInt,
                Required: true,
            },
            "summary": &amp;schema.Schema{
                Type:     schema.TypeString,
                Required: true,
            },
            "last_updated": &amp;schema.Schema{
                Type:     schema.TypeString,
                Optional: true,
                Computed: true,
            },
        },
    }
}

func resourceCourCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {

    var diags diag.Diagnostics

    name := d.Get("name").(string)
    time := d.Get("time").(int)
    summary := d.Get("summary").(string)

    data := map[string]interface{}{
        "name":    name,
        "time":    time,
        "summary": summary,
    }

    jsonData, err := json.Marshal(data)

    resp, err := http.Post("http://localhost:4000/cours", "application/json", bytes.NewBuffer(jsonData))

    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    cour := &amp;Cour{}
    err = json.NewDecoder(resp.Body).Decode(&amp;cour)
    if err != nil {
        return diag.FromErr(err)
    }
    // THIS IS MANDATORY FOR TERRAFORM TO BE ABLE TO GARANT CONSISTENCY OF YOUR RESOURCES
    d.SetId(cour.Id)
    return diags
}

func resourceCourRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
    var diags diag.Diagnostics
    client := &amp;http.Client{Timeout: 10 * time.Second}

    url := "http://localhost:4000/cours/" + d.Id()

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return diag.FromErr(err)
    }

    r, err := client.Do(req)
    if err != nil {
        return diag.FromErr(err)
    }
    defer r.Body.Close()
    cour := &amp;Cour{}
    err = json.NewDecoder(r.Body).Decode(&amp;cour)
    if err != nil {
        return diag.FromErr(err)
    }
    d.Set("name", cour.Name)
    d.Set("time", cour.Time)
    d.Set("summary", cour.Summary)

    return diags
}

func resourceCourUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
    client := &amp;http.Client{Timeout: 10 * time.Second}
    name := d.Get("name").(string)
    timeobj := d.Get("time").(int)
    summary := d.Get("summary").(string)

    data := map[string]interface{}{
        "name":    name,
        "time":    timeobj,
        "summary": summary,
    }

    jsonData, err := json.Marshal(data)

    url := "http://localhost:4000/cours/" + d.Id()

    req, err := http.NewRequest(http.MethodPut, url, bytes.NewBuffer(jsonData))
    if err != nil {
        log.Fatal(err)
    }
    req.Header.Set("Content-Type", "application/json; charset=utf-8")
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    // THIS IS MANDATORY FOR TERRAFORM TO BE ABLE TO GARANT CONSISTENCY OF YOUR RESOURCES
    d.Set("last_updated", time.Now().Format(time.RFC850))
    return resourceCourRead(ctx, d, m)
}

func resourceCourDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
    var diags diag.Diagnostics
    client := &amp;http.Client{}
    url := "http://localhost:4000/cours/" + d.Id()
    req, err := http.NewRequest("DELETE", url, nil)
    if err != nil {
        panic(err)
    }
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    // THIS IS MANDATORY FOR TERRAFORM TO BE ABLE TO GARANT CONSISTENCY OF YOUR RESOURCES
    d.SetId("")
    return diags
}
</pre>
<p>Une fois que vous avez mis à jour votre code, même chose, on rebuild on réinstalle et on réinitialise et vous pouvez vous amuser avec votre provider.<br />
<img loading="lazy" decoding="async" class="alignnone size-large wp-image-2587" src="https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.15.17-1024x455.png" alt="" width="1024" height="455" srcset="https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.15.17-980x435.png 980w, https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.15.17-480x213.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-2588" src="https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.15.41-1024x460.png" alt="" width="1024" height="460" srcset="https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.15.41-980x440.png 980w, https://ekite.info/wp-content/uploads/2024/03/Capture-decran-2024-03-08-a-15.15.41-480x216.png 480w" sizes="auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></p>
<p>Si vous voulez un résumé vous pouvez trouver le déroulé de ce pas à pas ici: https://www.youtube.com/watch?v=hVoPL61x5dI</p>
<h1>Conseils et conclusion</h1>
<div>
<div>Nous venons, en quelques minutes, de donner la possibilité de consommer un service, et le tout as code, je vous laisse imaginer les possibilités qui s&rsquo;ouvrent à vous.</div>
<div>
<p>Nous permettrons ainsi à nos utilisateurs de consommer notre service de manière très simple, via le code déclaratif de Terraform, pouvant automatiser tout son processus de validation Terraform via des CI les plus utilisés. Ceci pourrait vous débloquer dans la mise en place de vos processus DevOps 😉</p>
<p>Dans un futur article, nous verrons comment configurer nos custom providers&#8230;</p>
</div>
</div>
</div>
<p>L’article <a href="https://ekite.info/2024/11/20/terraform-custom-provider/">Terraform custom provider</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1570</post-id>	</item>
		<item>
		<title>Du green dans ton Cloud</title>
		<link>https://ekite.info/2024/10/31/du-green-dans-ton-cloud/</link>
		
		<dc:creator><![CDATA[Martin Sojka]]></dc:creator>
		<pubDate>Thu, 31 Oct 2024 12:55:09 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=2645</guid>

					<description><![CDATA[<p>Le green IT, c’est bien. Travailler sur sa façon de concevoir et d’utiliser des logiciels en ayant en tête les questions d’environnement et de développement durable, on commence à comprendre l’idée. Quand bien même ça n’apparait pas toujours dans les critères principaux du développement ou du déploiement d’une solution, le sujet se répand et aujourd’hui la [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2024/10/31/du-green-dans-ton-cloud/">Du green dans ton Cloud</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p id="bsutm" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []"><strong>Le <em>green IT</em>, c’est bien</strong>. Travailler sur sa façon de concevoir et d’utiliser des logiciels en ayant en tête les questions d’environnement et de développement durable, on commence à comprendre l’idée. Quand bien même ça n’apparait pas toujours dans les critères principaux du développement ou du déploiement d’une solution, le sujet se répand et aujourd’hui la plupart des personnes qui travaillent dans le domaine de l’ingénierie logicielle connaissent ce principe (pour ce qui est d’avoir des convictions sur le sujet, c’est propre à chaque individu, en tout cas ça met un peu de temps à faire consensus). En parallèle, on constate également une utilisation croissante des services de Cloud Computing, qui permettent en général de faire des économies sur les coûts d’hébergement et d’apporter de nouvelles fonctionnalités aussi bien aux équipes de développement, qu’aux organisations qui s’en servent.</p>
<p id="mon1c84" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []"><strong>Problème </strong>: bien souvent, ces solutions Cloud sont une boîte noire et au-delà de la facture correspondant aux ressources utilisées, il est à minima difficile d’en savoir plus sur la façon dont fonctionnent les fournisseurs de service Cloud, notamment sur le sujet du green IT. Parce que oui, si vous passez des heures à retravailler et limiter vos requêtes, que vos fonctionnalités sont sobres mais que l’hébergement Cloud que vous utilisez a pour principale source d’énergie une centrale à charbon, c’est pour le moins dommage. De même, si vos instances sont montées en permanence alors qu’elles connaissent des périodes de moindre utilisation (voire d’absence totale), on perd un peu de l’intérêt du green IT. Et enfin, il n’est pas toujours facile de se faire entendre sur ces questions, surtout quand les objectifs (de sprint, de produit, de politique d’entreprise)<strong> sont plus focalisés sur la performance économique que sur la préservation de la planète. </strong></p>
<p id="d1h8191" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">Aujourd’hui, l’objectif est donc d’aborder ces différents sujets. D’une part, comment améliorer la consommation de ressources d’un cluster Cloud et de l’autre, comment adapter les KPI traditionnels, prisés par les directions financières, afin de les mettre au service d’une cause plus grande.</p>
<h3 id="t6nuf93" class="rObS6 atKDY" dir="auto" data-pm-slice="1 1 []">« C’est pas Versailles ici », ou comment optimiser son Cloud</h3>
<p id="m1bhp1530" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []"><img loading="lazy" decoding="async" class="size-medium wp-image-2648 alignleft" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-24-at-10.39.43-300x291.png" alt="Logo Kube Green" width="300" height="291" />Si la lecture du titre de cette partie vous a rappelé des souvenirs ou que vous vous êtes vous-même surpris ou surprise à prononcer ces mots, ces quelques paragraphes devraient vous parler. En effet, alors qu’on éteint la lumière lorsqu’on quitte une pièce, comment justifier de laisser des ressources informatiques allumées en continu, même lorsqu’elles ne sont pas utilisées ? Prenons l’exemple de vos environnements de recette et de développement : en dehors des heures de bureau, y a-t-il le moindre intérêt à les faire fonctionner, si ce n’est brûler (<em>littéralement</em>) du gaz et remplir les poches de Google et Amazon ? Des améliorations concrètes et rapides sont donc faciles à aller chercher (dans un premier temps). C’est le service que propose <a class="VKazi _08uVf" href="https://kube-green.dev/" target="_blank" rel="noreferrer noopener" data-hook="WebLink"><strong><u>Kube-green</u></strong></a>, plug-in rapide à mettre en place (en 30 minutes c’est largement fait) et diablement efficace. Dans l’exemple qu’on trouve dans leur documentation, la mise en place d’une gestion très simple d’un cluster permet de réduire de près de <strong>30% les émissions de gaz à effet de serre</strong> (GES) et jusqu&rsquo;à 37% sur un cluster plus important. <strong>Rendez-vous compte : cela fait plus d’un tiers d’économie en quelques réglages. </strong></p>
<p id="0lq5o1627" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []"><strong>Remarque</strong> : le calcul de l’empreinte carbone se base sur <a class="VKazi _08uVf" href="https://www.goclimate.com/blog/the-carbon-footprint-of-servers/#:~:text=Cloud%20server%20using%20100%25%20green%20electricity:%20160%20kg%20CO2e%20/%20year%20and%20server" target="_blank" rel="noreferrer noopener" data-hook="WebLink"><u>un article rédigé par GoClimate</u></a> et qui donne des estimations en fonction du type d’hébergement choisi.</p>
<h5 class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">OK, qu&rsquo;est-ce que ça donne concrètement ?</h5>
<p id="c469228776" class="_9HeWj _8tluJ" dir="auto">Pour le tester, j’ai démarré un cluster Kubernetes en local, sur lequel j’ai créé un namespace, au sein duquel j’ai déployé une API, un front et une base de données. Ensuite, il m&rsquo;a de lancer cette commande :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">kubectl apply -f https://github.com/kube-green/kube-green/releases/latest/download/kube-green.yaml</pre>
<p id="htcjk28924" class="_9HeWj _8tluJ" dir="auto">Après quelques secondes, <strong>Kube-green</strong> était déployé dans mon cluster, au niveau global. J’ai ensuite appliqué ce fichier, dans le même namespace où j’ai déployé mes applications.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">apiVersion: kube-green.com/v1alpha1
kind: SleepInfo 
metadata: 
  name: sleep-test 
  Namespace: app-example 
spec: 
  weekdays: "*" 
  sleepAt: "*:*/5" 
  wakeUpAt: "*:*/7"</pre>
<p id="jlgws36562" class="_9HeWj _8tluJ" dir="auto">Dans celui-ci est écrit que je souhaite scale down tous les déploiements de ce namespace, tous les jours, à chaque 5ème minute de chaque heure et de la même manière, scale up à chaque 7ème minute (l’exemple n’a pas vraiment de sens, il s’agit là plutôt d’illustrer la syntaxe, il y a évidemment d’autres manières de configurer cette partie). On peut décider d’ignorer certaines ressources, ou de stopper également ou uniquement des cronjobs. Vous pouvez trouver ces informations dans la doc de <strong>Kube-green</strong>, que l’on peut remercier pour sa clarté. Si on observe les Pods du namespace ,on voit bien qu’ils se coupent et s’allument comme désiré :</p>
<p dir="auto"><img loading="lazy" decoding="async" class=" wp-image-2650 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.29.20-296x300.png" alt="" width="462" height="468" /></p>
<p id="zlza91631" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">Certes, cette solution n’est qu’un début, mais pourquoi ne pas aller plus loin ? On peut imaginer répliquer ce système pour ajouter les jours fériés, les pauses-repas, et ensuite en production, en adaptant le nombre de nœuds disponibles en fonction de l’activité prévue.</p>
<p id="lylpe1635" class="_9HeWj _8tluJ" dir="auto">Il existe encore d’autres solutions, comme <a class="VKazi _08uVf" href="https://keda.sh/" target="_blank" rel="noreferrer noopener" data-hook="WebLink"><strong><u>KEDA</u></strong></a>, qui permettent d’être encore plus flexible dans les choix de scalabilité. Cet outil, en plus de reprendre les fonctionnalités de <strong>Kube-green</strong>, permet d’allumer et d&rsquo;éteindre nos composants Kubernetes en suivant des métriques que vous pouvez personnaliser à volonté, au lieu de vous baser sur des métriques classiques, comme le niveau d’activité du CPU ou de la RAM. On peut imaginer <em>scale</em> sur un indicateur qui mesure le trafic, ou bien qui va chercher des informations en base de données. Par exemple une quantité de data à intégrer, ou encore une métrique personnalisée qui remonterait la consommation en euros (ou en CO2 ?) pour les limiter. <strong>KEDA</strong> est certes plus compliqué à mettre en place et à tester mais il vaut le coup qu’on s’y intéresse.</p>
<h3 id="dwr6n9082" class="rObS6 atKDY" dir="auto">C’est bien beau vos histoires mais comment je vends ça moi ?</h3>
<p id="uzb7c66458" class="_9HeWj _8tluJ" dir="auto">Ce qui est certain c’est qu’aujourd’hui les directions financières ont un objectif sur les questions d&rsquo;argent plutôt que sur celles de la biodiversité ou de la sobriété énergétique (et en même temps, tant qu&rsquo;on les appellera des directions financières&#8230;). <strong>C’est pour ça qu’il va falloir ruser</strong> : plutôt que de mentionner la diminution du bilan carbone de votre application, il vaudra toujours mieux mettre en avant la baisse de la facture de votre infrastructure (forcément, si on utilise moins de ressources, on émet moins de GES et on paie moins cher). En revanche, pour donner un objectif à vos équipes sensibles à ces questions, d’autres outils existent et notamment <strong>Kube Carbon</strong>.</p>
<p id="bx5l866800" class="_9HeWj _8tluJ" dir="auto">Introduit en 2019 par <strong>Adam Hevenor</strong>, cet outil permet facilement de générer des courbes et des métriques suivant les émissions de GES de votre activité. <a class="VKazi _08uVf" href="https://medium.com/@aHev/introducing-kube-carbon-72aea7d828b1" target="_blank" rel="noreferrer noopener" data-hook="WebLink"><u>Dans un article partagé sur Medium</u></a>, il détaille son calcul de manière à faire le lien entre volume d’opérations informatiques et émission de gaz à effet de serre. La méthodologie n’est pas parfaite, et certains chiffres mériteraient sans doute d’être revus (la publication date déjà d’octobre 2019), mais elle explore néanmoins les différentes questions qui se posent à l’heure où l’usage du Cloud se démocratise. Quelle est l’empreinte carbone des services Cloud de Google ou d’Amazon ? Les deux vous répondront qu’ils sont neutres en carbone mais ce tour de passe-passe n’est possible que grâce à l’achat de crédits carbone et autres compensations, le tout sans avoir la moindre transparence concernant les volumes d’équivalent CO2 produits. C’est d’ailleurs la conclusion de l’article d’Adam qui appelle de ses vœux les grands du Cloud à plus de transparence sur ces questions (d’ailleurs ils pourraient intégrer à leur service le même type de graphes de façon native). Surtout, dans une période qui appelle à la sobriété, tout ce qu&rsquo;il n&rsquo;est pas nécessaire de compenser est bon à prendre.</p>
<p id="unu96116787" class="_9HeWj _8tluJ" dir="auto"><strong>Kube Carbon</strong> a donc cet avantage de fournir une vision chiffrée de votre impact carbone, avec pour objectif de devenir un indicateur important pour l&rsquo;ensemble des acteurs.</p>
<h5 id="ft22f171155" class="a0sZJ atKDY" dir="auto">OK, vous pouvez me refaire un topo pratique aux petits oignons comme pour Kube-green ?</h5>
<p id="jw0jd192768" class="_9HeWj _8tluJ" dir="auto"><strong>Kube Carbon</strong>, techniquement, se résume à un <em>dashboard</em> <strong>Grafana</strong>, qui, dans l’état, ne fait que prendre des métriques, les transformer et nous les afficher. Ce qu’il faut retenir c’est la réflexion qu’a eu <strong>Adam Hevenor</strong> autour de ces indicateurs. Pour mieux me rendre compte de ce que cela représente, j’ai quand même déployé <strong>Prometheus</strong>, <strong>Grafana</strong> et importé ce <em>dashboard</em>.</p>
<p id="ogg69193015" class="_9HeWj _8tluJ" dir="auto">Toujours sur mon cluster k8s local, j’ai exécuté ces commandes :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">// create dedicated namespace and switch to it 
k create ns prometheus 
kubens prometheus 
// helm install for prometheus &amp; grafana 
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts  
helm repo update 
helm install prometheus prometheus-community/prometheus 
helm repo add grafana https://grafana.github.io/helm-charts  
helm repo update 
// Expose grafana svc to local access 
kubectl expose service grafana --type=NodePort --target-port=3000 --name=grafana-ext 
// Get svc port for access</pre>
<div dir="auto" data-pm-slice="1 1 []">
<pre class="_5WAbL YJSb9"><img loading="lazy" decoding="async" class=" wp-image-2653 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.37.48-300x34.png" alt="" width="688" height="78" /></pre>
<div dir="auto" data-pm-slice="1 1 []">
<pre class="EnlighterJSRAW" data-enlighter-language="shell">// Get secret data to log in grafana 
k get secret  grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo</pre>
<p id="glk9d200414" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">Maintenant qu’on a une stack <strong>Prometheus</strong> / <strong>Grafana</strong> qui fonctionne, on peut y accéder pour la paramétrer.</p>
<p dir="auto" data-pm-slice="1 1 []"><img loading="lazy" decoding="async" class=" wp-image-2655 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.39.41-300x173.png" alt="" width="731" height="422" /></p>
<p id="j7n1h207221" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">On peut remplir l’url de Prometheus avec son url de service Kubernetes, <em>service:port </em>comme <a class="VKazi _08uVf" href="http://prometheus-server:80" target="_blank" rel="noopener" data-hook="WebLink"><em><u>http://prometheus-server:80</u></em></a></p>
<p id="1bx0d206676" class="_9HeWj _8tluJ" dir="auto">Il ne nous reste plus qu’à importer le dashboard de Kube Carbon qu’on retrouve <a class="VKazi _08uVf" href="https://grafana.com/grafana/dashboards/11010-kube-carbon/" target="_blank" rel="noreferrer noopener" data-hook="WebLink"><u>ici.</u></a> Nous n’avons besoin que de son ID.</p>
<p dir="auto"><img loading="lazy" decoding="async" class=" wp-image-2656 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.43.07-300x167.png" alt="" width="730" height="406" /></p>
<p id="0rzih215724" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">On se rend dans Grafana, dans la partie <em>dashboard</em> puis Nouveau/New</p>
<p dir="auto" data-pm-slice="1 1 []"><img loading="lazy" decoding="async" class=" wp-image-2657 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.44.42-300x87.png" alt="" width="731" height="212" /></p>
<p id="mfnht218603" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">Et on vient importer notre <em>dashboard.</em></p>
<p dir="auto" data-pm-slice="1 1 []"><img loading="lazy" decoding="async" class=" wp-image-2658 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.45.01-300x245.png" alt="" width="736" height="601" /></p>
<p id="b5jtz221304" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">Et nous voici avec le <em>dashboard</em> pensé par son auteur pour évaluer le bilan carbone des ressources que nous utilisons. On trouve un résumé des métriques et des valeurs utilisées pour celles-ci dans son calcul.</p>
<p dir="auto" data-pm-slice="1 1 []"><img loading="lazy" decoding="async" class=" wp-image-2659 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.47.19-300x108.png" alt="" width="736" height="265" /></p>
<p id="n7lms224375" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">Ensuite nous avons un résumé de notre consommation totale, et un détail par Pod.</p>
<p dir="auto" data-pm-slice="1 1 []"><img loading="lazy" decoding="async" class="wp-image-2660 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.47.31-300x156.png" alt="" width="738" height="384" /></p>
<p id="kjmf6227688" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">Avec ces quelques manipulations, nous voilà déjà avec un outil qui commence à donner une idée de notre consommation. Pour rappel, le plus intéressant dans ces éléments, ce sont les choix au niveau des données en entrée et la formule que l&rsquo;outil applique :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">sum(container_cpu_usage_seconds_total * (.001/$flops_per_watt*$carbon_per_watt*$clock_speed)) / 1000000000</pre>
<p id="0rl62228283" class="_9HeWj _8tluJ" dir="auto">On note déjà une baisse à un instant précis, qui coïncide avec le moment où s’est appliqué mon fichier SleepInfo de <strong>Kube green</strong>, j&rsquo;ai donc voulu remonter d&rsquo;un cran au niveau de mon namespace de test, ce qui m’a amené à dupliquer la visualisation et faire les modifications nécessaires, pour aboutir à ce résultat :</p>
<p dir="auto"><img loading="lazy" decoding="async" class="wp-image-2662 aligncenter" src="https://ekite.info/wp-content/uploads/2024/03/Screenshot-2024-01-11-at-11.47.42-300x157.png" alt="" width="739" height="387" /></p>
<p id="zmihz244877" class="_9HeWj _8tluJ" dir="auto" data-pm-slice="1 1 []">On voit encore plus l’impact de la mise en place de <strong>Kube green</strong> au niveau de ce <em>namespace</em>, ça donne une idée de ce qu’il serait possible de faire en travaillant plus finement.  Vu la flexibilité qu’offrent <strong>Grafana</strong> et <strong>Prometheus</strong>, on peut très bien imaginer adapter ce <em>dashboard</em> à nos besoins et mettre à jour les indicateurs de base avec les nouvelles informations à notre disposition (encore faut-il qu&rsquo;elles soient fournies, que ce soit <strong>Scaleway</strong>, <strong>GCP</strong> ou <strong>Amazon</strong>, aucune information précise n’est trouvable à ce sujet, pas même une estimation).</p>
<p id="6dzig244221" class="_9HeWj _8tluJ" dir="auto">On peut imaginer un <em>dashboard</em> par fournisseur Cloud par exemple, avec ses propres informations en entrée, variabiliser les <em>dashboards</em> selon des tags ou des labels propres à nos besoins, pour mieux identifier qui consomme ou non.</p>
</div>
</div>
<p>L’article <a href="https://ekite.info/2024/10/31/du-green-dans-ton-cloud/">Du green dans ton Cloud</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2645</post-id>	</item>
	</channel>
</rss>
