<script data-pm-proxy="intercept"></script><?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[AgileBits by Learn Agile Practices]]></title><description><![CDATA[One practice. Five minutes. Every week.
AgileBits is a micro-learning newsletter on XP, Lean, and engineering discipline — one focused topic per issue, nothing else.]]></description><link>https://learnagilepractices.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!tmzC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c7edca-11c8-4eda-8c1b-f7fc03037193_500x500.png</url><title>AgileBits by Learn Agile Practices</title><link>https://learnagilepractices.substack.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 01 Sep 2026 04:45:31 GMT</lastBuildDate><atom:link href="/__u/learnagilepractices.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Dan the dev]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[learnagilepractices@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[learnagilepractices@substack.com]]></itunes:email><itunes:name><![CDATA[Dan the dev]]></itunes:name></itunes:owner><itunes:author><![CDATA[Dan the dev]]></itunes:author><googleplay:owner><![CDATA[learnagilepractices@substack.com]]></googleplay:owner><googleplay:email><![CDATA[learnagilepractices@substack.com]]></googleplay:email><googleplay:author><![CDATA[Dan the dev]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Restarting on purpose]]></title><description><![CDATA[I have been quiet for a few months. That ends today, and it ends in a different shape than before.]]></description><link>https://learnagilepractices.substack.com/p/restarting-on-purpose</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/restarting-on-purpose</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 25 Aug 2026 06:15:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UNXx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies, amplified by AI!</p><h1>Restarting on purpose</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!UNXx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!UNXx!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!UNXx!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!UNXx!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!UNXx!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!UNXx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f98827b3-9472-4233-96ee-7a496c611148_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1150258,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://learnagilepractices.substack.com/i/212212416?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!UNXx!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!UNXx!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!UNXx!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!UNXx!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff98827b3-9472-4233-96ee-7a496c611148_2240x1260.png 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 aria-hidden="true" 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><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><h2>The handbook stops here</h2><p>The Practical Handbook for Product Developers stops here. Each issue worked like a chapter: one on what building a product means, one on MVPs. Those two are the last of that series. After them, this newsletter changes.</p><p>Content has never been the point for me. I write to force myself to understand something well enough to explain it. That&#8217;s how I study, and for the past year the thing I&#8217;ve been studying is AI: how to use it in real engineering work, not the polished version you see in demos. That question took over my attention, and everything else I was writing about stalled.</p><h2>What&#8217;s next</h2><p>The second half of 2026 opens with that story, on purpose. Twelve months sit behind it: reflections already settled, reflections still forming as I write these issues, experiments that worked, experiments that failed, and a few ideas barely weeks old that might not survive more testing.</p><p>The center of gravity stays where it has always been: XP, Agile, DevOps, the practices that make software sustainable. This isn&#8217;t a 360-degree AI newsletter. I&#8217;ll read every practice through what AI tools and agents do to it: TDD, refactoring, incremental delivery, code review. General-purpose AI tools and techniques will come up when they matter, but I&#8217;ll spend most of that attention on coding agents, because they&#8217;re the tool sitting inside our daily work right now.</p><h2>Same shape, new content</h2><p>This newsletter stays what it has always been: short, one idea at a time, a few minutes to read.</p><p>The blog moves to monthly and goes deeper. The first piece lands around August 28th: &#8220;From Curiosity to Craft: How AI Entered My Professional Workflow.&#8221;</p><p>The podcast comes back this Thursday, August 27th. In that episode, I go further into the pause itself: why it happened, and why now is the right time to restart. It also tries a new format: no more forcing every episode into a 25-minute Pomodoro box. Each reflection gets the time it needs.</p><h2>Why I&#8217;m telling this story</h2><p>Writing is how I think. It&#8217;s sharpened my thinking these past few months more than anything else I&#8217;ve done. And when I share it, other people can push back, add what I&#8217;m missing, or tell me where I&#8217;ve got it wrong. That feedback loop, more than any single insight, is how this field gets better.</p><p>This content works for anyone building software, whatever your experience level. The more you bring, the more nuance you&#8217;ll catch, but the core ideas should land regardless.</p><p>This is a deliberate restart, shaped for a different world. The practices that built technical excellence before still hold, but AI means we have to challenge them, evolve them, and amplify them to keep that excellence alive now.</p><p>If that sounds like a conversation worth following, stick around. The podcast picks it up first, this Thursday.</p><div><hr></div><p><em>Reply to this email if you are curious about anything in this issue &#8212; I will be happy to reply to your questions directly! :) </em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – Building the MVP – MVP Playbook]]></title><description><![CDATA[A complete, practical checklist to build MVPs that are fast today &#8212; and still fast tomorrow.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ea6</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ea6</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 31 Mar 2026 06:15:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!l11p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832?r=1arsz9">&#9193; Section 1 - First steps: Idea, Validation, MVP</a></em></h3><h3>&#9193; Section 2 - <strong>Building the MVP</strong></h3><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019">1&#65039;&#8419;0&#65039;&#8419; Chapter 10 &#8211; Get to Production First</a><em> </em></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;1&#65039;&#8419;</a> <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-9fa">Chapter 11 &#8211; An architecture that can evolve</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-332">1&#65039;&#8419;2&#65039;&#8419; Chapter 12 &#8211; Release in slices</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-62f">1&#65039;&#8419;3&#65039;&#8419; Chapter 13 &#8211; TDD from day one</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-331">1&#65039;&#8419;4&#65039;&#8419; Chapter 14 &#8211; Thin slices for testable software</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-410">1&#65039;&#8419;5&#65039;&#8419; Chapter 15 &#8211; Bring the first users early</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-c53">1&#65039;&#8419;6&#65039;&#8419; Chapter 16 &#8211; Managing Technical Debt from Day One</a></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>7&#65039;&#8419; Chapter 17 &#8211; The MVP Playbook &#8594; You are here!</strong></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!l11p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!l11p!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!l11p!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!l11p!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!l11p!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!l11p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:917425,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/192613341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!l11p!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!l11p!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!l11p!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!l11p!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e605ee-b164-4a2c-b237-34b4a76be4ba_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Why an MVP Needs Method, Not Guesswork</strong></h2><p>Building an MVP is often misunderstood.</p><p>It&#8217;s not about building a smaller product.</p><p>It&#8217;s not about rushing development.</p><p>And it&#8217;s definitely not about cutting corners.</p><p>It&#8217;s about:</p><blockquote><p><strong>Maximizing learning while minimizing time, cost, and risk.</strong></p></blockquote><p>Across the previous chapters, we explored how to:</p><ul><li><p>define the right scope</p></li><li><p>build in thin slices</p></li><li><p>keep architecture evolvable</p></li><li><p>maintain quality under pressure</p></li><li><p>involve real users early</p></li></ul><p>This final chapter brings everything together into a <strong>practical playbook</strong> you can reuse every time you start a new product or feature.</p><div><hr></div><h2><strong>&#129517; The MVP Playbook</strong></h2><p>Here are the core principles &#8212; distilled.</p><div><hr></div><h3><strong>1&#65039;&#8419; Start from the problem, not the solution</strong></h3><p>An MVP is not a product idea.</p><p>It&#8217;s a <strong>problem validation tool</strong>.</p><p>Before building anything, make sure:</p><ul><li><p>the problem is real</p></li><li><p>it&#8217;s painful</p></li><li><p>it happens frequently</p></li><li><p>users actively want a solution</p></li></ul><p>Use:</p><ul><li><p>user interviews</p></li><li><p>manual workflows</p></li><li><p>landing pages</p></li><li><p>surveys</p></li></ul><p>No strong problem &#8594; no meaningful MVP.</p><div><hr></div><h3><strong>2&#65039;&#8419; Define a clear hypothesis</strong></h3><p>Every MVP should be driven by a simple statement:</p><blockquote><p>&#8220;We believe that [user] has [problem], and that [solution] will solve it.&#8221;</p></blockquote><p>This is your decision filter.</p><p>If a feature doesn&#8217;t validate the hypothesis &#8594; it&#8217;s out.</p><div><hr></div><h3><strong>3&#65039;&#8419; Identify and protect the core feature</strong></h3><p>Your MVP has <strong>one job</strong>:</p><p>&#128073; deliver the smallest possible version of the core value</p><p>The core feature is:</p><ul><li><p>the main user action</p></li><li><p>the moment where value is experienced</p></li></ul><p>Everything else is secondary.</p><div><hr></div><h3><strong>4&#65039;&#8419; Cut scope aggressively (not quality)</strong></h3><p>This is one of the most important lessons.</p><p>When under pressure:</p><p>&#10060; Don&#8217;t cut tests</p><p>&#10060; Don&#8217;t cut structure</p><p>&#10060; Don&#8217;t introduce shortcuts</p><p>&#9989; Cut features</p><p>&#9989; Simplify flows</p><p>&#9989; reduce variability</p><blockquote><p><strong>Scope is flexible. Quality is not.</strong></p></blockquote><div><hr></div><h3><strong>5&#65039;&#8419; Work in thin vertical slices</strong></h3><p>Avoid building layers (frontend, backend, infra) separately.</p><p>Instead, build <strong>end-to-end slices</strong>:</p><ul><li><p>minimal UI</p></li><li><p>minimal logic</p></li><li><p>minimal data</p></li><li><p>deployed and usable</p></li></ul><p>If it doesn&#8217;t work in production, it doesn&#8217;t generate learning.</p><div><hr></div><h3><strong>6&#65039;&#8419; Make everything testable</strong></h3><p>Testability is what keeps your MVP maintainable over time.</p><p>Key practices:</p><ul><li><p>automated tests (non-negotiable)</p></li><li><p>small, focused components</p></li><li><p>clear boundaries</p></li></ul><p>Even in an AI-driven future:</p><blockquote><p><strong>Tests are the only way to ensure your system behaves as expected.</strong></p></blockquote><div><hr></div><h3><strong>7&#65039;&#8419; Use TDD to control complexity</strong></h3><p>Test-Driven Development helps you:</p><ul><li><p>avoid overengineering</p></li><li><p>implement only what&#8217;s needed</p></li><li><p>keep design simple</p></li></ul><p>It naturally supports incremental development.</p><div><hr></div><h3><strong>8&#65039;&#8419; Set up CI/CD from day one</strong></h3><p>To stay fast over time:</p><ul><li><p>run tests on every change (CI)</p></li><li><p>keep the system always deployable (CD)</p></li><li><p>release frequently</p></li></ul><p>This gives you:</p><ul><li><p>fast feedback</p></li><li><p>safer changes</p></li><li><p>continuous validation</p></li></ul><div><hr></div><h3><strong>9&#65039;&#8419; Build an architecture that can evolve</strong></h3><p>Start with a <strong>walking skeleton</strong>:</p><ul><li><p>one repo</p></li><li><p>one pipeline</p></li><li><p>one working slice</p></li><li><p>minimal abstractions</p></li></ul><p>Then evolve only when needed:</p><ul><li><p>add a database later</p></li><li><p>split services later</p></li><li><p>scale infrastructure later</p></li></ul><blockquote><p>Architecture should grow with the product &#8212; not before it.</p></blockquote><div><hr></div><h3><strong>&#128287; Keep technical debt intentional</strong></h3><p>Not all debt is bad.</p><p>But you must distinguish:</p><ul><li><p><strong>intentional debt</strong> &#8594; visible, temporary, manageable</p></li><li><p><strong>accidental debt</strong> &#8594; hidden, risky, expensive</p></li></ul><p>Technical debt is not just code:</p><ul><li><p>architecture complexity</p></li><li><p>unclear domain understanding</p></li><li><p>unnecessary features</p></li></ul><p>Your goal is not zero debt.</p><p>&#128073; It&#8217;s <strong>controlled debt</strong>.</p><div><hr></div><h3><strong>1&#65039;&#8419;1&#65039;&#8419; Bring users in early</strong></h3><p>The MVP is useless without real users.</p><p>Involve them through:</p><ul><li><p>alpha programs</p></li><li><p>beta testing</p></li><li><p>user interviews</p></li><li><p>in-app feedback</p></li><li><p>NPS surveys</p></li></ul><p>Focus on:</p><ul><li><p>early adopters</p></li><li><p>champion users</p></li></ul><blockquote><p>Users don&#8217;t just validate your product &#8212; they shape it.</p></blockquote><div><hr></div><h3><strong>1&#65039;&#8419;2&#65039;&#8419; Keep feedback loops short</strong></h3><p>Speed is not about writing code faster.</p><p>It&#8217;s about <strong>learning faster</strong>.</p><p>To do that:</p><ul><li><p>release frequently</p></li><li><p>measure behavior</p></li><li><p>talk to users</p></li><li><p>adapt continuously</p></li></ul><p>Long cycles = slow learning = wasted effort.</p><div><hr></div><h3><strong>1&#65039;&#8419;3&#65039;&#8419; Prefer simplicity over flexibility</strong></h3><p>Early systems don&#8217;t need to be flexible.</p><p>They need to be:</p><ul><li><p>understandable</p></li><li><p>modifiable</p></li><li><p>testable</p></li></ul><p>Avoid:</p><ul><li><p>overengineering</p></li><li><p>premature abstractions</p></li><li><p>unnecessary configuration</p></li></ul><p>You can always add flexibility later.</p><div><hr></div><h3><strong>1&#65039;&#8419;4&#65039;&#8419; Combine product, tech, and user thinking</strong></h3><p>A successful MVP sits at the intersection of:</p><ul><li><p><strong>Product</strong> &#8594; solving the right problem</p></li><li><p><strong>Technology</strong> &#8594; enabling fast and safe changes</p></li><li><p><strong>Users</strong> &#8594; validating real value</p></li></ul><p>Ignoring one of these creates imbalance.</p><div><hr></div><h2><strong>&#9878;&#65039; The Big Trade-off</strong></h2><p>At every step, you&#8217;re balancing:</p><ul><li><p>speed today</p></li><li><p>speed tomorrow</p></li></ul><p>Bad MVPs optimize only for today.</p><p>Good MVPs optimize for both.</p><p>And the key principle is always the same:</p><blockquote><p><strong>Reduce scope to go fast &#8212; never reduce quality.</strong></p></blockquote><div><hr></div><h2><strong>&#128640; How to Use This Playbook</strong></h2><p>Before starting your next MVP, go through this checklist:</p><ul><li><p>Do we have a clear problem and hypothesis?</p></li><li><p>Are we building only the core feature?</p></li><li><p>Are we working in thin slices?</p></li><li><p>Do we have tests and CI/CD in place?</p></li><li><p>Is our architecture minimal and evolvable?</p></li><li><p>Are we involving real users early?</p></li><li><p>Are we learning fast enough?</p></li></ul><p>If the answer is yes to all of these:</p><p>&#128073; you&#8217;re not just building fast</p><p>&#128073; you&#8217;re building <strong>sustainably fast</strong></p><div><hr></div><p><em>Reply to this email if you are curious about anything in this issue &#8212; I will be happy to reply to your questions directly! :) </em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – Building the MVP – Managing Technical Debt from Day One]]></title><description><![CDATA[Technical debt is not just code &#8212; it&#8217;s complexity, assumptions, and shortcuts. Here&#8217;s how to keep it under control from day one with technical excellence and agile practices.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-c53</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-c53</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 24 Mar 2026 07:15:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nDDa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832?r=1arsz9">&#9193; Section 1 - First steps: Idea, Validation, MVP</a></em></h3><h3>&#9193; Section 2 - <strong>Building the MVP</strong></h3><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019">1&#65039;&#8419;0&#65039;&#8419; Chapter 10 &#8211; Get to Production First</a><em> </em></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;1&#65039;&#8419;</a> <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-9fa">Chapter 11 &#8211; An architecture that can evolve</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-332">1&#65039;&#8419;2&#65039;&#8419; Chapter 12 &#8211; Release in slices</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-62f">1&#65039;&#8419;3&#65039;&#8419; Chapter 13 &#8211; TDD from day one</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-331">1&#65039;&#8419;4&#65039;&#8419; Chapter 14 &#8211; Thin slices for testable software</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-410">1&#65039;&#8419;5&#65039;&#8419; Chapter 15 &#8211; Bring the first users early</a></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>6&#65039;&#8419; Chapter 16 &#8211; Managing Technical Debt from Day One &#8594; You&#8217;re here.</strong></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>7&#65039;&#8419;</strong> Chapter 17 &#8211; Best practices for building an MVP &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!nDDa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nDDa!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!nDDa!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!nDDa!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nDDa!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nDDa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:925034,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/191838835?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!nDDa!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!nDDa!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!nDDa!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nDDa!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d9ed0a-0182-4b90-acdb-4d8db8ca6211_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>You&#8217;re building your MVP.</p><p>Time is tight.</p><p>Pressure is high.</p><p>Decisions are made quickly.</p><p>And at some point, someone says:</p><blockquote><p><em>&#8220;Let&#8217;s do it quickly now, we&#8217;ll fix it later.&#8221;</em></p></blockquote><p>That&#8217;s the moment technical debt is born.</p><p>Not months later.</p><p>Not at scale.</p><p><strong>Right there.</strong></p><p>Early shortcuts feel harmless:</p><ul><li><p>skipping tests</p></li><li><p>hardcoding logic</p></li><li><p>duplicating code &#8220;just for now&#8221;</p></li><li><p>ignoring edge cases</p></li><li><p>delaying refactoring</p></li></ul><p>The problem is not the shortcut itself.</p><p>The problem is that <strong>shortcuts accumulate silently</strong>.</p><p>Weeks later:</p><ul><li><p>changes become harder</p></li><li><p>bugs become more frequent</p></li><li><p>releases become slower</p></li><li><p>confidence drops</p></li></ul><p>And suddenly the team says:</p><blockquote><p>&#8220;We need to refactor everything.&#8221;</p></blockquote><p>But by then, it&#8217;s already expensive.</p><div><hr></div><h2><strong>&#9889; What Technical Debt Really Is</strong></h2><p>The term &#8220;<em>technical debt</em>&#8221; was introduced to describe the trade-off between quick delivery and long-term maintainability.</p><p>But it&#8217;s often misunderstood.</p><p>Technical debt is <strong>not just bad code.</strong></p><p>It includes:</p><ul><li><p><strong>code debt</strong> &#8594; duplication, poor structure, lack of tests</p></li><li><p><strong>architecture debt</strong> &#8594; rigid or overcomplicated design</p></li><li><p><strong>domain debt</strong> &#8594; misunderstanding the business problem</p></li><li><p><strong>product debt</strong> &#8594; building unnecessary or misaligned features</p></li></ul><p>In short:</p><blockquote><p>Technical debt is <strong>unmanaged complexity</strong>.</p></blockquote><p>And complexity grows non-linearly.</p><p>At the beginning, it feels manageable.</p><p>Then it slows you down.</p><p>Then it blocks you.</p><p>And the most dangerous type is:</p><p>&#128073; <strong>unexpected technical debt</strong></p><p>The kind you didn&#8217;t plan, didn&#8217;t track, and can&#8217;t easily fix.</p><div><hr></div><h2><strong>&#9889; Why This Matters</strong></h2><p>You can&#8217;t avoid all debt.</p><p>In fact, some debt is necessary.</p><ul><li><p>You don&#8217;t know everything at the start</p></li><li><p>Requirements evolve</p></li><li><p>Trade-offs are inevitable</p></li></ul><p>This is <strong>intentional debt</strong> &#8212; and it can be managed.</p><p>The real problem is <strong>accidental debt</strong>:</p><ul><li><p>introduced without awareness</p></li><li><p>discovered too late</p></li><li><p>expensive to fix</p></li></ul><p>This is what kills velocity.</p><p>And here&#8217;s the key insight:</p><blockquote><p><em><strong>Most accidental debt comes from cutting quality instead of cutting scope.</strong></em></p></blockquote><div><hr></div><h2><strong>&#128736; How We Solve It</strong></h2><p>If you want to move fast <strong>without slowing down later</strong>, the rule is simple:</p><p>&#128073; <strong>Reduce scope. Never reduce quality.</strong></p><p>Let&#8217;s make it concrete.</p><div><hr></div><h3><strong>1&#65039;&#8419; Scope Is the Only Safe Lever</strong></h3><p>When under pressure, teams often choose between:</p><ul><li><p>delivering less</p></li><li><p>or delivering lower quality</p></li></ul><p>The correct choice is almost always:</p><p>&#128073; deliver less</p><p>Examples:</p><ul><li><p>instead of full permissions &#8594; start with 2 roles</p></li><li><p>instead of full analytics &#8594; one key metric</p></li><li><p>instead of flexible workflows &#8594; one fixed flow</p></li></ul><p>Scope reduction keeps:</p><ul><li><p>code simple</p></li><li><p>tests manageable</p></li><li><p>feedback fast</p></li></ul><p>Cutting quality does the opposite.</p><div><hr></div><h3><strong>2&#65039;&#8419; Automated Tests Are Non-Negotiable</strong></h3><p>Without automated tests:</p><ul><li><p>you don&#8217;t know if changes break existing behavior</p></li><li><p>refactoring becomes risky</p></li><li><p>bugs accumulate silently</p></li></ul><p>With automated tests:</p><ul><li><p>you get fast feedback</p></li><li><p>you can refactor safely</p></li><li><p>you can evolve the system</p></li></ul><p>This is why testability is the foundation of maintainability.</p><p>Even in a future where AI writes most of the code:</p><p>&#128073; <strong>tests are the only reliable verification mechanism</strong></p><p>No test suite = no safety net.</p><div><hr></div><h3><strong>3&#65039;&#8419; TDD Prevents Overengineering</strong></h3><p>Test-Driven Development forces you to:</p><ul><li><p>implement only what is needed</p></li><li><p>keep functions small</p></li><li><p>design for testability</p></li></ul><p>It naturally limits complexity.</p><p>Instead of designing everything upfront, you grow the system incrementally.</p><p>This reduces both:</p><ul><li><p>overengineering</p></li><li><p>unnecessary features</p></li></ul><div><hr></div><h3><strong>4&#65039;&#8419; Continuous Integration Prevents Drift</strong></h3><p>Without CI:</p><ul><li><p>code diverges</p></li><li><p>integration becomes painful</p></li><li><p>bugs appear late</p></li></ul><p>With CI:</p><ul><li><p>changes are integrated constantly</p></li><li><p>problems are detected early</p></li><li><p>complexity stays visible</p></li></ul><p>CI doesn&#8217;t eliminate debt.</p><p>But it prevents it from hiding.</p><div><hr></div><h3><strong>5&#65039;&#8419; Continuous Delivery Keeps the System Honest</strong></h3><p>If your system is always deployable:</p><ul><li><p>infrastructure stays simple</p></li><li><p>deployment stays predictable</p></li><li><p>releases stay small</p></li></ul><p>If you delay releases:</p><ul><li><p>complexity accumulates</p></li><li><p>assumptions go unvalidated</p></li><li><p>risk increases</p></li></ul><p>CD forces continuous validation.</p><div><hr></div><h3><strong>6&#65039;&#8419; Keep Complexity Visible and Intentional</strong></h3><p>Some debt is acceptable &#8212; if it&#8217;s:</p><ul><li><p>visible</p></li><li><p>documented</p></li><li><p>temporary</p></li></ul><p>Examples:</p><ul><li><p>quick implementation to validate a hypothesis</p></li><li><p>simplified logic to test a feature</p></li><li><p>temporary duplication before refactoring</p></li></ul><p>The key is:</p><p>&#128073; <strong>you know it exists, and you plan to address it</strong></p><p>Unmanaged debt is the problem &#8212; not debt itself.</p><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><p>Maintaining high quality from day one requires:</p><ul><li><p>writing tests</p></li><li><p>setting up CI/CD</p></li><li><p>thinking in smaller increments</p></li><li><p>resisting shortcuts</p></li></ul><p>But the alternative is:</p><ul><li><p>slow delivery after initial speed</p></li><li><p>fragile code</p></li><li><p>expensive rewrites</p></li><li><p>lost trust in the system</p></li></ul><p>Short-term shortcuts create long-term friction.</p><div><hr></div><h2><strong>&#128640; Next Steps (Tomorrow Morning)</strong></h2><p>when working your next MVP or Feature MVP, ask:</p><ul><li><p>Are we reducing scope &#8212; or cutting quality?</p></li><li><p>Are we skipping tests to go faster?</p></li><li><p>Is this complexity intentional or accidental?</p></li></ul><p>Then:</p><ol><li><p>Identify one feature that feels too big &#8594; <strong>reduce its scope</strong></p></li><li><p>Add tests for one critical part &#8594; <strong>increase safety</strong></p></li><li><p>Ensure your pipeline runs on every commit &#8594; <strong>increase visibility</strong></p></li></ol><p>Small actions compound.</p><div><hr></div><p><em>Reply to this email if you are curious about anything in this issue &#8212; I will be happy to reply to your questions directly! :) </em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – Building the MVP – Bring Real Users Early]]></title><description><![CDATA[The sooner real users interact with your product, the sooner you stop building in the dark. Learn practical ways to involve early adopters, run beta programs, and turn users into product partners.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-410</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-410</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 17 Mar 2026 07:15:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JBLq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832?r=1arsz9">&#9193; Section 1 - First steps: Idea, Validation, MVP</a></em></h3><h3>&#9193; Section 2 - <strong>Building the MVP</strong></h3><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019">1&#65039;&#8419;0&#65039;&#8419; Chapter 10 &#8211; Get to Production First</a><em> </em></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;1&#65039;&#8419;</a> <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-9fa">Chapter 11 &#8211; An architecture that can evolve</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-332">1&#65039;&#8419;2&#65039;&#8419; Chapter 12 &#8211; Release in slices</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-62f">1&#65039;&#8419;3&#65039;&#8419; Chapter 13 &#8211; TDD from day one</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-331">1&#65039;&#8419;4&#65039;&#8419; Chapter 14 &#8211; Thin slices for testable software</a></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>5&#65039;&#8419; Chapter 15 &#8211; Bring the first users early</strong> <em><strong>&#8594; You&#8217;re here.</strong></em></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>6&#65039;&#8419;</strong> Chapter 16 &#8211; Tech trade-offs: simple now vs debt later &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!JBLq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JBLq!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!JBLq!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!JBLq!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!JBLq!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JBLq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:920636,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/191064649?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!JBLq!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!JBLq!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!JBLq!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!JBLq!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9468c1f2-7361-42d5-b3b4-7844c5493dda_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>You built the walking skeleton.</p><p>You added the first slices of functionality.</p><p>The system runs in production.</p><p>But only the team is using it.</p><p>This is one of the most common traps in early product development: teams spend months building before real users ever touch the product.</p><p>When the first users finally arrive, surprises happen:</p><ul><li><p>the workflow doesn&#8217;t match how people actually work</p></li><li><p>the onboarding is confusing</p></li><li><p>the &#8220;core feature&#8221; isn&#8217;t the real problem users care about</p></li><li><p>users behave in ways nobody expected</p></li></ul><p>At this point the team discovers something uncomfortable:</p><blockquote><p><em>Most of the decisions were made without real users.</em></p></blockquote><p>Lean product development was designed to avoid exactly this problem.</p><p>The Lean Startup methodology emphasizes involving users as early as possible and iterating based on real feedback rather than assumptions.</p><p>The earlier real users interact with your product, the faster you learn whether you&#8217;re building the right thing.</p><div><hr></div><h2><strong>&#9889; Why It Matters</strong></h2><p>Getting early users involved is not just about feedback.</p><p>It changes the entire development dynamic.</p><h3><strong>1. Real usage validates assumptions</strong></h3><p>Internal testing cannot simulate real behavior.</p><p>Real users:</p><ul><li><p>misunderstand interfaces</p></li><li><p>use features in unexpected ways</p></li><li><p>find shortcuts you never predicted</p></li><li><p>ignore features you thought were essential</p></li></ul><p>That information is priceless.</p><div><hr></div><h3><strong>2. Early adopters drive product adoption</strong></h3><p>Products rarely spread evenly across users.</p><p>They follow the <strong>technology adoption curve</strong>:</p><ul><li><p>Innovators</p></li><li><p>Early adopters</p></li><li><p>Early majority</p></li><li><p>Late majority</p></li><li><p>Laggards</p></li></ul><p>Your MVP is not for everyone.</p><p>It&#8217;s for <strong>innovators and early adopters</strong>.</p><p>These users tolerate rough edges and actively want to influence the product.</p><div><hr></div><h3><strong>3. Early feedback accelerates product-market fit</strong></h3><p>Customer feedback is one of the most important drivers of MVP iteration because it helps validate assumptions and identify what users actually need.</p><p>Without feedback, teams iterate blindly.</p><p>With feedback, each iteration becomes a learning experiment.</p><div><hr></div><h3><strong>4. Adoption starts during onboarding</strong></h3><p>Adoption is not just about sign-ups &#8212; it&#8217;s when users start deriving real value from the product and integrate it into their workflow.</p><p>Early onboarding experiences determine whether users reach that value moment quickly or abandon the product.</p><div><hr></div><h2><strong>&#128736; How We Solve It</strong></h2><p>Here are practical ways to bring users into the life of your product early.</p><div><hr></div><h3><strong>1&#65039;&#8419; Launch an Alpha Program</strong></h3><p>Alpha users are the first real users who interact with the product.</p><p>Characteristics of alpha users:</p><ul><li><p>often internal users or trusted partners</p></li><li><p>high tolerance for bugs</p></li><li><p>willing to give detailed feedback</p></li><li><p>understand they are testing something unfinished</p></li></ul><p>The goal of alpha testing is not scale.</p><p>It is <strong>learning fast</strong>.</p><p>Typical alpha sources:</p><ul><li><p>internal teams</p></li><li><p>friendly companies</p></li><li><p>developer communities</p></li><li><p>personal network</p></li></ul><p>At this stage, direct communication with users is often more valuable than analytics.</p><div><hr></div><h3><strong>2&#65039;&#8419; Run a Structured Beta Program</strong></h3><p>A beta program expands testing to external users before a full launch.</p><p>Beta programs allow you to evaluate the product in real-world conditions and gather insights for improvement.</p><p>Typical beta program practices:</p><ul><li><p>invite a limited group of users</p></li><li><p>communicate that the product is experimental</p></li><li><p>provide a feedback channel</p></li><li><p>iterate frequently based on feedback</p></li></ul><p>The best beta programs treat participants as collaborators.</p><p>They are not just users.</p><p>They are <strong>product partners</strong>.</p><div><hr></div><h3><strong>3&#65039;&#8419; Identify Champion Users</strong></h3><p>Among early users, some people naturally become advocates.</p><p>These <strong>champion users</strong>:</p><ul><li><p>use the product frequently</p></li><li><p>provide detailed feedback</p></li><li><p>suggest improvements</p></li><li><p>promote the product internally</p></li></ul><p>Champion users are incredibly valuable.</p><p>They help you understand:</p><ul><li><p>real workflows</p></li><li><p>high-value features</p></li><li><p>adoption barriers</p></li></ul><p>Many successful products grow through these champions.</p><div><hr></div><h3><strong>4&#65039;&#8419; Run Continuous User Interviews</strong></h3><p>User interviews remain one of the most powerful learning tools.</p><p>Best practices:</p><ul><li><p>talk to users regularly</p></li><li><p>focus on their problems, not your features</p></li><li><p>observe real usage when possible</p></li><li><p>document insights and patterns</p></li></ul><p>Interviews complement analytics by revealing the <strong>why behind behavior</strong>.</p><div><hr></div><h3><strong>5&#65039;&#8419; Measure Feedback with NPS and Surveys</strong></h3><p>Quantitative feedback helps identify trends.</p><p>Common techniques include:</p><ul><li><p><strong>NPS surveys</strong></p></li><li><p>in-app feedback forms</p></li><li><p>short usability surveys</p></li><li><p>onboarding questionnaires</p></li></ul><p>In-app surveys are widely used during beta testing to validate ideas and prioritize improvements.</p><p>NPS is particularly useful for identifying promoters who may become champion users.</p><div><hr></div><h3><strong>6&#65039;&#8419; Build Feedback Channels into the Product</strong></h3><p>The easiest way to collect feedback is directly inside the app.</p><p>Examples:</p><ul><li><p>&#8220;Send feedback&#8221; button</p></li><li><p>bug report form</p></li><li><p>quick surveys</p></li><li><p>feature request widgets</p></li></ul><p>This allows users to provide feedback <strong>in context</strong>, when the experience is fresh.</p><div><hr></div><h3><strong>7&#65039;&#8419; Combine Online and Offline Feedback</strong></h3><p>Not all feedback needs to happen inside the app.</p><p>Offline channels are often more valuable in early stages:</p><ul><li><p>Slack communities</p></li><li><p>private Discord groups</p></li><li><p>email feedback loops</p></li><li><p>live user calls</p></li><li><p>product demos with discussion</p></li></ul><p>Early-stage products benefit enormously from <strong>high-touch communication</strong>.</p><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><p>Early user involvement comes with trade-offs.</p><p>You may expose:</p><ul><li><p>unfinished features</p></li><li><p>imperfect UX</p></li><li><p>occasional bugs</p></li></ul><p>But the alternative is worse:</p><ul><li><p>building features nobody uses</p></li><li><p>discovering problems too late</p></li><li><p>launching a product nobody understands</p></li></ul><p>Early feedback reduces uncertainty &#8212; which is the most expensive problem in product development.</p><div><hr></div><h2><strong>&#128640; Next Steps (Tomorrow Morning)</strong></h2><p>If your MVP is already running:</p><ol><li><p>Identify <strong>5&#8211;10 early adopters</strong> who might benefit from your product.</p></li><li><p>Invite them into an <strong>informal alpha program</strong>.</p></li><li><p>Schedule <strong>short user interviews</strong> after their first usage.</p></li><li><p>Add a <strong>feedback button or survey</strong> inside the product.</p></li></ol><p>The goal is not perfection.</p><p>The goal is <strong>learning faster than everyone else</strong>.</p><div><hr></div><p><em>Reply to this email if you are curious about anything in this issue &#8212; I will be happy to reply to your questions directly! :) </em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – Building the MVP – Thin Slices for testable software]]></title><description><![CDATA[Thin slices are not just about faster delivery &#8212; they are the key to making features testable, maintainable, and safe to evolve. Work in thin slices to setup the terrain for maintainability over time.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-331</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-331</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 10 Mar 2026 07:15:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mLKC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832?r=1arsz9">&#9193; Section 1 - First steps: Idea, Validation, MVP</a></em></h3><h3>&#9193; Section 2 - <strong>Building the MVP</strong></h3><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019">1&#65039;&#8419;0&#65039;&#8419; Chapter 10 &#8211; Get to Production First</a><em> </em></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;1&#65039;&#8419;</a> <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-9fa">Chapter 11 &#8211; An architecture that can evolve</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-332">1&#65039;&#8419;2&#65039;&#8419; Chapter 12 &#8211; Release in slices</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-62f">1&#65039;&#8419;3&#65039;&#8419; Chapter 13 &#8211; TDD from day one</a></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>4&#65039;&#8419; Chapter 14 &#8211; Thin slices for testable software</strong> <em><strong>&#8594; You&#8217;re here.</strong></em></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>5&#65039;&#8419;</strong> Chapter 15 &#8211; Bring the first users early &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!mLKC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!mLKC!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!mLKC!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!mLKC!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!mLKC!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!mLKC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ecd15331-d058-434a-805b-1417d956e865_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:927777,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/190362108?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!mLKC!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!mLKC!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!mLKC!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!mLKC!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecd15331-d058-434a-805b-1417d956e865_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>You start implementing a feature. It seems simple at first, especially in a fresh project.</p><p>Then it grows.</p><p>The feature touches the UI, business logic, database, API integration, and maybe authentication. Tests become harder to write. The feature branch gets larger. Integration takes longer.</p><p>Eventually someone says:</p><blockquote><p><em>&#8220;We&#8217;ll add tests later.&#8221;</em></p></blockquote><p>Looks reasonable, right? We need to go to the market as quickly as possible.</p><p>But &#8220;<em>later</em>&#8221; rarely comes.</p><p>The problem isn&#8217;t laziness or lack of discipline.</p><p>The real problem is that the <strong>feature was never designed to be testable</strong>.</p><p>Large features are hard to test, and even harder to add test after.</p><p>And when features are hard to test:</p><ul><li><p>tests are skipped</p></li><li><p>regressions increase</p></li><li><p>refactoring becomes risky</p></li><li><p>the codebase slowly becomes fragile</p></li></ul><p>This is exactly why <strong>thin slices</strong> are essential.</p><p>Thin slices are not only a delivery technique.</p><p>They are a <strong>testability strategy</strong>.</p><div><hr></div><h2><strong>&#9889; Why It Matters</strong></h2><p>Kent Beck, the creator of Extreme Programming and Test-Driven Development, repeatedly emphasized that <strong>testability is the fundamental enabler of change</strong>.</p><p>Software that cannot be tested cheaply cannot evolve.</p><p>Martin Fowler makes a similar point: the real value of automated tests is not catching bugs &#8212; it is enabling <strong>safe refactoring and continuous change</strong>.</p><p>This becomes even more important when we consider modern development trends.</p><p>Even if AI generates large portions of code in the future, one thing remains true:</p><p><strong>Automated tests are the only scalable way to ensure software does what you expect.</strong></p><p>Human review does not scale.</p><p>Manual testing does not scale.</p><p>Documentation does not scale.</p><p>Only automated verification scales with complexity.</p><p>Thin slices make this possible.</p><div><hr></div><h2><strong>&#9889; Thin Slices Make Testing Cheap</strong></h2><p>When features are sliced properly:</p><ul><li><p>each increment changes only a small part of the system</p></li><li><p>the behavior under test is clear</p></li><li><p>tests are simple to write</p></li><li><p>failures are easy to diagnose</p></li></ul><p>Small slices reduce the cost of testing dramatically.</p><p>This is why many modern engineering practices converge around the same idea:</p><ul><li><p><strong>TDD</strong> encourages tiny increments</p></li><li><p><strong>Continuous Integration</strong> encourages frequent integration</p></li><li><p><strong>Continuous Delivery</strong> encourages small releases</p></li><li><p><strong>Feature slicing</strong> encourages minimal behavioral changes</p></li></ul><p>All these practices reinforce each other.</p><div><hr></div><h2><strong>&#128736; How We Solve It</strong></h2><p>Let&#8217;s explore practical techniques for building thin slices that are easy to test.</p><div><hr></div><h3><strong>1&#65039;&#8419; Slice by Behavior, Not by Layer</strong></h3><p>A common mistake is slicing features by technical layers.</p><p>Example:</p><ul><li><p>Backend API first</p></li><li><p>Database schema later</p></li><li><p>UI last</p></li></ul><p>This creates large integration points.</p><p>Instead, slice by <strong>user behavior</strong>.</p><p>Example:</p><p>First slice:</p><ul><li><p>user can create a simple item</p></li><li><p>minimal API</p></li><li><p>minimal database structure</p></li><li><p>minimal UI</p></li></ul><p>Second slice:</p><ul><li><p>user can edit the item</p></li></ul><p>Third slice:</p><ul><li><p>user can delete the item</p></li></ul><p>Each slice is:</p><ul><li><p>end-to-end</p></li><li><p>small</p></li><li><p>testable</p></li></ul><p>And each slice adds a small, verifiable behavior.</p><div><hr></div><h3><strong>2&#65039;&#8419; Write Tests Close to the Behavior</strong></h3><p>Martin Fowler often describes the <strong>Test Pyramid</strong>:</p><ul><li><p>many fast unit tests</p></li><li><p>fewer integration tests</p></li><li><p>very few end-to-end tests</p></li></ul><p>Thin slices help maintain this structure.</p><p>If a slice introduces only a small behavior change:</p><ul><li><p>unit tests verify the logic</p></li><li><p>integration tests verify collaboration</p></li><li><p>end-to-end tests confirm user flow</p></li></ul><p>Large features tend to push teams toward expensive end-to-end tests.</p><p>Small slices keep most tests cheap.</p><div><hr></div><h3><strong>3&#65039;&#8419; Use TDD to Enforce Small Increments</strong></h3><p>Test-Driven Development naturally pushes developers toward thin slices.</p><p>The TDD loop is simple:</p><ol><li><p>write a failing test</p></li><li><p>write minimal code to pass</p></li><li><p>refactor</p></li><li><p>repeat</p></li></ol><p>Because tests are written first, developers avoid building large speculative features.</p><p>Instead they grow functionality step by step.</p><p>This aligns perfectly with MVP development.</p><div><hr></div><h3><strong>4&#65039;&#8419; Keep Tests Fast and Focused</strong></h3><p>Kent Beck emphasized that <strong>fast feedback loops are essential</strong>.</p><p>If tests take minutes to run, developers run them less frequently.</p><p>Thin slices help keep tests fast because:</p><ul><li><p>fewer components change</p></li><li><p>fewer integration points are involved</p></li><li><p>failures are localized</p></li></ul><p>Fast tests encourage frequent execution, which strengthens CI pipelines.</p><div><hr></div><h3><strong>5&#65039;&#8419; Protect Testability with Good Architecture</strong></h3><p>Testability doesn&#8217;t happen by accident.</p><p>Architectural patterns like:</p><ul><li><p><strong>Hexagonal Architecture</strong></p></li><li><p><strong>Clean Architecture</strong></p></li><li><p><strong>Ports and Adapters</strong></p></li></ul><p>separate business logic from infrastructure.</p><p>This separation allows:</p><ul><li><p>testing business logic without external systems</p></li><li><p>mocking infrastructure dependencies</p></li><li><p>writing fast unit tests</p></li></ul><p>Architecture and thin slicing reinforce each other.</p><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><p>Thin slicing requires discipline.</p><p>It often means:</p><ul><li><p>thinking harder before coding</p></li><li><p>splitting work more carefully</p></li><li><p>resisting the urge to build everything at once</p></li></ul><p>But the alternative is worse:</p><ul><li><p>complex tests</p></li><li><p>slow pipelines</p></li><li><p>fragile code</p></li><li><p>risky refactoring</p></li></ul><p>Thin slices trade a little design effort for long-term maintainability.</p><div><hr></div><h2><strong>&#128640; Next Steps (Tomorrow Morning)</strong></h2><p>Pick a feature currently in progress.</p><p>Ask yourself:</p><ul><li><p>Can this be split into two smaller behaviors?</p></li><li><p>Can each behavior be tested independently?</p></li><li><p>Can each slice be integrated today?</p></li></ul><p>If the answer is no, the feature is probably too big.</p><p>Slice it again.</p><p>The easiest software to test is software built in tiny increments.</p><div><hr></div><p><em>Reply to this email if you are curious about anything in this issue &#8212; I will be happy to reply to your questions directly! :) </em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – Building the MVP – TDD, CI/CD and the Myth of “We Don’t Have Time”]]></title><description><![CDATA[The real way to move fast is not cutting quality &#8212; it&#8217;s cutting scope. Speed without feedback is illusion. Learn how to build your MVP incrementally without accumulating hidden waste.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-62f</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-62f</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 03 Mar 2026 07:15:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!O6jl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832?r=1arsz9">&#9193; Section 1 - First steps: Idea, Validation, MVP</a></em></h3><h3>&#9193; Section 2 - <strong>Building the MVP</strong></h3><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019">1&#65039;&#8419;0&#65039;&#8419; Chapter 10 &#8211; Get to Production First</a><em> </em></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;1&#65039;&#8419;</a> <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-9fa">Chapter 11 &#8211; An architecture that can evolve</a></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-332">1&#65039;&#8419;2&#65039;&#8419; Chapter 12 &#8211; Release in slices</a></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>3&#65039;&#8419; Chapter 13 &#8211; TDD from day one</strong> <em><strong>&#8594; You&#8217;re here.</strong></em></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>4&#65039;&#8419;</strong> Chapter 14 &#8211; Build testable features &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!O6jl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!O6jl!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!O6jl!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!O6jl!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!O6jl!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!O6jl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:932566,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/189626971?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!O6jl!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!O6jl!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!O6jl!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!O6jl!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5208ff28-9e1d-4c4f-84b1-bbcf6c48ad18_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>You&#8217;re building the first real features after the walking skeleton.</p><p>Pressure is high.</p><p>Stakeholders want progress.</p><p>The market is moving.</p><p>And someone inevitably says:</p><blockquote><p><em>&#8220;We don&#8217;t have time for TDD.&#8221;</em></p><p><em>&#8220;Let&#8217;s skip tests for now.&#8221;</em></p><p><em>&#8220;We&#8217;ll clean it up later.&#8221;</em></p></blockquote><p>This is where most MVPs begin accumulating invisible debt.</p><p>The reasoning sounds logical:</p><p><em>&#8220;We need speed. Discipline can come later.&#8221;</em></p><p>But research tells a different story.</p><p>According to Pendo&#8217;s Product Benchmarks Report, <strong>around 80% of features in software products are rarely or never used.</strong></p><p>That means the biggest waste in software is not writing tests.</p><p>It&#8217;s building things that don&#8217;t create value.</p><p>The second major source of waste?</p><p>Unplanned work &#8212; bugs, regressions, unexpected behaviors, firefighting.</p><p>And what creates unplanned work?</p><ul><li><p>Large batches</p></li><li><p>Untested changes</p></li><li><p>Fragile integration</p></li><li><p>Manual deployments</p></li><li><p>Poor feedback loops</p></li></ul><p>So here&#8217;s the uncomfortable truth:</p><p>Cutting engineering discipline does not make you faster.</p><p>It just delays the bill.</p><div><hr></div><h2><strong>&#9889; Why It Matters</strong></h2><p>There are two kinds of speed:</p><ol><li><p><strong>Apparent speed</strong> &#8211; You ship something quickly.</p></li><li><p><strong>Sustainable speed</strong> &#8211; You keep shipping quickly.</p></li></ol><p>Most teams optimize for the first and destroy the second.</p><p>If 80% of features are unused, the only rational strategy is:</p><ul><li><p>Build less.</p></li><li><p>Validate earlier.</p></li><li><p>Keep change cheap.</p></li></ul><p>And this is true especially in the early days, when you don&#8217;t know if a feature will fall into the 80% or 20% and you need to build a lot of different features to know it.</p><p>Therefore, we want change to remain cheap - and change is cheap only when:</p><ul><li><p>Code is covered by tests.</p></li><li><p>Integration happens continuously.</p></li><li><p>Deployment is automated.</p></li><li><p>Releases are small and reversible.</p></li></ul><p>TDD, CI and CD are not &#8220;enterprise practices.&#8221;</p><p>They are <strong>anti-waste mechanisms</strong>.</p><p>They protect you from:</p><ul><li><p>Building too much.</p></li><li><p>Breaking too much.</p></li><li><p>Reworking too much.</p></li></ul><p>And the fastest way to go fast?</p><p>Reduce scope, keep things as simple as possible, have automated tests to ensure your changes are correct.</p><p>Build the MVP of a feature &#8212; not the full version.</p><div><hr></div><h2><strong>&#128736; How We Solve It</strong></h2><p>Let&#8217;s make this practical.</p><h3><strong>1&#65039;&#8419; Reduce Scope, Not Quality</strong></h3><p>If a feature feels too big, don&#8217;t remove tests.</p><p>Remove functionalities or simplify them.</p><p>Instead of:</p><ul><li><p>Full role management system &#8594; start with 2 roles.</p></li><li><p>Complex reporting dashboard &#8594; start with one core metric.</p></li><li><p>Configurable workflows &#8594; start with one fixed flow.</p></li><li><p>Users can ask for a custom configuration &#8594; start with an email or slack notification.</p></li></ul><p>Scope is the lever.</p><p>Quality is not negotiable.</p><div><hr></div><h3><strong>2&#65039;&#8419; Use TDD to Force Simplicity</strong></h3><p>Test-Driven Development naturally encourages:</p><ul><li><p>Small increments.</p></li><li><p>Clear interfaces.</p></li><li><p>Minimal implementation.</p></li><li><p>Refactoring confidence.</p></li></ul><p>TDD prevents speculative design because you only implement what is required to pass the test.</p><p>It aligns perfectly with MVP thinking:</p><ul><li><p>Write a failing test for the smallest valuable behavior.</p></li><li><p>Make it pass.</p></li><li><p>Refactor.</p></li><li><p>Repeat.</p></li></ul><p>The result?</p><p>No overengineering.</p><p>No invisible assumptions.</p><p>No accidental complexity.</p><div><hr></div><h3><strong>3&#65039;&#8419; Continuous Integration from Day One</strong></h3><p>CI means:</p><ul><li><p>Integrate to main multiple times per day.</p></li><li><p>Keep the build green.</p></li><li><p>Run all tests automatically.</p></li><li><p>Make integration boring.</p></li></ul><p>CI reduces unplanned work because:</p><ul><li><p>Integration issues are discovered immediately.</p></li><li><p>Merge conflicts stay small.</p></li><li><p>Architectural drift is visible early.</p></li></ul><p>Large feature branches are delayed feedback.</p><p>Delayed feedback is waste.</p><div><hr></div><h3><strong>4&#65039;&#8419; Continuous Delivery to Keep Learning Fast</strong></h3><p>CD means your software is always deployable.</p><p>Even if you don&#8217;t release to customers daily, you should be able to.</p><p>Benefits:</p><ul><li><p>Infrastructure stays validated.</p></li><li><p>Deployment risk stays low.</p></li><li><p>You can release small experiments quickly.</p></li><li><p>You can rollback easily.</p></li></ul><p>Deployment becomes routine instead of an event.</p><div><hr></div><h3><strong>5&#65039;&#8419; Why This Minimizes Waste</strong></h3><p>Let&#8217;s connect the dots:</p><h4><strong>Waste #1: Unused Features</strong></h4><p>TDD + Small slices &#8594;</p><p>You build only what is explicitly needed.</p><p>CI + Small releases &#8594;</p><p>You get feedback sooner and stop building sooner.</p><p>CD &#8594;</p><p>You validate assumptions in production faster.</p><h4><strong>Waste #2: Unplanned Work (Bugs, Regressions)</strong></h4><p>TDD &#8594;</p><p>Fewer regressions.</p><p>CI &#8594;</p><p>Early integration problems.</p><p>CD &#8594;</p><p>Deployment issues surface early, not months later.</p><p>The faster you close feedback loops, the less unplanned chaos you create.</p><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><p>Yes, writing tests takes time.</p><p>Yes, setting up CI/CD requires initial effort.</p><p>Yes, slicing features is harder than building the whole thing.</p><p>But compare that to:</p><ul><li><p>Weeks lost fixing regressions.</p></li><li><p>Rewriting unused features.</p></li><li><p>Fighting merge conflicts.</p></li><li><p>Delayed releases due to fragile deploys.</p></li></ul><p>Short-term discipline prevents long-term drag.</p><p>You are investing 1$ more today to avoid a 10$ loss tomorrow.</p><div><hr></div><h2><strong>&#128640; Next Steps (Tomorrow Morning)</strong></h2><p>If you&#8217;re starting a new feature:</p><ol><li><p>Write one test for the smallest valuable behavior.</p></li><li><p>Integrate the change the same day.</p></li><li><p>Ensure the pipeline runs automatically on every commit.</p></li><li><p>Ask: &#8220;What is the MVP of this feature?&#8221;</p></li></ol><p>If it feels slow, reduce scope further.</p><p>Remember:</p><p>You don&#8217;t go fast by cutting quality.</p><p>You go fast by simplifying and reducing what you build.</p><div><hr></div><p><em>Reply to this email if you are curious about anything in this issue &#8212; I will be happy to reply to your questions directly! :) </em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – Building the MVP – Release in slices]]></title><description><![CDATA[Delivering value early and often it&#8217;s a discipline. Learn how to slice work into tiny increments, and release with confidence to maximize feedback from all users and stakeholders from day one.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-332</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-332</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 24 Feb 2026 07:15:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wUi2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832?r=1arsz9">&#9193; Section 1 - First steps: Idea, Validation, MVP</a></em></h3><h3>&#9193; Section 2 - <strong>Building the MVP</strong></h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019">1&#65039;&#8419;0&#65039;&#8419; Chapter 10 &#8211; Get to Production First</a></strong><em><strong> </strong></em></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;1&#65039;&#8419;</a> <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-9fa">Chapter 11 &#8211; An architecture that can evolve</a></strong></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>2&#65039;&#8419; Chapter 12 &#8211; Release in slices</strong> <em><strong>&#8594; You&#8217;re here.</strong></em></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>3&#65039;&#8419;</strong> Chapter 13 &#8211; TDD from day one &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!wUi2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!wUi2!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!wUi2!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!wUi2!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!wUi2!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!wUi2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:919482,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/188875878?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!wUi2!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!wUi2!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!wUi2!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!wUi2!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F349b418c-a6b6-4e50-9749-9599d856443f_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>You&#8217;ve got your walking skeleton deployed &#8212; congratulations. Now it&#8217;s time to add features. But here comes a familiar problem:</p><p>Teams plan features as big chunks, work for weeks, then merge everything all at once. A single merge request becomes a mountain of changes. Stakeholders and users only see something meaningful after long waits. When feedback finally arrives, it often invalidates most of what was built.</p><p>This pattern &#8212; <strong>batching large chunks of work</strong> &#8212; slows everything down:</p><ul><li><p>Integration conflicts linger until the end</p></li><li><p>Feedback loops are long and weak</p></li><li><p>Risk accumulates and surprises blow up late</p></li><li><p>Your MVP turns into a &#8220;MVP-ish&#8221; project that never validates anything</p></li></ul><p>The antidote is simple (in principle, not always in practice): <strong>release in the smallest valuable slices possible</strong>, as early and often as you can.</p><p>Agile and DevOps wisdom has long championed this approach &#8212; delivering small increments, integrating constantly, and gathering feedback early. Releasing in slices isn&#8217;t just about features; it&#8217;s about keeping the product and the team aligned with real value delivery.</p><div><hr></div><h2><strong>&#9889; Why It Matters</strong></h2><p><strong>Small releases accelerate learning.</strong></p><p>Delivering in small slices shortens feedback loops with stakeholders, internal users, and real customers. Short cycles uncover wrong assumptions early, when change is cheap.</p><p><strong>Small releases reduce risk.</strong></p><p>Tiny changes mean smaller blast radius when something breaks. You can pinpoint issues faster and roll back or fix quickly.</p><p><strong>Small releases keep the codebase healthy.</strong></p><p>Large batches hide latent code that isn&#8217;t tested in context until it&#8217;s &#8220;finished&#8221;. This delays integration feedback and harms quality over time.</p><p><strong>Small releases support better architecture.</strong></p><p>Frequent integration supports evolutionary design, prevents brittle structures, and surfaces architectural issues early.</p><p>The bottom line: big batches are expensive, slow, and high-risk. Small increments create a feedback-rich loop that is the core of continuous delivery and learning.</p><div><hr></div><h2><strong>&#128736; How We Solve It: Practices to Release in Slices</strong></h2><p>Here are the tools and techniques that enable tiny releases and continuous delivery of value.</p><div><hr></div><h3><strong>1. Continuous Integration (CI) &#8212; The Essential Practice</strong></h3><p>CI is the heart of releasing in slices: integrate changes into a shared codebase <em>as soon as there is forward progress and the build is healthy</em>.</p><p>Key principles of CI include:</p><ul><li><p>Maintain a single code repository</p></li><li><p>Automate the build</p></li><li><p>Run automated tests on every commit</p></li><li><p>Keep tests fast and reliable</p></li><li><p>Integrate changes frequently (multiple times a day)</p></li><li><p>Make build results visible to everyone</p></li></ul><p>CI forces integration early and often &#8212; this means small changes land quickly, and feedback arrives before large conflicts accumulate.</p><p>If your current workflow waits for a long-lived feature branch to merge at the end, it&#8217;s <em>not Continuous Integration</em>. It&#8217;s <em>integration late</em>, and it hides problems until the last moment.</p><div><hr></div><h3><strong>2. Slice Features Vertically</strong></h3><p>To release small increments that deliver value, you must slice vertically &#8212; not by technical layers.</p><p>Instead of splitting by &#8220;backend first / frontend later,&#8221; slice this way:</p><ul><li><p>&#8220;User can do <em>one</em> small thing end-to-end&#8221;</p></li><li><p>Then add another tiny thing</p></li><li><p>Then another</p></li><li><p>&#8230; until each slice is usable, testable, and releasable</p></li></ul><p>The Elephant Carpaccio exercise (by Alistair Cockburn) is a great workshop for practicing this: slice work so thinly that each piece creates value and can be released independently.</p><p>Vertical slices let you gather real feedback instead of waiting until <em>all</em> layers are done.</p><div><hr></div><h3><strong>3. Release Unfinished Work Safely</strong></h3><p>With CI and slicing, you often land code that is not yet <em>revealed</em> to users &#8212; and that&#8217;s okay if you use techniques that keep it invisible until ready.</p><h4><strong>Feature Flags (Feature Toggles)</strong></h4><p>Feature flags let you merge in incomplete features and keep them disabled by default. The code is deployed, tested, and integrated, but it doesn&#8217;t affect user experience until you flip the switch.</p><p>Feature flags allow:</p><ul><li><p>Controlled releases (test with a small group first)</p></li><li><p>A/B testing</p></li><li><p>Dark launches (see performance effects before exposing users)</p></li><li><p>Decoupling deployment from release &#128161;</p></li></ul><p>Flags should be removed once the feature is fully released &#8212; leaving no &#8220;toggle debt&#8221; behind.</p><div><hr></div><h3><strong>4. Keystone Interfaces &amp; Latent Code</strong></h3><p>Martin Fowler describes the idea of <em>latent code</em> &#8212; code that is present in a release but not yet visible to users. A <em>keystone interface</em> ensures that code is not executed in production until it&#8217;s truly ready, while higher-level tests exercise it behind the scenes.</p><p>This lets you:</p><ul><li><p>Integrate unfinished functionality early</p></li><li><p>Test it with CI pipelines</p></li><li><p>Keep production behavior stable</p></li><li><p>Enable it progressively with minimal risk</p></li></ul><div><hr></div><h3><strong>5. Branch By Abstraction for Big Changes</strong></h3><p>When you face large infrastructure or platform changes (e.g., migration to a new data store), <em>branch by abstraction</em> lets you evolve the codebase step by step without blocking releases.</p><p>You create an abstraction layer that supports both old and new implementations, gradually moving clients over to the new version while keeping the system releasable at all times. This supports both CI and incremental release.</p><div><hr></div><h3><strong>6. Break Large Changes into Reversible Steps</strong></h3><p>Complex structural or schema changes (like renaming a database field) should be broken into reversible steps (expand&#8211;contract strategy):</p><ol><li><p>Add new field</p></li><li><p>Write to old + new</p></li><li><p>Copy data</p></li><li><p>Switch reads to new</p></li><li><p>Remove old</p></li></ol><p>Each step can be reversed independently &#8212; making releases safe and undoable if something goes wrong.</p><div><hr></div><h3><strong>7. Keep Feedback Loops Tight</strong></h3><p>Frequent releases invite feedback not just from automated tests but from real people. Internal users, customer beta programs, feedback tools, analytics &#8212; they provide data early that informs priorities.</p><p>The agile mantra of &#8220;inspect and adapt&#8221; depends on rapid feedback &#8212; and rapid release is the only way to get it.</p><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><p>Releasing in small slices and using CI isn&#8217;t free:</p><ul><li><p>You invest in test automation early</p></li><li><p>You must manage feature flags and remove them promptly</p></li><li><p>Teams need discipline to slice, integrate, and deploy frequently</p></li><li><p>You may expose latent code in production &#8212; but safely controlled</p></li></ul><p>However, these costs pay off in:</p><ul><li><p>Less risk</p></li><li><p>Better quality</p></li><li><p>Faster learning</p></li><li><p>Fewer late-stage surprises</p></li></ul><p>Small slices keep complexity from compounding &#8212; instead of big batches compounding risk.</p><div><hr></div><h2><strong>&#128640; Next Steps (Tomorrow Morning)</strong></h2><ol><li><p>Make sure your CI pipeline runs on every commit and keeps the build green.</p></li><li><p>Practice slicing one current feature into vertical, releasable pieces.</p></li><li><p>Introduce feature flags for any incomplete functionality that must be deployed early.</p></li><li><p>Plan at least one WIP hidden release to test impact before wide release.</p></li></ol><p>Release something, no matter how small &#8212; the sooner you do, the sooner you learn.</p><div><hr></div><p><em>Reply to this email if you are curious about anything in this issue &#8212; I will be happy to reply to your questions directly! :) </em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – Building the MVP – Architecture That Can Evolve]]></title><description><![CDATA[A minimal production system is just the beginning &#8212; architecture must be designed to evolve incrementally, with production validation, feedback loops and fitness checks embedded into delivery.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-9fa</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-9fa</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 17 Feb 2026 07:15:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!d-N4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832?r=1arsz9">&#9193; Section 1 - First steps: Idea, Validation, MVP</a></em></h3><h3>&#9193; Section 2 - <strong>Building the MVP</strong></h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developershttps://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019">1&#65039;&#8419;0&#65039;&#8419; Chapter 10 &#8211; Get to Production First</a></strong><em><strong> </strong></em></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;1&#65039;&#8419;</a> Chapter 11 &#8211; An architecture that can evolve </strong><em><strong>&#8594; You&#8217;re here.</strong></em></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>2&#65039;&#8419;</strong> Chapter 12 &#8211; Release in slices &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!d-N4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!d-N4!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!d-N4!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!d-N4!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!d-N4!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!d-N4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:923335,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/188158719?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!d-N4!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!d-N4!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!d-N4!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!d-N4!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce8d0f89-180c-43d8-9602-34d77a1b8f86_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>You deployed your walking skeleton &#8212; minimal frontend, a basic API, simple database connection &#8212; and it&#8217;s running in production.</p><p>But then new features creep in, deadlines loom, teams grow, and suddenly architecture questions that once felt &#8220;future-y&#8221; become blockers:</p><ul><li><p>Where should new services live?</p></li><li><p>Is the database schema flexible enough?</p></li><li><p>How do we ensure deploys stay reliable with more components?</p></li><li><p>How do we measure whether architecture quality is improving or deteriorating?</p></li></ul><p>Left unchecked, these questions morph into <em>design debt</em> &#8212; hidden complexity, fragile builds, unpredictable releases, and last-minute rewrites. That&#8217;s not accidental. It&#8217;s what happens when architecture is treated as a &#8220;phase&#8221; rather than a living part of development.</p><p>With modern Teams and products evolving fast, <strong>architecture must evolve with them</strong> &#8212; in production, incrementally, guided by real feedback. This is what industry leaders call <em>evolutionary architecture</em>.</p><div><hr></div><h2><strong>&#9889; Why It Matters</strong></h2><p>Evolutionary architecture is not about building a perfect system up front. It&#8217;s about making <strong>guided change a first principle</strong>.</p><p>Here&#8217;s why:</p><h3><strong>1. Changes Are the Norm, Not the Exception</strong></h3><p>Business needs shift, learnings arise from real usage, and new constraints surface. A static architecture will break or be abandoned.</p><h3><strong>2. Incremental Design Reduces Risk</strong></h3><p>By incorporating architectural practices into daily work, you avoid huge redesigns later. Small architectural improvements made with confidence beat big risky refactors.</p><h3><strong>3. Architecture Must Be Validated in Production</strong></h3><p>If your only production code is the walking skeleton, until that point architecture was just hopeful design. In evolutionary architecture, <em>every commit is a test of your assumptions</em>.</p><h3><strong>4. Continuous delivery is the foundation of evolution</strong></h3><p>Martin Fowler highlights that continuous delivery &#8212; making software deployable at any time &#8212; is essential to architecture that evolves. A deployment pipeline lets you test architectural assumptions automatically.</p><h3><strong>5. Fitness Functions Quantify Architectural Qualities</strong></h3><p>Instead of relying on human memory or opinion, fitness functions are automated checks that measure architectural health (e.g., dependency rules, performance budgets, resilience). They let you define &#8220;architectural success&#8221; and enforce it.</p><div><hr></div><h2><strong>&#128736; How We Solve It: Practices That Enable Evolution</strong></h2><p>Below are practical techniques and tools that support evolutionary architecture &#8212; both for infrastructure and for software structure.</p><div><hr></div><h3><strong>1. Infrastructure as Code (IaC)</strong></h3><p>Your infrastructure should be versioned, automated, and testable just like application code.</p><p>Tools like <strong>Terraform</strong>, <strong>Pulumi</strong>, and <strong>AWS CDK</strong> let you declare infrastructure in code, so:</p><ul><li><p>Environments are reproducible</p></li><li><p>Changes are trackable</p></li><li><p>Rollbacks are possible</p></li><li><p>Drift is detectable</p></li></ul><p>IaC transforms provisioning from a manual ritual to a <strong>refinable, evolvable asset</strong>.</p><blockquote><p>The practice of managing cloud infrastructure via code codifies familiar engineering benefits: version control, code review, rollback, and automation.</p></blockquote><div><hr></div><h3><strong>2. Deployment Pipelines That Include Architectural Checks</strong></h3><p>Continuous Delivery pipelines are more than &#8220;automatic deploy&#8221; screens &#8212; they are the engines of architectural validation.</p><p>Key elements:</p><ul><li><p><strong>Unit &amp; Integration Tests</strong> &#8212; catch errors early</p></li><li><p><strong>Contract and API Tests</strong> &#8212; ensure endpoints maintain compatibility</p></li><li><p><strong>Architectural Fitness Tests</strong> &#8212; automated checks for structural constraints (dependency rules, layering, code complexity thresholds)</p></li><li><p><strong>Database Migration Checks</strong> &#8212; ensure schema changes are safe</p></li><li><p><strong>Env Validation</strong> &#8212; smoke tests in a staging that mirrors production</p></li></ul><p>These checks ensure that every change not only works but preserves architectural health.</p><div><hr></div><h3><strong>3. Software Architecture Patterns for Change</strong></h3><p>Great architecture designs don&#8217;t force future choices &#8212; they <em>encapsulate change</em>.</p><h4><strong>Clean / Onion / Hexagonal Architecture</strong></h4><p>Patterns like Clean, Onion, or Hexagonal (Ports &amp; Adapters) isolate domain logic from infrastructure and external integrations, making them replaceable and testable.</p><p>Benefits:</p><ul><li><p>Business logic sits at the core</p></li><li><p>Adapters (UI, DB, external services) plug in around the core</p></li><li><p>Tests can target core logic independently</p></li><li><p>Infrastructure changes have minimal ripple effects</p></li><li><p>Refactoring becomes safer and frequent</p></li></ul><p>This structure aligns beautifully with evolving MVP codebases.</p><div><hr></div><h3><strong>4. Refactoring and Emergent Design</strong></h3><p>Kent Beck, an early proponent of evolutionary practices through Extreme Programming (XP), emphasised <strong>emergent design</strong> &#8212; design that grows as needed, not all up front.</p><p>With emergent design:</p><ul><li><p>You extend architecture only in response to real needs</p></li><li><p>Refactoring is the engine that keeps the codebase healthy</p></li><li><p>Over-engineering is replaced by <em>just enough architecture</em></p></li></ul><p>This approach assumes architecture will grow &#8212; and plans for it.</p><div><hr></div><h3><strong>5. Fitness Functions: Architecture Tests You Can Automate</strong></h3><p>A fitness function is an automated measure of how well a system aligns with architectural goals. They can evaluate:</p><ul><li><p>Coupling and dependency constraints</p></li><li><p>API compatibility and contract stability</p></li><li><p>Performance thresholds</p></li><li><p>Security policies</p></li><li><p>Chaos and resiliency checks (load, fault injection)</p></li></ul><p>Automating these ensures architectural qualities don&#8217;t degrade unnoticed.</p><div><hr></div><h3><strong>6. Continuous Delivery as an Architectural Enabler</strong></h3><p>Martin Fowler defines Continuous Delivery as the discipline that keeps software deployable at any point in time.</p><p>This discipline:</p><ul><li><p>Ensures architectural assumptions are exercised often</p></li><li><p>Pushes teams to build testable, modular code</p></li><li><p>Makes production deployments routine, so evolution happens in practice</p></li></ul><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><p>Evolving architecture is powerful &#8212; but not free:</p><ul><li><p><strong>Early automation requires effort</strong>, but saves rewrites later</p></li><li><p><strong>Fitness functions must be chosen carefully</strong> &#8212; too many checks can slow pipelines</p></li><li><p><strong>Patterns like hexagonal/clean add structure</strong> &#8212; but demand discipline initially</p></li><li><p><strong>Refactoring must be continuous</strong> &#8212; and that requires team investment</p></li></ul><p>The trade-off is always: <em>pay a little early to avoid paying a lot late</em> &#8212; and in MVP contexts, this is especially true.</p><div><hr></div><h2><strong>&#128640; Next Steps (Tomorrow Morning)</strong></h2><p>If your MVP is now running and you want architecture that can evolve:</p><ol><li><p><strong>Formalise your infrastructure in code</strong> (Terraform/Pulumi/CDK).</p></li><li><p><strong>Integrate at least one architectural fitness function</strong> into your pipeline (e.g., dependency rule, performance smoke test).</p></li><li><p><strong>Refactor one component toward clean/hexagonal structure</strong> &#8212; isolate domain logic from adapters.</p></li></ol><p>These steps help ensure your MVP isn&#8217;t just deployed &#8212; it&#8217;s <em>buildable, evolvable, and resilient</em>.</p><div><hr></div><p><em>Any question about evolutionary architectures techniques and technologies?</em></p><p><em>Reply to this email &#8212; I&#8217;ll help you stress-test it with a simple walking skeleton example on LinkedIn.</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – Building the MVP – Get to Production First]]></title><description><![CDATA[Before building features, ship a minimal system end-to-end. A walking skeleton helps you validate infrastructure, delivery, and architecture early &#8212; when change is still cheap.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-019</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 10 Feb 2026 07:15:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Drjs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832?r=1arsz9">&#9193; Section 1 - First steps: Idea, Validation, MVP</a></em></h3><h3>&#9193; Section 2 - <strong>Building the MVP</strong></h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a>0&#65039;&#8419; Chapter 10 &#8211; Get to Production First</strong><em><strong> &#8594; You&#8217;re here.</strong></em></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;1&#65039;&#8419;</a></strong> Chapter 11 &#8211; An architecture that can evolve</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Drjs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Drjs!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!Drjs!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!Drjs!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Drjs!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Drjs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:921848,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://learnagilepractices.substack.com/i/187375475?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Drjs!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!Drjs!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!Drjs!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Drjs!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095e1216-93c7-4ac9-a3b1-49ade41f0948_2240x1260.png 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 aria-hidden="true" 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><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><h2><strong>&#128075; Welcome back (2026 edition)</strong></h2><p>Happy new year, and welcome back to <em>AgileBits</em>.</p><p>With this issue we start a new section of the <strong>Practical Handbook for Product Developers</strong>: <strong>Building the MVP.</strong></p><p>In the previous section (<em>First Steps: Idea, Validation, MVP</em>), we focused on <em>what</em> to build and <em>why</em>: problem validation, scope, prioritisation, and product mindset.</p><p>From now on, we&#8217;ll focus on <em>how</em> to build an MVP in practice &#8212; day by day, release by release &#8212; without falling into over-engineering or local-only development traps.</p><p>And we start with the most important principle of all.</p><div><hr></div><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>Many teams start building an MVP by working locally for weeks &#8212; sometimes months.</p><p>They design architecture diagrams, define modules, add abstractions, and keep piling up features. Everything works fine on their laptops. Tests pass. Demos look great.</p><p>Then, close to the &#8220;launch&#8221;, reality hits:</p><ul><li><p>Deployment is complex and fragile</p></li><li><p>Infrastructure assumptions don&#8217;t hold</p></li><li><p>Environment differences break things</p></li><li><p>Authentication, networking, secrets, permissions were &#8220;postponed&#8221;</p></li><li><p>Architectural decisions made months ago are hard to revisit</p></li><li><p>Nobody clearly remembers <em>why</em> certain choices were made</p></li></ul><p>The real problem here is not technical skill: is <strong>timing</strong>.</p><p>Architecture, infrastructure, and delivery decisions were made <em>without being validated in production</em>. And production is where systems actually exist.</p><p>This is exactly what the <strong>walking skeleton</strong> is meant to prevent.</p><div><hr></div><h2><strong>&#9889; Why It Matters</strong></h2><p>An MVP is not real until it runs in production.</p><p>A walking skeleton is the smallest possible system that:</p><ul><li><p>Runs end-to-end</p></li><li><p>Is deployable automatically</p></li><li><p>Touches all major architectural components</p></li><li><p>Can evolve incrementally</p></li></ul><p>Starting from a walking skeleton matters because:</p><h3><strong>1. Architecture must be validated, not imagined</strong></h3><p>Architectural choices are hypotheses.</p><p>If they are not exercised in production early, you are just guessing.</p><h3><strong>2. Production feedback is different from local feedback</strong></h3><p>Latency, configuration, secrets, permissions, build pipelines &#8212; none of these behave like local environments.</p><h3><strong>3. Early deployment reduces cognitive load</strong></h3><p>Shipping small pieces frequently keeps decisions fresh.</p><p>You don&#8217;t &#8220;rediscover&#8221; complexity months later.</p><h3><strong>4. Evolutionary architecture requires evolution points</strong></h3><p>Architecture that evolves needs <strong>real release cycles</strong>.</p><p>Without production releases, nothing evolves &#8212; it just accumulates.</p><h3><strong>5. The cost of change is lowest at the beginning</strong></h3><p>Fixing a bad assumption after one week is cheap.</p><p>Fixing it after three months is painful &#8212; or impossible.</p><div><hr></div><h2><strong>&#128736; How We Solve It: Build a Walking Skeleton</strong></h2><p>A walking skeleton is not a feature.</p><p>It&#8217;s a <strong>delivery-first strategy</strong>.</p><p>Here&#8217;s a practical way to approach it.</p><div><hr></div><h3><strong>1. Start with deployment, not features</strong></h3><p>Before building &#8220;real functionality&#8221;, answer one question:</p><blockquote><p><em>Can we deploy something, end-to-end, to production?</em></p></blockquote><p>If your system has frontend and backend, treat them independently &#8212; but deploy both.</p><p><strong>Example:</strong></p><ul><li><p>Frontend: a minimal &#8220;Hello World&#8221; page</p></li><li><p>Backend: a minimal &#8220;Hello World&#8221; API</p></li><li><p>CI pipeline: build &#8594; test &#8594; deploy</p></li><li><p>Infrastructure: minimal, boring, explicit</p></li></ul><p>No business logic yet.</p><p>No users yet.</p><p>Just a system that exists in production.</p><div><hr></div><h3><strong>2. Grow the skeleton one slice at a time</strong></h3><p>Once the skeleton is alive, evolve it incrementally.</p><p><strong>Backend example:</strong></p><ol><li><p>Deploy a basic API</p></li><li><p>Add a database</p></li><li><p>Deploy again</p></li><li><p>Add one endpoint that reads real data</p></li><li><p>Deploy again</p></li><li><p>Add authentication</p></li><li><p>Deploy again</p></li><li><p>Add a sample test</p></li><li><p>Add test execution to pipeline</p></li><li><p>Deploy again</p></li></ol><p><strong>Frontend example:</strong></p><ol><li><p>Deploy static UI</p></li><li><p>Call the real API</p></li><li><p>Render real data</p></li><li><p>Handle loading/errors</p></li><li><p>Deploy each step</p></li><li><p>Add a sample test</p></li><li><p>Add test execution to pipeline</p></li><li><p>Deploy again</p></li></ol><p>Each step:</p><ul><li><p>Small</p></li><li><p>Reversible</p></li><li><p>Validated in production</p></li></ul><p>No big-bang releases.</p><div><hr></div><h3><strong>3. Treat infrastructure as part of the MVP</strong></h3><p>Infrastructure is not &#8220;later work&#8221;.</p><p>In an MVP:</p><ul><li><p>CI/CD is part of the product</p></li><li><p>Deployment scripts are part of the product</p></li><li><p>Environment configuration is part of the product</p></li></ul><p>A walking skeleton ensures infrastructure evolves <strong>with</strong> features, not against them.</p><div><hr></div><h3><strong>4. Let architecture emerge from real needs</strong></h3><p>Don&#8217;t design for scale you don&#8217;t have.</p><p>Instead:</p><ul><li><p>Start with the simplest structure that works</p></li><li><p>Add boundaries only when pressure appears</p></li><li><p>Refactor when reality forces your hand</p></li></ul><p>This is <strong>evolutionary architecture</strong> in practice:</p><ul><li><p>Architecture grows as the system grows</p></li><li><p>Decisions are driven by usage, not fear</p></li><li><p>Complexity is earned, not assumed</p></li></ul><div><hr></div><h3><strong>5. Release continuously, even when it feels &#8220;too small&#8221;</strong></h3><p>Releasing a &#8220;tiny change&#8221; is not wasteful.</p><p>Not releasing is.</p><p>Every release:</p><ul><li><p>Validates assumptions</p></li><li><p>Exercises the pipeline</p></li><li><p>Keeps the system honest</p></li><li><p>Builds confidence in delivery</p></li></ul><p>If you can&#8217;t release today, you&#8217;re already late.</p><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><ul><li><p>Early releases expose rough edges &#8212; but hide nothing</p></li><li><p>A walking skeleton may feel &#8220;slow&#8221; initially &#8212; but prevents massive rework</p></li><li><p>Minimal infrastructure feels naive &#8212; until it saves you weeks later</p></li><li><p>Frequent deployments require discipline &#8212; but reduce risk</p></li><li><p>You may throw code away &#8212; but you avoid throwing the whole system away</p></li></ul><p>This is a conscious trade:</p><p><strong>short-term discomfort for long-term speed</strong>.</p><div><hr></div><h2><strong>&#128640; Next Steps (Tomorrow Morning)</strong></h2><p>If you&#8217;re starting an MVP &#8212; or already building one:</p><ol><li><p>Ask: <em>Can we deploy something end-to-end today?</em></p><p>If not, stop adding features and fix that first.</p></li><li><p>Create a minimal CI/CD pipeline for frontend and backend, even if the app does nothing useful yet.</p></li><li><p>Plan your next features as <strong>production-ready thin slices</strong>, not local-only chunks.</p></li><li><p>Treat every architectural decision as provisional until exercised in production.</p></li></ol><div><hr></div><p><em>Which architectural decision in your MVP hasn&#8217;t been tested in production yet?</em></p><p><em>Reply to this email &#8212; I&#8217;ll help you stress-test it with a simple walking skeleton example on LinkedIn.</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – Best Practices for Defining and Planning an MVP]]></title><description><![CDATA[A practical summary of everything we covered in the &#8220;First Steps&#8221; section &#8212; the principles, mindsets, and techniques that help teams build an MVP that ships fast and sets an effective foundation.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-832</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 02 Dec 2025 07:15:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ebnf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3>&#9193; Section 1 - First steps: Idea, Validation, MVP</h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419; Chapter 1 &#8211; How to Decide What Goes In and What Stays Out of the MVP</a></strong></p><p><strong>2&#65039;&#8419; <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b">Chapter 2 &#8211; Simple Solutions First</a></strong></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd">3&#65039;&#8419;</a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd"> Chapter 3 &#8211; Fake it &#8216;till You make it</a> </strong></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb">4&#65039;&#8419; Chapter 4 &#8211; Validating the problem/opportunity or the solution?</a></strong></p><p><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8">5&#65039;&#8419;</a></em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8"> Chapter 5 &#8211; Prioritizing Features (with Stakeholders)</a></strong></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-056">6&#65039;&#8419; Chapter 6 &#8211; Implementing core and nice to have features</a></strong></em></p><p><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-d58">7&#65039;&#8419; </a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-d58">Chapter 7 &#8211; Managing internal expectations</a></strong></em></p><p><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-f60">8&#65039;&#8419; </a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-f60">Chapter 8 &#8211; Keeping MVP Scope Alive While Building</a></strong></em></p><p><em>9&#65039;&#8419; <strong>Chapter 9 &#8211; </strong></em><strong>Best Practices for Defining and Planning an MVP</strong><em><strong> &#8594; You&#8217;re here.</strong></em></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419;</a></strong>0&#65039;&#8419; Chapter 10 &#8211; Working skeleton: pipeline first &#8594; Coming on January 13th, the first chapter of the new section: Building the MVP!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Ebnf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Ebnf!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ebnf!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ebnf!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ebnf!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Ebnf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:766702,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/180409864?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Ebnf!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ebnf!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ebnf!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ebnf!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6db35d57-6ee2-4872-8d55-c14fb82f432b_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Why an MVP Needs Method, Not Guesswork</strong></h2><p>Planning an MVP is not about shrinking a big product idea into a small version.</p><p>It&#8217;s about <strong>identifying the minimum set of features that validate the solution</strong>, delivered in the fastest, simplest, most learning-oriented way possible.</p><p>Over the past chapters, we explored the decisions that make or break this process.</p><p>This final issue summarises them into a set of actionable best practices &#8212; a checklist you can return to any time you start a new product or feature initiative.</p><div><hr></div><h2><strong>&#129517; Best Practices for Defining and Planning an MVP</strong></h2><p>Here&#8217;s the complete toolkit we&#8217;ve explored so far.</p><div><hr></div><h3><strong>1. Start with the problem, not the product</strong></h3><p>Before thinking about features, validate that:</p><ul><li><p>The problem is <em>real</em></p></li><li><p>It is <em>painful</em></p></li><li><p>It happens <em>often enough</em></p></li><li><p>The target users <em>care</em></p></li><li><p>There&#8217;s a clear opportunity to solve it</p></li></ul><p>Use low-cost validation: interviews, simple landing pages, surveys, manual workflows, ads, and AI-assisted insight clustering.</p><p>Do not define the solution until the problem is strong and proven.</p><div><hr></div><h3><strong>2. Make your hypothesis explicit</strong></h3><p>Every MVP begins with:</p><blockquote><p><strong>&#8220;We believe that [segment] has [problem], and that [solution] will solve it.&#8221;</strong></p></blockquote><p>If this cannot be formulated clearly, the MVP will fail by definition.</p><p>This is your compass for every decision.</p><div><hr></div><h3><strong>3. Identify the core feature (and keep it sacred)</strong></h3><p>The core feature is the <strong>one action</strong> the user must take to experience the product&#8217;s value.</p><p>Everything else is supporting detail.</p><p>Rules:</p><ul><li><p>If it does not directly validate the hypothesis &#8594; it&#8217;s out</p></li><li><p>If it can be postponed &#8594; postpone it</p></li><li><p>If it can be simplified &#8594; simplify it</p></li></ul><p>A bloated MVP is not an MVP.</p><div><hr></div><h3><strong>4. Separate core features from nice-to-haves</strong></h3><p>A simple but powerful rule:</p><ul><li><p><strong>Core = essential to validation</strong></p></li><li><p><strong>Nice-to-have = everything else</strong></p></li></ul><p>Nice-to-haves don&#8217;t belong in an MVP.</p><p>If you really must include one, build the simplest possible version and expect to rebuild it later.</p><div><hr></div><h3><strong>5. Use the &#8220;fake it till you make it&#8221; principle intentionally</strong></h3><p>Automation is expensive.</p><p>Validation is cheap.</p><p>Any non-critical operational flow can initially be:</p><ul><li><p>Manual (email, spreadsheet, form submission)</p></li><li><p>Semi-automated (Zapier, n8n, Make, Bubble, Softr)</p></li><li><p>Simulated (Wizard-of-Oz prototype)</p></li></ul><p>Every hour you don&#8217;t spend on early automation is an hour you can spend learning.</p><div><hr></div><h3><strong>6. Choose technologies that maximise speed and feedback</strong></h3><p>The best tech stack for an MVP is the one the team can:</p><ul><li><p>Build quickly</p></li><li><p>Maintain without effort</p></li><li><p>Deploy continuously</p></li><li><p>Adapt without friction</p></li><li><p>Throw away if needed</p></li></ul><p>Use tools you know, explore new technologies only if they significantly reduce time-to-learn.</p><p>Keep architecture minimal and reversible.</p><div><hr></div><h3><strong>7. Build an architecture that can evolve</strong></h3><p>The architecture itself can be an MVP &#8212; a walking skeleton:</p><ul><li><p>One repo</p></li><li><p>One deploy pipeline</p></li><li><p>One vertical slice working end-to-end</p></li><li><p>Minimal abstractions</p></li><li><p>Everything replaceable</p></li></ul><p>Avoid premature modularisation, microservices, or heavy orchestration.</p><p>You don&#8217;t need scale before having users.</p><div><hr></div><h3><strong>8. Prioritise by impact, not effort</strong></h3><p>Effort estimates do not help prioritisation.</p><p>Impact (on validation) is the only variable that matters.</p><p>A feature that requires a week can be more important than one that takes a day if it&#8217;s essential to proving the solution.</p><p>Impact decides order.</p><p>Effort only informs slicing.</p><div><hr></div><h3><strong>9. Keep scope alive throughout development</strong></h3><p>Scope is not a static document.</p><p>It&#8217;s a hypothesis that evolves through daily learning.</p><p>To keep it alive:</p><ul><li><p>Turn standups into alignment sessions, not status reports</p></li><li><p>Re-evaluate priorities continuously</p></li><li><p>Update the scope weekly</p></li><li><p>Cut scope as soon as risks or delays appear</p></li><li><p>Replace expensive features with manual or low-code versions when needed</p></li></ul><p>Sticking to outdated scope is not discipline &#8212; it&#8217;s waste.</p><div><hr></div><h3><strong>10. Communicate constantly and transparently</strong></h3><p>Internal alignment is a core part of MVP success.</p><p>Use:</p><ul><li><p>A lightweight public roadmap</p></li><li><p>A simple idea intake process</p></li><li><p>Weekly learning updates</p></li><li><p>Decision logs (reversible vs irreversible choices)</p></li><li><p>Shared expectations with stakeholders</p></li></ul><p>Clarity reduces noise, prevents scope creep, and keeps focus on validation.</p><div><hr></div><h3><strong>11. Slice features vertically</strong></h3><p>A thin vertical slice is always better than multiple incomplete horizontal layers.</p><p>Each slice should include:</p><ul><li><p>Minimum UI</p></li><li><p>Minimum backend</p></li><li><p>Minimum workflow</p></li><li><p>Full deployment path</p></li></ul><p>If it doesn&#8217;t run end-to-end, it doesn&#8217;t teach you anything.</p><div><hr></div><h3><strong>12. Document decisions, not just features</strong></h3><p>A good MVP doc includes:</p><ul><li><p>The hypothesis</p></li><li><p>The core feature</p></li><li><p>The IN/OUT list</p></li><li><p>The rationale behind exclusions</p></li><li><p>Scope changes over time</p></li><li><p>Reversible vs irreversible decisions</p></li><li><p>What you expect to learn</p></li></ul><p>Documentation builds confidence, alignment, and speed.</p><div><hr></div><h2><strong>&#127873; Outro &#8212; End of Year &amp; Teaser for What&#8217;s Next</strong></h2><p>With this chapter, we close the first section of the Practical Handbook:</p><p><strong>First Steps: Idea, Validation, MVP.</strong></p><p>We talked about problem validation, core features, prioritisation, fake-it-till-you-make-it, scope management, and everything needed to <em>plan</em> an MVP that delivers learning instead of waste.</p><p>After the holidays, we&#8217;ll enter the second section:</p><h3><strong>&#8220;Building the MVP&#8221;</strong></h3><p>where we&#8217;ll go hands-on with topics like:</p><ul><li><p><strong>Walking Skeletons:</strong> getting your first end-to-end flow running</p></li><li><p><strong>Architecture That Can Evolve:</strong> making choices that don&#8217;t trap you</p></li><li><p><strong>Releasing in Thin Slices:</strong> shipping value continuously</p></li><li><p><strong>Simplifying Without Lowering Quality:</strong> how TDD and CI help MVP velocity</p></li><li><p><strong>How to Avoid Over-engineering During Build</strong></p></li></ul><p>A different section, with more examples, more code, and more real product stories.</p><p><em><strong>Have a great end of the year &#8212; see you in January with the next chapter.</strong></em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – Keeping MVP Scope Alive While Building]]></title><description><![CDATA[An MVP scope isn&#8217;t a frozen document &#8212; it&#8217;s a living system. Here&#8217;s how to keep it healthy through daily decisions, evolving priorities, and real-time feedback.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-f60</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-f60</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 25 Nov 2025 07:15:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4vJK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3>&#9193; Section 1 - First steps: Idea, Validation, MVP</h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419; Chapter 1 &#8211; How to Decide What Goes In and What Stays Out of the MVP</a></strong></p><p><strong>2&#65039;&#8419; <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b">Chapter 2 &#8211; Simple Solutions First</a></strong></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd">3&#65039;&#8419;</a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd"> Chapter 3 &#8211; Fake it &#8216;till You make it</a> </strong></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb">4&#65039;&#8419; Chapter 4 &#8211; Validating the problem/opportunity or the solution?</a></strong></p><p><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8">5&#65039;&#8419;</a></em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8"> Chapter 5 &#8211; Prioritizing Features (with Stakeholders)</a></strong></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-056">6&#65039;&#8419; Chapter 6 &#8211; Implementing core and nice to have features</a></strong></em></p><p><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-d58">7&#65039;&#8419; </a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-d58">Chapter 7 &#8211; Managing internal expectations</a></strong></em></p><p><em>7&#65039;&#8419; <strong>Chapter 8 &#8211; Keeping MVP Scope Alive While Building &#8594; You&#8217;re here.</strong></em></p><p><em>8&#65039;&#8419; Chapter 9 &#8211; Technical and generic suggestions to develop an MVP effectively &#8594; Coming next week, the final chapter of the first section!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!4vJK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!4vJK!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!4vJK!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!4vJK!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4vJK!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!4vJK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:756041,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/179815831?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!4vJK!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!4vJK!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!4vJK!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4vJK!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d67c0ba-d796-49fd-9e85-89a864ab7490_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>On paper, the MVP scope looked perfect: a clean list of features, prioritised and documented. But two weeks into development, reality kicks in:</p><ul><li><p>A feature takes longer than predicted</p></li><li><p>A dependency appears out of nowhere</p></li><li><p>A stakeholder adds &#8220;just one more thing&#8221;</p></li><li><p>The team uncovers new learning that affects the plan</p></li><li><p>The deadline stays still while complexity grows</p></li></ul><p>If the scope stays static while reality changes, teams start drifting.</p><p>They either:</p><p><strong>(a)</strong> try to force the original plan (and burn out)</p><p><strong>(b)</strong> start improvising solutions (and lose the MVP&#8217;s purpose)</p><p><strong>(c)</strong> deliver everything except the core value (and fail to validate the solution)</p><p>At the root of the problem is a misconception:</p><blockquote><p><strong>Scope is not a contract. Scope is a hypothesis.</strong></p></blockquote><p>And hypotheses evolve as you learn.</p><p><strong>The MVP scope must stay alive.</strong></p><p>It must adapt to new information, feedback, blockers, discoveries, and actual velocity.</p><p>This requires two things:</p><ol><li><p><strong>Effective daily communication</strong> (not status reporting)</p></li><li><p><strong>A willingness to re-prioritise fast</strong> when the plan no longer matches reality</p></li></ol><p>Static scope creates static teams.</p><p>Living scope sustains learning.</p><div><hr></div><h2><strong>&#9889; Why It Matters</strong></h2><p>Keeping the MVP scope alive is what separates teams that ship in 30&#8211;60 days from those that sink into six-month &#8220;MVPs&#8221; that are no longer minimal nor viable.</p><p>Here&#8217;s why this chapter is critical:</p><h3><strong>1. The goal of an MVP is to validate a solution, not to complete a checklist</strong></h3><p>If new learning changes what matters, the scope must change with it.</p><p>Rigid scope kills outcomes.</p><h3><strong>2. Scope that doesn&#8217;t move becomes a lie everyone works around</strong></h3><p>Teams pretend everything is fine until the final week&#8230;</p><p>&#8230;then cut features in panic mode, damaging quality and credibility.</p><h3><strong>3. Daily standups are your scope-maintenance engine</strong></h3><p>A good standup is not a <em>status update</em>.</p><p>It is:</p><ul><li><p>What do we need to move closer to the MVP goal today?</p></li><li><p>What is blocking us from validating the solution?</p></li><li><p>Does our current plan still make sense?</p></li><li><p>Should we drop or &#8220;simplify-to-learn&#8221; something?</p></li></ul><p>Done right, standups surface the truth early.</p><h3><strong>4. Priorities shift &#8212; and that&#8217;s healthy</strong></h3><p>New information = new priorities.</p><p>Same goal, new path.</p><h3><strong>5. A living scope protects your timeline</strong></h3><p>If the deadline is fixed (MVPs usually are), the only flexible variable is scope.</p><p>And the earlier you adjust it, the cheaper it is.</p><div><hr></div><h2><strong>&#128736; How We Solve It</strong></h2><p>Here&#8217;s the practical, product-first, engineering-aware playbook.</p><div><hr></div><h3><strong>1. Turn standups into daily alignment, not reporting</strong></h3><p>Bad standup:</p><blockquote><p>&#8220;What I did yesterday, what I&#8217;ll do today, blockers.&#8221;</p><p>Sounds good, teaches nothing, aligns nobody.</p></blockquote><p>Great standup:</p><ul><li><p>What is the <strong>next slice</strong> needed to validate the MVP?</p></li><li><p>Are we still on track to validate the core feature?</p></li><li><p>Do we need to simplify something today?</p></li><li><p>Did we learn something yesterday that affects priorities?</p></li><li><p>Are we working on the right thing <em>right now</em>?</p></li><li><p>What progress do we expect to achieve today?</p></li></ul><p>Use a shared Notion/Linear page titled:</p><p><strong>&#8220;Today&#8217;s focus to reach MVP validation&#8221;</strong></p><p>Updated collaboratively every morning.</p><p>AI can help:</p><ul><li><p>Slack standup summaries via <strong>Standuply</strong>, <strong>DailyBot</strong>, <strong>tl;dv</strong></p></li><li><p>AI clustering of blockers or repeated themes</p></li><li><p>Automatic scope update suggestions (&#8220;this item has been blocked for 3 days &#8212; consider moving it down or simplifying it&#8221;)</p></li></ul><div><hr></div><h3><strong>2. Keep the scope visible and editable</strong></h3><p>Scope should not live in a static document.</p><p>It must be visible <strong>every single day</strong>.</p><p>Use tools like:</p><ul><li><p><strong>Linear cycles</strong> with IN / OUT list</p></li><li><p><strong>Notion Kanban</strong> dedicated to MVP scope</p></li><li><p><strong>Coda</strong> with live tags and reasoning</p></li><li><p><strong>Figma FigJam</strong> for visual scoping</p></li></ul><p>Every day:</p><ul><li><p>Update status</p></li><li><p>Drop items</p></li><li><p>Move things to &#8220;Maybe Later&#8221;</p></li><li><p>Reorder priorities</p></li><li><p>Add small &#8220;fake-it&#8221; or &#8220;manual-first&#8221; cards</p></li></ul><p>Scope is not sacred.</p><p>Validation is.</p><div><hr></div><h3><strong>3. Re-prioritise continuously &#8212; not once per sprint</strong></h3><p>If you realise on day 7 that Feature C is too big&#8230;</p><p>Don&#8217;t wait for sprint planning.</p><p>Move it out, simplify it, or replace it with a manual version.</p><p><strong>Impact dictates priorities, not effort.</strong></p><p>A good rule:</p><ul><li><p>If a feature is not essential for validation &#8594; it is optional</p></li><li><p>If something becomes more important after learning &#8594; move it up</p></li><li><p>If something becomes less relevant &#8594; move it down or out</p></li></ul><p>You&#8217;re not &#8220;breaking the plan&#8221;.</p><p>You&#8217;re <strong>refining the hypothesis</strong>.</p><div><hr></div><h3><strong>4. Scope cuts are not failures &#8212; they&#8217;re strategic</strong></h3><p>When the team realises a scope cut is needed, they often hesitate:</p><p>&#8220;It feels like giving up.&#8221;</p><p>&#8220;It looks bad to stakeholders.&#8221;</p><p>&#8220;It feels like rework.&#8221;</p><p>But scope reductions done early are signs of maturity.</p><p>Types of positive scope cuts:</p><ul><li><p>Cutting a feature entirely</p></li><li><p>Replacing it with a manual operation</p></li><li><p>Shipping an ultra-simplified version</p></li><li><p>Using a low-code/no-code version first</p></li><li><p>Deprioritising a nice-to-have</p></li></ul><p>If quality validation remains intact, the cut is a win.</p><p>Use tools like:</p><ul><li><p><strong>Zapier</strong>, <strong>Make</strong>, <strong>n8n</strong> &#8594; to automate manually first</p></li><li><p><strong>Bubble</strong>, <strong>Softr</strong>, <strong>Glide</strong> &#8594; to deliver the skeleton of a feature</p></li><li><p><strong>Figma &#8594; AI &#8594; code</strong> to prototype faster</p></li><li><p><strong>Google Sheets</strong> as backend for simple flows</p></li></ul><p>Scope is a cost.</p><p>Cuts save time, reduce waste, and increase learning speed.</p><div><hr></div><h3><strong>5. If you didn&#8217;t prioritise well before development &#8212; fix it now</strong></h3><p>Sometimes teams start building before the MVP is fully sliced.</p><p>When this happens, acknowledge reality:</p><blockquote><p>&#8220;We should have prioritised earlier. So let&#8217;s do it now.&#8221;</p></blockquote><p>Steps:</p><ul><li><p>Run a <strong>quick prioritisation session</strong> using Impact over Effort</p></li><li><p>Tag each feature Core vs. Nice-to-Have</p></li><li><p>Move Nice-to-Haves to &#8220;out&#8221; unless they provide immediate learning</p></li><li><p>Rescope Core features (simplify further if needed)</p></li><li><p>Align with stakeholders (send a short summary, not a meeting)</p></li></ul><p>Late prioritisation is not ideal, but better late than never.</p><div><hr></div><h3><strong>6. Use new information to update priorities &#8212; instantly</strong></h3><p>If yesterday&#8217;s learning invalidates Feature B &#8594; cut it.</p><p>If user interviews show a different pain &#8594; elevate the feature that addresses it.</p><p>If engineering discovers complexity &#8594; simplify or replace.</p><p>If timeline becomes tight &#8594; reduce scope before quality.</p><p>Remember:</p><p><strong>Learning events are scope-changing events.</strong></p><p>A living scope responds to reality &#8212; not to the initial plan.</p><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><ul><li><p>A living scope requires constant communication &#8212; but reduces panic later</p></li><li><p>Re-prioritisation may frustrate some stakeholders &#8212; but protects the MVP&#8217;s purpose</p></li><li><p>Cutting scope reduces completeness &#8212; but increases learning</p></li><li><p>Fake-it versions reduce engineering effort &#8212; but increase manual work</p></li><li><p>Low-code patches move faster &#8212; but must be reviewed post-MVP</p></li></ul><p>You trade comfort for clarity.</p><p>Stability for truth.</p><p>Completeness for validation.</p><div><hr></div><h2><strong>&#128640; Next Steps (Tomorrow Morning)</strong></h2><ol><li><p>Open your current MVP board. Tag everything as:</p><ul><li><p>Core for validation</p></li><li><p>Optional for delight</p></li><li><p>Manual-first candidate</p></li><li><p>Low-code candidate</p></li><li><p>Out</p></li></ul></li><li><p>Rewrite your standup to be goal-focused:</p><ul><li><p>&#8220;What helps us validate today?&#8221;</p></li><li><p>&#8220;What blocks validation?&#8221;</p></li><li><p>&#8220;What can we simplify or cut?&#8221;</p></li><li><p>&#8220;What progress we expect today?&#8221;</p></li></ul></li><li><p>Review the bottom half of your scope list.</p><p>Move 50% of it out or convert into fake-it / no-code versions.</p></li></ol><p>Your MVP will instantly become lighter, faster, and more aligned.</p><div><hr></div><p><em>What part of your current MVP scope feels too heavy or over-engineered?</em></p><p><em>Reply to this email &#8212; I&#8217;ll help you simplify it in a Linkedin post.</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – Managing Internal Expectations]]></title><description><![CDATA[Clear internal communication is not a courtesy &#8212; it&#8217;s an essential ingredient for shipping fast, staying aligned, and protecting your MVP from uncontrolled scope and unrealistic assumptions.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-d58</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-d58</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 18 Nov 2025 07:15:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FHvV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3>&#9193; Section 1 - First steps: Idea, Validation, MVP</h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419; Chapter 1 &#8211; How to Decide What Goes In and What Stays Out of the MVP</a></strong></p><p><strong>2&#65039;&#8419; <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b">Chapter 2 &#8211; Simple Solutions First</a></strong></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd">3&#65039;&#8419;</a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd"> Chapter 3 &#8211; Fake it &#8216;till You make it</a> </strong></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb">4&#65039;&#8419; Chapter 4 &#8211; Validating the problem/opportunity or the solution?</a></strong></p><p><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8">5&#65039;&#8419;</a></em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8"> Chapter 5 &#8211; Prioritizing Features (with Stakeholders)</a></strong></p><p><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-056">6&#65039;&#8419; Chapter 6 &#8211; Implementing core and nice to have features</a></strong></em></p><p><em>7&#65039;&#8419; <strong>Chapter 7 &#8211; Implementing core and nice to have features &#8594; You&#8217;re here.</strong></em></p><p><em>8&#65039;&#8419; Chapter 8 &#8211; Keep the MVP scope alive during development &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!FHvV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!FHvV!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!FHvV!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!FHvV!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FHvV!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!FHvV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:756483,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/179159481?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!FHvV!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!FHvV!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!FHvV!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FHvV!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd483cf-63ce-4a99-80dc-791b6656bf54_2240x1260.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 aria-hidden="true" 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><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><h2><strong>&#128270; Scenario / Pain Point</strong></h2><p>You&#8217;re in the middle of building an MVP. Engineering is focused, product is slicing scope, the walking skeleton is in motion. But around you? Confusion.</p><p>Sales expects one set of features. Marketing expects another. Support has a list of urgent needs. The CEO sends you a Slack message at 23:00 asking, &#8220;Where are we with X?&#8221;</p><p>It&#8217;s not that these expectations are unreasonable &#8212; it&#8217;s that <strong>expectations were never explicitly set</strong>, so everyone fills the silence with their own assumptions.</p><p>This creates a familiar pattern inside many startups:</p><ul><li><p>The product team moves with a hypothesis-driven roadmap&#8230; but stakeholders assume feature-driven delivery.</p></li><li><p>Ideas enter the system in every possible way (meetings, Slack DMs, phone calls) with no visible intake or decision-making process.</p></li><li><p>&#8220;When will feature X be ready?&#8221; becomes the only conversation, instead of &#8220;What are we validating right now and why?&#8221;</p></li></ul><p>The result:</p><ul><li><p>The roadmap gets interpreted as a fixed promise instead of a directional narrative.</p></li><li><p>The MVP scope inflates to satisfy unspoken expectations.</p></li><li><p>Engineering becomes reactive instead of learning-driven.</p></li><li><p>Stakeholders lose trust because they feel ignored or vaguely updated.</p></li><li><p>Product loses leverage because decisions look arbitrary instead of transparent.</p></li></ul><p>The core issue is not misalignment &#8212; it&#8217;s <em>unmanaged expectations</em>.</p><p>The solution is not more process &#8212; it&#8217;s <em>better communication</em>.</p><div><hr></div><h2><strong>&#9889; Why It Matters</strong></h2><p>Managing internal expectations is not a &#8220;nice to have&#8221;. It&#8217;s foundational to shipping an MVP fast, confidently, and with company-wide support.</p><p>Here&#8217;s why:</p><h3><strong>1. Alignment drives speed</strong></h3><p>The organisation moves at the speed of its shared understanding.</p><p>A clear and visible roadmap reduces interruptions, resets expectations, and gives the whole company a single source of truth.</p><h3><strong>2. Transparency protects product autonomy</strong></h3><p>When stakeholders see the &#8220;why&#8221; behind decisions &#8212; including what&#8217;s <em>not</em> being built &#8212; they stop trying to overload the MVP with nice-to-haves.</p><p>The trade-offs become obvious instead of political.</p><h3><strong>3. Expectations shape behaviour</strong></h3><p>If the roadmap is seen as a contract, risk-taking dies.</p><p>If it&#8217;s seen as a learning plan, the team gains permission to experiment.</p><h3><strong>4. Clear communication improves trust</strong></h3><p>People rarely get angry at &#8220;no&#8221;&#8212;they get angry at silence.</p><p>A visible idea intake &#8594; review &#8594; outcome loop gives psychological safety: everyone knows their input is processed, even if not accepted.</p><h3><strong>5. It prevents &#8220;shadow roadmaps&#8221;</strong></h3><p>If you don&#8217;t provide an official roadmap, every stakeholder creates their own version &#8212; often outdated, unrealistic, or misaligned.</p><p>In short: <strong>expectations are a strategic lever</strong>. If you don&#8217;t manage them intentionally, they will manage you.</p><div><hr></div><h2><strong>&#128736; How We Solve It</strong></h2><p>Here&#8217;s an expanded, practical, tool-supported playbook for managing internal expectations inside a startup or product-led team.</p><div><hr></div><h3><strong>1. Publish a lightweight public roadmap (keep it simple)</strong></h3><p>The roadmap isn&#8217;t a project plan. It&#8217;s a <em>narrative artifact</em> that communicates priorities and the current learning focus.</p><p><strong>How to do it:</strong></p><ul><li><p>Create one page in <strong>Notion</strong>, <strong>Linear</strong>, <strong>Miro</strong>, or <strong>Coda</strong>.</p></li><li><p>Structure it using high-level buckets like &#8220;Now / Next / Later&#8221; or &#8220;Exploring / Building / Validating&#8221;.</p></li><li><p>Focus on themes, not features (&#8220;Improve onboarding&#8221; &gt; &#8220;Add OAuth login&#8221;).</p></li><li><p>Add a visible disclaimer:</p></li></ul><blockquote><p><em>&#8220;This roadmap expresses our current priorities and learning goals. It will evolve based on user feedback and validated learning.&#8221;</em></p></blockquote><ul><li><p>Use AI to automatically generate versions for different audiences (e.g., simplified for sales, detailed for internal devs).</p></li></ul><p><strong>What you avoid:</strong></p><ul><li><p>Feature promises you can&#8217;t keep</p></li><li><p>Misinterpretation of scope</p></li><li><p>Constant &#8220;what&#8217;s the status?&#8221; pings</p></li></ul><div><hr></div><h3><strong>2. Create a simple idea intake and feedback loop</strong></h3><p>Not a process. Not bureaucracy. Just one lightweight system that shows:</p><p><strong>idea &#8594; triage &#8594; decision &#8594; communication</strong>.</p><p><strong>Build it like this:</strong></p><ul><li><p>Use <strong>Tally</strong>, <strong>Google Forms</strong>, <strong>Typeform</strong>, or a <strong>Notion Form</strong>.</p></li><li><p>Ask for only 3 fields:</p><ol><li><p>What problem does this solve?</p></li><li><p>Who benefits?</p></li><li><p>Why now?</p></li></ol></li><li><p>Store submissions in a Notion or Airtable table.</p></li><li><p>Use Zapier / Make / n8n to auto-tag ideas (e.g., &#8220;growth&#8221;, &#8220;retention&#8221;, &#8220;support&#8221;).</p></li><li><p>Use AI weekly to summarise new ideas and cluster them by problem area.</p></li><li><p>Host a 15&#8211;20 minute biweekly evaluation with PM + Tech Lead.</p></li><li><p>For each idea, mark:</p><ul><li><p>In Scope</p></li><li><p>Later (parked)</p></li><li><p>Out (with rationale)</p></li></ul></li></ul><p><strong>Pro tip:</strong></p><p>Send an automated message back to the submitter (&#8220;Reviewed &#8212; here&#8217;s the outcome&#8221;).</p><p>Silence kills trust; transparency builds it.</p><div><hr></div><h3><strong>3. Use storytelling and metric-based updates</strong></h3><p>Stakeholders don&#8217;t want to understand your architecture &#8212; they want to understand your progress, risk, and learning.</p><p><strong>How to do it effectively:</strong></p><ul><li><p>Use Loom or Descript AI to record quick demos of thin slices or manual workflows.</p></li><li><p>Keep a &#8220;weekly update&#8221; in Notion or Slack:</p><ul><li><p>What we delivered</p></li><li><p>What we learned</p></li><li><p>What changed in the roadmap</p></li><li><p>What&#8217;s next</p></li></ul></li><li><p>Use AI summarisation to create short versions for Slack, email, sales, support.</p></li><li><p>Create a simple metrics dashboard using Looker Studio, Metabase, or even a Notion database (activation, retention, usage).</p></li></ul><p>This transforms your communication from reactive to proactive.</p><div><hr></div><h3><strong>4. Maintain expectation hygiene (be explicit)</strong></h3><p>Every commitment should include:</p><ul><li><p>What we&#8217;re building</p></li><li><p>What we&#8217;re not building</p></li><li><p>Why</p></li><li><p>When we expect to validate</p></li></ul><p>Use tools:</p><ul><li><p><strong>IN / OUT lists</strong> shared before every sprint or cycle.</p></li><li><p>A <strong>decision log</strong>: reversible vs irreversible decisions (two-way vs one-way doors).</p></li><li><p>AI-assisted summaries of decisions for non-technical stakeholders (&#8220;Rephrase this for sales&#8221;).</p></li></ul><p>This creates clarity and prevents scope creep disguised as &#8220;quick wins&#8221;.</p><div><hr></div><h3><strong>5. Celebrate the momentum (not just the walking skeleton)</strong></h3><p>You don&#8217;t need to celebrate only when something is fully shipped.</p><p>Celebrate <strong>learned, tested, validated, iterated, or unblocked</strong>.</p><p>Examples worth celebrating:</p><ul><li><p>The first end-to-end thin slice</p></li><li><p>A manual workflow that proves value before automation</p></li><li><p>The first user interaction with the prototype</p></li><li><p>A low-code automation replacing a manual task</p></li><li><p>A metric improving after an experiment</p></li></ul><p>Use AI tools to make celebration easier:</p><ul><li><p>Create micro-videos with Descript</p></li><li><p>Auto-generate update images with Gamma.ai</p></li><li><p>Turn logs into updates with Notion AI</p></li></ul><p>Momentum is contagious.</p><p>If you don&#8217;t show it, the organisation assumes you have none.</p><div><hr></div><h3><strong>6. Apply the same alignment inside the product+engineering team</strong></h3><p>Expectation misalignment isn&#8217;t only external &#8212; it&#8217;s internal too.</p><p><strong>Keep the team aligned:</strong></p><ul><li><p>Keep a shared Notion page with roadmap, priorities, rationale, and decisions</p></li><li><p>Use Slack bots + AI recaps (tl;dv, Clarity) to surface meeting outcomes</p></li><li><p>Revisit idea submissions during grooming so engineers see the full picture</p></li><li><p>Use retros to discuss where expectations went off track</p></li></ul><p>When engineers understand the &#8220;why&#8221;, everything accelerates.</p><div><hr></div><h2><strong>&#9878;&#65039; Trade-offs</strong></h2><ul><li><p>Too much detail overwhelms stakeholders; too little leaves them guessing.</p></li><li><p>A roadmap updated too often feels unstable; too rarely feels dead.</p></li><li><p>Too much process slows down speed; too little produces chaos.</p></li><li><p>Radical transparency is good &#8212; but must be curated for audience.</p></li><li><p>A great communication flow takes effort &#8212; but pays back in speed, trust, and sanity.</p></li></ul><div><hr></div><h2><strong>&#128640; Next Steps (tomorrow morning)</strong></h2><ol><li><p>Create a one-page internal &#8220;Product Communication Charter&#8221; in Notion, describing:</p><ul><li><p>How ideas come in</p></li><li><p>How decisions are made</p></li><li><p>How the roadmap is updated</p></li><li><p>How updates are shared</p></li></ul></li><li><p>Build a simple idea intake form in Google Forms or Tally. Connect it via Zapier to a Notion database.</p></li><li><p>Publish your first lightweight roadmap in Notion or Linear. Add the &#8220;subject to change based on validated learning&#8221; disclaimer. Share with the company.</p></li></ol><p>Do these 3 things and you&#8217;ll see your organisation shift from &#8220;What&#8217;s going on?&#8221; to &#8220;We&#8217;re aligned.&#8221;</p><div><hr></div><p><em>Where does expectation misalignment hurt you the most today &#8212; with stakeholders, or inside your team?</em></p><p><em>Reply and tell me. I&#8217;ll include a few anonymised examples in a Linkedin post.</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – implementing Core vs Nice-to-Have Features]]></title><description><![CDATA[What distinguishes a core feature from a nice-to-have &#8212; and how your tech and delivery choices should shift accordingly.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-056</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-056</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 11 Nov 2025 07:15:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tWXc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3>&#9193; Section 1 - First steps: Idea, Validation, MVP</h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419; Chapter 1 &#8211; How to Decide What Goes In and What Stays Out of the MVP</a></strong></p><p><strong>2&#65039;&#8419; <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b">Chapter 2 &#8211; Simple Solutions First</a></strong></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd">3&#65039;&#8419;</a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd"> Chapter 3 &#8211; Fake it &#8216;till You make it</a> </strong></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb">4&#65039;&#8419; Chapter 4 &#8211; Validating the problem/opportunity or the solution?</a></strong></p><p><em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8">5&#65039;&#8419;</a></em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8"> Chapter 5 &#8211; Prioritizing Features (with Stakeholders)</a></strong></p><p><em><strong>6&#65039;&#8419; Chapter 6 &#8211; Implementing core and nice to have features &#8594; You&#8217;re here.</strong></em></p><p><em>7&#65039;&#8419; Chapter 7 &#8211; Implementing core and nice to have features &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tWXc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tWXc!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!tWXc!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!tWXc!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tWXc!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tWXc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:757306,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/178451442?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!tWXc!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!tWXc!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!tWXc!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tWXc!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F235bf501-c565-4ecf-8ad3-920c261a7698_2240x1260.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 aria-hidden="true" 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><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><strong>&#128270; Scenario / Pain Point</strong></h3><p>When you&#8217;re launching an MVP, the feature wish-list grows fast: &#8220;Let&#8217;s add social login, analytics, multi-language, offline mode&#8230;&#8221; And while all these may look appealing, the real danger is that you bundle so many features that you lose sight of the MVP&#8217;s goal: validating the core value proposition.</p><p>Teams often treat all features as equal. They decide &#8220;Feature A = 3 days&#8221;, &#8220;Feature B = 4 days&#8221;, so why not do both? But if the &#8220;must-have&#8221; that actually solves the user&#8217;s main problem gets treated the same way as a &#8220;nice-to-have&#8221; decoration, you risk two things: First, you delay shipping something valuable. Second, you build complexity you&#8217;ll likely discard.</p><p>Technical teams also react differently depending on feature type. For core features, engineers may assume &#8220;we must do it perfectly&#8221;. For nice-to-haves, they may say &#8220;we&#8217;ll do a quick version, then fix&#8221;. The problem: quality trade-offs aren&#8217;t the same in both cases. A core feature with weak quality may undermine the product&#8217;s credibility; a nice-to-have with high quality wastes time and energy.</p><p>In startup mode, you often have only 30-60 days to deliver. The rest of the organisation moves fast. If your team tries to treat every feature as equal, you&#8217;ll slow down, scope will creep, and you&#8217;ll arrive at &#8220;MVP1&#8221; that looks like &#8220;v0.1 of full product&#8221; &#8212; and learn nothing. You need to clearly differentiate core vs nice-to-have <strong>before</strong> you design the system.</p><div><hr></div><h3><strong>&#9889; Why It Matters</strong></h3><p><strong>Core features</strong> are the ones without which your product doesn&#8217;t deliver value. They are the reason a user chooses you. <strong>Nice-to-haves</strong> add polish, differentiate, delight &#8212; but they don&#8217;t make or break your MVP.</p><p>Because of this distinction:</p><ul><li><p>The <strong>technical investment</strong> you&#8217;re willing to make changes. For core features you may accept higher engineering quality, better testing, even more robust architecture, because failure here means your product fails.</p></li><li><p>For nice-to-haves, you should treat them as optional or deferred. If you include them in the MVP, they should be <strong>minimal versions</strong>, with less testing, less polish &#8212; possibly even as manual or simulated features.</p></li><li><p>Treating all features equally means you allocate time and quality budget incorrectly. Many sources on MVPs emphasise avoiding feature-bloat and focusing on &#8220;must-have&#8221; elements.</p></li><li><p>Architecture must reflect this. Your system should prioritise the core features for reliability, simplicity, and scalability later; the nice-to-haves should live in less-rigorous territory until validated.</p></li></ul><p>In effect, distinguishing core vs nice-to-have lets you allocate your limited time, budget, and engineering capacity to what matters most. You increase your chance of learning something meaningful &#8212; instead of building a shiny toy.</p><div><hr></div><h3><strong>&#128736; How We Solve It</strong></h3><p>Here&#8217;s how to apply this distinction in practice:</p><ol><li><p><strong>Define core vs nice-to-have</strong></p><ul><li><p>Write down your feature list. For each feature ask: &#8220;Without this, can the user still derive our value proposition?&#8221; If no &#8594; core; if yes &#8594; nice-to-have.</p></li><li><p>Use frameworks like MoSCoW (Must/Should/Could/Won&#8217;t) or the 80/20 rule (20% of features deliver 80% of value) to formalise.</p></li></ul></li><li><p><strong>Adjust technical &amp; quality standards accordingly</strong></p><ul><li><p>For core features:</p><ul><li><p>Prioritise automated tests (unit + integration)</p></li><li><p>Deploy via CI/CD</p></li><li><p>Use an evolutionary architecture that allows growth but starts small (walking skeleton)</p></li></ul></li><li><p>For nice-to-have features:</p><ul><li><p>If included in MVP, build a <strong>minimal version</strong> (e.g., manual workflow, no automation)</p></li><li><p>Fewer tests, simpler design, faster to implement</p></li><li><p>Mark as &#8220;to revisit post-MVP&#8221;</p></li></ul></li></ul></li><li><p><strong>Use no-code/low-code and AI tools especially for nice-to-haves</strong></p><ul><li><p>Accept that if something is &#8220;nice, not core&#8221; you might build it with Bubble, Glide, or a Zapier workflow.</p></li><li><p>Use AI tools for prototyping: generate UI layouts, mock APIs, simulate feature behaviour. This reduces cost and speeds iteration.</p></li><li><p>Later, when usage is validated, you can decide to rewrite in code with full architecture. But treat that rewrite as a <strong>one-way door</strong> decision, and only after data supports it.</p></li></ul></li><li><p><strong>Document your decisions and scope</strong></p><ul><li><p>Maintain a feature register: each feature tagged with &#8220;Core / Nice-to-Have&#8221;, quality standard, implementation path (no-code/manual/auto).</p></li><li><p>Capture architecture choices: which modules, which tech stack, which parts are future bets.</p></li><li><p>This documentation keeps stakeholders aligned and allows you to defend quality trade-offs: &#8220;Yes, this feature is nice-to-have, so we&#8217;ll launch it manual and improve later.&#8221;</p></li></ul></li><li><p><strong>Review and iterate post-MVP</strong></p><ul><li><p>After launch, evaluate usage: are core features performing? Are nice-to-haves being used?</p></li><li><p>Based on data, decide which nice-to-have should be elevated to core, which should be deferred, and which should be removed.</p></li><li><p>Update your architecture accordingly: move features from no-code/manual to code only when justified.</p></li></ul></li></ol><div><hr></div><h3><strong>&#9878;&#65039; Trade-offs</strong></h3><ul><li><p><strong>Over-investing in nice-to-have features</strong> (quality, automation) steals cycles from life-or-death core features.</p></li><li><p><strong>Under-investing in core features</strong> means you deliver something unstable, users bounce, you miss the hypothesis.</p></li><li><p><strong>Manual/no-code flows for nice-to-haves</strong> work early, but if you never decide to rewrite them, you accumulate hidden technical debt and UX issues.</p></li><li><p><strong>Delaying architecture decisions</strong> is fine until you&#8217;ve validated. But delaying too much for core functionality may cause rework and slow down later growth.</p></li></ul><div><hr></div><h3><strong>&#128640; Next Steps (tomorrow morning)</strong></h3><ol><li><p>Categorise your current backlog: tag each feature as Core / Nice-to-Have and mark its planned quality standard (code/manual/no-code).</p></li><li><p>For each Core feature, ensure you have an end-to-end slice built, tested via CI, and deploy-ready. For each Nice-to-Have in MVP, plan a manual or no-code deliverable or defer it entirely.</p></li><li><p>Create a &#8220;feature queue&#8221; for Nice-to-Haves: set a trigger metric (e.g., 1,000 users or 20% adoption) before upgrading to full code. Store this queue in your documentation.</p></li></ol><div><hr></div><h3><strong>&#128206; Primary Resources</strong></h3><ul><li><p><a href="https://designli.co/blog/how-to-define-your-mvps-core-features?utm_source=chatgpt.com">Designli &#8212; </a><em><a href="https://designli.co/blog/how-to-define-your-mvps-core-features?utm_source=chatgpt.com">How to Define Your MVP&#8217;s Core Features</a></em></p></li><li><p><a href="https://decodifi.uk/insights/how-to-define-the-core-features-of-your-mvp?utm_source=chatgpt.com">Decodifi &#8212; </a><em><a href="https://decodifi.uk/insights/how-to-define-the-core-features-of-your-mvp?utm_source=chatgpt.com">How to Define the Core Features of Your MVP</a></em></p></li><li><p><a href="https://crowdbotics.com/posts/blog/how-to-know-which-features-you-should-or-shouldnt-include-in-mvp/?utm_source=chatgpt.com">Crowdbotics &#8212; </a><em><a href="https://crowdbotics.com/posts/blog/how-to-know-which-features-you-should-or-shouldnt-include-in-mvp/?utm_source=chatgpt.com">How to Know Which Features You Should (and Shouldn&#8217;t) Include in an MVP</a></em></p></li></ul><div><hr></div><p><em>Which feature in your current MVP list would you tag as &#8220;Nice-to-Have&#8221; and remove or convert to no-code for now? Reply and tell me &#8212; I&#8217;ll feature one example in the next issue.</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – Prioritizing Features with Stakeholders]]></title><description><![CDATA[Prioritisation isn&#8217;t about &#8220;least effort&#8221;; it&#8217;s about highest impact. Here&#8217;s why impact-led planning defines a sharp MVP scope &#8212; and how to lead stakeholders through it.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ae8</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 04 Nov 2025 07:15:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XU5J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3>&#9193; Section 1 - First steps: Idea, Validation, MVP</h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419; Chapter 1 &#8211; How to Decide What Goes In and What Stays Out of the MVP</a></strong></p><p><strong>2&#65039;&#8419; <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b">Chapter 2 &#8211; Simple Solutions First</a></strong></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd">3&#65039;&#8419;</a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd"> Chapter 3 &#8211; Fake it &#8216;till You make it</a> </strong></p><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb">4&#65039;&#8419; Chapter 4 &#8211; Validating the problem/opportunity or the solution? &#8594; </a></strong><em><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb">You&#8217;re here.</a></strong></em><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb"> </a></p><p><em>5&#65039;&#8419;</em><strong> Chapter 5 &#8211; Prioritizing Features (with Stakeholders) &#8594; </strong><em><strong>You&#8217;re here.</strong></em> </p><p><em>6&#65039;&#8419; Chapter 6 &#8211; Implementing core and nice to have features &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!XU5J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!XU5J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:766349,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/177190606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.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 aria-hidden="true" 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><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><strong>&#128270; Scenario / Pain Point</strong></h3><p>When building an MVP, countless feature ideas surface: &#8220;What about X?&#8221;, &#8220;Our competitor has Y&#8221;, &#8220;Let&#8217;s add Z now so we don&#8217;t rewrite later&#8221;. Without clear prioritisation, the backlog becomes a free-for-all, development drags, and the core goal of the MVP &#8212; validate the solution &#8212; gets buried under feature overload.</p><p>Worse: teams equate prioritisation with estimating effort. &#8220;This one is 3 days&#8221; vs &#8220;that one is 10 days&#8221;. But the real question is not how long; it&#8217;s how much value it delivers. If you spend 10 days on a low-impact feature because it was &#8220;easy&#8221;, you steal time from high-impact work that validates your hypothesis.</p><p>Stakeholders complicate things: marketing wants &#8220;delightful features&#8221;, product wants &#8220;nice to have&#8221;, sales demands &#8220;dashboard&#8221;. Without a structured prioritisation process, every voice becomes equal, and the MVP scope becomes uncontrolled.</p><p>When your MVP scope balloons, you risk missing your time box (30&#8211;60 days), losing the walking skeleton momentum, and delivering something that is feature-rich but value-poor. The team behind the scenes becomes slow, even though the business expects speed. This mismatch kills early product-developer credibility.</p><p>In short: Prioritisation is <strong>not</strong> optional. It&#8217;s the scaffold that lets you keep scope minimal, stay aligned with stakeholders, and focus on solving the right problem &#8212; not building everything.</p><div><hr></div><h3><strong>&#9889; Why It Matters</strong></h3><p>Prioritising features with purpose matters because it aligns three critical axes &#8212; value, time, and stakeholder trust &#8212; and transforms the MVP execution from a tactic into strategic validation:</p><ul><li><p><strong>Impact first, effort second</strong>. Frameworks like the Impact/Effort Matrix highlight that value to the user and business should outweigh raw development cost.</p></li><li><p><strong>Scope clarity equals speed</strong>. Prioritisation gives you a concrete IN list and an OUT list. When everyone understands what doesn&#8217;t get built &#8212; and why &#8212; scope discussions vanish and velocity rises.</p></li><li><p><strong>Stakeholder alignment</strong>. Using prioritisation frameworks makes discussions observable and objective. It prevents &#8220;<em>my pet feature</em>&#8221; wins and forces trade-offs to be explicit.</p></li><li><p><strong>Validating what matters</strong>. You prioritise <strong>features that test your hypothesis</strong>, not features that fill up your backlog. This focus ensures the MVP remains a learning tool, not just a busy box.</p></li><li><p><strong>Avoiding the effort trap</strong>. Estimations are inherently unreliable early on; relying on them to prioritise is a mistake. A feature may be tagged &#8220;low effort&#8221; but deliver zero value; or &#8220;high effort&#8221; yet unlock major learning. Practice shows impact drives outcomes more than effort prediction.</p></li></ul><p>In essence: a well-prioritised backlog is your control panel. Without it, you are blind.</p><div><hr></div><h3><strong>&#128736;&#65039; How We Solve It</strong></h3><p>Here are practical steps you can apply to prioritise features with stakeholders &#8212; keeping the focus on impact, not development effort.</p><ol><li><p><strong>Set the prioritisation criteria upfront</strong>.</p><ul><li><p>Define what &#8220;impact&#8221; means for the MVP: e.g., number of users adopting the feature, revenue potential in 3 months, reduction of manual work by X%.</p></li><li><p>Agree on &#8220;ease&#8221; or &#8220;cost&#8221; but treat it as context, not decision driver.</p></li></ul></li><li><p><strong>Choose a prioritisation framework</strong>.</p><ul><li><p>Use <strong>Impact/Effort Matrix</strong> to visualise features: high-impact low-effort go first.</p></li><li><p>Use <strong>MoSCoW</strong> (Must/Should/Could/Won&#8217;t) to classify features quickly.</p></li><li><p>Avoid <strong>RICE</strong> (Reach, Impact, Confidence, Effort) and any other effort-based approach.</p></li><li><p>Choose the tool that suits your team&#8217;s maturity. The goal: drive alignment and speed, not debate forever.</p></li></ul></li><li><p><strong>Lead stakeholder workshops with structure</strong>.</p><ul><li><p>Pre-work: send a one-pager describing the MVP goal, core hypothesis, list of candidate features with business/user context.</p></li><li><p>Workshop format:</p><ul><li><p>For each feature: ask &#8220;What problem does this solve?&#8221;, &#8220;How many users will this impact?&#8221;, &#8220;How will we know it worked?&#8221;</p></li><li><p>Plot features on Impact/Effort grid live.</p></li><li><p>Build consensus on the IN list (top quadrant) and the OUT list (low impact or high cost).</p></li></ul></li><li><p>Document decisions real-time. Distribute the &#8220;IN/OUT&#8221; list after the workshop.</p></li></ul></li><li><p><strong>Keep &#8220;effort&#8221; estimates as context, not ranking criteria</strong>.</p><ul><li><p>When someone argues &#8220;but this takes 2 days vs 10 days&#8221;, respond: &#8220;Okay &#8211; but will it move the metric we care about more than others?&#8221;</p></li><li><p>Highlight that effort is uncertain and shouldn&#8217;t delay high-impact work. The feature&#8217;s priority is based on impact.</p></li></ul></li><li><p><strong>Embed no/low-code and AI tools into the prioritisation conversation</strong>.</p><ul><li><p>Highlight features that can be prototyped with no-code (e.g., Carrd, Bubble) or AI (e.g., GPT-4 prototype, Figma-generated UI) as <strong>low-investment experiments</strong>.</p></li><li><p>Use these quick prototypes to validate value before coding full solutions. Features that succeed via no-/low-code often get built later in code with stronger evidence.</p></li><li><p>During workshop: add a column &#8220;Prototype possible?&#8221; (Y/N). Those yes entries get fast-tracked for learning.</p></li></ul></li><li><p><strong>Revisit decisions frequently</strong>.</p><ul><li><p>Prioritisation is not once-and-done. As you gather feedback, metrics may change. Use regular check-ins (every sprint or every 2 weeks) to review the IN/OUT list.</p></li></ul></li></ol><div><hr></div><h3><strong>&#9878;&#65039; Trade-offs</strong></h3><ul><li><p><strong>Highest impact features may take longer</strong> &#8594; you delay smaller quick-wins. That&#8217;s okay if your hypothesis is big enough and you stay committed to fast feedback.</p></li><li><p><strong>Quick wins feel cheap but may not validate the core problem</strong> &#8594; you might build ability to do X but not find whether users care about X.</p></li><li><p><strong>Low-code prototyping accelerates validation but may mask tech debt</strong> &#8594; if you commit to no-code without plan to replace, you may carry hidden cost.</p></li><li><p><strong>Stakeholder consensus helps alignment but risks lowest-common-denominator</strong> &#8594; keep the criteria strict to avoid &#8220;everyone wins&#8221; outcomes.</p></li></ul><div><hr></div><h3><strong>&#128640; Next Steps (tomorrow morning)</strong></h3><ol><li><p>Draft your <strong>feature list</strong>: include 8&#8211;15 candidate features tied to your MVP hypothesis.</p></li><li><p>Define &#8220;impact&#8221; for your product (user metric, cost reduction, activation rate), and rank each feature by that metric &#8212; ignore effort for now.</p></li><li><p>Schedule a 1-hour prioritisation workshop with your key stakeholders: walk through the list, apply an Impact/Effort grid, decide the IN/OUT list. Distribute the results.</p></li></ol><div><hr></div><h3><strong>&#128206; Primary Resources</strong></h3><ul><li><p><a href="https://www.atlassian.com/agile/product-management/prioritization-framework?utm_source=chatgpt.com">Atlassian &#8211; </a><em><a href="https://www.atlassian.com/agile/product-management/prioritization-framework?utm_source=chatgpt.com">Six Product Prioritisation Frameworks &amp; How to Pick.</a></em></p></li><li><p><a href="https://productschool.com/blog/product-fundamentals/impact-effort-matrix?utm_source=chatgpt.com">Product School &#8211; </a><em><a href="https://productschool.com/blog/product-fundamentals/impact-effort-matrix?utm_source=chatgpt.com">Impact Effort Matrix &amp; How to Use One + Examples.</a></em></p></li><li><p><a href="https://www.optimizely.com/optimization-glossary/feature-prioritization/?utm_source=chatgpt.com">Optimizely &#8211; </a><em><a href="https://www.optimizely.com/optimization-glossary/feature-prioritization/?utm_source=chatgpt.com">What is Feature Prioritisation? Five Methods and Examples.</a></em></p></li></ul><div><hr></div><p><em>What feature do you and your stakeholders disagree most about &#8212; and how confident are you in its impact?</em></p><p><em>Reply to this email. I&#8217;ll pick 2-3 to walk through in the next issue (with crowd feedback).</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – Validating the problem/opportunity or the solution?]]></title><description><![CDATA[Are you still in the problem space or you already are in the solution space for your product? Here&#8217;s how structuring your discovery can reduce waste and increase your odds of success]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-7cb</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 28 Oct 2025 07:15:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XU5J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3>&#9193; Section 1 - First steps: Idea, Validation, MVP</h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419; Chapter 1 &#8211; How to Decide What Goes In and What Stays Out of the MVP</a></strong></p><p><strong>2&#65039;&#8419; <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b">Chapter 2 &#8211; Simple Solutions First</a></strong></p><p><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd">3&#65039;&#8419;</a><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd"> Chapter 3 &#8211; Fake it &#8216;till You make it</a> </strong></p><p><strong>4&#65039;&#8419; Chapter 4 &#8211; Validating the problem/opportunity or the solution? &#8594; </strong><em><strong>You&#8217;re here.</strong></em> </p><p><em>5&#65039;&#8419; Chapter 5 &#8211; Features prioritization strategies &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!XU5J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!XU5J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:766349,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/177190606?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XU5J!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0cc016c-e972-4ff6-a807-03cbaf77bdd4_2240x1260.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 aria-hidden="true" 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><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><strong>&#128270; Scenario / Pain Point</strong></h3><p>You&#8217;ve got a glimmer of an idea&#8212;a tech-startup moment of insight. Maybe you saw a process that drags on, a customer always complaining, a manual workflow that could be digitised. So you dive straight into building. You sketch the UI, pick your tech stack, start writing code. But after weeks or months you realise: users don&#8217;t care as much as you thought. Or the value you promised doesn&#8217;t land. Why? Because you validated the <strong>solution</strong>, not the <strong>problem</strong>.</p><p>When you jump to solution-mode too fast, you&#8217;re building &#8220;just in case&#8221; instead of &#8220;because.&#8221; You assume the underlying problem is big, urgent and unserved. You assume your proposed solution will work. But if those assumptions aren&#8217;t true, you&#8217;ll have built fast &#8212; and failed faster.</p><p>The right order is:</p><ol><li><p>Validate that the problem/opportunity exists and is meaningful.</p></li><li><p>Only then validate if your chosen solution addresses it in a way users will adopt.</p></li></ol><p>For example: if you believe &#8220;small business time-tracking is broken&#8221; (problem) you validate that first &#8212; ask how often they track, what they hate, what they do instead. Once you see urgency, a workaround, willingness to change &#8212; then you build &#8220;our time-tracking app.&#8221; If you built the app first, you risk discovering they&#8217;re okay with spreadsheets and don&#8217;t care about switching.</p><p>The cost of skipping intention is high: you end up locked into technical choices (one-way-doors) before you know you had a market problem. Meanwhile you miss flexible, reversible decisions (two-way-doors) that would have given you speed and cheap learning.</p><div><hr></div><h3><strong>&#9889; Why it matters</strong></h3><p>Getting this order right matters because it dramatically changes your odds of success and the shape of your technical and product decisions.</p><ul><li><p><strong>Reducing waste early</strong>. Validating a problem costs far less than developing a full feature set. As one article puts it, one of the top reasons startups fail is &#8220;solving problems nobody cares about&#8221;.</p></li><li><p><strong>Keeping your options open</strong>. If you validate the solution too early, you may lock in architecture, UI flows and tech stack before you understand usage. Two-way&#8208;door decisions (e.g., UI layout, backend choice) should happen early; one-way&#8208;door decisions (e.g., core database, major business model) should wait for problem/solution validation.</p></li><li><p><strong>Aligning product, business and tech</strong>. Validating the problem means you understand user desire, pain severity and willingness to switch. That clarity helps you choose the right scope, the right features and the right metrics. Then&#8212;you build the solution with discipline and speed.</p></li><li><p><strong>Shaping your business model correctly</strong>. If the problem isn&#8217;t urgent, your solution may not be paid for or adopted. Validating the problem ensures that when you validate the solution, you&#8217;re testing something meaningful&#8212;not vanity features.</p></li><li><p><strong>Making simpler, faster architecture and MVP choices</strong>. When the problem is clear, you can build a <strong>walking skeleton</strong>, adopt <strong>evolutionary architecture</strong> and keep the scope thin because you&#8217;re focused on learning one thing well&#8212;not shipping everything poorly.</p></li></ul><div><hr></div><h3><strong>&#128736;&#65039; How we solve it</strong></h3><p>Here&#8217;s a practical roadmap you can apply.</p><h4><strong>1&#65039;&#8419; Formulate your hypothesis</strong></h4><p>Write it as a testable statement:</p><blockquote><p>&#8220;We believe [user segment] has [problem] that causes [pain], and they are willing to pay/use [solution].&#8221;</p></blockquote><p>Make it concrete and falsifiable &#8212; if it can&#8217;t be disproved, it&#8217;s not a hypothesis.</p><div><hr></div><h4><strong>2&#65039;&#8419; Validate the problem first &#8212; fast and cheap</strong></h4><ul><li><p><strong>Talk to humans before writing code.</strong> Do 5&#8211;10 user interviews focused on <em>pain, frequency, and urgency</em>. Avoid showing your solution idea too early &#8212; you&#8217;ll bias feedback.</p></li><li><p><strong>Use AI/no-code tools for discovery</strong>, some examples<strong>:</strong></p><ul><li><p>&#129513; <strong>Typeform</strong>, <strong>Google Forms </strong>or <strong>Fillout</strong> for quick surveys.</p></li><li><p>&#127760; <strong>Carrd</strong>, <strong>Webflow</strong>, or <strong>Framer</strong> for simple landing pages.</p></li><li><p>&#129302; <strong>Lovable</strong> or <strong>Bolt.new</strong> to quickly create an MVP or &#8220;realistic prototype&#8221;</p></li><li><p>&#128227; Run small <strong>ad experiments</strong> on Google or Meta to test demand (&#8220;Sign up for early access&#8221;).</p></li></ul></li><li><p><strong>Leverage AI for insight extraction:</strong></p><ul><li><p>Use ChatGPT or Perplexity to <strong>summarize user interviews</strong>, cluster recurring pain points, and detect language patterns (&#8220;What words do users use to describe this problem?&#8221;).</p></li><li><p>Feed transcripts into a vector DB (e.g., <strong>Supabase + OpenAI embeddings</strong>) to query later.</p></li></ul></li><li><p><strong>Measure signals, not opinions.</strong> Count how many people click, sign up, or reply &#8220;I&#8217;d pay for this.&#8221; Interest is a better signal than agreement.</p></li></ul><p>Keep everything flexible: at this stage, nothing should require hard technical choices.</p><div><hr></div><h4><strong>3&#65039;&#8419; Define and validate the solution only once the problem signal is strong</strong></h4><p>When you have evidence the problem is real and painful, define the smallest possible solution that proves your hypothesis.</p><ul><li><p><strong>Start with one feature.</strong> The core capability that directly addresses the pain. Anything else is out.</p></li><li><p><strong>Prototype with low-code and AI first:</strong></p><ul><li><p>Use <strong>Bubble</strong>, <strong>Glide</strong>, or <strong>Softr</strong> to build the working prototype.</p></li><li><p>Use <strong>Zapier</strong>, <strong>n8n</strong>, or <strong>Make</strong> for quick process automation behind the scenes.</p></li><li><p>Use <strong>AI code assistants</strong> (e.g., <strong>Replit AI</strong>, <strong>GitHub Copilot</strong>, <strong>v0.dev, Lovable</strong>) to generate UI scaffolds or backend templates in minutes.</p></li></ul></li><li><p><strong>Simulate or semi-automate when needed (Wizard-of-Oz MVP):</strong></p><ul><li><p>Example: accept user inputs but process them manually in a spreadsheet for early users.</p></li><li><p>Replace the manual step with code only when it becomes the bottleneck.</p></li></ul></li><li><p><strong>For coded parts, keep architecture evolutionary:</strong></p><ul><li><p>Use a single repo and a <strong>walking skeleton</strong> that runs end-to-end from day one.</p></li><li><p>Keep layers thin and replaceable &#8212; one service, one database.</p></li><li><p>Automate deployment early (CI/CD) to build confidence while staying lean.</p></li><li><p>Delay irreversible design choices (one-way doors) until you have user data.</p></li></ul></li></ul><p>The goal is to <strong>validate value</strong>, not to build infrastructure.</p><div><hr></div><h4><strong>4&#65039;&#8419; Keep tech and feature choices reversible</strong></h4><ul><li><p><strong>Tag every decision</strong>: one-way or two-way door.</p><ul><li><p><em>One-way</em>: foundational architecture, data model, contracts &#8212; delay.</p></li><li><p><em>Two-way</em>: landing page copy, component layout, integration provider &#8212; decide fast.</p></li></ul></li><li><p><strong>Use no/low-code tools deliberately:</strong></p><ul><li><p>Treat them as <strong>temporary scaffolding</strong>: something to replace later when scale or cost demands.</p></li><li><p>Or, if they prove stable and cheap to maintain, <strong>integrate them safely</strong> as part of your long-term system &#8212; encapsulated behind APIs, monitored, and versioned like any other component.</p></li></ul></li><li><p><strong>Budget their replacement upfront.</strong> Assume every no-code component has a future rewrite cost. Document it and track it as technical debt, not surprise.</p></li></ul><div><hr></div><h4><strong>5&#65039;&#8419; Document everything</strong></h4><p>Keep a single, living document (Notion, Linear, Confluence &#8212; doesn&#8217;t matter) with:</p><ul><li><p>&#9989; The problem and solution hypotheses.</p></li><li><p>&#128202; Metrics and signals that confirm or disprove them.</p></li><li><p>&#128682; Decision logs: what&#8217;s in/out, what&#8217;s a one-way door, what&#8217;s temporary.</p></li></ul><p>This discipline gives you clarity when you revisit assumptions or scale up.</p><div><hr></div><h3><strong>&#9878;&#65039; Trade-offs</strong></h3><ul><li><p><strong>Problem first but no solution build</strong> &#8594; you may validate pain but miss testing whether your proposed approach actually works. Eventually you still need to build the solution.</p></li><li><p><strong>Solution too early</strong> &#8594; you may build great code for a non-problem. The product might be technically perfect but commercially dead.</p></li><li><p><strong>Manual or simulated delivery</strong> &#8594; fast and cheap, but must be replaced or scaled later or you risk reputation and user experience issues.</p></li><li><p><strong>Delaying too many one-way-door decisions</strong> &#8594; can slow things down if you never decide. Balance is key.</p></li></ul><div><hr></div><h3><strong>&#128640; Next Steps (tomorrow morning)</strong></h3><ol><li><p>Write your hypothesis for the problem in one sentence. Share it with your team and commit to validating or refuting it.</p></li><li><p>List the pain indicators you expect: how often, how urgent, what alternative do users use now. Run a quick survey or landing-page test to measure one indicator by end of week.</p></li><li><p>Identify one two-way-door decision you can make in the next 48 hours (e.g., landing page design, workflow stub). Decide, implement, learn. Mark all other one-way doors and postpone them until you gather more evidence.</p></li></ol><div><hr></div><h3><strong>&#128206; Primary Resources</strong></h3><ul><li><p><a href="https://www.samdickie.me/writing/start-with-problem-validation-not-solution-validation?utm_source=chatgpt.com">Sam Dickie &#8212; </a><em><a href="https://www.samdickie.me/writing/start-with-problem-validation-not-solution-validation?utm_source=chatgpt.com">Start with Problem Validation, NOT Solution Validation</a></em><a href="https://www.samdickie.me/writing/start-with-problem-validation-not-solution-validation?utm_source=chatgpt.com">.</a></p></li><li><p><a href="https://medium.com/%40jjv/the-importance-of-validating-problems-before-building-the-mvp-0b9788c74906?utm_source=chatgpt.com">Juan Jes&#250;s Velasco &#8212; </a><em><a href="https://medium.com/%40jjv/the-importance-of-validating-problems-before-building-the-mvp-0b9788c74906?utm_source=chatgpt.com">The Importance of Validating Problems Before Building the MVP</a></em><a href="https://medium.com/%40jjv/the-importance-of-validating-problems-before-building-the-mvp-0b9788c74906?utm_source=chatgpt.com">.</a></p></li><li><p><a href="https://www.itonics-innovation.com/blog/mvp-types-in-rd?utm_source=chatgpt.com">iTonics Innovation Blog &#8212; </a><em><a href="https://www.itonics-innovation.com/blog/mvp-types-in-rd?utm_source=chatgpt.com">6 MVP Types for Validating Complex New Products and R&amp;D</a></em><a href="https://www.itonics-innovation.com/blog/mvp-types-in-rd?utm_source=chatgpt.com">.</a></p></li></ul><div><hr></div><p><em>Which assumption about your product are you validating this week &#8212; the pain or the approach?</em></p><p><em>Reply to this email and share your hypothesis. I&#8217;ll pick a few for a follow up on a Linkedin post!</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – Fake it ‘till You make it]]></title><description><![CDATA[An MVP isn&#8217;t about building less &#8212; it&#8217;s about learning fast by making users believe the value exists before fully automating it.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-ddd</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 21 Oct 2025 06:15:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qZsH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3>&#9193; Section 1 - First steps: Idea, Validation, MVP</h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419; Chapter 1 &#8211; How to Decide What Goes In and What Stays Out of the MVP</a></strong></p><p><strong>2&#65039;&#8419; <a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b">Chapter 2 &#8211; Simple Solutions First</a></strong></p><p><strong>2&#65039;&#8419; Chapter 3 &#8211; Fake it &#8216;till You make it </strong>&#8594; <em>You&#8217;re here.</em> </p><p><em>3&#65039;&#8419; Chapter 4 &#8211; Validating the problem/opportunity vs validating the solution &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!qZsH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qZsH!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!qZsH!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!qZsH!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qZsH!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qZsH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/daaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:740978,&quot;alt&quot;:null,&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://learnagilepractices.substack.com/i/176590017?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qZsH!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!qZsH!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!qZsH!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qZsH!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaaba046-0a4e-4c74-babe-57f9397d80c8_2240x1260.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 aria-hidden="true" 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><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><strong>&#128270; Scenario / Pain Point</strong></h3><p>In the rush to ship, many startup teams fall into the trap of <strong>over-building early</strong>. They design for scale before they have one user, set up full production infrastructure before they&#8217;ve confirmed the core value, and build features that only make sense &#8220;when we reach 10K users&#8221;. Meanwhile, the rest of the business is experimenting, iterating, learning &#8212; and the engineering team is stuck trying to perfect architecture.</p><p>The core mistake here is confusing <strong>product</strong> with <strong>project</strong>. A project is &#8220;build this spec, then ship&#8221;. A product is &#8220;deliver one slice of value, learn, then evolve&#8221;. When you treat an MVP like a full release, you end up with a large, slow, expensive version that validates nothing.</p><p>Instead, what an MVP needs is to <strong>validate the solution</strong>, not just the idea. And if you build everything as if you already have full automation, you lose speed. You lose learning. That&#8217;s where the principle of <strong>&#8220;Fake it till you Make it&#8221;</strong> comes in: build what users see, but you might handle the value delivery manually or semi-automatically behind the scenes. Think &#8220;Wizard of Oz&#8221; architecture or &#8220;Concierge MVP&#8221; where you simulate the final product with human operations.</p><p>With a 30-60 day window to launch a viable MVP, you cannot wait to build perfect systems. Your architecture must be <strong>evolutionary</strong>: start with a walking skeleton and enable real learning before you scale. Build simple, see what works, then evolve. If you don&#8217;t, you risk being slow because you over-engineered before you even had clarity.</p><div><hr></div><h3><strong>&#9889; Why it matters</strong></h3><p>When you shift to this mindset, you free your team from the tyranny of &#8220;perfect first&#8221;. You align with speed, feedback and learning. Here&#8217;s why the principle is critical:</p><ul><li><p><strong>Research &amp; tech spikes speed things up.</strong> Instead of choosing a new framework on day one and rewriting later, experiment quickly to see what works &#8212; then scale. Otherwise you invest time in tech decisions you may never use.</p></li><li><p><strong>Prioritize features for learning, not completeness.</strong> With a list of IN vs OUT items you guarantee that, if time becomes the blocker, you have done the value delivery first. If you wait too long on secondary features, you ship no value.</p></li><li><p><strong>Keep a list of non-must features anyway.</strong> Just because they&#8217;re out now doesn&#8217;t mean you forget them. Documenting the OUT list allows future scope decisions to reference it rather than start from scratch.</p></li><li><p><strong>Features must themselves be &#8220;MVP versions&#8221;.</strong> A feature isn&#8217;t finished when it&#8217;s built; it&#8217;s finished when it <em>validates</em> the problem. If you only need two operations, don&#8217;t build a full suite of six. Simplify.</p></li><li><p><strong>Build to learn, not to perfect.</strong> An architecture that evolves wins over one that&#8217;s built for all possible use-cases. Evolutionary architecture + walking skeleton = start small, adapt often.</p></li></ul><div><hr></div><h3><strong>&#128736;&#65039; How we solve it</strong></h3><p>Here are practical steps to apply &#8220;Fake it until you make it&#8221; within your MVP:</p><ol><li><p><strong>Create your walking skeleton.</strong> Build a thin vertical slice of functionality that works end-to-end: UI &#10141; business logic &#10141; backend &#10141; deploy. Even if manual behind the scenes, the slice must deliver real value to a user.</p></li><li><p><strong>Adopt an evolutionary architecture mindset.</strong> Don&#8217;t build the entire platform up front. Start small, code by the team, evolve as real data justifies it.</p></li><li><p><strong>Identify your core feature and map manual delivery.</strong> Pick the one feature that validates your solution. If automation takes too long, deliver manually for now and mark &#8220;automate later&#8221;.</p></li><li><p><strong>Classify all other features into must-have vs nice-to-have.</strong> If you have more than 5 must-haves, revisit: tie each back to your core problem. For example: do you really need your own login system or can you reuse one?</p></li><li><p><strong>Use &#8220;Fake it&#8221; experiments like fake-doors, concierge or manual-first delivery.</strong> Add a &#8220;Pay now&#8221; button for a feature that doesn&#8217;t exist yet, manually onboard users, manually generate results. Learn their behaviour before coding full stack.</p></li><li><p><strong>Document scope clearly: IN / OUT with reasons.</strong> You&#8217;ll avoid endless debates and keep the team aligned. When stakeholders push &#8220;just one more feature&#8221;, you refer to the documented list and explain trade-offs.</p></li><li><p><strong>Always ask: is this a one-way door or a two-way door decision?</strong> If reversible, act now. If irreversible, delay until you have data. Engineering in MVP mode thrives on reversible decisions.</p></li></ol><div><hr></div><h3><strong>&#9878;&#65039; Trade-offs</strong></h3><ul><li><p><strong>Too minimal</strong> &#10141; you&#8217;ll refactor later; acceptable if you learn quickly.</p></li><li><p><strong>Too elaborate</strong> &#10141; you get stuck in build-mode and learn nothing; dangerous.</p></li><li><p><strong>Manual delivery (fake) is fast</strong>, but if you don&#8217;t automate or evolve, you risk poor scalability or user experience.</p></li><li><p><strong>Evolutionary architecture requires discipline</strong>, else you accumulate technical debt because you didn&#8217;t set boundaries.</p></li><li><p><strong>Simulations are valid</strong>, but must still deliver user value &#8212; fake for speed, not for deception.</p></li></ul><div><hr></div><h3><strong>&#128640; Next Steps (tomorrow morning)</strong></h3><ol><li><p><strong>Highlight 3 major technical assumptions</strong> your team is making (e.g., &#8220;we will need multi-tenant DB&#8221;, &#8220;we need custom workflow engine&#8221;, &#8220;we need full AI pipeline&#8221;). Decide which are one-way vs two-way doors.</p></li><li><p><strong>Define one thin slice</strong>: pick a single user flow that delivers value now, automate none or very little, deliver manually if needed. Map what parts are manual vs automated.</p></li><li><p><strong>Write your IN / OUT feature list</strong>: mark clearly what must be done for launch and what you&#8217;ll purposely exclude. Publish the list to the team and stakeholders for alignment.</p></li></ol><div><hr></div><h3><strong>&#128206; Primary Resources</strong></h3><ul><li><p><em><a href="https://tsharon.medium.com/fake-doors-mvp-42242fd68b6f?utm_source=chatgpt.com">Fake Doors MVP</a></em> &#8212; Tomer Sharon (Medium)</p></li><li><p><em><a href="https://mobilelive.ai/blog/16-ways-to-validate-and-improve-your-mvp?utm_source=chatgpt.com">16 Techniques to Validate &amp; Improve Your MVP</a></em> &#8212; mobileLIVE blog</p></li><li><p><em><a href="https://www.ironhack.com/us/blog/what-is-a-minimum-viable-product-mvp?utm_source=chatgpt.com">What is a Minimum Viable Product?</a></em><a href="https://www.ironhack.com/us/blog/what-is-a-minimum-viable-product-mvp?utm_source=chatgpt.com"> </a>&#8211; Ironhack blog</p></li></ul><div><hr></div><p><em>What is one feature you&#8217;re simulating manually right now &#8212; and why?</em></p><p><em>Reply to this email: I&#8217;d love to hear how you&#8217;re &#8220;faking it&#8221; to learn faster.</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – Simple Solutions First]]></title><description><![CDATA[The goal of an MVP isn&#8217;t completeness. It&#8217;s to learn if your solution works for the problem you&#8217;ve identified. Every feature should be simplest thing that solves that problem and enable learning.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers-81b</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 14 Oct 2025 06:15:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ddjt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><h2><strong>&#128218; Previous on this series</strong></h2><h3>&#9193; Section 1 - First steps: Idea, Validation, MVP</h3><p><strong><a href="/__u/learnagilepractices.substack.com/p/practical-handbook-for-product-developers">1&#65039;&#8419; Chapter 1 &#8211; How to Decide What Goes In and What Stays Out of the MVP</a></strong></p><p><strong>2&#65039;&#8419; Chapter 2 &#8211; Simple Solutions First </strong>&#8594; <em>You&#8217;re here.</em> </p><p><em>3&#65039;&#8419; Chapter 3 &#8211; Fake it &#8216;till You make it &#8594; Coming next week!</em></p><p>&#129517; <em>Follow the journey:</em> each issue is a micro-chapter of the series: <em><strong>Practical Handbook for Product Developers</strong></em> &#8212; released weekly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ddjt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ddjt!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!ddjt!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!ddjt!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ddjt!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ddjt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:747763,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://learnagilepractices.substack.com/i/175952501?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ddjt!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!ddjt!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!ddjt!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ddjt!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f3b85-4760-4231-8385-70ca3b2327ff_2240x1260.png 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 aria-hidden="true" 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><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><strong>&#128270; Scenario / Pain Point</strong></h3><p>Most startups die of over-building.</p><p>Teams design for scale before they have a single user. They worry about performance, permissions, or micro-services when what they really need is a working product that validates one clear solution. The codebase becomes a cathedral for imaginary traffic.</p><p>This happens because developers and founders often confuse <strong>a product</strong> with <strong>a project</strong>. A project is finished when the spec is implemented. A product is never finished &#8212; it evolves through feedback, validation, and learning.</p><p>The goal of an MVP isn&#8217;t completeness. It&#8217;s <strong>to learn if your solution works for the problem you&#8217;ve identified.</strong></p><p>That means starting from the simplest thing that solves that problem, not from the most elegant, extensible, or scalable design.</p><p>Yet many engineers still believe that &#8220;simple&#8221; means &#8220;cheap&#8221; or &#8220;temporary.&#8221; It doesn&#8217;t. Simple means <strong>purpose-driven</strong>: just enough to solve the current problem and to let you learn from real use.</p><p>If your app only needs addition and subtraction, don&#8217;t build multiplication and square roots &#8220;for later.&#8221; If you only have two types of users, don&#8217;t design a full permission system with 14 roles. Every extra abstraction delays learning and adds useless complexity.</p><p>In the early phase, speed equals survival. The rest of the company &#8212; product, marketing, sales &#8212; is moving fast, experimenting daily. Engineering must match that rhythm, not hide behind over-architecture. Otherwise, by the time you finish your perfect foundation, the market has already moved on.</p><p>And when startups grow, this slowness often becomes invisible. The rest of the company slows down too, and technical inertia feels &#8220;normal.&#8221; But that doesn&#8217;t make it right &#8212; it just turns lack of agility into culture.</p><div><hr></div><h3><strong>&#9889; Why it matters</strong></h3><p>One of the fundamentals elements of a <strong>product mindset</strong> is the ability to distinguish between what must be <strong>decided now</strong> and what <strong>can safely wait</strong>.</p><p>Amazon calls this the difference between <strong>one-way-door</strong> and <strong>two-way-door</strong> decisions.</p><ul><li><p><em>One-way doors</em> are irreversible choices (e.g., foundational tech stack, data model design). Delay them until you have enough information.</p></li><li><p><em>Two-way doors</em> are reversible (e.g., naming conventions, API structure, UI flows). Move through them fast. Learn, adjust, repeat.</p></li></ul><p>In MVPs, almost every decision is a two-way door. Optimize for speed and learning. Don&#8217;t over-plan what can be easily changed.</p><p>Software development is continuous discovery: learning what users need, what scales, and what to drop. Every line of code should teach you something about your product or your problem space.</p><p>That&#8217;s why we talk about <strong>building to learn</strong>, not building to complete.</p><p>Each slice you build should:</p><ol><li><p>Deliver a tiny piece of real value.</p></li><li><p>Be simple enough to replace or evolve.</p></li><li><p>Generate feedback you can act on.</p></li></ol><p>Techniques like <strong>Thin-Slice Development</strong> help. Build vertical features, not horizontal layers &#8212; an entire &#8220;slice of cake,&#8221; not a spoonful of frosting. Deliver a full end-to-end experience, however small, instead of shipping disconnected technical components.</p><p>Another useful approach is what Alistair Cockburn called a <strong>Walking Skeleton</strong> &#8212; a minimal, end-to-end version of the system that connects all layers, however crudely. It&#8217;s not a slice of backend here and a mockup there; it&#8217;s a thin vertical cut that actually works from UI to persistence. Once that skeleton is alive, you can evolve it.</p><p>That&#8217;s where <strong>Evolutionary Architecture</strong> comes in: the idea that architecture itself should start as an MVP. It must be small, understandable, and adjustable by the team that writes the code. Complexity grows only when the product earns it.</p><p>When you design in thin slices, you avoid premature optimization. You can add complexity only when data justifies it.</p><p>AI tools make this mindset even more powerful. With generative design and code assistants, you can prototype in hours. Build quick sketches in Figma, generate first UI drafts, and let AI create boilerplate code so your energy goes into validation &#8212; not scaffolding.</p><p>And the classics still hold true: <strong>TDD</strong> keeps your code simple by forcing you to write only what&#8217;s necessary to make the next test pass. <strong>Continuous Integration</strong> gives you the confidence to evolve architecture safely, one change at a time.</p><div><hr></div><h3><strong>&#128736;&#65039; How we solve it</strong></h3><ol><li><p><strong>Start with a Walking Skeleton.</strong></p><p>Build the simplest vertical slice that proves the system can run end-to-end. One button, one API, one database call. Ship it.</p></li><li><p><strong>Adopt an Evolutionary Architecture mindset.</strong></p><p>Your architecture has its own MVP. It should evolve with the product &#8212; not be designed once and frozen. The only constant is the ability to change safely.</p></li><li><p><strong>Focus on the main pain point.</strong></p><p>Every feature must map directly to the problem you&#8217;re solving. If it doesn&#8217;t, it&#8217;s out. </p></li><li><p><strong>Simplify the implementation, minimize the scope.</strong></p><p>Two user roles may be enough. Two workflows may be enough. Remember: you can add complexity later, but you can&#8217;t easily remove it.</p></li><li><p><strong>Prototype fast, with tools you know.</strong></p><p>If speed is the goal, build with technologies your team masters. Experiment with new tech only through isolated spikes.</p></li><li><p><strong>Decide through doors.</strong></p><p>For every choice, ask: <em>Is this reversible?</em> If yes, decide fast. If not, delay until data informs you.</p></li><li><p><strong>Build to learn.</strong></p><p>Ship small, measure impact, refactor. Every iteration should reduce uncertainty.</p></li></ol><div><hr></div><h3><strong>&#9878;&#65039; Trade-offs</strong></h3><ul><li><p><strong>Too simple:</strong> you&#8217;ll refactor later &#8212; acceptable to learn fast as soon as it&#8217;s tested and under control.</p></li><li><p><strong>Too complex:</strong> you&#8217;ll never learn, and you&#8217;ll have to live with a lot of wrong choices &#8212; fatal.</p></li><li><p><strong>Fake solutions:</strong> good short-term validation, replace them quickly as soon as they start to be unsustainable.</p></li><li><p><strong>Evolutionary design</strong> <strong>requires discipline</strong>, or it can bring to chaos if unmanaged. At the same time, it&#8217;s the only way to have a &#8220;<em>good enough</em>&#8221; architecture under control. </p></li></ul><p>The goal isn&#8217;t perfection &#8212; it&#8217;s momentum with intention. It&#8217;s having <strong>intentional choices instead of unexpected ones</strong>.</p><div><hr></div><h3><strong>&#128640; Next Steps (tomorrow morning)</strong></h3><ol><li><p><strong>List your current architectural decisions.</strong> Mark which are one-way and which are two-way doors. Commit only to what you can reverse.</p></li><li><p><strong>Draw your Walking Skeleton.</strong> One flow, one data path, one deployment pipeline. Visualize it end-to-end.</p></li><li><p><strong>Ship a thin slice.</strong> Deliver one feature that a real user can touch, even if it&#8217;s ugly. Learn from it before building anything else.</p></li></ol><div><hr></div><h3><strong>&#128206; Primary Resources</strong></h3><ul><li><p><strong><a href="https://evolutionaryarchitecture.com/">Building Evolutionary Architectures</a></strong> &#8212; Neal Ford, Rebecca Parsons, Patrick Kua</p></li><li><p><strong><a href="https://resources.valueflowsolutions.co.uk/agile-analogies/a-walking-skeleton">A Walking Skeleton</a></strong> - a minimal initial implementation of an application&#8217;s architecture that includes and connects the basic components of the system</p></li><li><p><strong><a href="/__u/tidyfirst.substack.com/p/minimum-viable-product-revisited">Minimum Viable Product revisited</a> </strong>- an article by Kent Beck</p></li></ul><div><hr></div><p><em>Where do you see your team over-engineering right now?</em></p><p><em>Reply to this email &#8212; I&#8217;d love to hear one place where &#8220;simpler&#8221; could get you learning faster.</em></p>]]></content:encoded></item><item><title><![CDATA[Practical Handbook for Product Developers – First Steps: Idea, Validation, MVP – How to Decide What Goes In and What Stays Out of the MVP?]]></title><description><![CDATA[An MVP isn&#8217;t about building less, but building only what proves your solution works. Learn how to decide which features are truly essential &#8212; and which can safely wait.]]></description><link>https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/practical-handbook-for-product-developers</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 07 Oct 2025 06:15:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Z6SH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Z6SH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Z6SH!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!Z6SH!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!Z6SH!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Z6SH!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Z6SH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:842900,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://learnagilepractices.substack.com/i/174963448?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Z6SH!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!Z6SH!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!Z6SH!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Z6SH!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997be05a-7972-4f8a-91dc-2137c9e25e40_2240x1260.png 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 aria-hidden="true" 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><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><strong>&#128270; Scenario / Pain Point</strong></h3><p>Every MVP discussion starts with the same tension: <em>everything</em> feels essential. The designer argues for polished onboarding, sales insists on dashboards, and marketing demands push notifications. Meanwhile, the clock is ticking.</p><p>The truth is, building an MVP is not about validating the <strong>idea</strong> &#8212; it&#8217;s about validating the <strong>solution</strong>. You already know the problem you want to solve; now you need to prove that your chosen approach is viable. That means being crystal clear on three things from day one:</p><ul><li><p><strong>What problem are we solving?</strong> If this is fuzzy, no feature prioritization will save you.</p></li><li><p><strong>Which technology can we deliver with speed and confidence?</strong> MVP timelines are 30&#8211;60 days max &#8212; you can&#8217;t afford to learn everything from scratch.</p></li><li><p><strong>Where do we need spikes?</strong> If you must touch a new tech, isolate it in small experiments before it contaminates the whole product.</p></li></ul><p>And there&#8217;s the budget: an MVP must be <strong>cheap enough</strong> to fail fast, but <strong>solid enough</strong> to serve as a foundation. If you cut corners blindly, you&#8217;ll end up rewriting from scratch. If you over-engineer, you&#8217;ll never ship.</p><p>This constant push-and-pull &#8212; speed vs. quality, cheap vs. sustainable, minimum vs. lovable &#8212; is the real pain point. Without clear criteria, you&#8217;ll waste weeks debating and still end up with a bloated backlog that delays the one thing an MVP must deliver: <strong>evidence that your solution works.</strong></p><div><hr></div><h3><strong>&#9889; Why it matters</strong></h3><p>Defining an MVP is never just a design exercise &#8212; it&#8217;s about making deliberate trade-offs that keep you moving fast without sabotaging the future. If you don&#8217;t set the right boundaries early, the &#8220;minimum&#8221; in MVP quickly turns into &#8220;months of building&#8221; instead of &#8220;weeks of learning.&#8221;</p><p>One of the most underrated moves is <strong>researching and spiking on technologies</strong> that can accelerate delivery. A half-day spike on a new framework, hosting service, or integration can save you weeks later, either by cutting implementation time or allowing you to fit more scope into the same 30&#8211;60 day window. Skipping this step means committing blind to tech choices that may slow you down at the worst moment.</p><p>Equally critical is having a <strong>prioritized list of MVP features</strong>. Why? Because deadlines rarely move. If time beats scope &#8212; and it usually does &#8212; you want the essentials implemented first. Without clear priority, you risk spending your first two weeks on secondary features, only to realize the core problem is still unsolved by launch day.</p><p>It also helps to maintain a <strong>separate list of excluded features</strong>. You don&#8217;t need to treat it as gospel, but it serves as a reference point: when stakeholders ask, <em>&#8220;Why isn&#8217;t this included?&#8221;</em> you can show the trade-offs explicitly rather than debating from memory.</p><p>And finally, remember that even <strong>features inside the MVP must be &#8220;MVP versions&#8221; of themselves</strong>. Don&#8217;t build the perfect onboarding flow &#8212; build the simplest version that allows a user to start. Don&#8217;t architect the reporting system of your dreams &#8212; show a CSV export first. Every extra layer of polish you add delays the one thing an MVP must deliver: a working validation of your solution.</p><p>In short: research to accelerate, prioritize to focus, and simplify to ship. Miss any of these, and your MVP becomes just another unfinished v1.</p><div><hr></div><h3><strong>&#128736;&#65039; How we solve it</strong></h3><p>Solving the MVP dilemma isn&#8217;t about intuition or luck &#8212; it&#8217;s about applying a disciplined approach to narrowing down scope until only the essentials remain. Here are practices that consistently help:</p><p><strong>1. Define the primary problem.</strong></p><p>Every MVP starts with a clear hypothesis: <em>&#8220;If we solve this problem, users will adopt our solution.&#8221;</em> Without that north star, scope decisions are random. Before writing code, align the team on the single problem you&#8217;re validating.</p><p><strong>2. Identify the core feature.</strong></p><p>Most products can be boiled down to one or two functionalities without which users won&#8217;t feel any value. These are your non-negotiables. Everything else is optional. If you&#8217;re debating between 10 &#8220;must-haves,&#8221; you don&#8217;t have clarity &#8212; refine the list until only the features that directly validate your problem remain.</p><p><strong>3. Classify the rest: must-have vs. nice-to-have.</strong></p><p>Be ruthless: all nice-to-haves stay out of the MVP. If you still end up with more than 5&#8211;6 must-haves, you&#8217;ve lost focus. Tie each candidate feature back to the core problem. Example: everyone assumes login is mandatory. But is it? For early stages, you can piggyback on packaged auth (Laravel&#8217;s built-in auth, Firebase, Supabase) instead of building your own system. Low-code/no-code tools are invaluable here &#8212; they buy you weeks of development time.</p><p><strong>4. Fake it till you make it.</strong></p><p>If a feature isn&#8217;t critical but stakeholders want to see it, simulate it. A support system can start as a simple email address. An automated workflow can start as a Google Sheet updated manually. These shortcuts validate demand without sinking dev time. Again, no-code platforms are excellent enablers for this stage.</p><p><strong>5. Apply the MVP principle inside features.</strong></p><p>Even must-haves can be scoped down. If you need a search function, start with keyword filtering before building advanced full-text search with ranking. If you need analytics, start with one chart, not a full dashboard. An MVP within the MVP ensures you&#8217;re always testing the smallest useful slice.</p><p><strong>6. Document the scope.</strong></p><p>Write down what&#8217;s in and what&#8217;s out &#8212; and why. This isn&#8217;t bureaucracy; it&#8217;s protection against endless debates. Having a visible &#8220;in/out&#8221; list makes it clear to the team and stakeholders where the line is drawn, and prevents scope creep disguised as &#8220;small changes.&#8221;</p><p>In practice, these steps won&#8217;t silence every disagreement. But they create a common framework for making decisions quickly, keeping the team aligned, and ensuring the MVP remains what it&#8217;s supposed to be: the smallest possible product that proves your solution works.</p><div><hr></div><h3><strong>&#128640; Next Steps (tomorrow morning)</strong></h3><p>If you had to start defining your MVP tomorrow, here&#8217;s a practical checklist to keep yourself honest:</p><ol><li><p><strong>Write down the core problem in one sentence.</strong></p><p>Strip away everything else. If you can&#8217;t summarize the hypothesis you&#8217;re validating in a single line, your MVP is already in danger of drifting.</p></li><li><p><strong>Draft two lists: IN and OUT.</strong></p><ul><li><p><em>IN</em>: the 1&#8211;2 features that directly validate your problem.</p></li><li><p><em>OUT</em>: everything else. You can revisit later, but for now it&#8217;s a clear boundary.</p></li></ul></li><li><p><strong>Scope down each &#8220;IN&#8221; feature to its simplest useful version.</strong></p><p>Ask yourself: <em>What&#8217;s the smallest implementation that still lets a user experience value?</em> Example: if you need reporting, start with a single export instead of a full analytics dashboard.</p></li></ol><p>Do this exercise in less than an hour with your team or co-founder. The goal isn&#8217;t perfection &#8212; it&#8217;s clarity and alignment.</p><div><hr></div><h3><strong>&#128206; Primary Resources</strong></h3><ol><li><p><strong><a href="https://blog.crisp.se/2016/01/25/henrikkniberg/making-sense-of-mvp">Henrik Kniberg &#8212; &#8220;Making Sense of MVP&#8221; (Crisp Blog)</a></strong></p><p>A timeless piece on the difference between a prototype, an MVP, and a full product.</p></li><li><p><strong><a href="https://ia800509.us.archive.org/7/items/TheLeanStartupErickRies/The%20Lean%20Startup%20-%20Erick%20Ries.pdf">Eric Ries &#8212; The Lean Startup</a></strong></p><p>The original reference on MVP thinking, with focus on Build-Measure-Learn loops.</p></li></ol><div><hr></div><p><em>What&#8217;s the hardest feature you&#8217;ve ever had to cut from an MVP &#8212; and why?</em></p><p><em>Reply to this email and share your story. I&#8217;d love to collect real-world cases to feature in future issues.</em></p>]]></content:encoded></item><item><title><![CDATA[TDD When You Don’t Know What to Build]]></title><description><![CDATA[How do you test what hasn&#8217;t been built&#8230; when you don&#8217;t even know what you're building? What if the only thing we know is the problem, not the solution?]]></description><link>https://learnagilepractices.substack.com/p/tdd-when-you-dont-know-what-to-build</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/tdd-when-you-dont-know-what-to-build</guid><pubDate>Tue, 24 Jun 2025 10:43:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZuGO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!5t</p><p>Before starting, I quickly remind you that my brand new Test-Driven Development 101 5-day Email Course is available: it is the introduction to TDD I wish I had when I started learning it, so I think you will find it very useful!</p><p>As a subscriber to my newsletter, you can have it with a 10EUR discount! &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/l/tdd-101-email-course/2VC213X&quot;,&quot;text&quot;:&quot;Take me to the course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://learnagilepractices.gumroad.com/l/tdd-101-email-course/2VC213X"><span>Take me to the course</span></a></p><p>Now, let's dive into today's micro-topic!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ZuGO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ZuGO!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!ZuGO!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!ZuGO!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ZuGO!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ZuGO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/afa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:217954,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://learnagilepractices.substack.com/i/166004951?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ZuGO!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!ZuGO!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!ZuGO!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ZuGO!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafa8c0c1-08df-48db-98cd-c0c1c93d7662_2240x1260.png 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 aria-hidden="true" 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><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><h4>In short</h4><p>&#129514; Test-Driven Development (TDD) thrives when feature requirements are clearly defined. In traditional workflows, TDD helps validate known behaviors and ensures safe implementation. But in product-first teams&#8212;where solutions are still being explored&#8212;this rigid use of TDD might seem limiting or even counterproductive. </p><p>&#129504; The mindset shift is viewing TDD not just as a tool for testing, but as a tool for design. In exploratory phases, tests help define interfaces, clarify intentions, and provoke team conversations. Even if a feature is discarded, the process improves decision-making and understanding. </p><p>&#128295; However, using rigorous test suites too early can slow progress or lead to flawed designs. Instead, use lightweight prototype tests during experimentation. These &#8220;throwaway&#8221; tests act like scaffolding, helping teams learn quickly. Once a promising solution emerges, transition to robust tests and refactor deliberately. </p><p>&#128200; TDD then becomes a two-phase process: sketch with loose tests while exploring, commit to strong design and thorough testing once the idea proves viable. This approach preserves TDD&#8217;s value&#8212;even when outcomes are uncertain&#8212;by aligning test depth with learning stage.</p><h1>Tell people what you do, and listen what they do</h1><p>Test-Driven Development shines when requirements are clear&#8212;but what happens when they aren&#8217;t? What if the only thing we know is the problem, not the solution?</p><p>In a traditional setup (aka feature factory mode), developers receive well-formed specs: input goes in, output goes out, write a test, write the code, move on. TDD works great here. It helps validate behavior early and guides implementation safely. But in product-first teams&#8212;where you're exploring solutions, not shipping pre-decided features&#8212;TDD may feel like a mismatch.</p><p>So, should you still use TDD when the future of the feature is uncertain? Yes! </p><p>TDD isn&#8217;t not just about verification. It&#8217;s also about design. Tests aren&#8217;t just checks&#8212;writing them drives the process of shaping the interface and clarifying intent. Even if the feature gets thrown away tomorrow, you&#8217;re using TDD to force conversations and make better decisions today.</p><p>During experiments, where you are really just investigating around, you can use looser, throwaway tests. Think of them as learning scaffolding. They help you converge on a direction. Once you hit a promising result&#8212;something that meets a user goal or passes an experiment threshold&#8212;you know what&#8217;s going to stick. That&#8217;s when you harden tests and refactor for maintainability.</p><p>The key is committing to revisit the code that survives exploration. Refactor mercilessly <em>as soon</em> as an idea proves valuable. That means overcoming the temptation (or pressure) to skip cleanup and jump to the next thing. No design upfront doesn&#8217;t mean no design at all&#8212;it means deferring intentional design until you&#8217;re confident the code has a future.</p><p>TDD in this context becomes two-phase: sketch lightly during the explore mode, then shift to deliberate design once you know a feature is here to stay. The test-first cycle remains&#8212;but the kind of test and depth of assertion adapt to the stage of learning. TDD is a powerfuul tool&#8212;even when the path is unclear&#8212;and you should use it to guide throught, not just to verify code.</p><p><em>Until next time&#8212;<strong>happy coding!</strong> </em>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</p>]]></content:encoded></item><item><title><![CDATA[Leverage Communities to Spread Better Practices]]></title><description><![CDATA[Communities (meetups, Slack groups, conferences, internal guilds, blog posts, newsletters) are where practices propagate. Not by mandate or theory, but by exposure and shared experience.]]></description><link>https://learnagilepractices.substack.com/p/leverage-communities-to-spread-better</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/leverage-communities-to-spread-better</guid><pubDate>Tue, 17 Jun 2025 10:50:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bIc8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, developers! &#128640;</p><p>Welcome back to the Learn Agile Practices newsletter, your weekly dose of insights to power up your software development journey through Agile Technical Practices and Methodologies!5t</p><p>Before starting, I quickly remind you that my brand new Test-Driven Development 101 5-day Email Course is available: it is the introduction to TDD I wish I had when I started learning it, so I think you will find it very useful!</p><p>As a subscriber to my newsletter, you can have it with a 10EUR discount! &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/l/tdd-101-email-course/2VC213X&quot;,&quot;text&quot;:&quot;Take me to the course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://learnagilepractices.gumroad.com/l/tdd-101-email-course/2VC213X"><span>Take me to the course</span></a></p><p>Now, let's dive into today's micro-topic!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!bIc8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!bIc8!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!bIc8!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!bIc8!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!bIc8!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_webp, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!bIc8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:241793,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://learnagilepractices.substack.com/i/165435929?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!bIc8!, /__u/learnagilepractices.substack.com/w_424, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png 424w, /__u/substackcdn.com/image/fetch/$s_!bIc8!, /__u/learnagilepractices.substack.com/w_848, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png 848w, /__u/substackcdn.com/image/fetch/$s_!bIc8!, /__u/learnagilepractices.substack.com/w_1272, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png 1272w, /__u/substackcdn.com/image/fetch/$s_!bIc8!, /__u/learnagilepractices.substack.com/w_1456, /__u/learnagilepractices.substack.com/c_limit, /__u/learnagilepractices.substack.com/f_auto, /__u/learnagilepractices.substack.com/q_auto:good, /__u/learnagilepractices.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe540f-70ac-4ee7-a88b-6bbf572f7320_2240x1260.png 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 aria-hidden="true" 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><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><h4>In short</h4><p>&#128161; Many developers have never experienced high-quality software practices like test-driven development or continuous delivery. The article argues that this isn't because they resist improvement but because they simply don&#8217;t know better options exist. Exposure to effective methods is essential &#8212; you can't adopt what you've never seen.</p><p>&#127757; Communities and peer conversations are the true engines of change. Whether it&#8217;s through blog posts, Slack messages, meetups, or lunch-and-learns, showing how your team works helps others imagine and apply those patterns. Real-world stories have more persuasive power than abstract best practices. </p><p>&#129513; Sharing doesn&#8217;t require grand gestures. Small contributions &#8212; a tweet about rapid PRs, a gist about code review flows, or a short talk &#8212; can shift someone&#8217;s perspective. These micro-insights, when amplified across networks, help spread healthier and more efficient development cultures. </p><p>&#9881;&#65039; Ultimately, developers who&#8217;ve witnessed effective ways of working have a responsibility to speak up. Sharing is what lifts the baseline. Better software isn't handed down &#8212; it grows from grassroots knowledge, peer examples, and everyday storytelling.</p><h1>Tell people what you do, and listen what they do</h1><p>The way your team works is not just a private matter &#8212; it&#8217;s a drop in the industry-wide pool.</p><p>If you care about clean code, continuous delivery, testability, or healthy workplaces, you need to tell people about it.</p><p>Too many developers work in environments where low standards are normalized. They&#8217;ve never seen TDD done well. Never seen trunk-based development in action. Never been part of a team that prioritizes quality and flow over ticket throughput.</p><p>And that&#8217;s a problem &#8212; because you can&#8217;t adopt what you don&#8217;t know exists.</p><p>Communities (meetups, Slack groups, conferences, internal guilds, blog posts, newsletters) are where practices propagate. Not by mandate or theory, but by exposure and shared experience.</p><p>This is why talking about your way of working matters: it shows what&#8217;s possible.</p><p>Working in a team where PRs last 2 hours tops? Say it out loud. Have 100% of code in production guarded by feature flags? Tell that story. Moving from monthly releases to daily deploys? Share the journey.</p><p>Because when developers hear these things from peers &#8212; not just unicorn companies &#8212; it becomes credible. And doable.</p><p>Awareness is Step Zero. Before change happens, someone needs to know there&#8217;s an alternative.</p><p>This is also where responsibility kicks in. If you&#8217;ve seen better ways of working, and never mention them, you&#8217;re not helping shift the baseline.</p><p>Software gets better when practices spread. Practices spread when people talk.</p><p>You don&#8217;t need to run a conference. Just:</p><ul><li><p>Share your approach in community chats or retrospectives.</p></li><li><p>Give a 10-minute lightning talk at a meetup.</p></li><li><p>Publish a quick GitHub gist with how your team organises reviews.</p></li><li><p>Explain to a junior why your team values small deploys.</p></li></ul><p>These micro-drops of information compound. A better developer culture doesn&#8217;t come from top-down initiatives. It grows from shared stories, local examples, practical improvements that others can see and adopt.</p><p>So next time someone asks, &#8220;How does your team do __?&#8221; &#8212; take it seriously.</p><p>Because your normal might be someone else&#8217;s turning point.</p><p><em>Until next time&#8212;<strong>happy coding!</strong> </em>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</p>]]></content:encoded></item></channel></rss>