
<?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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Healthy Scientist: Build Using AI With Healthy Habits 🌱]]></title><description><![CDATA[The Healthy Engineer 😋 Start building AI systems without burning out while maintaining healthy habits and a balanced lifestyle 🏝
I share everything as a software engineer and data scientist on AI, ML, positive mindset, and healthy proactive habits🥑🤖🏆]]></description><link>https://www.pierrehenry.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!VGF6!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9c40f8-f3be-46ef-a6db-b1eb6f0aa3cb_1024x1024.png</url><title>The Healthy Scientist: Build Using AI With Healthy Habits 🌱</title><link>https://www.pierrehenry.dev</link></image><generator>Substack</generator><lastBuildDate>Sat, 11 Jul 2026 07:32:48 GMT</lastBuildDate><atom:link href="https://www.pierrehenry.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Pierre-Henry Soria]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pierrehenry@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pierrehenry@substack.com]]></itunes:email><itunes:name><![CDATA[🎡 Pierre-Henry™ 🌴]]></itunes:name></itunes:owner><itunes:author><![CDATA[🎡 Pierre-Henry™ 🌴]]></itunes:author><googleplay:owner><![CDATA[pierrehenry@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pierrehenry@substack.com]]></googleplay:email><googleplay:author><![CDATA[🎡 Pierre-Henry™ 🌴]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[What 40 Years in Tech Teaches About AI, Blockchain, and the Internet]]></title><description><![CDATA[Watch now | A conversation about curiosity, decentralisation, cybersecurity, and why understanding technology matters more than ever.]]></description><link>https://www.pierrehenry.dev/p/what-40-years-in-tech-teaches-about</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/what-40-years-in-tech-teaches-about</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Sat, 11 Jul 2026 01:05:29 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/200256232/b6699a8dd5bfdd8cb022f203fc7d2cd8.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/what-40-years-in-tech-teaches-about?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/what-40-years-in-tech-teaches-about?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>For this conversation, I sat down with Roberto Capodieci, a technology entrepreneur, blockchain researcher, and one of those people who has seen several generations of computing from the inside.</p><p>Our conversation started with something simple: coffee. As an Italian living in Bali, Roberto still begins his mornings with a cappuccino before jumping into work. It quickly became clear that technology has been part of his life for almost as long as he can remember.</p><p>He started programming when he was five years old. By the age of nine, he was already making money from software. As a teenager, he founded his first company and built video games for the Commodore systems, working in C and assembly when every kilobyte mattered.</p><p>Listening to those early stories was fascinating because they reminded me how different software engineering used to be. There were no online courses, no Stack Overflow, no AI assistants. Learning meant taking machines apart, reading manuals, experimenting, and spending hours on bulletin board systems with other curious people around the world.</p><p>We also spoke about the early internet.</p><p>Long before cybersecurity became a recognised field, Roberto was already investigating online scams. One case involved malicious dialers that secretly redirected people&#8217;s internet connections to expensive premium phone numbers. He tracked down the people behind the scam and shared his findings with the authorities, eventually receiving a letter of thanks from Bill Clinton.</p><p>What quite surprise me wasn&#8217;t the technical achievement here. It was his motivation!</p><p>He believes that when you understand how something dangerous works, you have a responsibility to help others understand it too. Whether it is exposing online scams or explaining how software really behaves, his goal has always been to make technology safer for everyone.</p><p>That naturally led us into a discussion about trust.</p><p>Modern software gives us switches, buttons, and settings that we simply accept. We click &#8220;disable&#8221;, &#8220;private&#8221;, or &#8220;do not train on my data&#8221;, but very few of us actually know what happens behind the interface. We trust software because the interface tells us to.</p><p>It is an interesting perspective, especially today as AI becomes part of our daily lives.</p><p>We then moved into blockchain.</p><p>Roberto was involved with decentralised systems long before blockchain became popular. In fact, when he first discovered Bitcoin, he did not immediately see its value because his focus was elsewhere. Over time, after working on multiple blockchain projects and protocols, his perspective changed.</p><p>One part of his journey stood out to me.</p><p>During the pandemic, he spent a significant amount of time and money building a new decentralised platform. The first attempt failed. Instead of walking away, he started again, rewriting the entire project from scratch in C, this time with the help of AI to speed up development.</p><p>I think every software engineer can relate to that.</p><p>Sometimes the first version teaches you more than success ever could.</p><p>Towards the end of our conversation, we discussed AI.</p><p>Like many engineers, I often think about the balance between the opportunities AI creates and the concentration of power behind today&#8217;s largest models.</p><p>Roberto shares that concern.</p><p>He believes AI is one of the most powerful tools we have ever built, but he also argues that it should become more decentralised over time. If only a handful of companies control the models, the infrastructure, and the data, they also influence how information reaches billions of people.</p><p>At the same time, he is genuinely optimistic about what AI enables.</p><p>He gave a simple example that stayed with me. Someone who owns a bakery understands their business far better than any software engineer ever could. Today, with AI, that bakery owner can build the first version of the software they actually need instead of trying to explain every detail to someone else.</p><p>That idea extends far beyond bakeries.</p><p>People closest to a problem can now participate directly in building the solution.</p><p>For me, that is one of the biggest changes happening in software engineering today.</p><p>This conversation is not only about blockchain or AI.</p><p>It is about curiosity, questioning assumptions, learning continuously, and remembering that technology is only valuable when it genuinely helps people.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_fPq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_fPq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png 424w, https://substackcdn.com/image/fetch/$s_!_fPq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png 848w, https://substackcdn.com/image/fetch/$s_!_fPq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png 1272w, https://substackcdn.com/image/fetch/$s_!_fPq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_fPq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png" width="1623" height="948" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:948,&quot;width&quot;:1623,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2968050,&quot;alt&quot;:&quot;    Sharing ideas, challenging assumptions, and exploring the future of software engineering&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/200256232?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72172a78-f154-4d9a-ac42-d7bcd90ff9a9_1643x957.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="    Sharing ideas, challenging assumptions, and exploring the future of software engineering" title="    Sharing ideas, challenging assumptions, and exploring the future of software engineering" srcset="https://substackcdn.com/image/fetch/$s_!_fPq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png 424w, https://substackcdn.com/image/fetch/$s_!_fPq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png 848w, https://substackcdn.com/image/fetch/$s_!_fPq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png 1272w, https://substackcdn.com/image/fetch/$s_!_fPq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2e64fd-ce78-410a-bf3b-aaa60d2d9781_1623x948.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><strong>Sharing ideas, challenging assumptions, and exploring the future of software engineering.</strong></figcaption></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Why Flow State Might Be Your Biggest Shipping Advantage]]></title><description><![CDATA[Watch now | How focus and clear priorities turn ideas into shipped software]]></description><link>https://www.pierrehenry.dev/p/flow-state-is-the-real-shipping-advantage</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/flow-state-is-the-real-shipping-advantage</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Mon, 06 Jul 2026 18:59:03 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/181853625/5369cdd0154af5956e16821db9e83426.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p>Shipping better products is rarely about working harder or spending more hours. It comes from focus, flow, and knowing what matters next. Clear priorities reduce hesitation and improve decision making, helping engineers ship with confidence. This is about building the right things at the right time without noise or distraction.</p><p>Building software is rarely about generating code first. It is about making the right decisions at the right time, with a clear focus on what actually matters.</p><p>The strongest engineers are not the ones who know every tool. They are the ones who stay anchored in the problem they are solving and avoid drifting into unnecessary complexity.</p><p>Focus keeps everything aligned. When you are in flow, you stop jumping between tools and start asking better questions. What does the user really need? What is the simplest way to deliver that value? What can be removed instead of added?</p><p>This mindset changes how architecture decisions are made.</p><p>If the system only needs a few endpoints and caching matters, REST often fits better than introducing GraphQL. GraphQL has its strengths, but it is not always the simplest choice.</p><p>The same applies to databases and infrastructure. PostgreSQL, ORMs like Prisma or Drizzle, or query builders like Knex all solve different trade-offs. The decision is not about using the most modern tool, but the one that keeps the system understandable and maintainable.</p><p>On the infrastructure side, simplicity wins in most early-stage systems. Lightweight CI/CD pipelines often outperform heavier setups early on. ECS can be enough without introducing Kubernetes too early. Terraform is powerful, but not always necessary at the start.</p><p>Good engineering is also about knowing when to stop adding layers.</p><p>Middleware, authentication checks, schema validation, and error handling are necessary, but only when they reduce real risk or duplication. Every abstraction should earn its place in the system.</p><p>Reliability becomes part of this mindset. Observability tools like Datadog or New Relic surface issues such as latency spikes and failure rates. SRE concepts like error budgets help prioritise what matters next. If the system is consuming too much of its error budget, stability takes priority over new features.</p><p>Security and maintenance are part of the same loop. Dependency scanning tools like Snyk exist to prevent hidden vulnerabilities, but they introduce trade-offs in cost and complexity. The decision is not about using everything available, but what is appropriate for the current stage of the system.</p><p>At the core of all of this is focus.</p><p>Focus on the user.<br>Focus on the smallest useful system.<br>Focus on shipping, observing, then improving.</p><p>Everything else is optional until it is not.</p><p>Building software is an ongoing cycle of decisions. The better your focus, the better your system becomes over time.</p><p>Avoid distractions to increase quality and productivity outcomes.</p><p>Subscribe for free to receive new posts.</p><p>I&#8217;ve spent the last decade building projects on GitHub. They are available for inspiration and contribution. More content is coming on LinkedIn.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ib4T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ib4T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ib4T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ib4T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ib4T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ib4T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4120114,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/181853625?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ib4T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ib4T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ib4T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ib4T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df67339-1106-45bf-8f84-9102a7e287ed_5712x4284.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Avoid distractions to increase quality and productivity outcomes.</figcaption></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to receive new posts &#128640;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><blockquote><p><em>I&#8217;ve spent the last decade building projects <a href="https://github.com/pH-7">on my GitHub</a>. </em></p><p><em>Check them out for inspiration and contribution. And I&#8217;ve got more content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>!</em></p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/flow-state-is-the-real-shipping-advantage?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/flow-state-is-the-real-shipping-advantage?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Push Your Limits: Transform How You Grow as a Software Engineer]]></title><description><![CDATA[Watch now | Discover actionable ways to challenge yourself and accelerate your growth in software engineering]]></description><link>https://www.pierrehenry.dev/p/push-your-limits-transform-how-you</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/push-your-limits-transform-how-you</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Fri, 03 Jul 2026 14:19:04 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/187052149/4b86a83adc386ae860c7ba6e3ad3bfbd.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Feeling stuck in your career? Learn my practical strategies to take on challenges that push your skills, increase your impact, and open doors to the opportunities you want as a (product) software engineer.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tukc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tukc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tukc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tukc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tukc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tukc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5302078,&quot;alt&quot;:&quot;Focused on my laptop, building intensely&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/187052149?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Focused on my laptop, building intensely" title="Focused on my laptop, building intensely" srcset="https://substackcdn.com/image/fetch/$s_!tukc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tukc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tukc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tukc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa07520ca-77a0-43f2-9a9b-b6979dc74e61_5712x4284.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Focused on my laptop, building intensely.</figcaption></figure></div><blockquote><p>I&#8217;ve built plenty of projects <a href="https://github.com/pH-7">on my GitHub</a> over the years. Feel free to browse through for inspiration or contribution. I&#8217;ve got more exciting content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>. Make sure to hit that follow button so you don&#8217;t miss out!</p></blockquote><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#128293;! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Take Your Software Skills Further: High Availability Apps Explained]]></title><description><![CDATA[Watch now | Turn your projects into reliable systems that impress every time]]></description><link>https://www.pierrehenry.dev/p/take-your-software-skills-further</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/take-your-software-skills-further</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Tue, 30 Jun 2026 14:38:08 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/180799739/6b10c81eb7292ce3a631e23a1214f2fa.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Level up your software engineering game by building applications that can handle anything. In this tech talk session, I walk you through techniques for high availability, fault tolerance, and scalable design, helping you move from good to exceptional.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p>I&#8217;ve built <strong>tons of product-centric projects <a href="https://github.com/pH-7">on my GitHub</a> over the years</strong>. Feel free to check them out for inspiration or jump in to contribute! And I&#8217;ve got more content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>! Stay tuned! &#128293;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kRXH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kRXH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kRXH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kRXH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kRXH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kRXH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5109984,&quot;alt&quot;:&quot;    Building reliable software, one commit at a time&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/180799739?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="    Building reliable software, one commit at a time" title="    Building reliable software, one commit at a time" srcset="https://substackcdn.com/image/fetch/$s_!kRXH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kRXH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kRXH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kRXH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcde54a29-6d8f-4ab9-aa5c-ca52cf4511c1_5712x4284.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Building reliable software, one commit at a time.</em></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/take-your-software-skills-further?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/take-your-software-skills-further?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>Eenjoy your journey! &#127965;&#65039;</p>]]></content:encoded></item><item><title><![CDATA[Becoming a Product-First and AI-First Engineer: Mindset, Tools, and Efficient Workflows]]></title><description><![CDATA[How positivity, user focus, and modern AI tools reshape the way engineers build, think, and stay effective in a fast-changing environment]]></description><link>https://www.pierrehenry.dev/p/becoming-a-product-first-and-ai-first</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/becoming-a-product-first-and-ai-first</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Tue, 30 Jun 2026 12:23:04 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/200594238/c15994ad5b6133a2725c24aaa63bd9d2.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Being an engineer is not only about writing code or shipping features. It is also about how you feel while you build, how you think about problems, and how you choose to improve your daily workflow.</p><p>A strong mindset starts with something simple: doing work you care about and staying close to that feeling over time. There are difficult days, moments where things feel unclear or frustrating, but what matters is how you respond to them. Staying grounded in a positive direction helps you keep moving, even when things are not perfect.</p><p>Positivity here is not abstract. It is practical. It comes from surrounding yourself with the right influences, choosing tools that remove friction, and building habits that keep you focused on progress instead of frustration.</p><p>From there, the shift toward becoming a product-first engineer starts with one key idea: think like the user. Before writing solutions, understand the problem deeply. Before building features, experience the product as someone who depends on it. This perspective changes how decisions are made and naturally leads to simpler, more useful software.</p><p>On top of that, the role of an AI-first engineer is becoming more real in everyday workflows. Modern tools are changing how engineers interact with their environment. Tools like Superset, Conductor, CMUX, and terminal-based AI integrations like Codex or Grok bring intelligence directly into your workflow instead of keeping it separate.</p><p>Using MCP integrations with tools like Figma, Linear, Notion, or Webflow also changes how fast ideas can move from design to implementation. Instead of switching contexts constantly, you can stay closer to execution and iteration inside your terminal environment.</p><p>Even personal workflow setups evolve around this. Some engineers use multiple terminal sessions, cloned repositories, or workspaces to isolate features, experiments, and debugging tasks. Others rely on Git worktrees. Newer tools like Superset and Conductor simplify this by abstracting complexity and making parallel work more manageable without friction.</p><p>The key point is not the tools themselves, but the willingness to adapt. What you used last year is often not enough for what you are building today. The pace of change in software engineering means your workflow must evolve with it.</p><p>Improvement comes from exposure, experimentation, and action. When you discover better ways of working, the value only appears when you apply them in your own environment.</p><p>The goal is simple: stay positive, stay curious, build with intent, and continuously refine how you work as both a product-first and AI-first engineer.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1df7ade0-4faf-45d0-80e0-cf4416d0f4af_5712x4284.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52373050-ec95-4803-a603-9ffe6603cce8_4284x4382.jpeg&quot;}],&quot;caption&quot;:&quot;Engineer working across multiple tools and environments, reflecting a modern workflow built around AI, product thinking, and continuous iteration.&quot;,&quot;alt&quot;:&quot;Engineer working across multiple tools and environments, reflecting a modern workflow built around AI, product thinking, and continuous iteration&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8dfeaea2-e6c1-4618-bf95-137792f1cfc1_1456x720.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#127793;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><blockquote><p>I&#8217;ve spent the last decade building projects <a href="https://github.com/pH-7">on my GitHub</a>. Check them out for inspiration and contribution. </p><p>I&#8217;m preparing more content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>!</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Interview with a Solo Engineer Who Builds Simple Software That Lasts]]></title><description><![CDATA[Watch now | Simplicity, durability, and the discipline to say no. Herman Martinus, founder of BearBlog.]]></description><link>https://www.pierrehenry.dev/p/why-this-solo-developer-chose-simplicity</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/why-this-solo-developer-chose-simplicity</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Sun, 28 Jun 2026 20:13:03 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/199453872/c5d3d66feb89233428d2a1085006e7f1.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><blockquote><p><em>Most software becomes more complex over time. More features, more abstractions, more layers. But what about taking the opposite path?</em></p></blockquote><p>I had the great pleasure of interviewing Herman Martinus, the founder of BearBlog.</p><p>He has taken a very deliberate path: simplicity over growth, independence over scale, and a strong refusal to let feature requests dilute the core idea behind his product. That mindset alone makes his approach interesting to follow!</p><p>Herman is a former video game developer based in Cape Town, South Africa, where the tech scene is real and active. Meetups happen regularly, and the community is small enough that you keep bumping into the same people, which builds genuine connections over time. And when it&#8217;s not cloudy, the majestic Table Mountain is right there outside his window (no need for a virtual background!). Definitely a nice backdrop.</p><p>Cape Town also turns out to be a strong base for independent builders. The cost of living is relatively low, the time zone aligns well with Europe, and English is widely spoken. Many developers there work remotely for European companies, earning in pounds or euros while living on South African Rand, which creates a comfortable setup for independent work.</p><p>We also go into building products that last, resisting overengineering, and why saying no is one of the most important skills for any founder. A recurring theme is focus: building for a specific kind of user instead of trying to serve everyone.</p><p>What also caught my attention is how Herman manages his work rhythm. He does not rely on a rigid schedule. He follows what needs attention, stays mostly in maintenance mode when travelling, and recently spent a month in Japan doing just that: handling support, emails, and small fixes. No deep building, no pressure to ship. When he returned, he felt refreshed and ready to build again. He also noticed that mixing travel and deep work left him underwhelmed on both sides, so he now separates them more intentionally.</p><p>We also discussed how he uses AI. It is not part of the product itself, but it plays a specific role in his workflow, mainly for security audits and content moderation. Not as a shortcut for building features, but as a targeted tool with a clear purpose.</p><p>From a lockdown side project to a sustainable independent business, Herman shares a grounded perspective on software engineering, product design, and what it means to build something that stays useful long after launch.</p><p>A lot is covered in this episode: Why simplicity is a real competitive advantage, the dangers of overengineering, growing without traditional marketing, the special &#661;&#8226;&#7461;&#8226;&#660; growth hack that drives most of the user acquisition, how constraints often lead to better products, and the philosophy behind <a href="https://herman.bearblog.dev/manifesto/">Bear Blog&#8217;s Manifesto</a>, which helps Herman stay focused on what actually really matters for Bear Blog and its core values.</p><div><hr></div><p>This episode is definitely a <strong>must-listen</strong> for <strong>all software engineers</strong>, <strong>indie entrepreneurs</strong>, <strong>founders</strong>, and anyone interested in building <strong>meaningful products with intention</strong> rather than complexity.</p><p>Herman also hosts his own podcast, &#8220;<a href="https://podcasts.apple.com/au/podcast/the-idea-roastery/id1566662429">The Idea Roastery</a>&#8221;, co-hosted with his friend Jason Forte.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><blockquote><p><em>I&#8217;ve built plenty of projects <a href="https://github.com/pH-7">on my GitHub</a> over the years. Feel free to browse through for inspiration or contribution. I&#8217;ve got more exciting content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>. Make sure to hit that follow button so you don&#8217;t miss out!</em></p></blockquote><p>Thanks for passing by! &#127793; If you enjoyed this interview, I&#8217;ll make more like this.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/why-this-solo-developer-chose-simplicity?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.pierrehenry.dev/p/why-this-solo-developer-chose-simplicity?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p>]]></content:encoded></item><item><title><![CDATA[How to Keep Your Web Services PERFORMANT]]></title><description><![CDATA[Watch now | Small changes in images, APIs, caching, and infrastructure can completely change how fast your application feels to users]]></description><link>https://www.pierrehenry.dev/p/how-to-make-your-web-services-more</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/how-to-make-your-web-services-more</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Sun, 28 Jun 2026 15:42:27 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/203876912/e10d85ee7cd581e122ac7b96ab50122e.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p>APIs and web applications can become complex very quickly, and performance issues usually come from multiple small inefficiencies stacked together. Improving load speed is less about one big fix and more about identifying bottlenecks and applying optimisations at the right layer of the system.</p><p>In this tech session, we explore practical techniques to make web applications faster and more efficient across the full stack.</p><p>We start with image optimisation, since it is often one of the biggest performance drains. This includes serving images at the correct size, compressing them properly, and removing unnecessary metadata. We also look at modern formats like WebP and AVIF, which significantly reduce file size compared to PNG or JPEG. On top of that, lazy loading using the native HTML <code>loading</code> attribute helps defer offscreen images and improves initial page render speed.</p><p>Fonts also play a role in performance. Choosing lighter formats like WOFF2 instead of heavier TTF or OTF files can reduce load time noticeably, especially on content-heavy pages.</p><p>From there, we move into frontend and network performance. CDNs (Content Delivery Networks) help reduce latency by serving assets from locations closer to users. Preloading critical resources can also improve perceived speed by prioritising what the browser needs first. For client-side applications such as React, avoiding synchronous blocking calls and using proper asynchronous API handling helps keep the UI responsive.</p><p>We also look at how hosting location impacts performance. If your users are mostly in one region but your infrastructure is hosted far away, latency increases unnecessarily. Using multi-region deployments or edge-based services helps reduce this gap.</p><p>A key part of debugging performance issues is using browser tools effectively. Chrome DevTools provides the Network and Performance tabs to inspect request timing, payload sizes, and rendering behaviour. Lighthouse adds a structured performance score and highlights specific areas for improvement, making it easier to prioritise fixes.</p><p>On the backend, database optimisation is critical. Proper indexing in relational databases can drastically reduce query time. Tools like pgAnalyze (for Postgres) help identify slow queries and inefficient patterns. Caching is another major improvement area, using systems like Redis or Memcached to avoid repeated expensive database calls. A well-designed caching strategy can often tolerate 30&#8211;60 minute stale data windows depending on the use case.</p><p>API design also matters. REST APIs are often easier to optimise with HTTP caching headers, while GraphQL requires more careful cache management due to flexible query structures. In both cases, avoiding unnecessary requests and reducing payload size improves overall performance.</p><p>Other important techniques include pagination and limiting data transfer. Instead of loading everything at once, APIs should return only the required chunk of data. This works well alongside frontend lazy loading strategies.</p><p>Finally, serverless architectures require attention to database connections. Opening too many connections can create overhead, so proper connection pooling and cleanup is essential.</p><p>The goal of this video is to show that performance is not a single optimisation, but a collection of small improvements across images, fonts, frontend behaviour, APIs, caching, and backend systems. When combined, they produce a significantly faster and smoother user experience.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GPSs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GPSs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GPSs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GPSs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GPSs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GPSs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16632730,&quot;alt&quot;:&quot;Slow app vs optimised fast system comparison showing performance gains&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/203876912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Slow app vs optimised fast system comparison showing performance gains" title="Slow app vs optimised fast system comparison showing performance gains" srcset="https://substackcdn.com/image/fetch/$s_!GPSs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GPSs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GPSs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GPSs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02526974-15de-48b0-a04a-b1113ec9bc0f_5712x4284.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Slow app vs optimised fast system comparison showing performance gains.</figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><blockquote><p>I&#8217;ve built plenty of projects <a href="https://github.com/pH-7"><span>on my GitHub</span></a> over the years. Feel free to browse through for inspiration or contribution. </p><p>I&#8217;ve got more exciting content coming your way <a href="https://www.linkedin.com/in/ph7enry"><span>on my LinkedIn</span></a>. Make sure to hit that follow button so you won&#8217;t miss out!</p></blockquote>]]></content:encoded></item><item><title><![CDATA[Why Software Engineers Keep Choosing Complex Solutions Without Realizing It]]></title><description><![CDATA[Watch now | How bias, habits, and fear push engineers toward complexity instead of clarity]]></description><link>https://www.pierrehenry.dev/p/why-software-engineers-keep-choosing</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/why-software-engineers-keep-choosing</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Fri, 26 Jun 2026 15:30:10 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/180140571/769846adb08e6afff54a51c9add2886b.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p><strong>In this video, I break down why so many engineers default to complex solutions even when a simpler approach works better.</strong> And honestly? I&#8217;ve been guilty of this too. We all have.</p><p>Here&#8217;s what&#8217;s really happening: ego, insecurity, and unclear thinking lead us straight into overengineering territory. You want to prove you&#8217;re smart, so you reach for the fancy design pattern. You&#8217;re worried the simple solution looks too basic, so you add layers of abstraction &#8220;just in case.&#8221; Or you haven&#8217;t actually clarified the problem, so you build something overly flexible to cover all possible scenarios.</p><p>But here&#8217;s the truth&#8230; The best engineers aren&#8217;t the ones writing the most clever code. They&#8217;re the ones solving problems with the least amount of complexity necessary. Because simple code is easier to debug, faster to ship, and way more reliable in production.</p><p>In this video, I&#8217;ll show you how to recognize when you&#8217;re overengineering, how to shift your mindset from &#8220;what&#8217;s the coolest solution?&#8221; to &#8220;what&#8217;s the right solution?&#8221;, and how to build cleaner, faster software that actually solves the problem at hand. Let&#8217;s talk about fighting the urge to be clever and learning to be effective instead.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p>Psst! I&#8217;ve built tons of projects <a href="https://github.com/pH-7">on my GitHub</a> over the years. Check them out for inspiration or jump in to contribute! &#129312;</p><p>I&#8217;ve got more content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>! Hit that follow button so you don&#8217;t miss out! &#127919;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PD5G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PD5G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic 424w, https://substackcdn.com/image/fetch/$s_!PD5G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic 848w, https://substackcdn.com/image/fetch/$s_!PD5G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic 1272w, https://substackcdn.com/image/fetch/$s_!PD5G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PD5G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1037065,&quot;alt&quot;:&quot;Simplicity as a software engineer&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/180140571?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Simplicity as a software engineer" title="Simplicity as a software engineer" srcset="https://substackcdn.com/image/fetch/$s_!PD5G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic 424w, https://substackcdn.com/image/fetch/$s_!PD5G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic 848w, https://substackcdn.com/image/fetch/$s_!PD5G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic 1272w, https://substackcdn.com/image/fetch/$s_!PD5G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c0b6f-372d-4891-9b75-2ab9379cff0c_3024x4032.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Why software engineers keep choosing complex solutions without realizing it.</figcaption></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#128293;! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Build Great Products With Clients as an Engineer]]></title><description><![CDATA[Watch now | An engineer and a client aligned on the same plan, looking at one shared goal]]></description><link>https://www.pierrehenry.dev/p/build-great-products-with-clients</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/build-great-products-with-clients</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Fri, 26 Jun 2026 08:35:06 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/181976764/701c334c1b76b9707201b34542e939c3.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Great products are built with clients, not for them. In this video, I explain how I communicate clearly, plan work realistically, and handle deadlines without stress. This approach helps avoid misunderstandings, last-minute pressure, and broken trust while delivering software that actually works.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5iBr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5iBr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5iBr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5iBr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5iBr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5iBr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5000815,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/181976764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5iBr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5iBr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5iBr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5iBr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F458c1d83-b2bd-45be-9287-f5f67848c273_5712x4284.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">An engineer and a client aligned on the same plan, looking at one shared goal.</figcaption></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#128293;! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I&#8217;ve built tons of projects <a href="https://github.com/pH-7">on my GitHub</a> over the years. Check them out for inspiration or contribution. I&#8217;ve got more content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>! Hit that follow button so you don&#8217;t miss out! &#128293;</p>]]></content:encoded></item><item><title><![CDATA[SSR vs CSR vs SPA: What Most Developers Get WRONG]]></title><description><![CDATA[Watch now | Three common approaches, one important decision every web developer should understand.]]></description><link>https://www.pierrehenry.dev/p/ssr-vs-csr-vs-spa-what-most-developers</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/ssr-vs-csr-vs-spa-what-most-developers</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Thu, 25 Jun 2026 20:59:53 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/203577919/5ee7ecbd2b5cd9584e72a60106eef647.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve worked with React, PHP, Django, Symfony, or modern SaaS products, you&#8217;ve probably heard terms like SSR, CSR, and SPA. They&#8217;re everywhere in web development, yet many developers use them without fully understanding the trade-offs behind each approach.</p><p>In this article, I break down the differences between <strong>Server-Side Rendering</strong> (SSR), <strong>Client-Side Rendering</strong> (CSR), and <strong>Single-Page Applications</strong> (SPA) using practical examples from real-world software engineering.</p><p>You will learn how traditional server-rendered applications work, why frameworks such as Symfony, Rails, and Django have relied on SSR through Smarty, Twig, ERB, and Jinja2 for years, why SSR applications are (often) easier and simpler to build than CSR, and how modern frontend frameworks like React changed the way we build applications by moving much of the rendering logic to the browser.</p><p>You&#8217;ll also learn why client-side rendering creates a clear separation between frontend and backend systems, what performance implications come with that choice, and when a single-page application can provide a smoother user experience for products such as dashboards, internal tools, and SaaS platforms.</p><p>Whether you&#8217;re preparing for software engineering interviews, learning web architecture, or simply trying to better understand the technologies you use every day, this article provides a straightforward explanation of these core concepts without unnecessary complexity.</p><p><strong>By the end, you&#8217;ll understand:</strong></p><p>&#8226; What SSR, CSR, and SPA actually mean<br>&#8226; How data flows in each architecture<br>&#8226; The advantages and disadvantages of every approach<br>&#8226; When to choose one over another<br>&#8226; Why modern applications often combine multiple rendering strategies</p><p>These concepts sit at the foundation of modern web development, and understanding them will help you make better architectural decisions for your next project.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZEqR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZEqR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZEqR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZEqR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZEqR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZEqR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19512473,&quot;alt&quot;:&quot;SSR, CSR, and SPAs&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/203577919?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="SSR, CSR, and SPAs" title="SSR, CSR, and SPAs" srcset="https://substackcdn.com/image/fetch/$s_!ZEqR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZEqR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZEqR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZEqR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d2fcaa5-9f96-4427-8db1-d58bf86c4f76_5712x4284.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Building, learning, and sharing practical web architecture concepts.</figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/ssr-vs-csr-vs-spa-what-most-developers?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/ssr-vs-csr-vs-spa-what-most-developers?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><blockquote><p>I built various projects <a href="https://github.com/pH-7">on my GitHub</a> over the years that might interest you. Feel free to browse them for inspiration or contribution. </p><p>And I&#8217;ve got more exciting content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>. Make sure to hit the follow button so you won&#8217;t miss anything.</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[How I Start Every Morning as an Engineer to Get Things Done]]></title><description><![CDATA[Watch now | A simple start to the day that shapes productivity, clarity, and creative thinking]]></description><link>https://www.pierrehenry.dev/p/how-i-start-every-morning-as-an-engineer</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/how-i-start-every-morning-as-an-engineer</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Mon, 22 Jun 2026 16:19:05 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/183213223/47f6ecd15c31f464b5c321fd12af65d4.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p><strong>See how small, intentional morning routines can improve your focus, problem-solving, and overall output as a software engineer.</strong> Real practices, real impact, no productivity hype.</p><p>The way you start your day shapes everything that follows. In this video, I share the simple morning habits that help me show up sharper, think clearer, and code better. These aren&#8217;t complicated rituals or time-consuming routines. They&#8217;re small, deliberate actions that set the tone for deep work and consistent performance. Try them and see the difference yourself.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T3zj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T3zj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!T3zj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!T3zj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!T3zj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T3zj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4261635,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/183213223?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!T3zj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!T3zj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!T3zj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!T3zj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0805e069-39b6-461a-9984-e349428b8327_5712x4284.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Get this done proactively as a software engineer.</figcaption></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#128293;! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>You might be interested by this! Indeed, <strong>I&#8217;ve built many projects <a href="https://github.com/pH-7">on my GitHub</a> over the years that you can check out for inspiration or contribution</strong>! </p><p>I&#8217;ve got plenty more content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>! Hit that follow button so you don&#8217;t miss out!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/how-i-start-every-morning-as-an-engineer?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/how-i-start-every-morning-as-an-engineer?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Pragmatic Principles for Software Engineers]]></title><description><![CDATA[Core software engineering principles for writing scalable, maintainable, and production-ready code inspired by the Pragmatic Programmer mindset.]]></description><link>https://www.pierrehenry.dev/p/pragmatic-programmer-rules-any-developers</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/pragmatic-programmer-rules-any-developers</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Mon, 22 Jun 2026 08:10:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/b_aqjMwIYPs" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Essential Pragmatic Engineering Rules Every Developer Should Live By</h2><p>I have listed some of the most essential rules every software engineer should know. These principles are taken from The Pragmatic Programmer by Andy Hunt and Dave Thomas.</p><p></p><h3><strong>Algorithm speed &#128640;</strong></h3><p>Although this is nothing new for any experienced engineer, you should always be careful when dealing with multiple loops.</p><p>The complexity of a simple loop is O(n). Now, if we introduce a function or method inside it that also loops over something, the complexity will immediately become O(m &#215; n). Always consider the side effects of any change in your code to ensure there is no impact on the scalability of your application in the long term.</p><h3>Best isn&#8217;t always best &#128161;</h3><p>Be aware that premature optimisation is not always the appropriate decision at the start of any project or proof of concept (POC). At that stage, it is impossible to know the traffic or the eventual iterations and direction of your application. Instead, it is usually wiser to keep things simple and small.</p><h3><strong>Be pragmatic. Not a coincidental &#8220;Code Monkey&#8221; &#128165;</strong></h3><p>Coding is not a mechanical job. As a pragmatic programmer, you need to make the right decisions. You need to think critically about all code and the impact it could have, as well as how your code and software architecture will scale in the future.</p><p>On the other hand, a coincidence programmer will write code without planning or looking at the big picture. They tend to add mechanical code in an inefficient manner.</p><h3>Automation &#129302;</h3><p>Automating things is an important concept in the lifecycle of an application. However, like optimisation, if you automate too early things that might not be repetitive, it will only add unnecessary extra hours of work.</p><h3>Learn what you need &#128221;</h3><p>Learning the right tools well (such as Jenkins, Docker, a framework, shortcuts, your favourite IDE, or a benchmarking tool) will be one of your greatest strengths in your career.</p><h3>Don&#8217;t write Dodo-Code &#129444;</h3><p>Writing dodo code implies that your code will not adapt well over time. The dodo did not adapt to the presence of humans. They were once abundant on the island of Mauritius before going extinct. Do not give the same future to your code. Keep your codebase agile and well maintained, using good design patterns that make new changes and feature implementations easy.</p><h3>Testing before production &#127859;</h3><p>Although this can seem obvious, too often I see last-minute &#8220;important&#8221; changes that need to be shipped to production as soon as possible. And since the software engineers do not have the time or necessary resources, they proceed with shipping the changes right away to please their manager or C-level stakeholders.</p><p>This can end up quite badly. It is always easy to underestimate what can go wrong until you wake up one morning and the entire online service is down because of a missing assignment operator or a missing semicolon or comma causing incorrect behaviour. No matter how much you trust the release, you are never 100% sure of the consequences of each change in your code. Integration and acceptance tests can be very useful here.</p><p>A good practice is also the use of the &#8220;chaos monkey&#8221; technique in your application to make sure there are no obvious issues with it.</p><h3>The boy-scout rule &#129529;</h3><p>The Boy Scout rule says: &#8220;<em>Always leave the campground cleaner than you found it.</em>&#8221;</p><p>It means you should clean up even when others leave things messy, no matter the excuses. It does not matter whether you created the mess or not. The rule aims to make the codebase incrementally better, step by step, every time you touch a legacy or outdated part of the code.</p><p>So, every time you need to add or change something in an existing function or class, identify a small improvement you can also make. A tiny improvement will not introduce new problems or make the code review harder, but those small improvements, applied consistently, will make the entire codebase much cleaner over time.</p><h3>Debugging mindset &#129504;</h3><p>Before debugging, it is important to adopt the right mindset. Debugging can be tricky and time-consuming.</p><p>Here are some rules of thumb that make this &#8220;mental digging&#8221; more pleasant &#129312;:</p><ol><li><p>Immediately think about which tier or layer of your code the problem could come from.</p></li><li><p>Failing early will tell you more directly where something is not working. Always fail early instead of quietly moving to the next function when something is not supposed to happen.</p></li><li><p>Use breakpoints and exception tracing.</p></li><li><p>Speaking to your <strong>rubber duck</strong>, an AI chat, or a colleague will help you see the bigger picture of what you are working on. Very often, you will have an &#8220;aha&#8221; moment when you explain what is not working, what has changed, and where you looked in the code.</p></li><li><p>Step back and consider the overall architecture and infrastructure to locate the problem more easily.</p></li></ol><h3>Rubber Duck debugging technique &#128037;</h3><div id="youtube2-b_aqjMwIYPs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;b_aqjMwIYPs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/b_aqjMwIYPs?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Happy Debugging Day! &#129312; Enjoy solving and tackling your technical challenges! &#127919;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><blockquote><p><em>I&#8217;ve built plenty of projects <a href="https://github.com/pH-7">on my GitHub</a> over the years. Feel free to browse through for inspiration or contribution. </em></p><p><em>I&#8217;ve got more exciting content coming your way <a href="https://www.linkedin.com/in/ph7enry/">on my LinkedIn</a>. So, make sure to hit that follow button so you don&#8217;t miss out!</em></p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/pragmatic-programmer-rules-any-developers?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.pierrehenry.dev/p/pragmatic-programmer-rules-any-developers?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p>]]></content:encoded></item><item><title><![CDATA[Why Modern Engineers Win by Thinking Better, Solving Differently and Sticking to Principles]]></title><description><![CDATA[Watch now | What top performers do differently when solving problems every day]]></description><link>https://www.pierrehenry.dev/p/why-modern-engineers-win-by-thinking</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/why-modern-engineers-win-by-thinking</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Sat, 20 Jun 2026 22:38:53 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/179696743/862c0282d72a986334c1c2d280796cb2.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p><strong>In this long tech video (whilst I&#8217;m walking), I explain where you need to focus and spend your time as an engineer, why just shipping is no longer part of it, and how thinking clearly as a product-oriented problem-solver is the skill that separates strong engineers from everyone else.</strong></p><p>Look, this might sound controversial, but hear me out. The actual act of writing code? That&#8217;s becoming less and less of the differentiator. AI can handle everything now. What it can&#8217;t do (at least not yet) is understand the <em>why</em>behind what you&#8217;re building.</p><p>The engineers who are genuinely valuable are definitely no longer the ones who can write the most maintainable lines of code in a day. They&#8217;re the ones who can look at a feature request and ask: &#8220;<em>Wait, does this actually solve the user&#8217;s problem? Is this the right approach? What are we missing here?</em>&#8221; </p><p>Product-oriented thinking means you&#8217;re not just executing tasks. You&#8217;re questioning requirements. You&#8217;re thinking about edge cases before you write a single function. You&#8217;re considering the long-term maintenance burden of your decisions. You&#8217;re thinking like someone who owns the outcome, not just the implementation.</p><p>And here&#8217;s the thing: this requires clear thinking. Not clever thinking. Clear thinking. The ability to break down a complex problem into simple parts, spot what actually matters, and communicate your reasoning to others. That&#8217;s the skill that separates strong engineers from everyone else.</p><p>In this video (which is quite long because I&#8217;m walking and thinking out loud), I&#8217;ll break down what this actually looks like in practice. How to shift from &#8220;just tell me what to build&#8221; to &#8220;let me understand the problem first.&#8221; How to evaluate trade-offs. How to think through second and third-order effects of your decisions. And why this mindset matters more than any specific technology you know.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/why-modern-engineers-win-by-thinking?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/why-modern-engineers-win-by-thinking?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3lGm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3lGm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3lGm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3lGm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3lGm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3lGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg" width="962" height="1008" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1008,&quot;width&quot;:962,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:309035,&quot;alt&quot;:&quot;Stop coding. Start thinking like a product owner&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/179696743?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ab1b93-eed9-4978-99af-aa98994cab82_962x1280.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Stop coding. Start thinking like a product owner" title="Stop coding. Start thinking like a product owner" srcset="https://substackcdn.com/image/fetch/$s_!3lGm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3lGm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3lGm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3lGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82179ee-0207-4cc1-8023-5dc2dc053ecd_962x1008.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Stop just shipping. Start thinking like a product owner.</em></figcaption></figure></div><p>I&#8217;ve been building several projects <a href="https://github.com/pH-7">on my GitHub</a> over the years that might interest you. Feel free to check them out for inspiration or jump in with contributions!</p><p>There are so much more to come <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>! Don&#8217;t forget to follow and stay tuned! &#128293;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[The Essential Knowledge No Developer Can Ignore!]]></title><description><![CDATA[Watch now | Master the essential skills and mindset that make software engineers truly effective]]></description><link>https://www.pierrehenry.dev/p/the-essential-knowledge-no-developer</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/the-essential-knowledge-no-developer</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Thu, 18 Jun 2026 20:52:04 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/175269860/7c05366e81dae58ae4283c52a5f6603f.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p><strong>Learn the core principles every developer needs to know to stay sharp and effective.</strong> Look, there&#8217;s a massive difference between writing code that works and writing code that actually matters. Between being a good engineer and being a great one.</p><p>This video breaks down the skills and mindset that separate the two. We&#8217;re talking about the fundamentals that don&#8217;t expire when a new framework drops. Things like thinking critically about trade-offs, knowing when to optimise (and when not to), writing code that adapts over time instead of becoming legacy debt, and understanding the &#8220;why&#8221; behind what you&#8217;re building, not just the &#8220;how.&#8221;</p><p>These aren&#8217;t trendy tips or hacks. They&#8217;re the timeless principles that make you someone people actually want on their team. The kind of engineer who doesn&#8217;t just ship features but ships solutions that last.</p><p>Whether you&#8217;re just starting out or you&#8217;ve been coding for years, revisiting these core concepts will make your work sharper, cleaner, and way more effective. Let&#8217;s dive in.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VzVI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VzVI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic 424w, https://substackcdn.com/image/fetch/$s_!VzVI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic 848w, https://substackcdn.com/image/fetch/$s_!VzVI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic 1272w, https://substackcdn.com/image/fetch/$s_!VzVI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VzVI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1472125,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/175269860?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VzVI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic 424w, https://substackcdn.com/image/fetch/$s_!VzVI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic 848w, https://substackcdn.com/image/fetch/$s_!VzVI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic 1272w, https://substackcdn.com/image/fetch/$s_!VzVI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4080ad01-323d-41c0-9107-c251eba82638_5592x4194.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Learn the core principles every developer needs to know.</em></figcaption></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#128293;! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><blockquote><p><strong>I&#8217;ve developed numerous projects <a href="https://github.com/pH-7">on my GitHub</a> over the years</strong>. Feel free to browse them for inspiration or to contribute!</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/the-essential-knowledge-no-developer?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/the-essential-knowledge-no-developer?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Productivity Apps You Actually Need]]></title><description><![CDATA[Watch now | How Forest, Flora, and FocusDog help you protect focus without turning productivity into stress]]></description><link>https://www.pierrehenry.dev/p/the-productivity-apps-you-actually</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/the-productivity-apps-you-actually</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Thu, 18 Jun 2026 17:29:01 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/185008620/e1f40f108f1a4df725f66bf22d1c4a37.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Most productivity apps try to do too much. More features, more settings, more noise. Forest, Flora, and FocusDog do the opposite. They create clear boundaries between focus and distraction using simple visual feedback and gentle pressure.</p><p>In this tutorial, I explain why these apps work, what they get right compared to complex task managers, and how I use them to stay consistent without burning out. If you want fewer tools and better focus, this is a practical place to start.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1aea6abe-0048-4e75-81f7-5b39e874d058_4032x3024.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96f33f03-1e7b-4442-b74e-ed25fb923d0a_4032x3024.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/868c9a5b-847d-4612-b3b6-dc5be770c776_4032x3024.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd692c09-614a-40e8-b54e-62cf5fd91584_3024x4032.jpeg&quot;}],&quot;caption&quot;:&quot;Use the right tool to leverage your productivity&quot;,&quot;alt&quot;:&quot;Use the right tool to leverage your productivity&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3817fb4c-b700-4b21-9488-13149ddcd94c_1456x1456.png&quot;}},&quot;isEditorNode&quot;:true}"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#128293;! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The Best Focus &amp; Note-Taking Apps I Actually Use</h2><p>Let me share the apps I&#8217;ve been using and that I genuinely recommend depending on your setup.</p><h3>Focus Apps</h3><p>Three solid options here depending on your OS and what you&#8217;re looking for.</p><p><strong>Forest</strong> is my top pick if you&#8217;re on iOS. You pay once, that&#8217;s it. No subscription, no freemium trap. The downside is it&#8217;s iOS only, so keep that in mind.</p><p><strong>Flora</strong> used to be fully free. Now it&#8217;s gone freemium, so you get the basics for free and pay for more features. Still decent.</p><p><strong>FocusDog</strong> is the one worth highlighting if you&#8217;re on Android or iOS and want something with more gamification. Donuts, rewards, that kind of thing. It&#8217;s built and maintained by a single developer who also has a full-time job, and he&#8217;s kept the app alive and updated for over two years. That says a lot. It&#8217;s also the only one available on both iOS and Android, so if you&#8217;re not on iOS, this is your go-to.</p><p>For background music while working, Brain.fm does the trick very well.</p><h3>Note-Taking &amp; Bookmarking Apps</h3><p>This is where it gets interesting.</p><p><strong>Raindrop.io</strong> over Pocket, no question. Pocket is painful to search through. Raindrop makes it genuinely easy to find anything you&#8217;ve saved. Also maintained by essentially one engineer doing it full time, which is impressive.</p><p>For actual note-taking, you have a few good options:</p><p><strong>Obsidian</strong> is probably the most powerful one out there. It&#8217;s mostly free, with a paid commercial plan. The concept is simple: your notes are linked like nodes in a graph, so finding connections between ideas becomes much easier over time. It&#8217;s not the simplest app to get started with, but once you&#8217;re in, it&#8217;s hard to go back.</p><p><strong>Roam Research</strong> is also excellent and very powerful, accessible from the web too. The catch is the price. It&#8217;s $165 per year, or $500 for five years, so roughly $100 per year if you commit long term. Expensive, but people who use it swear by it.</p><p><strong>Dendron</strong> is worth a mention too. It&#8217;s 100% open source, which is a big plus if that matters to you.</p><h3>The Bigger Picture</h3><p>The reason any of this matters is simple. You need a second brain. You are constantly consuming information, and if you don&#8217;t have a place to store and organize it, it just disappears. Note-taking apps are that external brain.</p><p>And beyond storing, the real value is teaching back what you learn. Writing it down, reorganizing it, explaining it forces your brain to actually retain it. That daily habit of learning and then reinforcing what you learned is what compounds over time &#128522;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uMVO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uMVO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uMVO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uMVO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uMVO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uMVO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg" width="1399" height="1105" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1105,&quot;width&quot;:1399,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:323682,&quot;alt&quot;:&quot;Desk setup for product software engineer&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/185008620?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Desk setup for product software engineer" title="Desk setup for product software engineer" srcset="https://substackcdn.com/image/fetch/$s_!uMVO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uMVO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uMVO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uMVO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38935583-700b-4e15-8ee2-d26c048d19ba_1399x1105.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Do <strong>less</strong>, but <strong>better</strong>. <strong>There is no excellence without specialisation</strong>.</figcaption></figure></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/the-productivity-apps-you-actually?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#128293; This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/the-productivity-apps-you-actually?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/the-productivity-apps-you-actually?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><blockquote><p><em>I&#8217;ve built tons of product-centric projects <a href="https://github.com/pH-7">on my GitHub</a> over the years. </em></p><p><em>Feel free to check them out for inspiration or jump in to contribute! I&#8217;ve got more content coming your way <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>.</em></p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Write CLEAN, EFFICIENT, and SCALABLE JavaScript Code That Actually Lasts]]></title><description><![CDATA[Practical principles to structure JavaScript so it stays readable, maintainable, and ready for growth in real-world applications.]]></description><link>https://www.pierrehenry.dev/p/write-clean-efficient-and-scalable</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/write-clean-efficient-and-scalable</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Thu, 18 Jun 2026 17:12:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/2kOfQHz3JFs" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Learn the best practices and coding standards for clean and professional quality code that lasts long</h3><p>Every day, I review hundreds of lines of code. Brand new micro-services, new features, refactoring, hotfixes, and so on. I&#8217;ve seen so many different coding flavors, good and bad coding habits, etc. <strong>Below is everything I&#8217;ve learned for over 12 years in the industry</strong> as a software engineer.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p></p><h2>Don&#8217;t comment on what it does. Write meaningfully what it does instead</h2><p>It&#8217;s crucial to name your functions and variables in simple and explicit words so that they say what they do (just by reading their names).</p><blockquote><p><em>Self-descriptive code is very important. Your code should simply self-document itself.</em></p></blockquote><p>If the code requires too many comments to be understood, it means the code needs to be refactored. The code has to be understood by reading it, not by reading the comments. And the same applies when you write tests. Having to justify what the code does is usually a bad sign of a code smell.</p><p>Your code has to be clear enough to document itself as well. As developers, we tend to be lazy and we don&#8217;t read (carefully) the comments. However, the code, we always do.</p><p>Icing on the cake, it&#8217;s always more rewarding and requires less time to write self-descriptive code rather than commenting it.</p><h3>&#10060; Bad practice</h3><pre><code><code>let validName = false;
// We check if name is valid by checking its length
if (name.length &gt;= 3 &amp;&amp; name.length &lt;= 20) {
  validName = true;
  // Now we know that the name is valid
  // &#8230;
}
</code></code></pre><pre><code><code>const sr = 8.79; // Saving Rate
</code></code></pre><h3>&#9989; Good example</h3><pre><code><code>const isValidName = (name) =&gt; {
  return (
    name.length &gt;= config.name.minimum &amp;&amp; name.length &lt;= config.name.maximum
  );
};
// &#8230;

if (isValidName('Peter')) {
  // Valid &#9989;
}
</code></code></pre><pre><code><code>const savingRate = 8.79;
</code></code></pre><p>Remember, <strong>your job is to write efficient and meaningful code</strong>, <strong>not endless comments.</strong></p><div><hr></div><h2>The &#8220;One Thing&#8221; principle 1&#65039;&#8419;</h2><p>When writing a function, remind yourself that it should (ideally) do only one (simple) thing. Think about what you have already learned concerning comments. The code should say everything. No comments should be needed. Splitting the code into small, readable functions and reusable portions of code will drastically improve your code&#8217;s readability and eliminate the need to copy/paste the same piece of code just because it hasn&#8217;t been properly moved into reusable functions or classes.</p><p>Just as individual LEGO blocks can be combined to create larger structures, your functions should be small, focused units that can be composed together to accomplish more complex tasks.</p><h3>&#10060; Non-readable function</h3><pre><code><code>function retrieveName(user) {
  if (user.name &amp;&amp; user.name !=== 'admin' &amp;&amp; user.name.length &gt;= 5) {
    return user.name;
  }
  // ...
}
</code></code></pre><h3>&#9989; One Thing. Neat &amp; Clean</h3><pre><code><code>const isRegularUser = (name) =&gt; {
  return name !=== config.ADMIN_USERNAME;
}

const isValidNameLength = (name, minimumLength = 5) =&gt; {
  return name.length &gt;= minimumLength;
}

const isEligibleName(name) {
  return isRegularUser(name) &amp;&amp; isValidNameLength(name);
}

// &#8230;

function retrieveName(user) {
  const name = user?.name;

  if (isEligibleName(name)) {
    return user.name;
  }
}
</code></code></pre><div id="youtube2-2kOfQHz3JFs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;2kOfQHz3JFs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/2kOfQHz3JFs?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Uncle Bob explains this concept as &#8220;<em>Extract Till You Drop</em>,&#8221; where you continuously extract your code into smaller and more manageable components.</p><div><hr></div><h2>Boat anchor (AKA <a href="https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking">Tree Shaking</a> &#127795;)</h2><p>Never keep unused code or commented code, &#8220;<em>just in case</em>&#8221; for history reasons.</p><p>Sadly, it&#8217;s still very common to find commented code in pull requests we review.</p><p>Nowadays, everybody uses a version control system like git, so there is always a history where you can look and go backward if needed.</p><h3>&#10060; Downsides of keeping unused code</h3><ol><li><p>We think we will come back to removing it when it&#8217;s time. Very likely, we will get busy with something else and we will forget to remove it.</p></li><li><p>The unused code will add more complexity for a later refactoring.</p></li><li><p>Even if unused, it will still show up when searching in the codebase (which adds more complexity too).</p></li><li><p>For new developers joining the project, they don&#8217;t know if they can remove it or not.</p></li></ol><h3>&#9989; Action to take</h3><p>Add a Bitbucket/GitHub pipeline or a git hook on your project level for rejecting any unused, dead, and commented code.</p><div><hr></div><h2>Minimalist code</h2><blockquote><p><em>Measuring programming progress by lines of code is like measuring aircraft building progress by weight.</em></p><p>&#8212; Bill Gates</p></blockquote><p>Coding in a minimalist way is the best pattern you can follow! Simplicity over complexity always wins! &#127942;</p><p>Each time you need to create a new feature or add something to a project, see how you can reduce the amount of code.</p><p>There are so many ways to achieve a solution. And there is always a shorter and cleaner version which should always be the chosen one.</p><p>Think twice before starting to write your code. Ask yourself &#8220;<em>what would be the simplest and most elegant solution I can write</em>&#8220;, so that the written code can be well-maintained over time and very easily understood by other developers who don&#8217;t have the context/acceptance criteria in mind.</p><p>Brainstorm about it. Later, you will save much more time while writing your code.</p><div><hr></div><h2>You Aren&#8217;t Gonna Need It (YAGNI)</h2><p>&#10060; <strong>Don&#8217;t code things &#8220;</strong><em><strong>just in case</strong></em><strong>&#8220; you might need it later</strong>.</p><p>Don&#8217;t spend time and resources on what you might not need.</p><p>&#9989; <strong>You need to solve today&#8217;s problem today, and tomorrow&#8217;s problem tomorrow</strong>.</p><div><hr></div><h2>Reuse your code across your different projects by packing them into small NPM libraries</h2><h3>&#10060; Wrong approach</h3><p>My project is small (well, it always starts small).<br>I don&#8217;t want to spend time splitting functionalities into separated packages. Later on, somehow, my project grow bigger and bigger indeed. However, since I haven&#8217;t spent time splitting my code into packages at the beginning. Now, I think it will take even longer to refactor my code into reusable packages.<br>In short, I&#8217;m in a trap. My architecture is just not scalable.</p><h3>&#9989; Right approach</h3><p>Always think about reusibility. No matter how small or big is your project.</p><p>Splitting your code into small reusable external packages will always speed you up in the long run. For instance, there will be times where you will need a very similar functionality to be used in another project for another client&#8217;s application.</p><p>Whether you are building a new project from scratch or implementing new features into it, always think about splitting your code early into small reusable internal NPM packages, so other potential products will be able to benefit from them and won&#8217;t have to reinvent the wheel.<br>Moreover, your code will gain in consistency thanks to reusing the same packages.</p><p>Finally, if there is an improvement or bug fix needed, you will have to change only one single place (the package) and not every impacted project.</p><p>Icing on the cake, you can make public some of your packages by open source them on GitHub and other online code repositories to get some free marketing coverage and potentially some good users of your library and contributors as well &#128170;</p><div><hr></div><h2>&#127937; Tests come first. Never last</h2><p><strong>Never wait until the last moment to add some unit tests of the recent changes you have added</strong>.</p><p>Too many developers underestimate their tests during the development stage.</p><p>Don&#8217;t create a pull request without unit tests. The other developers reviewing your PR are not only reviewing your changes but also your tests.</p><p>Moreover, without unit tests, you have no idea if you introduce a new bug. Your new changes may not work as expected. <br>Lastly, there will be chances you won&#8217;t get time or rush up writing your tests if you push them for later.</p><h3>&#10060; Stop doing</h3><p>Stop neglecting the importance of unit tests. Tests are there to help you developing faster in the long run.</p><h3>&#9989; Start doing</h3><p>Create your tests even before changing your code. Create or update the current tests to expect the new behavior you will introduce in the codebase. Your test will then fail. Then, update the <code>src</code> of the project with the desired changes.<br>Finally, run your unit tests. If the changes are correct and your tests are correctly written, your test should now pass &#128077; Well done! You are now following the TDD development approach &#128170;</p><p>Remember, unit tests are there to save your day &#127881;</p><div><hr></div><h2>Import only what you need</h2><p>Have the good practice of importing only the functions/variables you need. This will prevent against function/variable conflicts, but also optimizing your code/improving readability by only expose the needed functions.</p><h3>&#10060; Importing everything</h3><pre><code><code>import _ from 'lodash';

// &#8230;

if (_.isEmpty(something)) {
  _.upperFirst(something);
}
</code></code></pre><h3>&#9989; Import only the needed ones</h3><pre><code><code>import { isEmpty as _isEmpty, upperFirst as _upperFirst } from 'lodash';

// &#8230;

if (_isEmpty(something)) {
  _upperFirst(something);
}
</code></code></pre><div><hr></div><h2>Filtering empty values from arrays the clean way</h2><h3>&#10060; Less readable way to filter out null/undefined values</h3><pre><code><code>names.filter((value) =&gt; value !== null &amp;&amp; value !== undefined &amp;&amp; value !== '');

// Note: Loose equality (!=) removes null and undefined, but keeps empty strings
</code></code></pre><h3>&#9989; Clean way to filter out null and undefined values</h3><pre><code><code>names.filter(Boolean); // Gives only the defined names. Removes ALL falsy values
</code></code></pre><div><hr></div><h2>Refactoring conditions into clear functions</h2><h3>&#10060; Non-readable condition</h3><pre><code><code>const { active, feature, setting } = qrCodeData;

if (active &amp;&amp; feature === 'visitor' &amp;&amp; setting.name.length &gt; 0) {
  // &#8230;
}
</code></code></pre><p>The condition isn&#8217;t easy to read, long, not reusable, and would very likely need to be documented as well (making the whole coding experience tedious).</p><h3>&#9989; Clear boolean function</h3><pre><code><code>const canQrCode = ({ active, feature, setting }, featureName) =&gt; {
  return active &amp;&amp; feature === 'visitor' &amp;&amp; setting.name.length &gt; 0;
};

// &#8230;

if (canQrCode(qrCodeData, 'visitor')) {
  // &#8230;
}
</code></code></pre><p>Here, the code doesn&#8217;t need to be commented. The boolean conditional function name says exactly what it does, producing a readable and clean code &#128640;</p><p>&#127856; Cherry on the cake, the code is scalable. Indeed, the function <code>canQrCode</code> can be placed in a service or helper, increasing the reusability and decreasing the chance of duplicating code.</p><div><hr></div><h2>Readable Name: Variables</h2><p>Mentioning clear good and explicit names for your variables is critical to prevent confusion. Sometimes, we spend more time understanding what a variable is supposed to contain rather than achieving the given task.</p><h3>&#10060; Bad Variable Name</h3><pre><code><code>// `nbPages` naming doesn&#8217;t mean much &#10060;
const nbPages = postService.getAllItems();

let res = '';
for (let i = 1; i &lt;= nbPages; i++) {
  res += '&lt;a href="?page=' + i + '"&gt;' + i + '&lt;/a&gt;';
  }
}
</code></code></pre><p>Giving <code>i</code> for the name of the increment variable is a terrible idea. Although, this is the standard for showing examples with the <code>for</code> loop, you should never do the same with your production application (sadly, plenty of developers just repeat what they&#8217;ve learned. Of course, we can&#8217;t blame them, but it&#8217;s now time to change!).</p><p>Every time you declare a new variable, look at the best and short words you can use to describe what it stores.</p><h3>&#9989; Good example, with a clear variable name</h3><pre><code><code>// `totalItems` is a much better name &#9989;
const totalItems = postService.getAllItems();
// &#8230;

let htmlPaginationLink = '';
for (let currentPage = 1; currentPage &lt;= totalItems; currentPage++) {
  htmlPaginationLink +=
    '&lt;a href="?page=' + currentPage + '"&gt;' + currentPage + '&lt;/a&gt;';
}
</code></code></pre><div><hr></div><h2>Readable Name: Functions</h2><h3>&#10060; Complicated (vague/unclear) function name</h3><pre><code><code>function cleaning(url) {
  const specialCharacters = /[^A-Za-z0-9]/g;
  // &#8230;
  return url.replace(specialCharacters, '');
}
</code></code></pre><h3>&#9989; Explicit descriptive name</h3><pre><code><code>function removeSpecialCharactersInUrl(url) {
  const specialCharacters = /[^A-Za-z0-9]/g;
  // &#8230;
  return url.replace(specialCharacters, '');
}
</code></code></pre><p>Function names are like subheadings in an article - they simply tell you what the function does.</p><p>Also, each word of a function name should be capitalized except the first letter of the function. This is known as <strong>lowerCamelCase</strong>, like <code>isNameValid()</code>.</p><div><hr></div><h2>Readable Name: Classes</h2><h3>&#10060; Generic/Vague name</h3><pre><code><code>class Helper { // 'Helper' doesn't mean anything

  stripUrl(url) {
    // ...
    return url.replace('&amp;amp;', '');
  }

  // ...
}
</code></code></pre><p>The class name is vague and doesn&#8217;t clearly communicate what it does. By reading the name, we don&#8217;t have a clear idea of what <code>Helper</code> contains and how to use it.</p><h3>&#9989; Clear/Explicit name</h3><pre><code><code>class Sanitizer { // &lt;- Name is already more explicit

  constructor(value) {
    this.value = value;
  }

  url() {
    this.value.replace('&amp;amp;', '');
    // ...
  }
}
</code></code></pre><p>In this case, the class name clearly says what it does. It&#8217;s the opposite of a black box. By saying what it does, it should also follow the single responsibility principle of achieving only one single purpose.<br>Class names should be a (singular) noun that starts with a capital letter. The class can also contain more than one noun. If so, each word has to be capitalized (this is called <strong>UpperCamel</strong> case).</p><div><hr></div><h2>Fail Fast principle</h2><p>When applying the <strong>fail-fast</strong> principle in your code, you will <code>throw</code> an error or <code>trigger</code>an <code>exception</code> as soon as something goes wrong, rather than trying to proceed in an unstable state. In addition, when a function instruction <a href="https://en.wikipedia.org/wiki/Fail-fast_system">fails early</a>, you will let the other layers/tiers of your application&#8217;s architecture know about an error that needs to be treated first before proceeding to the higher-level components of your software.</p><div><hr></div><h2>Guard Clauses approach</h2><p>Derived from the fail-fast principle seen earlier, the guard clauses technique is the way of leaving a function earlier by removing the redundant <code>else {}</code> blocks after a <code>return</code> statement.</p><p>Let&#8217;s see a snippet that doesn&#8217;t follow the guard clause pattern and a clean and readable example that does.</p><p>The two samples represent the body of a function. Inside the function, we have the following &#128071;</p><h3>&#10060; The &#8220;not-readable&#8221; way</h3><pre><code><code>if (payment.bonus) {
  // &#8230; some logics
  if (payment.bonus.voucher) {
    return true; // eligible to a discount
  } else if (payment.confirmed) {
    if (payment.bonus.referral === 'friend') {
      return true;
    } else {
      return false;
    }
  }
  return false;
}
</code></code></pre><h3>&#9989; Clean readable way</h3><pre><code><code>if (!payment.bonus) {
  return false;
}

if (payment.bonus.voucher) {
  return true;
}

if (payment.bonus.referral === 'friend') {
  return true;
}

return false;
</code></code></pre><p>On this example, we can notice how we could remove the complicated nested conditionals thanks to exiting the function as early as possible with the <code>return</code>statement.</p><div><hr></div><h2>.gitignore and .gitattributes to every project</h2><p>When you are about to distribute your library, you should always create a <code>.gitignore</code>and <code>.gitattributes</code> in your project to prevent undesirable files to be presented in there.</p><h3>&#9989; <code>.gitignore</code></h3><p>As soon as you commit files, your project needs a <code>.gitignore</code> file. It guarantees to exclude specific files from being committed in your codebase.</p><h3>&#9989; <code>.gitattributes</code></h3><p>When you publish your package to be used by a dependency manager, it&#8217;s crucial to exclude the developing files (such as the <code>tests</code> folders, <code>.github</code> configuration folder, <code>CONTRIBUTING.md</code>, <code>SECURITY.me</code>, <code>.gitignore</code>, <code>.gitattributes</code> itself, and so on&#8230;).<br>Indeed, when you install a new package through your favorite package manager (npm, yarn, &#8230;), <strong>you only want to download the required source files, that&#8217;s all</strong>without including the test files, pipeline configuration files, etc, not needed for production.</p><div><hr></div><h2>Demeter Law</h2><p>The <strong>Demeter law</strong>, AKA the <strong>principle of least knowledge</strong> states that each unit of code should only have very limited knowledge about other units of code. They should only talk to their close friends, not to their strangers &#128579; It shouldn&#8217;t have any knowledge on the inner details of the objects it manipulates.</p><h3>&#10060; Chaining methods</h3><pre><code><code>object.doA()?.doB()?.doC(); // violated deleter&#8217;s law
</code></code></pre><p>Here, <code>doB</code> and <code>doC</code> might receive side-effects from their sub-chaining functions.</p><h3>&#9989; Non-chaining version</h3><pre><code><code>object.doA();
object.doB();
object.doC();
</code></code></pre><p>Each method doesn&#8217;t rely on each other. They are independent and safe from eventual refactoring.</p><div><hr></div><h2>Debugging efficiently</h2><p>When debugging with arrays or objects, it&#8217;s always a good practice to use <code>console.table()</code></p><h3>&#10060; <code>console.log(array)</code></h3><p><code>console.log</code> makes the result harder to read. You should always aim for the most efficient option.</p><pre><code><code>const favoriteFruits = ['apple', 'bananas', 'pears'];
console.log(favoriteFruits);
</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7AuK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7AuK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp 424w, https://substackcdn.com/image/fetch/$s_!7AuK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp 848w, https://substackcdn.com/image/fetch/$s_!7AuK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp 1272w, https://substackcdn.com/image/fetch/$s_!7AuK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7AuK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp" width="800" height="315" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:315,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Debugging with simple console.log&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Debugging with simple console.log" title="Debugging with simple console.log" srcset="https://substackcdn.com/image/fetch/$s_!7AuK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp 424w, https://substackcdn.com/image/fetch/$s_!7AuK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp 848w, https://substackcdn.com/image/fetch/$s_!7AuK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp 1272w, https://substackcdn.com/image/fetch/$s_!7AuK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db2cd79-7ba7-4e21-b929-ac05a2ece60d_800x315.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#9989; <code>console.table(array)</code></h3><p>Using <code>console.table</code> saves you time as the result is shown in a clear table, improving readability of the log when debugging an array or object.</p><p>Mozilla gives us a clear example to see how <code>console.table</code> can help you.</p><pre><code><code>const favoriteFruits = ['apple', 'bananas', 'pears'];
console.table(favoriteFruits);
</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EfDw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EfDw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp 424w, https://substackcdn.com/image/fetch/$s_!EfDw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp 848w, https://substackcdn.com/image/fetch/$s_!EfDw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp 1272w, https://substackcdn.com/image/fetch/$s_!EfDw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EfDw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp" width="800" height="534" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11f418a5-d857-44a9-8311-897126f44784_800x534.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:534,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;With console.table&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="With console.table" title="With console.table" srcset="https://substackcdn.com/image/fetch/$s_!EfDw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp 424w, https://substackcdn.com/image/fetch/$s_!EfDw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp 848w, https://substackcdn.com/image/fetch/$s_!EfDw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp 1272w, https://substackcdn.com/image/fetch/$s_!EfDw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11f418a5-d857-44a9-8311-897126f44784_800x534.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Fewer arguments is more efficient</h2><p>If your functions have more than 3 arguments, it means you could have written a much better and cleaner code. In short, the purpose of your function does too much and violates the single responsibility principle, leading to debugging and reusability hells.</p><p>In short, the fewer arguments your function has, the more efficient it will become as you will prevent complexity in your code.</p><h3>&#10060; Unclean code</h3><pre><code><code>function readItem(
  id: number,
  userModel: UserModel,
  siteInfoModel: SiteModel,
  security: SecurityCheck
) {}
</code></code></pre><h3>&#9989; Clean code</h3><pre><code><code>user = new User(id);
// &#8230;
function readItem(user: User) {}
</code></code></pre><p>With this version, because it has only relevant arguments, reusing the function elsewhere will be possible as the function doesn&#8217;t rely or depend on unnecessary arguments/objects.</p><div><hr></div><h2>Stub/mock only what you need</h2><p>When you stub an object in your tests (with Sinon for instance), it&#8217;s a good and clean practice to decide only what functions you need to stub out, instead of stubbing out the entier object. Doing so, you also prevent overriding internal implementations of functions which cause all sorts of inconsistencies in your business logic.</p><h3>&#10060; Everything is stubbed</h3><pre><code><code>sinon.stub(myObject);
</code></code></pre><h3>&#9989; Only the function you need is stubbed</h3><pre><code><code>sinon.stub(myObject, 'myNeededFunction');
</code></code></pre><p>Here, we only stub out the individual function we need.</p><div><hr></div><h2>Remove the redundant things</h2><p>When we code, we often tend to write &#8220;unnecessary&#8221; things, which don&#8217;t increase the readability of the code either.</p><p>For instance, in a switch-statement, having a <code>default</code> clause that isn&#8217;t used.</p><h3>&#10060; Redundant version</h3><pre><code><code>const PRINT_ACTION = 'print';
const RETURN_ACTION = 'return';
const EVENT_ACTION = 'event';
// &#8230;
switch (action) {
  case PRINT_ACTION:
    console.log(message);
    break;

  case RETURN_ACTION:
    return message;
    break; // &#10060; Redundant as we already exit the `switch` with `return`

  case EVENT_ACTION:
    throw new NotImplemented("Not implemented yet");
    break; // &#10060; Redundant as the code won't be reached after error is thrown

  default: // &#10060; This clause is redundant as no default instruction was used
    break;
}
</code></code></pre><h3>&#9989; Neat version</h3><pre><code><code>const PRINT_ACTION = 'print';
const RETURN_ACTION = 'return';
// &#8230;
switch (action) {
  case PRINT_ACTION:
    console.log(message);
    break;
  case RETURN_ACTION:
    return message;

  default:
    throw new Error(`Invalid ${action}`);
}
</code></code></pre><p>Here, we keep the <code>default</code> clause, but we take benefit of it by throwing an exception.</p><div id="youtube2-6jwFHk5EN2Y" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;6jwFHk5EN2Y&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/6jwFHk5EN2Y?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2>Ego is your enemy &#9995;</h2><p>Too often I see developers taking the comments on their pull requests personally because they see what they have done as their own creation. When you receive a change request, don&#8217;t feel judged! This is actually an improvement reward for yourself &#127942;</p><p>If you want to be a good developer, leave your ego in your closet. Never bring it to work. This will just slow your progression down and could even pollute your brain space and the company culture.</p><h3>&#10060; Taking what others say as personally</h3><p></p><h3>&#9989; See every feedback as a learning experience</h3><blockquote><p>When you write code, it&#8217;s not your code, it&#8217;s everybody&#8217;s else code. Don&#8217;t take what you write personally. It&#8217;s just a little part of the whole vessel.</p></blockquote><div><hr></div><h2>Don&#8217;t use abbreviations &#128528;</h2><p>Abbreviations are hard to understand. For new joiners who aren&#8217;t familiar with the company&#8217;s terms. And even with common English abbreviations, they can be quite difficult to be understood by non-native English speakers who might be hired in the future or when outsourcing developers from overseas.</p><p>Having as a golden rule to never use abbreviations in your codebase (so at least, you&#8217;ll never have to take any further decisions on this topic) is critical for preventing confusion later on.</p><h3>&#10060; Difficult to read. Hard to remember over time</h3><pre><code><code>if (type === Type.PPL_CTRL) {
  // We are on People Controller
  // Logic comes here
}

if (type === Type.PPL_ACT) {
  // We are on People Action
  // &#8230;
}

if (type === Type.MSG_DMN_EVT) {
  // We are on Messaging Domain Event
  // &#8230;
}

// ...

const IndexFn = () =&gt; {
  // index function
}
</code></code></pre><h3>&#9989; Clear names (without comments needed &#128076;)</h3><pre><code><code>if (type === Type.PEOPLE_CONTROLLER) {
  // Logic comes here
}

if (type === Type.PEOPLE_ACTION) {
  // Logic here
}

if (type === Type.MESSAGING_DOMAIN) {
  // Logic here
}

// ...

const index = () =&gt; {
  // No need to have `Fn` or &#715;Function` as suffix in the name
  // Having &#715;function` or &#715;method` for an actual function is redundant and generally bad practice
  // ...
}
</code></code></pre><div><hr></div><h2>&#127482;&#127480; American English spelling: The default choice when coding</h2><p>I always recommend using only <strong>US English</strong> in your code. If you mix both British and American spellings, it will introduce some sort of confusion later and might lead to complications for new developers joining the development of your software.</p><p>Most of the 3rd-party libraries and JavaScript&#8217;s reserved words are written in American English. As we use them in our codebase, we should prioritize US English as well in our code. <br>I&#8217;ve seen codebases with words such as &#8220;<em>licence</em>&#8220; and &#8220;<em>license</em>&#8220;, &#8220;<em>colour</em>&#8220; and &#8220;<em>color</em>&#8220;, or &#8220;<em>organisation</em>&#8220; and &#8220;<em>organization</em>&#8220;.<br>When you need to search for terms / refactor some code, and you find both spellings, it requires more time and consumes further brain space, which could have been avoided in the first place by following consistent spellings.</p><p>Finally, I&#8217;ve noticed that it&#8217;s easier to misspell words with the British spelling like typing <code>colur</code> instead of <code>colour</code>.</p><div><hr></div><h2>Destructuring array elements. Make it readable</h2><p>When you need to destructure an array with JavaScript (ES6 and newer), and you want to pick up only a specific element, there is a much cleaner way than using <code>,</code> to skip the previous indices.</p><h3>&#10060; Bad Way</h3><pre><code><code>const meals = [
  'Breakfast',
  'Lunch',
  'Ap&#233;ro',
  'Dinner'
];

const [, , , favoriteMeal] = meals;
console.log(favoriteMeal); // Dinner</code></code></pre><h3>&#9989; Recommended readable way</h3><pre><code><code>const meals = [
  'Breakfast', // index 0
  'Lunch',     // index 1
  'Ap&#233;ro',     // index 2
  'Dinner'     // index 3
];

const { 3: favoriteMeal } = meals; // Get the 4th element, at index 3
console.log(favoriteMeal); // Dinner</code></code></pre><p>Here, we destructure the array as an object using its index number and give an alias name <code>favoriteMeal</code> to it.</p><div><hr></div><h2>Readable numbers</h2><p>With JavaScript, you can use <strong>numeric separators</strong> and <strong>exponential notations</strong> to make numbers easier to read. The execution of the code remains exactly the same, but it&#8217;s definitely easier to read.</p><h3>&#10060; Without numeric separators</h3><pre><code><code>const largeNumbers = 1000000000;
</code></code></pre><h3>&#9989; Clear/readable numbers</h3><pre><code><code>const largeNumbers = 1_000_000_000;
</code></code></pre><p><em>Note: numeric separators works also with other languages than JavaScript such as Python, Kotlin, &#8230;</em></p><div><hr></div><h2>Avoid &#8220;else-statement&#8221;</h2><p>Similar to what I mentioned concerning the importance of writing portions of code that only do &#8220;<strong>One Thing</strong>&#8221;, you should also avoid using the <em>if-else statement</em>.</p><p>Too many times, we see code such as below with unnecessary and pointless <code>else</code>blocks.</p><h3>&#10060; Conditions with unnecessary <code>else {}</code></h3><pre><code><code>const getUrl = () =&gt; {
  if (options.includes('url')) {
    return options.url;
  } else {
    return DEFAULT_URL;
  }
}
</code></code></pre><p>This code could easily be replaced by a clearer version.</p><h3>&#9989; Option 1. Use default values</h3><pre><code><code>const getUrl = () =&gt; {
  let url = DEFAULT_URL;

  if (options.includes('url')) {
    url = options.url;
  }
  return url;
}
</code></code></pre><p>By having a default value declared in an upper variable, we remove the need of a <code>else {}</code> block.</p><h3>&#9989; Option 2. Use Guard Clauses approach</h3><pre><code><code>const getUrl = () =&gt; {
  if (options.includes('url')) {
    return options.url; // if true, we return `options.url` and leave the function
  }
  return DEFAULT_URL;
}
</code></code></pre><p>With this approach, we leave the function early, preventing complicated and unreadable nested conditions in the future.</p><div><hr></div><h2>Prioritize <code>async/await</code> over Promises</h2><h3>&#10060; With promises</h3><pre><code><code>const isProfileNameAllowed = (id) =&gt; {
  return profileModel.get(id).then((profile) =&gt; {
    return Ban.name(profile.name);
  }).then((ban) =&gt; ({
    return ban.value
  }).catch((err) =&gt; {
    logger.error({ message: err.message });
  });
}
</code></code></pre><p>Promises make your code harder to read and tend to increase code <a href="https://en.wikipedia.org/wiki/Cyclomatic_complexity">cyclomatic complexity</a>.</p><h3>&#9989; With <code>async</code>/<code>await</code></h3><pre><code><code>const isProfileNameAllowed = async (id) =&gt; {
  try {
    const profile await profileModel.get(id);
    const {value: result } = await Ban.name(profile.name);
    return result;
  } catch (err) {
    logger.error({ message: err.message });
  }
}
</code></code></pre><p>By using <code>async</code>/<code>await</code>, you avoid callback hell, which happens with promises chaining when data are passed through a set of functions and leads to unmanageable code due to its nested fallbacks.</p><div><hr></div><h2>No magic numbers &#128290;</h2><p>Avoid as much as you can to hardcode changeable values which could change over time, such as the number of total posts to display, timeout delay, and other similar information.</p><h3>&#10060; Code containing magic numbers</h3><pre><code><code>setTimeout(() =&gt; {
  window, (location.href = '/');
}, 3000);
</code></code></pre><pre><code><code>getLatestBlogPost(0, 20);
</code></code></pre><h3>&#9989; No hardcoded numbers</h3><pre><code><code>setTimeout(() =&gt; {
  window, (location.href = '/');
}, config.REFRESH_DELAY_IN_MS);
</code></code></pre><pre><code><code>const POSTS_PER_PAGE = 20;

getLatestBlogPost(0, POSTS_PER_PAGE);
</code></code></pre><div><hr></div><h2>No magic strings &#129526;</h2><p>Similarly to <a href="https://dev.tono-magic-numbers-/">magic numbers</a>, &#8220;<strong>magic strings</strong>&#8221; are hardcoded strings that make the codebase harder to understand, more prone to typos, less flexible when the strings need to be changed, create duplication, and harder to maintain in general.</p><h3>&#10060; Code containing magic strings</h3><pre><code><code>const getProviderName = () =&gt; {
  switch (this.selectedProvider) {
    case 'openai':
      return 'OpenAI';
    case 'gemini':
    default:
      return 'Gemini';
  }
}
</code></code></pre><h3>&#9989; No hardcoded strings</h3><pre><code><code>const getProviderName = () =&gt; PROVIDER_NAMES[this.selectedProvider]
    ?? PROVIDER_NAMES[AI_PROVIDERS.GEMINI];
</code></code></pre><p>Another common example is storing end-user application messages in constants. This allows you to change the value of each constant key without digging into the application and changing string messages one by one.</p><div><hr></div><h2>Always use <code>assert.strictEqual</code></h2><p>With your test assertion library (e.g. chai), always consider using the strict equal assertion method.</p><h3>&#10060; Don&#8217;t just use <code>assert.equal</code></h3><pre><code><code>assert.equal('+63464632781', phoneNumber);
assert.equal(validNumber, true);
</code></code></pre><h3>&#9989; Use appropriate strict functions from your assertion library</h3><pre><code><code>assert.strictEqual('+63464632781', phoneNumber);
assert.isTrue(validNumber);
</code></code></pre><div><hr></div><h2>Updating an object - The right way</h2><h3>&#10060; Avoid <code>Object.assign</code> as it&#8217;s verbose and longer to read</h3><pre><code><code>const user = Object.assign(data, {
  name: 'foo',
  email: 'foo@bar.co',
  company: 'foo bar inc',
});
</code></code></pre><h3>&#9989; Use destructing assignment, spread syntax</h3><pre><code><code>const user = {
  ...data,
  name: 'foo',
  email: 'foo@bar.co',
  company: 'foo bar inc',
};
</code></code></pre><div><hr></div><h2>Stop using <code>Date()</code> when doing benchmarks</h2><p>JavaScript is offering a much nicer alternative when you need to measure the performance of a page during a benchmark.</p><h3>&#10060; Stop doing</h3><pre><code><code>const start = new Date();
// your code ...
const end = new Date();

const executionTime = start.getTime() - end.getTime();
</code></code></pre><h3>&#9989; With <code>performance.now()</code></h3><pre><code><code>const start = performance.now();
// your code ...
const end = performade.now();

const executionTime = start - end;
</code></code></pre><div><hr></div><h2>Lock down your object &#128272;</h2><p>It&#8217;s always a good idea to const lock the properties when creating an object. That way, the values of your properties object will only be read-only.</p><h3>&#10060; Without locking an object</h3><pre><code><code>const canBeChanged = { name: 'Pierre' }:

canBeChanged.name = 'Henry'; // `name` is now "Henry"
</code></code></pre><h3>&#9989; With <code>as const</code> to lock an object</h3><pre><code><code>const cannotBeChanged = { name: 'Pierre' } as const;

cannotBeChanged = 'Henry'; // Won't be possible. JS will throw an error as `name` is now readonly
</code></code></pre><div><hr></div><h2>Consider aliases when destructing an object</h2><h3>&#10060; Without aliases</h3><pre><code><code>const { data } = getUser(profileId);
const profileName = data.name;
// ...
</code></code></pre><h3>&#9989; With clear alias name</h3><pre><code><code>const { data: profile } = getUser(profileId);
// then, use `profile` as the new var name &#128578;
const profileName = profile.name;
// ...
</code></code></pre><div><hr></div><h2>Always use the strict type comparison</h2><p>When doing some kind of comparison, always use the <code>===</code> strict comparison.</p><h3>&#10060; Don&#8217;t use loose comparisons</h3><pre><code><code>if ('abc' == true) {
} // this gives true &#10060;

if (props.address != details.address) {
} // result might not be what you expect
</code></code></pre><h3>&#9989; Use strict comparisons</h3><pre><code><code>if ('abc' === true) {
} // This is false &#9989;

if (props.address !== details.address) {
} // Correct expectation
</code></code></pre><div><hr></div><h2>Avoid using default exports as much as you can</h2><p>The main reason you should avoid using <code>export default</code> is that it makes refactoring more complex when you need to rename a class or component.<br>You will have to update every name of your imports to match the new name of the default-exported class, function, or component.</p><p>In large-scale projects, this not only takes more time, but also increases the risk of forgetting to rename an import (or introducing a typo).</p><p>Using <strong>named exports</strong> instead allows your IDE&#8217;s IntelliSense to detect and auto-import correctly during refactoring, which doesn&#8217;t happen as easily with a renamed default export.</p><p>At the end of the day, however, being consistent within your project and team regarding coding style and conventions is also an important factor to consider.</p><div><hr></div><h2>Always write pure functions</h2><blockquote><p><em>If a tree falls in the woods, does it make a sound?<br>If a pure function mutates some local data in order to produce an immutable return value, is this okay?</em></p><p>&#8212; Rich Hickey. Creator of the <a href="https://en.wikipedia.org/wiki/Clojure">Clojure</a></p></blockquote><p>Given a specific input (argument) to a function, a pure function always returns the same output as the pure function doesn&#8217;t modify their input values.</p><p>A pure function will never produce side effects, meaning that it doesn&#8217;t change any external states from another function. The pure function only depends on its input arguments and on the function&#8217;s scope itself. With them, you can focus your attention in only one place, which makes a huge difference when reading and debugging your code.</p><pre><code><code>// A pure function
function addition(x, y) {
    return x + y;
}
</code></code></pre><p>A trickier scenario can occur when you are passing an object.<br>Imagine you are passing a &#8220;user&#8221; object to another function. If you modify the object &#8220;user&#8221; in the function, it will modify the actual user object because the object passed in as a parameter is actually a reference of the object, which is the opposite of a distinct new cloned object.</p><p>To prevent this downside, you will have to deep-clone the object first (you can use the Lodash <em>cloneDeep</em> function) and then <code>Object.freeze(copyUser)</code> when returning it. This will guarantee the &#8220;copyUser&#8221; to be immutabled.</p><p><strong>For instance:</strong></p><pre><code><code>import { cloneDeep as _cloneDeep } from 'lodash';

function changeUser(user) {
  // copyUser = { &#8230;user };
  const copyUser = _cloneDeep(user);
  copyUser.name = 'Edward Ford';

  return Object.freeze(copyUser);
}
</code></code></pre><p>Here, by writing pure functions, you will make the code maintainable and easy to understand. You only need to focus your attention on the function itself without having to look at the surrounding environments, states, and properties outside the function&#8217;s scope, preventing you from spending hours debugging.</p><div><hr></div><h2>Don&#8217;t overcomplicate things</h2><p>Sometimes, it&#8217;s tempting to make our code prettier for no reason. Keep it simple unless it affects the readability or scalability of our code.</p><p>For instance, let&#8217;s imagine a function that generates lorem ipsum text for us. Currently, we have one option to be formatted as markdown.</p><pre><code><code>const generateText = (options = {}) =&gt; {
  // ...
};

// Generate some lorem ipsum sentences
generateText();
</code></code></pre><p>We could be tempted to destructure the <code>options</code> variable like below:</p><pre><code><code>const generateText = ({ markdownFormat = false } = {}) =&gt; {
  // ...
};
</code></code></pre><p>However, you can already notice that our function&#8217;s signature has gotten bigger. Similar to the above function, to keep the function&#8217;s arguments optional in JavaScript, we need to assign our destructured object with a default empty object as <code>= {}</code> to ensure that the destructuring doesn&#8217;t fail if no argument is passed to the function. Then, we need to initialize the <code>markdownFormat</code> property with a default value (e.g. <code>false</code>). All of this noise adds complexity to our code. Later on, let&#8217;s imagine we need to support other output formats such as AsciiDoc and reStructuredText.</p><p>Our function becomes the following:</p><pre><code><code>const generateText = ({
  markdownFormat = false,
  reStructuredTextFormat = false,
  asciiDocFormat = false
} = {}) =&gt; {
  // ...
};
</code></code></pre><p>Instead, keeping the first function&#8217;s signature, <code>const generateText = (options = {}) =&gt; { /* ... */ }</code>, where it handles the options inside the function body, is a wiser choice as it provides more flexibility and scalability when we need to add additional output formats:</p><pre><code><code>const generateText = (options = {}) =&gt; {
  if (options.markdownFormat) {
    // ...
    const output = loremIpsum.toMarkdown();
    return output;
  }

  if (options.reStructuredTextFormat) {
    // ...
    const output = loremIpsum.toReST();
    return output;
  }

  if (options.asciiDocFormat) {
    // ...
    const output = loremIpsum.toAsciiDoc();
    return output;
  }

  // ...
};
</code></code></pre><div><hr></div><h2>Use the TODO and FIXME prefix in your comments (when really need to comment)</h2><p>If you have to come back and change something later, you might need to comment in your code, but then you must use the TODO or FIXME prefix, so that your code will be highlighted in the majority of IDEs.</p><p>Finally, I would also suggest you the VS Code extension <a href="https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree">TODO Tree</a> that cretes a nice todo list.</p><p>&#9989; Example &#128071;</p><pre><code><code>// TODO &lt;JIRA-TICKET-ID&gt; Change the logic to reflect to the release of productB
function somethingMeaningful() {}
</code></code></pre><div><hr></div><h2>Linters and Formatters</h2><p>Indentation is also very important. Having consistent code that follows the same coding conventions across your products will help to ship clean and readable code.</p><p>For doing so, it&#8217;s crucial to use ESLint and Prettier on your code editor (e.g., VS Code) as well as set up some git hooks (on pre-commit or pre-push hook) which will run ESLint as a pre-check for when you git commit/push your code.</p><p>Finally, you can very easily set up a GitHub workflow action for your project.</p><div><hr></div><h2>Conclusion</h2><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ec279bb3-e143-4eb7-92a7-3ab314cae477&quot;,&quot;duration&quot;:null}"></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Writing clean and readable code that scales is crucial for tomorrow&#8217;s development and maintenance. When we write code for a job, it is not our code; it is everybody else&#8217;s code. Writing code that does not require unnecessary cognitive effort helps prevent misunderstandings and errors that could have been easily avoided by making the code easy to understand, where it clearly shows what it does right away.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Software Engineering in 2030: The Skills You Must Build Today]]></title><description><![CDATA[Watch now | How to stay relevant by providing values that AI cannot replace]]></description><link>https://www.pierrehenry.dev/p/software-engineering-in-2030-the</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/software-engineering-in-2030-the</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Sat, 13 Jun 2026 11:16:51 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/179013422/286604381a950998c8406dd79031906b.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p><strong>A clear look at how the software engineer role will evolve by 2030 and the skills that will matter most.</strong> You&#8217;ll see where real value comes from in an AI-driven world and how to prepare for it now, not when it&#8217;s too late.</p><p>The engineers who thrive in the next five years won&#8217;t be the ones clinging to old playbooks. They are the ones who understand how to work alongside AI, architect complex systems, and solve problems that require human judgment and creativity. This video breaks down what&#8217;s changing, what&#8217;s staying, and how you can position yourself ahead of the curve.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2kmc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2kmc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2kmc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2kmc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2kmc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2kmc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/baef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2951291,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/179013422?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2kmc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2kmc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2kmc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2kmc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaef009f-5542-432c-a3c5-88253180344b_4032x3024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Software Engineering in 2030.</figcaption></figure></div><div><hr></div><p>I&#8217;ve been building several projects <a href="https://github.com/pH-7">on my GitHub</a> over the years that might interest you. Feel free to check them out for inspiration or jump in with contributions! There are so much more to come <strong><a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a></strong> as well! Don&#8217;t forget to follow and stay tuned! &#128293;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/software-engineering-in-2030-the?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/software-engineering-in-2030-the?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Zero-Downtime Deployment & Canary Release]]></title><description><![CDATA[Mastering zero-downtime deployments with blue-green and canary strategies to ship changes safely, reduce risk, and keep production systems stable while releasing continuously.]]></description><link>https://www.pierrehenry.dev/p/zero-downtime-deployment-and-canary</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/zero-downtime-deployment-and-canary</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Fri, 12 Jun 2026 19:56:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uQTx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s speak about the <strong>Zero-Downtime Deployment</strong>, a crucial concept for modern applications! Zero-downtime deployment ensures to keep everything running smoothly without interrupting the service while releasing new major changes to the server.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><h2>Understanding Zero-Downtime Deployment</h2><p>Zero-downtime deployment means deploying new application versions to production without any service interruption. Users continue using your application normally while updates roll out in the background.</p><p>The core principle is maintaining service availability throughout the entire deployment process. This approach represents the best possible deployment scenario since teams can introduce new features and fix bugs without causing outages.</p><h2>Blue-Green Deployment</h2><p>Blue-Green deployment is one of the most straightforward approaches to zero-downtime deployment. The concept is simple despite its colorful name.</p><h3>How Blue-Green Deployment Works</h3><p>The strategy involves running two identical production environments simultaneously:</p><ul><li><p><strong>Blue Environment</strong>: Currently serves live traffic with the existing version</p></li><li><p><strong>Green Environment</strong>: Receives the new version deployment and testing</p></li></ul><p>The deployment process follows these steps:</p><ol><li><p><strong>Preparation</strong>: Your blue environment serves production traffic</p></li><li><p><strong>Deployment</strong>: Create an identical green environment and deploy the new version</p></li><li><p><strong>Testing</strong>: Run comprehensive smoke tests and sanity checks on the green environment</p></li><li><p><strong>Traffic Switching</strong>: Redirect traffic from blue to green once confident in the new version</p></li><li><p><strong>Monitoring</strong>: Keep both environments running temporarily for quick rollback if needed</p></li><li><p><strong>Cleanup</strong>: Decommission the blue environment after confirming stability</p></li></ol><h3>Traffic Migration Strategies</h3><p>When transitioning from blue to green, you have two primary approaches:</p><p><strong>Immediate Switch</strong>: Redirect all traffic at once to the new environment. This approach is faster but carries higher risk if issues arise.</p><p><strong>Gradual Migration</strong>: Start by routing a small percentage of traffic to the green environment, gradually increasing the load as confidence grows. This method provides better risk mitigation and allows for real-world testing under production conditions.</p><h3>Blue-Green Deployment Checklist</h3><p>For successful blue-green deployments, maintain this checklist:</p><ul><li><p>[ ] Both environments are operational and properly configured</p></li><li><p>[ ] Comprehensive testing completed on the new environment</p></li><li><p>[ ] Traffic routing mechanism is ready and tested</p></li><li><p>[ ] Monitoring and alerting systems are in place</p></li><li><p>[ ] Rollback procedures are documented and tested</p></li><li><p>[ ] Database migrations are compatible with both versions</p></li><li><p>[ ] Load balancer configuration is updated appropriately to adjust the traffic accordingly</p></li></ul><h2>Canary Releases: Risk-Controlled Deployment</h2><p>Canary releases offer a more sophisticated approach to risk management during deployments than blue-green deployment alone.</p><h3>The Canary Release Philosophy</h3><p>Named after canaries used in coal mines to detect dangerous gases, canary releases expose new software versions to a small, controlled subset of users before full deployment. This strategy identifies potential issues early while minimizing the impact of any problems.</p><h3>Implementing Canary Releases</h3><p>The canary release process follows these stages:</p><ol><li><p><strong>Initial Deployment</strong>: Deploy the new version alongside the existing one, but route no user traffic to it</p></li><li><p><strong>Selective Exposure</strong>: Begin routing a small percentage of users to the new version</p></li><li><p><strong>Monitoring and Analysis</strong>: Carefully monitor both business metrics and operational indicators</p></li><li><p><strong>Gradual Expansion</strong>: Progressively increase the user base exposed to the new version</p></li><li><p><strong>Full Rollout</strong>: Migrate all users to the new version once confidence is established</p></li><li><p><strong>Cleanup</strong>: Remove the old version after confirming stability</p></li></ol><h3>User Selection Strategies</h3><p>Choosing which users see the new version is crucial for effective canary releases:</p><p><strong>Random Sampling</strong>: Select users randomly, providing an unbiased sample of your user base.</p><p><strong>Internal Users First</strong>: Deploy to employees and internal stakeholders before external users, allowing for thorough testing in a controlled environment.</p><p><strong>Demographic-Based Selection</strong>: Choose users based on specific characteristics, geographic location, or usage patterns that align with your testing objectives.</p><p><strong>Geographic Rollout</strong>: In distributed systems, deploy to specific regions or data centers before global rollout.</p><h3>Advanced Canary Strategies</h3><p>Large-scale organizations often employ sophisticated canary approaches:</p><p><strong>Multi-Stage Canaries</strong>: Companies like Facebook use multiple canary stages, starting with internal employees who have feature flags enabled to detect issues early.</p><p><strong>Partition-Based Deployment</strong>: Instead of user-based routing, deploy to specific service instances, geographic regions, or business units.</p><p><strong>Capacity Testing</strong>: Use canary releases to validate performance characteristics under real production load without risking the entire user base.</p><h2>Canary Releases vs. A/B Testing</h2><p>While canary releases and A/B testing share similar technical implementations, they serve different purposes:</p><p><strong>Canary Releases</strong> focus on risk mitigation and detecting regressions or operational issues with new software versions.</p><p><strong>A/B Testing</strong> aims to validate hypotheses about user behavior and business metrics using different feature variants.</p><p>Mixing these concerns can interfere with results and create confusion. A/B tests typically require days or weeks to achieve statistical significance, while canary rollouts should complete within hours.</p><h2>Managing Complexity and Challenges</h2><h3>Version Management</h3><p>Both blue-green and canary deployments require managing multiple software versions simultaneously. While this increases operational complexity, the benefits typically outweigh the costs. Best practices include:</p><ul><li><p>Minimizing the number of concurrent versions in production</p></li><li><p>Implementing robust version tracking and monitoring</p></li><li><p>Automating deployment and rollback procedures</p></li><li><p>Maintaining clear documentation for each version</p></li></ul><h3>Database Considerations</h3><p>Database schema changes present unique challenges in zero-downtime deployments. The Parallel Change pattern offers an effective solution:</p><ol><li><p><strong>Expand</strong>: Modify the database to support both old and new application versions</p></li><li><p><strong>Migrate</strong>: Deploy the new application version while maintaining backward compatibility</p></li><li><p><strong>Contract</strong>: Remove support for the old version once migration is complete</p></li></ol><p>This approach ensures database compatibility throughout the deployment process.</p><h3>Client-Side Applications</h3><p>Deploying client-side applications (mobile apps, desktop software) presents additional challenges since update timing is beyond your control. Strategies include:</p><ul><li><p>Using feature flags to control functionality rollout</p></li><li><p>Maintaining backward compatibility for extended periods</p></li><li><p>Implementing graceful degradation for unsupported client versions</p></li><li><p>Monitoring client version distribution to inform deprecation decisions</p></li></ul><h2>Implementation Considerations</h2><h3>Infrastructure Requirements</h3><p>Successful zero-downtime deployments require:</p><p><strong>Load Balancing</strong>: Required for traffic routing between environments. Solutions include cloud-based load balancers, nginx, HAProxy, or service mesh technologies.</p><p><strong>Monitoring and Observability</strong>: Comprehensive monitoring of both business and operational metrics is crucial for detecting issues early.</p><p><strong>Automation</strong>: Manual processes are error-prone and slow. Invest in automation for deployments, testing, and rollbacks.</p><p><strong>Infrastructure as Code</strong>: Ensure environments can be reliably reproduced and configured consistently.</p><h3>Cloud vs. On-Premises</h3><p>Cloud platforms offer managed services that simplify zero-downtime deployments:</p><p><strong>AWS</strong>: Route 53 for DNS routing, Application Load Balancer for traffic distribution, and services like CodeDeploy for automated deployments.</p><p><strong>Other Cloud Providers</strong>: Similar services are available across major cloud platforms.</p><p><strong>On-Premises</strong>: Requires more manual setup but remains achievable with proper tooling and processes.</p><h2>Best Practices and Recommendations</h2><h3>Planning and Preparation</h3><ul><li><p>Design applications with zero-downtime deployment in mind from the beginning</p></li><li><p>Implement comprehensive testing strategies including unit, integration, and end-to-end tests</p></li><li><p>Practice deployment procedures regularly in non-production environments</p></li><li><p>Maintain detailed runbooks for both deployment and rollback procedures</p></li></ul><h3>Monitoring and Metrics</h3><ul><li><p>Define clear success criteria for deployments</p></li><li><p>Monitor both technical metrics (error rates, response times) and business metrics (conversion rates, user engagement)</p></li><li><p>Set up automated alerting for anomalies</p></li><li><p>Establish baseline metrics before deployments for comparison</p></li></ul><h3>Risk Management</h3><ul><li><p>Start with smaller, less critical applications to build expertise</p></li><li><p>Always have a tested rollback plan</p></li><li><p>Communicate deployment schedules with stakeholders</p></li><li><p>Consider the timing of deployments to minimize business impact</p></li></ul><h2>Conclusion</h2><p>Zero-downtime deployment strategies like blue-green deployment and canary releases have become standard practices for modern software delivery. These approaches enable organizations to ship features rapidly while preserving service reliability.</p><p>Blue-green deployment provides a solid foundation with its straightforward approach to maintaining two production environments. Canary releases build upon this concept by adding sophisticated risk management through gradual user exposure and comprehensive monitoring.</p><p>The choice between these strategies&#8212;or a combination of both&#8212;depends on your specific requirements, risk tolerance, and operational capabilities. Regardless of the chosen approach, investing in zero-downtime deployment practices improves user satisfaction, reduces business risk, and increases deployment confidence.</p><p>As software delivery continues to accelerate, mastering these deployment strategies becomes increasingly important for DevOps and FullStack engineers seeking to balance innovation speed with operational stability. Start with solid fundamentals, invest in proper tooling and automation, and more importantly, continuously refine your processes based on real-world experience.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><blockquote><p><em>Hopefully this helps! I wish you a wonderful happy deploying day!</em></p><p><em>You can check out my open-source projects I&#8217;m working on at <strong><a href="https://github.com/pH-7">GitHub.com/pH-7</a></strong></em></p><p><em>&#127937; Follow my Software Engineering Journey on <a href="https://substack.com/@pierrehenry/">PierreHenry.Dev</a></em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uQTx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uQTx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uQTx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uQTx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uQTx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uQTx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg" width="1000" height="420" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:420,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:308915,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/200571209?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uQTx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uQTx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uQTx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uQTx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbedbe92-d650-4732-9be0-dbe68961b158_1000x420.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Developer working while deployments run safely in the background.</em></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/zero-downtime-deployment-and-canary?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/zero-downtime-deployment-and-canary?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[AI-First Engineer Mindset: Know What to Build Before You Build]]></title><description><![CDATA[Watch now | A focused engineer looking at a single clear path while AI tools run in the background.]]></description><link>https://www.pierrehenry.dev/p/ai-first-engineer-mindset-know-what</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/ai-first-engineer-mindset-know-what</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Wed, 10 Jun 2026 11:32:52 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/181970139/69a3cc6ea117da3b167a9fc48833cd39.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>As an AI-first software engineer, the real advantage is not how fast you generate code, but how clearly you decide what matters.</p><p>In this video, I share how I decide what to build, what to ignore, and how AI fits into that decision process without creating noise or wasted effort.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!seJd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!seJd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!seJd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!seJd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!seJd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!seJd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4272630,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/181970139?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!seJd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!seJd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!seJd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!seJd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d405b72-76e1-4ba7-b03b-090bdf5ec6c0_5712x4284.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Stay focused each day. And think as a product-first engineer.</figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><blockquote><p>I&#8217;ve built tons of product-centric projects <a href="https://github.com/pH-7">on my GitHub</a> over the years. <strong>Feel free to check them out for inspiration or contribution</strong>. </p></blockquote><p></p><blockquote><p>I&#8217;ve also got exclusive content coming soon <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a>. Don&#8217;t forget to follow so you won&#8217;t miss out! &#128293;</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[How to Become a Software Engineer Who SOLVES REAL-WORLD Problems]]></title><description><![CDATA[Watch now | Becoming the engineer teams rely on when everything breaks.]]></description><link>https://www.pierrehenry.dev/p/be-the-software-engineer-who-solves</link><guid isPermaLink="false">https://www.pierrehenry.dev/p/be-the-software-engineer-who-solves</guid><dc:creator><![CDATA[🎡 Pierre-Henry™ 🌴]]></dc:creator><pubDate>Fri, 05 Jun 2026 13:32:52 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/179084394/ad49314923ac4c5fa6d67728f9cce3c0.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p><strong>What separates engineers who ship things fast from those who get stuck when problems get messy</strong> often comes down to thinking, habits, and how they approach unclear situations. This video breaks down how to build that way of working so you can handle issues with more calm, consistency, and steady progress even when nothing is fully defined.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/subscribe?"><span>Subscribe now</span></a></p><h3>Key Lessons</h3><h4>1. Slow down before you touch anything</h4><p>Most people rush. Strong problem solvers pause, read the error, inspect the context, and understand what is actually failing. This gives clarity before any action.</p><h4>2. Break the problem into tiny parts</h4><p>Take a messy issue and split it into small checks.</p><p>What works? What does not? Where does the behaviour change?</p><p>This lets you isolate the real cause instead of guessing.</p><h4>3. Always reproduce the issue first</h4><p>If you can trigger the bug on demand, you are already halfway to a fix. Engineers who skip this step stay stuck longer.</p><h4>4. Write down everything you test</h4><p>Keep a short log while debugging. It prevents going in circles, and it helps you reason like an investigator.</p><h4>5. Learn one tool at a time, deeply</h4><p>Debuggers, profilers, logs, CLI tools. Being able to inspect a system properly is more valuable than memorising syntax.</p><h4>6. Stay calm even when things look bad</h4><p>Good engineers do not panic when a system fails. They follow a method. Calm thinking is a competitive edge.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lpUh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lpUh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lpUh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lpUh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lpUh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lpUh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg" width="1456" height="1372" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1372,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2142626,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pierrehenry.dev/i/179084394?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lpUh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lpUh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lpUh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lpUh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bf8603-4dc5-4a66-969f-edb20302148b_4547x4284.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Be the software engineer who solves things.</em></figcaption></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Healthy Scientist: Build Using AI With Healthy Habits &#128293;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><blockquote><p><em>I&#8217;ve been building several projects <a href="https://github.com/pH-7">on my GitHub</a> over the years that might interest you. Feel free to check them out for inspiration or jump in with contributions!</em></p><p><em>There are so much more to come <a href="https://www.linkedin.com/in/ph7enry">on my LinkedIn</a> as well! Don&#8217;t forget to follow and stay tuned! &#128293;</em></p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pierrehenry.dev/p/be-the-software-engineer-who-solves?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pierrehenry.dev/p/be-the-software-engineer-who-solves?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item></channel></rss>