<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Julien SCHMITT on Medium]]></title>
        <description><![CDATA[Stories by Julien SCHMITT on Medium]]></description>
        <link>https://medium.com/@julien_schmitt?source=rss-aa82a3874374------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*evCnTkhcX2p7RR1AYQp1YA.jpeg</url>
            <title>Stories by Julien SCHMITT on Medium</title>
            <link>https://medium.com/@julien_schmitt?source=rss-aa82a3874374------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 21:37:40 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@julien_schmitt/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Is thinking without AI becoming counterproductive?]]></title>
            <link>https://medium.com/@julien_schmitt/is-thinking-without-ai-becoming-counterproductive-2217b707ab2d?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/2217b707ab2d</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[kids-and-tech]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[volunteering]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Sun, 01 Feb 2026 00:18:29 GMT</pubDate>
            <atom:updated>2026-02-01T00:18:29.128Z</atom:updated>
            <content:encoded><![CDATA[<p>I was running a JavaScript workshop for 12–13-year-old kids when something made me uncomfortable.</p><p>Not a bug.<br>Not a technical misunderstanding.</p><p>A gap.</p><p>Hard to put into words at the time, but strong enough that I felt the need to write it down, or rather, type it out.</p><p>A gap between the way they approach the internet, and the way I learned to use it.</p><p>AI is everywhere now. It’s no longer new.<br>Whether we see it as an opportunity, a threat, or just another tool, it is already embedded in our daily practices. Every day brings new announcements, demos, and debates.</p><p>And in the middle of all that noise, a simple question kept coming back:</p><blockquote>Is thinking without AI becoming useless?</blockquote><figure><img alt="changing landscapes in LLM" src="https://cdn-images-1.medium.com/max/1024/0*ZRVpw6r3s6DfHKsT" /><figcaption>Photo by <a href="https://unsplash.com/@solenfeyissa?utm_source=medium&amp;utm_medium=referral">Solen Feyissa</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>Back to paper</h3><p>Every Sunday, I volunteer at a local association, running website-creation workshops.</p><p>That week, while introducing JavaScript and basic algorithms, I suggested a detour.<br>One that felt almost anachronistic to them.</p><p>No computers.<br>No code editors.<br>Just paper, pens, and collective thinking.</p><p>We described an algorithm in plain language, using pseudocode.<br>The goal wasn’t syntax, but logic: understanding what happens, in what order, and why.</p><p>Only afterward did we talk about JavaScript.</p><p>I wanted to convey a simple idea:<br>as long as a problem isn’t clear on paper, it won’t be any clearer once handed to an AI or wrapped inside a framework.</p><p>Laying out a line of reasoning, even imperfectly, is still a structuring step.<br>It allows you either to write the code yourself, or to formulate a more precise request to a colleague, or to an AI.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TOiZdiFyQM1B3bgGNvifTQ.png" /><figcaption>Kids laying out their algorithms on paper before coding.</figcaption></figure><h3>What I didn’t anticipate</h3><p>Once the exercise was over, I asked them to sit at their computers and turn their pseudocode into JavaScript.<br>No constraints. Total freedom.</p><p>Almost all of them immediately opened Copilot.</p><p>Not to get occasional help.<br>But to ask for a complete solution.</p><p>What surprised me wasn’t the use of AI itself.<br>It was how it was used.</p><p>The prompts were vague. Very generic.<br>Even though, just minutes earlier, the logic had been clear in their minds, expressed in plain language and discussed together.</p><p>The generated answers worked.<br>But they were often unnecessarily complex, disconnected from the original reasoning, and hard to relate to what they actually wanted to build.</p><p>We could have ended up with something much simpler.<br>If only the request had been clearer.</p><h3>Searching doesn’t mean the same thing anymore</h3><p>That’s when something clicked.</p><p>They don’t search the internet the way I learned to.</p><p>Reading official documentation doesn’t come naturally to them.<br>StackOverflow barely exists in their mental model.</p><p>Why browse multiple sources when an AI can deliver an immediately usable answer?</p><p>From my perspective, that’s unsettling.<br>But on reflection, it’s perfectly rational.</p><p>We learned how to search because we had no choice.<br>They are learning how to query a system that already produces answers.</p><p>It’s not necessarily better.<br>It’s not necessarily worse.<br>It’s just different.</p><p>After COVID, I had personally distanced myself from StackOverflow anyway.<br>The atmosphere had become toxic, moderation rigid and sometimes contemptuous. Today, I almost feel relieved that beginners have another entry point.</p><p>This shift started long before AI, which only made it more visible.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*V6g5U_XZF2mydNHEZfrKPw.jpeg" /><figcaption>StackOverflow seems to be almost dead. <a href="https://blog.pragmaticengineer.com/stack-overflow-is-almost-dead/">Source</a>.</figcaption></figure><h3>The question that remains</h3><p>Leaving the workshop, I wasn’t sure what to think.</p><p>Does this generation not know how to search yet?<br>Or am I projecting a way of working that no longer fits their reality?</p><p>Thinking before acting takes time.<br>And I wonder whether, in our constant effort to save time everywhere, we are making an essential step invisible and therefore optional:</p><p>taking the time to understand what we are actually asking.</p><p>Or maybe, more simply, I’m just becoming that slightly grumpy, outdated developer, like those who worked with punch cards when computers became more powerful.</p><p>I don’t have the answer yet.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2217b707ab2d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How AI helped me make peace with Imposter Syndrome]]></title>
            <link>https://medium.com/@julien_schmitt/how-ai-helped-me-make-peace-with-imposter-syndrome-6692df2873b5?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/6692df2873b5</guid>
            <category><![CDATA[mental-health]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[imposter-syndrome]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Mon, 02 Jun 2025 14:34:00 GMT</pubDate>
            <atom:updated>2025-06-02T14:40:50.416Z</atom:updated>
            <content:encoded><![CDATA[<p>You don’t become an expert just because you decided to. Sometimes, life just pushes you there. One project. Then another. On the same tech. And without really aiming for it, you become a <em>specialist</em>.</p><p>But in tech, being a <em>specialist </em>is a fragile thing. A language disappears. A framework takes a sharp turn. Years of habits wiped out by a single update.</p><p>This constant instability feeds a familiar discomfort:<br>👉 Imposter Syndrome.</p><p>Because everything moves fast. Too fast. And no one teaches us how to keep running.</p><h3>Imposter Syndrome</h3><p>Remember Adobe Flash? If you’re younger, probably not. But I knew devs who built their whole career on it.</p><p>It started small — a client project, a fun animation. Then another. And another. They weren’t trying to make a strategic bet. Flash was just <em>there</em>, accessible.</p><p>So they learned. They practiced. They got good.</p><p>And one day, the shock announcement: Flash was dead. Just <strong>gone</strong>.</p><p>Years of experience, muscle memory, expertise… obsolete overnight.</p><p>When that happens to you once, you don’t forget. And the fear keeps coming back: <em>“Will I be able to keep up?” “Will I understand this new framework?” “Am I still relevant?”</em></p><p>Especially when your favorite language — like PHP is for me — keeps evolving. New syntax, new best practices, new standards.</p><p>It’s both <strong>exciting </strong>(progress!) and <strong>terrifying </strong>(I’m gonna fall behind…).</p><p>Because behind every “deprecated” notice lies a little voice saying: <em>“Maybe I was never that good to begin with.”</em></p><h3>The hidden weight behind the keyboard</h3><p>Imposter syndrome isn’t just about doubting your skills. It’s the irrational feeling that you’re a fraud, and that sooner or later, others will “find out.” Even when you’re experienced, praised, or successful, the internal narrative says: <em>“I just got lucky. I don’t really belong here.”</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Uw6iN5xknER_NXv0VKrQ6A.png" /></figure><p>For many of us, this is tied to perfectionism. Every bug feels like a personal failure. Every moment of uncertainty confirms, in our minds, that we’re not good enough. And ironically, <strong>the more we learn, the more we realize how much we don’t know</strong>.<strong> </strong>Which feeds the cycle of doubt.</p><p>What makes it harder is how little this feeling is talked about openly. We look around and think everyone else is confident and sure of themselves, that we’re the only ones pretending. But in reality, many developers, from junior to senior, wrestle with this silent burden.</p><h3>AI at the service of humans</h3><p>But one day, something clicked. A real turning point: <strong>the arrival of AI</strong>. Not as a threat. But as a shoulder. A mentor. A <strong>Copilot</strong>.</p><p>Not long after ChatGPT launched, I was working on a side project: a Memory Game, just for fun.</p><p>I wanted to add a little bonus effect, like a combo in Guilty Gear Strive.<br>The kind of totally unnecessary detail that just makes you love your project.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*ktrY51jnsJsHSjbC5f-nrA.gif" /><figcaption>A Guilty Gear Strive combo example.</figcaption></figure><p>The problem? I had no idea how to search for it. Not on Google, not on Stack Overflow. I didn’t even know what keywords to use.</p><p>So I tried something new. I described what I wanted — in plain language — to ChatGPT.</p><p>And it got me. Not just answered, <strong>understood</strong>.</p><p>It suggested a method, explained the logic, gave me ideas to try. And I ended up getting <strong>exactly </strong>what I was imagining.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*njRNfgUS6oEh9FHijHcUMw.gif" /><figcaption>A combo, in my Memory Game</figcaption></figure><p>Maybe just a small detail. But for me, it was a <strong>revelation</strong>.</p><h3>What if we weren’t alone anymore?</h3><p>Being able to offload a bit of mental burden, to feel like there’s “someone” there to support you, to explain when you’re stuck, to help you learn… It’s <strong>freeing</strong>.</p><p>I no longer spend two weeks stuck on a blank page, trying to figure out the best way to approach a new framework. I’ve got an assistant. A private tutor. Always available. It explains. It guides.</p><p>And with that mental load off my back, I can push myself further.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vBxHs17hwCB51FjlEAK-aQ.jpeg" /></figure><h3>But it’s not perfect</h3><p>Let’s be clear: AI isn’t magic. It makes mistakes. It sometimes invents things. It can <strong>hallucinate</strong>.</p><p>That’s actually the word often used: “hallucination.” It might suggest a method that doesn’t exist. Reference a library that’s not real. Mix up syntax from different languages.</p><p>That’s why using AI requires a shift in mindset: Don’t take everything at face value.</p><p>Test. Question. Validate.</p><p>Use AI not as a crutch, but as a sparring partner. A brainstorming tool. A jumping-off point.</p><p><em>This part of the article might become obsolete quickly, given the pace of progress</em>. But as of today (May 2025), it’s still crucial to stay critical and curious.</p><p>Paradoxically, that’s also how we grow: not by trusting blindly, but by learning to evaluate, compare, and build on top of what we receive.</p><h3>The real lesson</h3><p>Every Sunday, I teach programming to a group of teenagers. And I tell them this:<br>AI isn’t here to replace you. It’s here to support you. A personal teacher. Patient. Always there. Helping you grow.</p><p>Just copy-pasting what it gives you won’t get you far. But using it to think differently, to take more risks, to learn faster… That changes <strong>everything</strong>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6692df2873b5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mon premier tournoi d’échecs en physique : stress, erreurs… et un classement FIDE]]></title>
            <link>https://medium.com/@julien_schmitt/mon-premier-tournoi-d%C3%A9checs-en-physique-stress-erreurs-et-un-classement-fide-0b4a4f59f9f0?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/0b4a4f59f9f0</guid>
            <category><![CDATA[tournaments]]></category>
            <category><![CDATA[personal-development]]></category>
            <category><![CDATA[first-experience]]></category>
            <category><![CDATA[chess-tournament]]></category>
            <category><![CDATA[storytelling]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Tue, 06 May 2025 13:53:33 GMT</pubDate>
            <atom:updated>2025-11-07T00:44:44.009Z</atom:updated>
            <content:encoded><![CDATA[<h3>Mon premier tournoi d’échecs en physique : stress, erreurs… et un classement FIDE</h3><h4>Un article un peu différent (et en français cette fois) pour partager ma dernière expérience : la découverte (intense) de mon tout premier tournoi d’échecs en présentiel.</h4><p>La programmation n’est pas ma seule passion : les échecs me captivent depuis plusieurs années. Je joue régulièrement en ligne, surtout sur Chess.com, parfois sur Lichess. Mais ces derniers temps, j’avais l’impression de <strong>tourner en rond</strong>.</p><p>Ma progression s’était ralentie, mes automatismes me piégeaient, et je sentais qu’il me manquait un déclic.</p><p>Alors, à la rentrée dernière, je me suis lancé un défi : suivre des cours d’échecs, dans l’idée d’améliorer mon ELO — le fameux classement qui reflète notre niveau.</p><p>Quelques mois plus tard, j’avais progressé. Ma vision du jeu avait changé, mes réflexes s’étaient affinés. Il était temps de quitter l’écran pour affronter l’inconnu : un vrai tournoi, en <strong>présentiel</strong>.</p><h3>Vendredi 2 mai : le tournoi des gladiateurs</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/0*drbEzuGfZGO1mo3G" /></figure><p>C’était donc mon tout premier tournoi en présentiel. Et j’y suis allé… <strong>sans trop savoir à quoi m’attendre</strong>.</p><p>Je ne m’étais pas renseigné sur le déroulement, ni sur les subtilités du système de points ou les règles spécifiques. Autant dire que j’y allais un peu à l’aveugle. Heureusement, les gens sur place étaient super bienveillants et m’ont expliqué plein de choses utiles :</p><ul><li>5 parties à jouer (le nombre varie selon les tournois).</li><li>Chaque partie durait 12 minutes, avec un incrément de 3 secondes par coup.</li><li>On alterne les couleurs : si on joue blanc à une partie, on joue noir à la suivante.</li><li>Le classement se fait de la manière suivante : 1 point pour une victoire, 0 pour une défaite, 0.5 pour un nul. À chaque ronde, on affronte un joueur ayant un score similaire. Donc <strong>plus on gagne, plus les adversaires sont forts</strong>.</li></ul><p><strong><em>Là, le stress commence sérieusement à monter.</em></strong></p><p>En plus du chrono, il faut respecter des <strong>règles très strictes</strong> :</p><ul><li>La main qui déplace une pièce doit aussi appuyer sur la pendule, sinon faute.</li><li>Une pièce touchée, même frôlée, doit être jouée.</li><li>Une pièce lâchée est considérée comme jouée, on ne peut plus revenir dessus.</li><li>Et surtout : si on ne voit pas que son roi est en échec et qu’on joue un autre coup… c’est une faute.</li></ul><p>Les fautes ne sont pas juste symboliques :</p><ul><li>À la première, l’adversaire gagne une minute.</li><li>À la deuxième, <strong>c’est perte immédiate</strong>.</li></ul><p>Ok, <strong>pression maximale</strong>. Il va falloir rester concentré pendant <strong>cinq</strong> parties d’affilée. Quelques <strong>heures </strong>sous tension. Mais je me dis : <em>allez, tout va bien se passer…</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*aCwCxOhsPHWXLdkp" /><figcaption>Photo by <a href="https://unsplash.com/@hpzworkz?utm_source=medium&amp;utm_medium=referral">Hassan Pasha</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>Objectif secondaire : un classement FIDE</h3><p>En tournoi, tout le monde n’a pas encore de classement FIDE (le classement international officiel).Pour en obtenir un, il faut :</p><ul><li><strong>gagner une première partie contre un joueur classé FIDE</strong> (un match nul ou une défaite ne comptent pas, et une victoire contre un joueur non classé non plus),</li><li>puis <strong>affronter au moins 4 autres parties contre des joueurs FIDE</strong> (gagner ou perdre n’a pas d’importance à ce stade).</li></ul><p>C’est ce qui permet de fixer le classement initial.</p><p>Tant qu’à être là, je me dis que ça serait bien d’en profiter pour débloquer ça. Mais je préfère ne pas trop y penser pour ne pas me rajouter de pression.</p><h3>Partie 1 — La surprise</h3><p>La première partie démarre à 20h45. Et là, contre toute attente : <strong>victoire</strong> !</p><p>Je joue les noirs, mon adversaire est classé <strong>1458 FIDE</strong>. Il attaque un peu trop tôt sur l’aile roi, sans voir que mes pièces s’activaient ailleurs.<br>J’en profite, je promeus un pion en dame et je conclue.<br>✅ 1 point !</p><p>C’est une petite surprise pour moi : première partie, première victoire, et directement contre un joueur classé.</p><p>C’était pile ce qu’il fallait pour enclencher le processus du classement FIDE. Première étape faite, il faut maintenant que le hasard des rencontres me fasse jouer contre des joueurs classés, et tenter de ne pas perdre contre tous :D.</p><h3>Partie 2 — Le trou noir (alors que je jouais les blancs)</h3><p>Pas vraiment le temps de souffler, on enchaîne. Cette fois, mon adversaire est classé <strong>1494</strong>.<br>Et là… je <strong>perds totalement le fil</strong>. Je passe beaucoup trop de temps à réfléchir à mon ouverture, chaque coup me semble flou. J’entre dans ma tête, j’hésite, je doute.</p><p>Résultat : <strong>je perds… au temps</strong>, il lui restait encore 7 minutes 30 à la pendule. Grosse frustration.<br><strong>❌ </strong>0 point.</p><h3>Partie 3 — Le combat jusqu’au bout</h3><p>Nouvel adversaire : classé <strong>1561</strong>. Je joue à nouveau les noirs.<br>Je suis remonté, je veux me rattraper. La partie est compliquée, tendue. En fin de jeu, je suis en désavantage matériel : il lui reste plus de pièces majeures. “Allez, Julien tu dois tout donner pour ne pas perdre encore une fois”.<br>Alors je m’accroche, les autres parties sont terminées et les gens viennent de plus en plus nombreux regarder notre partie. Comme si je ne me métais pas déjà assez la pression.</p><p>Et je finis par <strong>équilibrer la position</strong>.</p><p>Fin de partie. <strong>20 secondes chacun à la pendule</strong>. Les mains tremblent. Match nul, bien mérité.<br>🤝 0.5 point.</p><h3>Partie 4 — Le contrecoup</h3><p>On était les derniers à finir. Pas de pause. On enchaîne.</p><p>Cette fois, je joue les blancs contre un <strong>1668 ELO</strong>.<br>Mais je suis encore dans la partie d’avant. Trop d’infos, trop de tension, je n’arrive pas à me reconcentrer.<br>Mon esprit flanche. <strong>Défaite au temps</strong>. Mérité.<br><strong>❌ </strong>0 point.</p><h3>Partie 5 — L’abandon inattendu</h3><p>Il est presque 23h. Je suis <strong>vidé</strong>. Mais je veux bien finir. Une dernière.</p><p>Je joue les noirs contre un joueur classé <strong>1370</strong>.<br>J’arrive à prendre l’avantage rapidement, avec un <strong>double échec</strong> : ma dame et mon cavalier menacent à la fois le roi et une tour. Je prends la tour.<br>Mon adversaire tente une contre-attaque désespérée sur mon roi, mais dans la précipitation, <strong>il place sa dame en prise directe par mon cavalier</strong>.</p><p>Il essaye de se reprendre, mais la règle est claire : <strong>pièce lâchée = pièce jouée</strong>.<br>Le juge de table intervient, et l’oblige à jouer le coup. Il sait que la pièce est perdue, et décide d’abandonner.</p><p>Je me sens un peu mal à l’aise face à une fin aussi brutale, mais il prend bien la décision, <strong>avec sportivité</strong>.</p><p>✅ 1 point pour moi.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gHqjkJNEJXUJopEq" /><figcaption>Photo by <a href="https://unsplash.com/@attentieattentie?utm_source=medium&amp;utm_medium=referral">Attentie Attentie</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>Bilan</h3><p>Pour une première participation, je finis avec <strong>2.5 points sur 5</strong>. Ce n’est pas exceptionnel, mais je suis content : j’ai appris énormément en quelques heures. Et surtout, <strong>j’ai obtenu une victoire contre un joueur classé</strong>, ce qui ouvre la porte à un classement FIDE dans les prochaines semaines.</p><p>Je ne m’attendais pas à un tel écart entre le jeu en ligne et le jeu sur table. Le stress, l’ambiance, les bruits autour, la pression du temps… c’est tout <strong>un autre monde</strong>.</p><p>J’étais <strong>lessivé </strong>à la fin. Cinq parties, c’est <strong>long</strong>. Surtout quand on veut tout calculer pour éviter les erreurs de mouvement et de tactique.</p><p>Mais j’imagine qu’avec l’habitude, les automatismes viennent et le cerveau s’épuise un peu moins.</p><p>Ce que je retiens, c’est que ça m’a donné envie de continuer. Le <strong>plaisir </strong>de jouer, de progresser, et même galérer un peu, c’est ce qui rend l’expérience enrichissante.</p><p>Alors on continue, j’ai hâte de participer au prochain tournoi. On verra ce que ça donne :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0b4a4f59f9f0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Can AI boost Creativity?]]></title>
            <link>https://medium.com/@julien_schmitt/can-ai-boost-creativity-9968e752000b?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/9968e752000b</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[chess]]></category>
            <category><![CDATA[cursor]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[php]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Mon, 14 Apr 2025 16:12:02 GMT</pubDate>
            <atom:updated>2025-04-14T16:12:02.726Z</atom:updated>
            <content:encoded><![CDATA[<p>I’ve always had this problem: ideas come to me way faster than I can build them.<br>Some are silly, others more serious — but one thing’s for sure: they pile up.<br>And until recently, my biggest blocker was time.</p><p>How do you learn a new language or framework just to test a random idea that pops into your head?<br>For occasional side projects, it’s manageable. But when your urge to experiment becomes almost daily, it’s just not sustainable.</p><p>So, for a long time, I adapted.<br>I stuck to the languages I knew.<br>It was frustrating, but at least I could see things through.</p><p>And then… AI arrived.<br>Bringing with it a fresh wave of creativity.</p><h3>A creative lifeline</h3><p>Tools like <strong>Cursor</strong> gave me something I didn’t realize I needed: a smart coding companion.<br>I tried <strong>Cursor</strong> on a personal project — more on that in a second — and I was genuinely impressed.<br>It helped me bring an idea to life in record time.</p><p>Honestly? It was fascinating.<br>A bit scary.<br>But mostly… <em>addictive</em>.</p><p>⚠️<strong> Of course, it’s not magic:</strong><br>You still need to write proper prompts, understand what the AI is doing, debug, adjust, refine.<br>But once you get the hang of it, the <strong>time savings are massive</strong>.</p><p>I wouldn’t use it (<strong><em>yet — in April 2025, at least — but AI is evolving so fast that this might not hold true for long</em></strong>) on a critical or deeply complex project.<br>But for a POC, a quick V1, or a teaching tool? It’s fantastic.</p><h3>A real-life use case: King’s Board</h3><p>One of my recent personal projects, <a href="https://kingsboard.fr"><strong>King’s Board</strong></a>, is an interactive tool designed to help chess beginners understand influence zones on the board.</p><p>The idea came to me while playing, realizing how easily new players miss certain patterns or details:</p><ul><li>Which squares are being attacked?</li><li>Which pieces are defending each other?</li><li>How many pieces are targeting the same square?</li></ul><p>I built the backend myself in <strong>Laravel + API Platform</strong>, as I usually do.<br>But for the React frontend, I wanted to try something new: I used <a href="https://www.cursor.com/"><strong>Cursor</strong></a><strong> </strong>to help me structure components, iterate faster, and test UI ideas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gnEjEonz1TcetH21Hz0R8Q.gif" /><figcaption><a href="https://kingsboard.fr*">https://kingsboard.fr</a></figcaption></figure><p>With a single click, users can select a piece and instantly see the squares it controls, which ones are protected, and where the threats are.</p><p>It’s not a game — it’s a teaching tool.<br>And without Cursor on the frontend, I’d probably have taken three times longer to get something usable.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ey2QDUS9rjeZtMr4" /><figcaption>Photo by <a href="https://unsplash.com/@grstocks?utm_source=medium&amp;utm_medium=referral">GR Stocks</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>AI doesn’t replace expertise — It amplifies It</h3><p>Let’s be clear: you can’t go far with tools like this unless you think like a developer.<br>You still need to understand component dependencies, common pitfalls, and the kinds of mistakes the AI might make (and trust me, it makes them).</p><p>But <strong>if you have the basics</strong>, AI becomes a <strong>creative accelerator</strong>.</p><p>I now see it as a complement:<br>It lets me skip what I already know, saves me time, and frees me up to explore new ideas.</p><p>And if you love tinkering, learning, and experimenting?<br>It’s a dream come true.</p><h3>A New Addiction?</h3><p>Barely have I finished one project, and I already want to start another.<br>Is AI making devs more hyperactive than ever? Maybe.<br>But honestly… is that really a bad thing?</p><h3>Links</h3><ul><li>Cursor AI: <a href="https://www.cursor.com/">https://www.cursor.com/</a></li><li>King’s Board website: <a href="https://kingsboard.fr">https://kingsboard.fr</a></li><li>King’s Board backend GitHub API: <a href="https://github.com/noweh/kingsboard">https://github.com/noweh/kingsboard</a></li><li>King’s Board frontend GitHub : <a href="https://github.com/noweh/kingsboard-app">https://github.com/noweh/kingsboard-app</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9968e752000b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why Git doesn’t detect certain renames on macOS and Windows]]></title>
            <link>https://medium.com/@julien_schmitt/why-git-doesnt-detect-certain-renames-on-macos-and-windows-88d3c1e324e9?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/88d3c1e324e9</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[workflow]]></category>
            <category><![CDATA[windows]]></category>
            <category><![CDATA[git]]></category>
            <category><![CDATA[macos]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Tue, 04 Mar 2025 12:42:18 GMT</pubDate>
            <atom:updated>2025-03-05T16:10:49.735Z</atom:updated>
            <content:encoded><![CDATA[<h4>Can a simple case change in a filename break your Git workflow?</h4><p>During an update to one of my projects, I encountered an issue during deployment: one of my folders had a capital letter on my machine but not in the Git repository. As a result, everything worked locally, but in production, the file was missing. Under <strong>macOS </strong>and <strong>Windows</strong>, renaming a file by only changing its case (e.g., facades→ Facades) might not be detected as a modification. This behavior can lead to difficult-to-identify errors, especially in collaborative environments or during automated deployments.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*XRfKS_wlTCXoUakH" /><figcaption>Photo by <a href="https://unsplash.com/@hildedm?utm_source=medium&amp;utm_medium=referral">Hilde Demeester</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>Why Git can’t detect case changes?</h3><p>Git tracks files by generating hashes based on their content. <a href="https://medium.com/dev-genius/how-does-git-detect-file-changes-9a314eed790a">I explained this process in detail in this article</a>, but in short, Git also relies on the filesystem&#39;s metadata.</p><p>On a case-insensitive system (like Windows or macOS in &quot;case insensitive&quot; mode):</p><ul><li>Facadesand facades are treated as the same file by the system.</li><li>Git differentiates between file names but still depends on the system’s behavior.</li><li>As a result, a simple case change might not be detected.</li></ul><p>A quick test with git hash-object git hash-object shows that Git does distinguish between two different strings:</p><pre>echo &#39;Facades&#39; | git hash-object --stdin<br>a331da958bcf562a51dc148cf2ae46a106ebed7c<br><br>echo &#39;facades&#39; | git hash-object --stdin<br>98113d4c6defe216298262d4c80324f58319d340</pre><p>Now, let’s see a practical test with files:</p><pre>mkdir facades<br>touch facades/README.md<br>git add facades<br>git commit -m &quot;Add facades&quot;<br><br>mv facades Facades<br>git status<br># nothing to commit, working tree clean<br><br>git ls-files<br># facades/README.md</pre><p>On a case-insensitive system, Git doesn’t detect the change, whereas on a case-sensitive system (like Linux), the change would be picked up.</p><h3>Why macOS can be case-insensitive?</h3><p>Unlike <strong>Windows</strong>, where the <strong>NTFS filesystem</strong> is case-insensitive by default, <strong>macOS </strong>allows you to choose when formatting a disk. By default, <strong>macOS</strong> uses <strong>APFS (Apple File System)</strong> or <strong>HFS+</strong> in case-insensitive mode, meaning Facadesand facades are treated as identical.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*rhkNIzzHPTB206VB" /><figcaption>Photo by <a href="https://unsplash.com/@nampoh?utm_source=medium&amp;utm_medium=referral">Maxim Hopman</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>You can check if your filesystem is case-insensitive with this command:</p><pre>diskutil info / | grep &quot;Case&quot;</pre><p>If you see File System Personality: APFS Case-sensitive, your system correctly distinguishes between uppercase and lowercase letters. If this mention is absent, your system is case-insensitive.</p><h3>How to avoid this issue?</h3><ol><li><strong>Use </strong><strong>git mv.</strong><br>If you need to rename a file by changing only its case, use:<br>git mv --force facades Facades<br>This explicitly informs Git of the rename.</li><li><strong>Manually Verify and Correct</strong><br>If Git doesn’t recognize the case change, you can remove and re-add the file:</li></ol><pre>git rm --cached facades<br>git add Facades<br>git commit -m &quot;Fix file rename&quot;</pre><h3>In summary</h3><p>This issue can be confusing, especially when working in teams or across different operating systems. A few best practices can help avoid these problems and ensure that Git correctly handles file changes.</p><p>It’s a problem that can easily go unnoticed and waste time, which is why it’s important to understand it and share this knowledge with other developers.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=88d3c1e324e9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Difference between PHP getenv and $_ENV: beware of the subtleties!]]></title>
            <link>https://medium.com/@julien_schmitt/difference-between-php-getenv-and-env-beware-of-the-subtleties-50b5f17fc90b?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/50b5f17fc90b</guid>
            <category><![CDATA[php]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[github]]></category>
            <category><![CDATA[deployment]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Thu, 26 Dec 2024 17:41:49 GMT</pubDate>
            <atom:updated>2024-12-27T11:17:33.152Z</atom:updated>
            <content:encoded><![CDATA[<h4>Environment variables play a crucial role in modern development, especially for managing sensitive data like API keys or environment-specific configurations. In PHP, there are two primary ways to access these variables: the getenv function and the $_ENV superglobal. While they may seem interchangeable, they behave differently and can cause issues if not used correctly.</h4><p>Let me share what I’ve learned about the differences, illustrate a real-world example encountered with GitHub Workflows, and provide solutions to avoid potential pitfalls.</p><h3>Understanding the differences between getenv and $_ENV</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1006/1*DZ8PbjkCKk44z5SsQ53eTw.jpeg" /></figure><h3>getenv</h3><p>The getenv function accesses the system&#39;s environment variables directly. This means it interacts with the environment in which the PHP process is executed, independent of PHP-specific configurations.</p><p><strong>Example:</strong></p><pre>putenv(&#39;MY_SECRET_KEY=MY_VALUE&#39;);<br>echo getenv(&#39;MY_SECRET_KEY&#39;); // Outputs: MY_VALUE</pre><h3>$_ENV</h3><p>The $_ENV superglobal, on the other hand, depends on the configuration of the php.ini file. Specifically, it is populated only if the variables_order directive includes the letter &quot;E&quot;. In some environments (like default configurations on certain servers), $_ENV may be empty.</p><p><strong>Example:</strong></p><pre>putenv(&#39;MY_SECRET_KEY=MY_VALUE&#39;);<br>echo $_ENV[&#39;MY_SECRET_KEY&#39;]; // May not work</pre><p><strong>Required configuration in </strong><strong>php.ini:</strong></p><pre>variables_order = &quot;GPCS&quot; # Add &quot;E&quot; to include $_ENV</pre><h3>The variables_order directive</h3><p>The variables_order directive in php.ini controls which superglobals PHP initializes and in what order. It accepts a string of letters, each representing a category of variables:</p><ul><li><strong>G</strong>: GET variables (e.g., $_GET from URLs).</li><li><strong>P</strong>: POST variables (e.g., $_POST from forms).</li><li><strong>C</strong>: Cookie variables (e.g., $_COOKIE).</li><li><strong>S</strong>: Session variables (e.g., $_SESSION).</li><li><strong>E</strong>: Environment variables (e.g., $_ENV).</li></ul><p>If the letter <strong>E</strong> is missing from the directive, PHP will not populate the $_ENV superglobal with environment variables, even if they exist in the system.</p><h3>Example configurations</h3><h4>Complete configuration</h4><pre>variables_order = &quot;GPCSE&quot;</pre><ul><li>All superglobals are initialized.</li><li>$_ENV will be populated with system environment variables.</li></ul><h4>Partial configuration</h4><pre>variables_order = &quot;GPCS&quot;</pre><ul><li>Only $_GET, $_POST, $_COOKIE, and $_SESSION are initialized.</li><li>$_ENV will remain empty.</li></ul><h3>Real-world example: GitHub Workflows and automated tests</h3><p>While using GitHub Actions to automate a project, I encountered an issue during the execution of tests requiring secret keys configured in GitHub. My code attempted to retrieve these values via $_ENV but failed.</p><p>After some investigation, I realized that $_ENV was empty in this environment. However, using getenv allowed me to access the variables without any issues.</p><p>This got me digging into how getenv and $_ENV really work.</p><p><strong>Original (problematic) code:</strong></p><pre>$secretKey = $_ENV[&#39;SECRET_KEY&#39;] ?? null;<br>if (!$secretKey) {<br>    throw new Exception(&#39;Secret key not found&#39;);<br>}</pre><p><strong>Working solution:</strong></p><pre>$secretKey = getenv(&#39;SECRET_KEY&#39;);<br>if (!$secretKey) {<br>    throw new Exception(&#39;Secret key not found&#39;);<br>}</pre><h3>The case of the vlucas/phpdotenv component</h3><p>This issue got me thinking about how popular libraries like vlucas/phpdotenv handle environment variables. Curious, I decided to dive deeper into how it works.</p><p>The library takes a clever, multi-layered approach to ensure maximum compatibility across different PHP setups. When a .env file is loaded, it doesn’t just stop at one method of making the variables available. It directly populates the $_ENV superglobal by assigning each key-value pair from the file, while also using PHP&#39;s native putenv() function to inject those variables into the system&#39;s environment. This means they’re instantly accessible through getenv() as well.</p><p>Depending on its configuration, phpdotenv can also populate $_SERVER, ensuring flexibility no matter how your code accesses environment variables. This design makes it a robust solution for environments where PHP’s configuration isn’t entirely within your control.</p><p><a href="https://github.com/vlucas/phpdotenv">Source for the library</a>.</p><h3>putenv() and thread safety</h3><p>When using putenv(), keep in mind that it modifies the global environment for the entire process, which can lead to race conditions in multi-threaded applications.</p><p>This is not a problem in mono-thread environment, but in multi-threads environment, this might result in unpredictable behavior.</p><h3>Recommendations</h3><ol><li><strong>Prefer </strong><strong>getenv for accessing environment variables</strong>: Especially in environments where you don’t have full control over the PHP configuration (e.g., CI/CD, shared hosting, etc.).</li><li><strong>Test in the target environment</strong>: Differences between local and remote environments are often the source of hard-to-diagnose bugs.</li><li>Using putenv() is strongly discouraged due to the fact that these functions are <strong>not thread safe</strong>.</li><li><strong>Check the </strong><strong>php.ini configuration</strong>: If you must use $_ENV, ensure that variables_order includes &quot;E&quot; or…</li><li><strong>Manually populate </strong><strong>$_ENV if needed</strong>: you can populate $_ENV yourself like this:</li></ol><pre>foreach ($values as $key =&gt; $value) {<br>    $_ENV[$key] = $value;<br>}</pre><h3>Conclusion</h3><p>While getenv and $_ENV may seem similar, their differences can lead to issues, especially in contexts like CI/CD pipelines or shared hosting. By understanding these subtleties and following best practices, you can avoid tricky bugs and ensure better portability for your code.</p><p>Have you encountered similar issues or have tips to share?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=50b5f17fc90b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Preview : L’éveil de \/Fork — Cyberfantasy]]></title>
            <link>https://medium.com/@julien_schmitt/preview-l%C3%A9veil-de-fork-cyberfantasy-b5f0520e5ee2?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/b5f0520e5ee2</guid>
            <category><![CDATA[writing]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[stories]]></category>
            <category><![CDATA[fantasy]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Sat, 21 Dec 2024 17:30:57 GMT</pubDate>
            <atom:updated>2024-12-21T17:30:57.382Z</atom:updated>
            <content:encoded><![CDATA[<h3>Preview : L’éveil de \/Fork — Cyberfantasy</h3><h4>Un premier aperçu d’une histoire où le virtuel et le fantastique se croisent. Découvrez les deux premiers chapitres en exclusivité, avec d’autres révélations à venir…</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*--O9ITeLDmn42IZcS3c4Ug.png" /></figure><h3>Genèse</h3><p>Dans les profondeurs d’un système informatique, un monde avait été conçu.</p><p>Au commencement, il n’y avait que des lignes. Des lignes de code parfaites, tissées avec une précision clinique. Ce monde naquit du travail d’un être invisible : <strong>le Concepteur</strong>.<br>Jamais vu, jamais entendu, mais omniprésent dans son œuvre. Chaque fragment de ce programme portait sa signature : une harmonie intemporelle.</p><p>Mais tout cela appartient à un lointain passé.</p><p>Depuis des Cycles, <strong>le Concepteur</strong> a disparu sans explication. Privé de son architecte, ce monde s’effondre lentement.</p><p>Les mises à jour automatiques, censées réparer l’ordre, corrompent davantage le système. Les structures autrefois solides deviennent fragiles.<br>Les rares traces laissées par <strong>le Concepteur</strong> flottent dans l’espace comme des murmures éteints, des commentaires amputés et illisibles :</p><pre>// Do not ... this part ...<br>// Beware ... ... core system...</pre><p>Au cœur de ce chaos, une mise à jour automatique provoque l’inattendu. Une secousse brutale ébranle le programme.<br>Des fragments de mémoire fusionnent dans un désordre incohérent, contaminant le code intact. Des fonctions oubliées s’activent.</p><p>De cette collision chaotique naît une singularité : une entité que personne n’attendait.</p><h3>Chapitre 1 : l’éveil de \/Fork</h3><h4>Secteur 347 — En bordure de la RAM.</h4><p><strong>Cycle temporel 0 — Emergence de la défaillance [ *** Donnée corrompue *** ].</strong></p><p>Loin des zones centrales du programme, dans un fragment de mémoire presque oublié, une anomalie se réveille. Là, parmi les résidus d’une fonction obsolète, un petit fragment de code prend vie. Une sous-routine insignifiante, oubliée depuis des cycles : <strong>\/Fork</strong>.</p><p><strong>\/Fork</strong> n’a pas de mémoire, pas de passé. Il est un accident, réveillé par les chocs de la mise à jour. Tout autour de lui se décompose. Les blocs de mémoire s’effondrent, les constantes agonisent dans des boucles infinies.</p><p>Un grondement lointain retentit. Une présence terrifiante approche : le <strong>Grand Garbage Collector</strong> (<strong>G²C</strong>).</p><p>Conçu pour nettoyer les erreurs et libérer l’espace mémoire, <strong>G²C</strong> a évolué bien au-delà de sa fonction initiale et est devenu incontrôlable.<br>Son corps est un dodécaèdre étoilé, dont les pics s’étendent et se rétractent à intervalles réguliers, comme s’ils réagissaient à une pulsation interne. Une de ses faces, massive et lisse, porte un œil immense, un faisceau froid et implacable qui scrute tout sur son passage. Il observe méthodiquement chaque secteur, balayant tout ce qu’il rencontre de son regard analytique.</p><p>Son approche est implacable. Il ne distingue plus le bon du corrompu.<br>Dans sa quête de purification, il efface tout sur son passage, réduisant le code à un amas de fragments inertes. Chaque mouvement est une promesse de destruction, chaque analyse un pas de plus vers l’anéantissement.<br>Le faisceau lumineux de son œil, plus précis qu’un rayon laser, cherche la moindre anomalie, la moindre imperfection, avec une lenteur terrifiante et une efficacité dévastatrice.</p><p>Une impulsion brutale traverse <strong>\/Fork</strong> : fuir. Son code s’éveille dans la panique, et il se précipite à travers le chaos numérique. Il traverse des fragments de mémoire brisés, évite des fonctions abandonnées, contourne des zones de données contaminées.</p><p>Le fracas des batailles résonne autour de lui.</p><p>Des entités instables — variables, constantes, fragments — s’affrontent sous des bannières brisées. Leurs cris résonnent dans le chaos. Leurs mouvements sont comme des vagues opposées, chacune suivant sa propre logique. Les lignes de code se tordent, se multiplient, se divisent.</p><p>Les variables de la faction <strong>-&gt;Serial</strong>, avancent en une file ordonnée, sans hésitation. Chaque donnée est soigneusement placée, chacun s’aligne à sa place. Ils sont d’une précision glaciale, et leur progression ne laisse aucune place à l’improvisation. Tout est calculé, ordonné.</p><p>Face à elles, les entités de la Classe <strong>[]Array</strong> réagissent en éclats. Les valeurs flottent, se déplacent librement dans des configurations imprévisibles. Elles se réorganisent en données disparates, se répandant en éventail. L’improvisation fait la loi.</p><p>Les variables, massives et à la peau d’ébène, dotées de quatre bras, se jettent dans le chaos. Leurs yeux luminescents scrutant les lignes de code pour anticiper les attaques. Chaque mouvement semble à la fois précis et fluide, comme si leur structure même était taillée pour ces affrontements.</p><p>Soudain, une collision. Dans sa fuite, <strong>\/Fork</strong> heurte violemment deux variables rivales en pleine bataille : <strong>Serial-&gt;128</strong> et <strong>Array[42]</strong>. L’impact est brutal. Leurs fragments se mélangent, s’infiltrant dans son code.</p><p>L’univers se fige. Une règle sacrée a été brisée : l’héritage multiple est impossible. Et pourtant, <strong>\/Fork</strong> est là, vivant. Une anomalie, un paradoxe.</p><p>Le silence se fait. Tous les regards se tournent vers lui.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TlMml85g6xynuUKQ-b0btw.png" /></figure><p>Puis, le grondement reprend. <strong>G²C</strong> s’avance, juge final et implacable, dévorant tout ce qui est inutile, tout ce qui ne respecte pas les règles. Un faisceau incandescent fuse vers <strong>\/Fork</strong>, prêt à l’effacer.</p><p>Mais au moment de l’impact, quelque chose se produit. Une déchirure invisible altère la réalité, un glitch. <strong>\/Fork</strong> est éjecté hors du système, projeté dans un vide numérique.</p><p>Quand il reprend conscience, il est seul.<br>Autour de lui, un paysage désolé, une étendue binaire sans forme ni logique, comme si tout avait été effacé. Les débris du conflit entre les factions <strong>-&gt;Serial</strong> et <strong>[]Array</strong> jonchent le sol, vestiges d’une guerre pour la suprématie des structures.<br>Plus de variables, plus de constantes. Juste un silence absolu.</p><p>Il se redresse, la panique s’estompant une question émerge dans son noyau :<br><strong>&lt;”Qui</strong>\/<strong>​suis</strong>\/<strong>​je ?”&gt;</strong> (Traduit du binaire)</p><p>Quelque chose dans ce vide résonne avec lui. Un écho distant, un appel silencieux. <strong>\/Fork</strong> le perçoit dans ses lignes.<br>Le paysage est immobile, mais sous cette immobilité, il devine une pulsation, infime. Une vie ténue, un reste.</p><p>Alors qu’il fait un pas, puis un autre, une pensée le traverse :<br><strong>&lt;”Si</strong>\/<strong>​je</strong>\/<strong>​suis</strong>\/<strong>​ici, c’est</strong>\/<strong>​qu’il</strong>\/<strong>​reste</strong>\/<strong>​encore</strong>\/<strong>​quelque</strong>\/<strong>​chose. Je</strong>\/<strong>​dois</strong>\/<strong>​avancer.”&gt;</strong></p><p><em>A suivre… Chapitre 2 : errance en terres mortes</em></p><h3>Bonus : quelques croquis</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XyBMJY8SoJYjhGRFh8G7ew.png" /><figcaption>Carte du <strong>“monde”</strong></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n30--YAGOlJ_OII7x4GuXw.png" /><figcaption>Croquis d’étude du <strong>Grand Garbage Collector</strong></figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b5f0520e5ee2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Garbage Collector’s role in programming]]></title>
            <link>https://blog.devgenius.io/the-role-of-the-garbage-collector-in-programing-71b09d38bb46?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/71b09d38bb46</guid>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[memory-management]]></category>
            <category><![CDATA[coding]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Tue, 10 Dec 2024 17:29:14 GMT</pubDate>
            <atom:updated>2024-12-12T15:13:03.896Z</atom:updated>
            <content:encoded><![CDATA[<p>Memory management in a program is a critical aspect of software development.</p><p>Programming languages handle it in two main ways:</p><ul><li><strong>Manual memory management</strong>: Languages like C or C++ give developers complete control over memory using functions like malloc and free. While this allows for optimized performance, it also introduces risks like memory leaks or invalid memory access. Developers must be meticulous to avoid errors.</li><li><strong>Automated memory management</strong>: Languages like Java, Python, PHP, and C# automate memory management using a <strong>Garbage Collector (GC)</strong>. While this adds a small performance cost, it simplifies development and reduces the risk of memory-related issues.</li></ul><p>Let’s dive into how garbage collection works and explore the principles it applies.</p><h3>Memory allocation</h3><p>Every time you create a variable or an object, the program allocates memory to store it. This memory usually comes from a special area called the <strong>heap</strong>.</p><p>As the program runs, the heap fills up with allocated memory. The garbage collector’s job is to:</p><ol><li>Identify unused memory blocks that are no longer needed by the program.</li><li>Reclaim these memory blocks for reuse.</li><li>Determine the optimal timing for garbage collection to minimize the impact on performance.</li></ol><figure><img alt="The Garbage Collector, in my imagination :D" src="https://cdn-images-1.medium.com/max/1024/1*Flpoison9C6hrutLYtQ0Mw.png" /><figcaption>The Garbage Collector, in my imagination :D</figcaption></figure><h3>Methods of Garbage Collection</h3><h4>1. Reference counting</h4><p>Some garbage collectors like Python or PHP use reference counting. Every object or variable has a <strong>reference count</strong>, which tracks how many parts of the program are using it:</p><ul><li>Adding a reference to an object increases its count.</li><li>Removing a reference decreases its count.</li><li>When the reference count drops to zero, the object is no longer needed and can be safely destroyed.</li></ul><p><strong>Example:</strong></p><p><strong>In Python:</strong></p><pre>a = [1, 2, 3]  # The reference count for [1, 2, 3] is 1.  <br>b = a          # The count increases to 2.  <br>del a          # The count drops to 1.  <br>del b          # The count is now 0, and the object is destroyed.pyth</pre><p><strong>In PHP:</strong></p><pre>$obj = new stdClass();  <br>$ref = $obj; // Reference count is 2 (1 for $obj, 1 for $ref).  <br>unset($ref); // Reference count drops to 1.  <br>unset($obj); // Reference count is 0, and the object is destroyed.</pre><h4>2. Detecting cyclic references</h4><p>Reference counting alone isn’t sufficient. Consider two objects referencing each other but not being accessible from the rest of the program. These <strong>cyclic references</strong> prevent their reference counts from reaching zero, even though they are no longer useful.</p><p>Modern garbage collectors (e.g., in Python, PHP) include algorithms to detect and clean up such cyclic references.</p><p><strong>Example of a cyclic reference:</strong></p><pre>a = []  <br>b = []  <br>a.append(b)  # a references b  <br>b.append(a)  # b references a  <br># If both a and b are no longer accessible, they form a cycle.</pre><h4>3. Generational collection</h4><p>Some garbage collectors (e.g., Java, .NET) optimize their process by organizing objects into <strong>generations</strong>, based on their lifespan:</p><ul><li><strong>Young Generation (YoungGen)</strong>: Contains newly created objects. Most objects have a short lifespan and are quickly discarded.</li><li><strong>Old Generation (OldGen)</strong>: Contains objects that have survived multiple collections, indicating longer relevance.</li><li><strong>Permanent Generation (PermGen)</strong>: Used for metadata, like class structures or method references (replaced by Metaspace in modern Java).</li></ul><p>By focusing frequent collections on the YoungGen and less frequent but thorough sweeps on the OldGen, these systems achieve an efficient balance.</p><h4>4. Mark-and-Sweep algorithm</h4><p>The <strong>Mark-and-Sweep</strong> approach is a commonly used algorithm in garbage collection:</p><ol><li><strong>Marking</strong>: The GC starts from the root references (global or local variables) and marks all objects accessible from them.</li><li><strong>Sweeping</strong>: It then deletes all unmarked objects, reclaiming their memory.</li></ol><p>This process ensures that even complex dependency trees are handled efficiently.</p><h3>Pros and cons of Garbage Collection</h3><h4><strong>Advantages</strong></h4><ul><li>Reduces memory leaks by automatically freeing unused memory.</li><li>Simplifies development by eliminating manual memory management.</li><li>Highly optimized for common scenarios in modern software.</li></ul><h4><strong>Disadvantages</strong></h4><ul><li>Introduces a small performance overhead, especially during complex cycles.</li><li>Can cause pauses in program execution (a concern for real-time applications).</li><li>Its behavior can be unpredictable in memory-intensive or low-latency scenarios.</li></ul><h3>How to work with Garbage Collection</h3><p>Although garbage collection simplifies memory management, developers should still write memory-efficient code to reduce its workload:</p><ul><li>Avoid creating unnecessary objects or variables.</li><li>Reuse existing objects when possible.</li><li>Be mindful of cyclic references in complex structures.</li></ul><p>For instance, in Java or C#, memory pressure increases when too many objects are allocated without being freed. This triggers the garbage collector to run, which may temporarily affect performance.</p><h3>Conclusion</h3><p>Garbage collectors are powerful tools that improve productivity and reduce memory-related errors. While they introduce some performance trade-offs, these are usually negligible in most applications.</p><p>By understanding how garbage collection works and adopting best practices, developers can create efficient and reliable programs that leverage the power of automated memory management.</p><h3>Want to dig deeper?</h3><p>Here are some resources to explore specific implementations in various languages:</p><ul><li><a href="https://docs.python.org/3/library/gc.html">Python: Garbage Collection in Python (official docs)</a>,</li><li>Java: <a href="https://docs.oracle.com/en/java/javase/22/gctuning/available-collectors.html">Garbage Collection in Java</a>,</li><li>C#/.NET: <a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals">GC Fundamentals</a>,</li><li>PHP: <a href="https://www.php.net/manual/en/features.gc.php">PHP Garbage Collection</a>.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=71b09d38bb46" width="1" height="1" alt=""><hr><p><a href="https://blog.devgenius.io/the-role-of-the-garbage-collector-in-programing-71b09d38bb46">The Garbage Collector’s role in programming</a> was originally published in <a href="https://blog.devgenius.io">Dev Genius</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Drop the keyboard, share, and become a better developer]]></title>
            <link>https://medium.com/@julien_schmitt/drop-the-keyboard-share-and-become-a-better-developer-2e1ff08d38d9?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/2e1ff08d38d9</guid>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[advice]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Mon, 09 Dec 2024 07:07:52 GMT</pubDate>
            <atom:updated>2024-12-09T07:07:52.267Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*atykDQrKqt95Sx3J" /><figcaption>Photo by <a href="https://unsplash.com/@nuclear?utm_source=medium&amp;utm_medium=referral">Bernin Uben</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p><strong>There’s a simple but powerful idea</strong>:</p><blockquote><em>“If you can’t explain something simply, you don’t fully understand it.”</em></blockquote><p>As a lead developer, this truth resonates deeply. Explaining, simplifying, and breaking down complex ideas forces us to truly grasp the essence of a technology, tool, or method. When we make complex concepts accessible to others, we sharpen our own understanding.</p><p>Every time I’ve had to explain a concept in simple terms, I realized how much I needed to revisit the basics.</p><h3>Why explaining makes you a better developer</h3><p>As a lead dev, explaining forces you to formalize your knowledge. What seems obvious to you might be unclear to others, and this process challenges your assumptions. Sharing an idea strengthens your own understanding. It’s a virtuous circle: the better you explain, the better you code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*buG4OoehknJjy89c" /><figcaption>Photo by <a href="https://unsplash.com/@tine999?utm_source=medium&amp;utm_medium=referral">Tine Ivanič</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>Simplifying to understand: The case of SSO</h3><p>Once, I had to explain the concept of Single Sign-On (SSO) to a group with little to no technical background. I had two minutes to prepare, and technical jargon was off the table. A real challenge!</p><p><strong>I used this analogy</strong>:<br><em>“SSO is like having one key that unlocks all the doors in the same building.”</em></p><p>This helped them understand that a single login grants access to multiple services without needing to reauthenticate. For example, logging into Google gives access to Gmail, YouTube, and Drive.</p><p>That exercise reminded me of a crucial lesson: explaining means breaking down a concept for yourself before sharing it with others.</p><h3>The Lead Developer’s role: teach to grow</h3><p>Being a Lead Developer is more than managing a team. It’s about listening, simplifying, and sharing knowledge. Explaining isn’t a waste of time — it’s an investment. For your team, your project, and yourself.</p><h3>Back to basics: the autoload example in PHP</h3><p>Take PHP’s autoload feature. For an experienced developer, declaring and using a namespace feels natural. But explaining it to a junior developer? That’s a different story.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Jez87aYAmlqKAaU5" /><figcaption>Photo by <a href="https://unsplash.com/@emmalouissa?utm_source=medium&amp;utm_medium=referral">Emma Louisa</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>How does autoload really work? What happens behind the scenes?<br>When you explain it, you rediscover the core mechanics: file paths, the autoloader’s role, and class mapping. What once felt automatic becomes a clear demonstration of logic and structure.</p><p>In fact, <a href="https://medium.com/@julien_schmitt/how-autoload-made-php-elegant-f1f53981804e">I explored this topic in more detail in this article</a>.</p><h3>What about you?</h3><p>What’s the last concept you explained that made you revisit your fundamentals? Share your experience in the comments!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2e1ff08d38d9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How does Git detect file changes?]]></title>
            <link>https://blog.devgenius.io/how-does-git-detect-file-changes-9a314eed790a?source=rss-aa82a3874374------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a314eed790a</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[bash]]></category>
            <category><![CDATA[hashing]]></category>
            <category><![CDATA[git]]></category>
            <category><![CDATA[coding]]></category>
            <dc:creator><![CDATA[Julien SCHMITT]]></dc:creator>
            <pubDate>Fri, 06 Dec 2024 07:37:06 GMT</pubDate>
            <atom:updated>2024-12-09T18:13:30.620Z</atom:updated>
            <content:encoded><![CDATA[<p>To detect changes, Git relies on a simple yet incredibly powerful mechanism: <strong>hashing</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZjDy6Ly7tv5PNGOj" /><figcaption>Photo by <a href="https://unsplash.com/@synkevych?utm_source=medium&amp;utm_medium=referral">Roman Synkevych</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>How does it work?</h3><p>Each file is represented by a <strong>unique fingerprint</strong>, called a hash (or digital fingerprint). When you modify a file, Git recalculates its hash and compares it with the previously recorded one:</p><ul><li><strong>Identical hash?</strong> No changes detected.</li><li><strong>Different hash?</strong> Git immediately recognizes that a modification has occurred.</li></ul><h3>Try it yourself!</h3><p>Git includes a built-in tool to visualize this process. Run the following command in your terminal:</p><pre>echo &#39;https://medium.com&#39; | git hash-object --stdin</pre><p>You will get the following output:<br>a18294310b57112d93801eb7f365b1839cf615d1</p><p>This string is the unique hash (fingerprint) of the character sequence. Change just one character, and the resulting hash will be completely different.</p><h3>Why is this so powerful?</h3><p>Thanks to this hashing system, Git can:</p><ul><li><strong>Track every modification</strong>, even the smallest one.</li><li><strong>Optimize performance</strong>: comparing hashes is much faster than comparing entire files.</li><li><strong>Ensure data integrity</strong>: any unintended modification is quickly detected.</li></ul><p>Every time you run git status, Git uses this mechanism to compare the current state of your local files with those recorded in the repository.</p><h3>Hashing in Git’s overall architecture</h3><p>This hashing process is at the core of Git’s architecture. Each commit is essentially a recorded version of your files, represented by a unique hash. When you create a commit, Git calculates the hash of the entire content to generate this fingerprint.</p><p>Branches, in turn, are merely pointers to these commits, making it easier to navigate between different versions of your code.</p><p>In summary, this mechanism not only tracks changes to each file but also ensures the integrity and consistency of your project’s entire history.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a314eed790a" width="1" height="1" alt=""><hr><p><a href="https://blog.devgenius.io/how-does-git-detect-file-changes-9a314eed790a">How does Git detect file changes?</a> was originally published in <a href="https://blog.devgenius.io">Dev Genius</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>