<?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[Fractional Architect]]></title><description><![CDATA[Everything you need to know to become a top-tier software architect. No BS, only a pragmatic, and holistic approach to software architecture. There is no other place like that.]]></description><link>https://newsletter.fractionalarchitect.io</link><image><url>https://substackcdn.com/image/fetch/$s_!EKpT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554a159-c5ba-4833-bb8f-9608f36361a6_500x500.png</url><title>Fractional Architect</title><link>https://newsletter.fractionalarchitect.io</link></image><generator>Substack</generator><lastBuildDate>Thu, 16 Apr 2026 20:04:44 GMT</lastBuildDate><atom:link href="https://newsletter.fractionalarchitect.io/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Fractional Architect]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[fractionalarchitect@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[fractionalarchitect@substack.com]]></itunes:email><itunes:name><![CDATA[MJ]]></itunes:name></itunes:owner><itunes:author><![CDATA[MJ]]></itunes:author><googleplay:owner><![CDATA[fractionalarchitect@substack.com]]></googleplay:owner><googleplay:email><![CDATA[fractionalarchitect@substack.com]]></googleplay:email><googleplay:author><![CDATA[MJ]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[#52 FREE Ebook: Understand Your Domain First: An Introduction to Event Storming and Domain-Driven Design]]></title><description><![CDATA[Four months of silence later, I have transformed my "good enough" Domain-Driven Design book into something that actually teaches you how to think about business domains.]]></description><link>https://newsletter.fractionalarchitect.io/p/52-free-ebook-understand-your-domain</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/52-free-ebook-understand-your-domain</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 24 May 2025 12:25:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/697b3d52-0ccc-4a74-9ce3-a5cdcbbc4e8e_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Radio silence since March, right? I know, I know &#8211; where the hell have I been?</p><p>I have been completely obsessed with something that's been eating at me since I published <a href="https://mastersoftwarearchitecturebook.com/">"Master Software Architecture: A Pragmatic Guide."</a></p><p>Don't get me wrong, that book helped thousands of architects. But when I looked back at my first attempt at strategic Domain-Driven Design &#8211; "Mastering Strategic Domain-Driven Design" from late 2023 &#8211; I realized I could have done much better.</p><p>Sure, it hit 1,000 downloads in 24 hours and people loved that it was totally free. But I kept thinking that this is not good enough. You deserve better.</p><p>So I made a decision that probably sounds crazy to most creators. I completely stopped writing my newsletter and poured every ounce of my writing energy into rewriting that book from scratch.</p><p>Starting in March, I began what turned into a complete reconstruction&#8212;not a revision, not an update, but a total rebuild from the foundation up.</p><p>The original was good. This new version? It is the book I wish I had when I was struggling to understand why my software projects kept missing the mark despite perfect technical execution.</p><p>I am happy to share with you <a href="https://leanpub.com/understand-your-domain-first">"Understand Your Domain First: An Introduction to Event Storming and Domain-Driven Design."</a> I used some parts of the "Master Software Architecture&#8221; book in it (just that you know).</p><p>Most technical books teach you patterns and frameworks. This book teaches you how to think. It shows you how to look at a business domain and see the natural seams where your software should split, the workflows that drive real value, and the integration challenges that will emerge before they become expensive problems.</p><p>When you finish this book, you will know how to use Event Storming and transform the results of it into subdomains, bounded contexts and how to define a context map. Thanks to it, you will be able to understand any business domain deeply enough to build software that serves the business instead of fighting against it.</p><p><a href="https://leanpub.com/understand-your-domain-first">Download it</a>, share it, use it to transform how you and your team think about software architecture.</p><p>And of course, let me know what you think :)</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Warning: Subscribing may cause sudden urges to draw architecture diagrams on napkins. Subscribe anyway? (It's free!)</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#51 Evolutionary Architecture: From Articles to Videos]]></title><description><![CDATA[From simplicity to maintainability. From maintainability to complexity. From complexity to growth. Evolutionary architecture will help you to stay focused on the most important things at a given time.]]></description><link>https://newsletter.fractionalarchitect.io/p/51-evolutionary-architecture-from</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/51-evolutionary-architecture-from</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 15 Mar 2025 08:01:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6d8ecd36-be56-4fad-8282-31c4da7d141e_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last December, I wrote articles about evolutionary architecture. If you observe me for a longer time, you know that this is one of my favorite topics. Here you can find the first one in the series:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;739dbb3d-4d5d-4edb-bd18-f8b8d27bffd5&quot;,&quot;caption&quot;:&quot;Before we start today&#8217;s post, I would like to let you know that my &#8220;Master Software Architecture&#8221; book is finally available on Amazon as a paperback! You can find it here (you can change the marketplace by switching to .de, .it, .fr in the URL).&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;#38 Step One of Evolutionary Architecture: Focus on Simplicity&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:218430604,&quot;name&quot;:&quot;MJ&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/440b2b60-5b91-4bf0-922b-4c1db21e6e92_1080x1080.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-11-30T08:03:23.454Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68db9685-e1a6-4c55-9734-da6a4598de09_1456x1048.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.fractionalarchitect.io/p/38-step-one-of-evolutionary-architecture&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:152351352,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:9,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Fractional Architect&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554a159-c5ba-4833-bb8f-9608f36361a6_500x500.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Today, I would like to share videos covering the same content.</p><p>Why is this topic so important to me? In general, I am lazy. I don't want unnecessary complexity when building projects. That is why I am skeptical of microservices, Redis, Kafka, and similar unless absolutely needed.</p><p>However, the world isn't black and white. Sometimes they are a perfect fit. But in my experience (30 direct projects, dozens of consulting gigs), they were truly justified around three times.</p><p>The videos dive into the same principles of keeping architecture simple, flexible, and focused on actual business needs rather than technical hype. You will get extended and practical insights on how to deal with complexity and how to focus on maintainability - all delivered in a format that might be easier to consume during your commute or coffee break.</p><p>If you found value in the written series, you will probably enjoy this alternative take on the same ideas. And if you are new to the concept of evolutionary architecture, either format will help you avoid the common pitfall of overengineering your next project.</p><h2>How Did I Start Building Successful Apps - Evolutionary Architecture #1</h2><p>In this video, I describe how I approach building successful apps by leveraging evolutionary architecture - a concept that grows and extends within time in your application.</p><div id="youtube2-c6iK5B1yYBw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;c6iK5B1yYBw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/c6iK5B1yYBw?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2><strong>How Did I Start To Focus On Simplicity In My Apps - Evolutionary Architecture #2</strong></h2><p>In this step - Simplicity - we are not reinventing the wheel. The goal is dead simple: build the most straightforward solution that works right now.</p><div id="youtube2-HhxvkfbHe-Y" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;HhxvkfbHe-Y&quot;,&quot;startTime&quot;:&quot;410s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/HhxvkfbHe-Y?start=410s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>How Do You Keep Your Apps Maintainable - Evolutionary Architecture #3</h2><p>At some point, we need to think about another aspect of our system - like how easy it is to maintain.</p><div id="youtube2-xDi2tim4_SA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;xDi2tim4_SA&quot;,&quot;startTime&quot;:&quot;2s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/xDi2tim4_SA?start=2s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2><strong>How Do I React To The Growth of My Apps? Evolutionary Architecture #4</strong></h2><p>At some point, you need to react to your app's growth. The number of users, requests, several development teams, and frequency of changes are common factors that help you decide whether to extract part of your application to microservices or wait a bit longer.</p><p>In this video, you will learn about four common decision factors that will help you. Make sure that you check them before deciding on microservices.</p><div id="youtube2-K0cdtsl_8sc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;K0cdtsl_8sc&quot;,&quot;startTime&quot;:&quot;94s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/K0cdtsl_8sc?start=94s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Hungry for more? Ready to see these principles in action? Check out <a href="https://leanpub.com/master-software-architecture/c/l6iixhjvQcx5">my comprehensive 400-page book</a> that walks through real-world applications. Grab it now with a 25% discount &#8211; offer valid only until the end of next week!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Warning: Subscribing may cause sudden urges to draw architecture diagrams on napkins. Subscribe anyway? (It's free!)</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#50 DDD Series: Fine Tune Event Storming Results]]></title><description><![CDATA[After our initial exploration and identifying business events in our fitness domain, it is time to dig deeper and uncover the connecting elements: actors, commands, policies and read models.]]></description><link>https://newsletter.fractionalarchitect.io/p/50-ddd-series-fine-tune-event-storming</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/50-ddd-series-fine-tune-event-storming</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 01 Mar 2025 08:01:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7ddd0eee-8b8e-46b6-a54e-7260f1c4d455_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We have done much great work so far. In the previous post, we have analyzed our business domain from a big-picture perspective, recorded events, wrapped them into processes, and grouped them.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;176eda0d-9858-42f0-a3de-71bc9185cada&quot;,&quot;caption&quot;:&quot;Now that you have learned the fundamentals of your business, it is time to bring the vision to life by hosting the first interactive workshop.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;#49 DDD Series: Organize High-Level Workshops&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:218430604,&quot;name&quot;:&quot;MJ&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/440b2b60-5b91-4bf0-922b-4c1db21e6e92_1080x1080.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-02-22T08:04:08.333Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72bd5eb3-29ba-4bbb-a80c-0860c73dfdbb_1456x1048.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.fractionalarchitect.io/p/49-ddd-series-organize-high-level&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:157666461,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Fractional Architect&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554a159-c5ba-4833-bb8f-9608f36361a6_500x500.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>That's fine, but not enough to start technical implementation.</p><p>We still need to examine our business processes at a deeper level. Luckily, Event Storming comes with a solution called Process-Level analysis. At this level, we will focus on details&#8212;actors, commands, policies, and read models. Ultimately, we should have a clear map of our business processes, ready for a technical design.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>Before we start, I would like to introduce you to four new types of notes:</p><p><strong>Command: </strong>It is usually pictured with a blue card.<strong> </strong>Represents an action taken by a user or system that changes the state of the domain. It is usually a verb or a verb phrase, like <em>Prepare contract</em> or <em>Publish offer</em>. Commands are crucial for understanding what actions can be performed in the system and what triggers these actions.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0n_V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0n_V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!0n_V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!0n_V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!0n_V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0n_V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png" width="370" height="158" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e190d290-ab30-447c-a87a-f80bac4487c0_370x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:158,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8683,&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://newsletter.fractionalarchitect.io/i/158017392?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0n_V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!0n_V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!0n_V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!0n_V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe190d290-ab30-447c-a87a-f80bac4487c0_370x158.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>When you are adding commands, try to avoid having both a command and an event that basically say the same thing. Look at <em>Process payment</em> command and <em>Payment processed</em> event - they are just repeating each other!</p><p>Instead, you could have something like <em>Validate payment details and authorize transaction</em> as your command, which then leads to the <em>Payment processed</em> event. This cuts out the redundancy while still capturing what is happening.</p><p><strong>Policy: </strong>It is usually pictured with a purple card.<strong> </strong>Represents a business policy that dictates what action should be taken under certain circumstances. Policies are typically derived from business rules or legal requirements. They guide the decision-making process within the domain and often lead to the generation of commands based on certain conditions.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WaLr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WaLr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!WaLr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!WaLr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!WaLr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WaLr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png" width="370" height="158" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:158,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9699,&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://newsletter.fractionalarchitect.io/i/158017392?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WaLr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!WaLr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!WaLr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!WaLr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa4a21d2-ea39-4524-abf5-19aa8121b1a4_370x158.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>Read model:</strong> It is usually pictured with a green card. Represents the result of a translation of a business event. It is the data a user or system needs to execute the action. Read models could still be a little bit vague, so treat them as a draft.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VMJY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VMJY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!VMJY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!VMJY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!VMJY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VMJY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png" width="370" height="158" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:158,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9306,&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://newsletter.fractionalarchitect.io/i/158017392?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VMJY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!VMJY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!VMJY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!VMJY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b26546f-de97-4d91-83b6-0dd8c88b1f61_370x158.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>Actor: </strong>It is usually pictured with a yellow card. Represents a person or role interacting with the domain. Actors can be the initiators of commands or recipients of information. Actors help identify who or what is interacting with the system, providing insights into user roles or other entities that play a part in the domain.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lS4x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lS4x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!lS4x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!lS4x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!lS4x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lS4x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png" width="370" height="158" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:158,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9027,&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://newsletter.fractionalarchitect.io/i/158017392?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lS4x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!lS4x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!lS4x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!lS4x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e647c45-722a-49f1-b3e7-8c02f86be4f3_370x158.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Let's first check out how we handle offers. After digging deeper into this area, we have spotted some interesting things:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aiI0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aiI0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png 424w, https://substackcdn.com/image/fetch/$s_!aiI0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png 848w, https://substackcdn.com/image/fetch/$s_!aiI0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png 1272w, https://substackcdn.com/image/fetch/$s_!aiI0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aiI0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png" width="1197" height="1161" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1161,&quot;width&quot;:1197,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136900,&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://newsletter.fractionalarchitect.io/i/158017392?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aiI0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png 424w, https://substackcdn.com/image/fetch/$s_!aiI0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png 848w, https://substackcdn.com/image/fetch/$s_!aiI0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png 1272w, https://substackcdn.com/image/fetch/$s_!aiI0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6320289-937a-4b57-910d-2a20d540cd68_1197x1161.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We have three actors:</p><ul><li><p><strong>Sales representative</strong> who prepares the offer.</p></li><li><p><strong>Manager</strong> who provides feedback to the prepared offer.</p></li><li><p><strong>Marketing</strong> <strong>specialist</strong> who releases offer to the market.</p></li></ul><p>who need to work together before an offer goes live. We also noticed something we missed in the Big Picture sessions - the offer approval process.</p><p>There are two policies:</p><ul><li><p><strong>Revision handling policy</strong> which establishes how many revision cycles are permitted and timeframes for implementing changes.</p></li><li><p><strong>Offer publication standards policy</strong> which sets requirements for formatting, branding, and content that must be met before an offer can be published.</p></li></ul><p>One more thing that came up was the <em>Inquiry sent for an offer</em> event - someone in the group started a discussion about whether this should be part of <em>Offer Management</em> at all. We couldn't reach a decision on this, so we tagged it as a hot spot to come back to later.</p><p>Next, we move to contract processing. This time we also discovered additional process that we missed during initial workshops.</p><p>Next, we move to contract processing. This time we also discovered an additional process - the compliance verification at the end was something we completely missed in earlier sessions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!01hx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!01hx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png 424w, https://substackcdn.com/image/fetch/$s_!01hx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png 848w, https://substackcdn.com/image/fetch/$s_!01hx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png 1272w, https://substackcdn.com/image/fetch/$s_!01hx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!01hx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png" width="1456" height="685" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:685,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:142377,&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://newsletter.fractionalarchitect.io/i/158017392?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!01hx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png 424w, https://substackcdn.com/image/fetch/$s_!01hx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png 848w, https://substackcdn.com/image/fetch/$s_!01hx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png 1272w, https://substackcdn.com/image/fetch/$s_!01hx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04786ac-3f7b-40c6-b178-599495d3005c_1659x781.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We have four actors:</p><ul><li><p><strong>Legal officer</strong> who drafts contract terms and conditions</p></li><li><p><strong>Sales representative</strong> who customizes contracts for specific customers</p></li><li><p><strong>Customer</strong> who reviews and signs the contract</p></li><li><p><strong>Compliance officer</strong> who ensures contract meets regulatory requirements</p></li></ul><p>who need to work together for a contract to be fully processed. We noticed that the sales rep specifically handles customizing contracts for two types of customers: MVPs and renewals.</p><p>There are two policies:</p><ul><li><p><strong>Customer classification policy</strong> which includes guidelines for identifying and handling MVPs and renewals, including special terms or expedited processing.</p></li><li><p><strong>Regulatory compliance policy</strong> that defines specific requirements that must be verified by compliance officers before finalizing contracts.</p></li></ul><p>Next, we move to pass lifecycle management. This time we have added more detail to the flow based on our deeper understanding.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LM31!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LM31!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png 424w, https://substackcdn.com/image/fetch/$s_!LM31!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png 848w, https://substackcdn.com/image/fetch/$s_!LM31!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png 1272w, https://substackcdn.com/image/fetch/$s_!LM31!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LM31!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png" width="1385" height="940" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:940,&quot;width&quot;:1385,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:115825,&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://newsletter.fractionalarchitect.io/i/158017392?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LM31!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png 424w, https://substackcdn.com/image/fetch/$s_!LM31!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png 848w, https://substackcdn.com/image/fetch/$s_!LM31!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png 1272w, https://substackcdn.com/image/fetch/$s_!LM31!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e6b1dc-7221-4ff4-b41d-535f20ed8915_1385x940.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There are two actors: a manager who enrolls all passes in our system, and a security officer who initiates pass termination. We also find other events like <em>Time elapsed </em>and <em>Security breach recorded</em>. Additionally, we decided to replace <em>Pass expired </em>with <em>Pass validity ended</em> to be more clear.</p><p>There are two policies:</p><ul><li><p><strong>Pass expiration policy </strong>which determines when and how passes should expire. It contains the business rules that define the conditions under which a pass is considered to have reached the end of its validity period.</p></li><li><p><strong>Pass cancellation policy </strong>which defines the circumstances under which passes should be cancelled for various reasons, the protocol to follow, and who has the authority to make such decisions.</p></li></ul><h2>Summary</h2><p>As you can see, thanks to <em>Process Level</em> we are able to spot details that were missed during initial sessions. Our exploration of offer management, contract processing, and pass lifecycle revealed various important insights:</p><ol><li><p>We identified key actors in each process and their specific roles:</p></li><li><p>We discovered missed processes:</p><ul><li><p>The offer approval process in the offer management</p></li><li><p>The compliance verification step in contract processing</p></li><li><p>The security breach handling in the pass lifecycle</p></li></ul></li><li><p>We properly structured our model by:</p><ul><li><p>Avoiding command/event duplication</p></li><li><p>Adding policies between events and commands</p></li><li><p>Improving terminology for clarity</p></li></ul></li><li><p>We identified important policies like:</p><ul><li><p>Offer publication standards</p></li><li><p>Customer classification policy</p></li><li><p>Pass expiration policy</p></li><li><p>Pass cancellation policy</p></li></ul></li></ol><p>It helped us understand how actors cooperate through specific commands and events, giving us a much richer picture of our domain.</p><p>In the next post we will focus on describing subdomains based on what we modelled till now. Till then!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Warning: Subscribing may cause sudden urges to draw architecture diagrams on napkins. Subscribe anyway? (It's free!)</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#49 DDD Series: Organize High-Level Workshops]]></title><description><![CDATA[Before diving into code, you need to understand what you are actually building. Event Storming workshops bridge the gap between business ideas and technical implementation - here is how to run them.]]></description><link>https://newsletter.fractionalarchitect.io/p/49-ddd-series-organize-high-level</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/49-ddd-series-organize-high-level</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 22 Feb 2025 08:04:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/72bd5eb3-29ba-4bbb-a80c-0860c73dfdbb_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Now that you have learned the fundamentals of your business, it is time to bring the vision to life by hosting the first interactive workshop.</p><p>Plan your first workshop with decision-makers and domain experts - including developers (especially the ones who work on legacy systems as they often understand business processes deeply).</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>Keep your workshop intimate with no more than 10 people (my rule of thumb). Working with a large system? Start with understanding your most vital workflow first. A medical practice might focus on scheduling, while an insurance company could tackle claims processing, and retailers might prioritize their ordering system.</p><p>Next, structure the workshop into shorter segments to maintain productivity. A typical 3.5-hour session includes:</p><ul><li><p>Three 1-hour blocks with 5-minute breaks</p></li><li><p>15-minute buffer at the end</p></li></ul><p>Alternatively, you can plan six 30-minute segments with 5-minute breaks.</p><p>When modeling business processes, you will usually work with one of below states:</p><ul><li><p><strong>As-is</strong> state (focusing and modeling the current process)</p></li><li><p><strong>To-be</strong> state (focusing and modeling the desired future state)</p></li></ul><p>In my case, the modeling is usually done with either Event Storming or Domain Storytelling, or with a combination of both. There are also other techniques, so feel free to use the one that is comfortable for you, and what is most important - for participants.</p><p>In this post, I will show you how to leverage the power of Event Storming Big Picture workshops to start analyzing our fitness domain.</p><p>Think of Event Storming as your process detective kit. It helps uncover how things really work by focusing on completed actions &#8211; those 'done deals' in your business like <em>Contract Signed</em> or <em>Offer Published</em>. The magic happens in three layers.</p><p>It all starts with the Big Picture &#8211; a high-level map of events that shows what happens when highlighting any trouble spots. Next, you move to Process Level workshops where you focus on the details of the process - you will add actors, commands, policies, and read models. Finally, at the Design Level, you will explore modeled processes, focus on design, find aggregates, and refine business rules. At this level, pseudo-code may accompany sticky notes.</p><p>To handle such a workshop you will need plenty of wall space, sticky notes in different colors (static ones work best), and markers. Keep everyone on their feet during in-person sessions &#8211; it keeps minds sharp and ideas flowing. Running it remotely? Tools like Miro create that same collaborative feel.</p><p>For the Big Picture session, I usually use four types of notes:</p><ul><li><p><strong>Event.</strong> It is usually pictured with an orange note. It represents every business event in our domain. It does not represent a technical event, so <em>Button clicked</em> is not something you should care about. The rule of thumb is to name it in the past tense (something happened) because it is an event that has already occurred and cannot be changed.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ry6v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ry6v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!Ry6v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!Ry6v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!Ry6v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ry6v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png" width="370" height="158" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:158,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8315,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ry6v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!Ry6v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!Ry6v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!Ry6v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8205835-eef0-40ce-96b6-4e6e2c1cb760_370x158.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li><li><p><strong>Hot Spot. </strong>It is usually pictured with a red note. It represents every question or input that is unclear or cannot be answered during the workshop. This ensures that these concerns are not forgotten and can be addressed in future workshops.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n5bj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n5bj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!n5bj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!n5bj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!n5bj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n5bj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png" width="370" height="158" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:158,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11588,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!n5bj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!n5bj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!n5bj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!n5bj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f9c49d-3a9d-4944-8c1b-a140e37f0f81_370x158.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li><li><p><strong>Comment. </strong>It is usually pictured with a yellow note. It represents additional information, clarifications, or observations that participants want to add to the conversation. They ensure that important information is not overlooked.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XT5z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XT5z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!XT5z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!XT5z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!XT5z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XT5z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png" width="370" height="158" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:158,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11383,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XT5z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!XT5z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!XT5z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!XT5z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fb0d42d-1eee-4153-8116-f87377027ace_370x158.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li><li><p><strong>External System. </strong>It is usually pictured with a pink note. It represents an external system that interfaces with the domain. External systems are not directly controlled by the modeled system but play a significant role in its operation. They may send or receive messages, data, or events to and from the system, influencing its behavior or being influenced by it.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XP-V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XP-V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!XP-V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!XP-V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!XP-V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XP-V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png" width="370" height="158" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:158,&quot;width&quot;:370,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10517,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XP-V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png 424w, https://substackcdn.com/image/fetch/$s_!XP-V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png 848w, https://substackcdn.com/image/fetch/$s_!XP-V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png 1272w, https://substackcdn.com/image/fetch/$s_!XP-V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb63d33cd-7b8d-43d9-bf25-2d5c1d5f0268_370x158.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li></ul><p>Begin the workshop with practical preparation: equip everyone with plenty of colored notes and markers. Before diving into your business process, spend 30 minutes mapping something familiar, like a bike rental. It will help everyone grasp the techniques's basics.</p><p>With the team prepared, share your workshop's goal. In fitness, for example, you might aim to create a comprehensive view of membership enrollment and access management. Start the modeling by posting an orange event note centrally on your workspace. This first event &#8211; perhaps <em>Contract Signed</em> &#8211; becomes your temporal anchor, with the full process timeline growing organically in both directions: from offer selection through to pass registration and membership renewals.</p><p>Try to establish a 'no wrong answers' atmosphere where everyone feels confident contributing their process knowledge. When you spot similar events on the wall, pause for a quick alignment check &#8211; sometimes apparent duplicates are actually distinct events that share a name but serve different business functions.</p><p>Keep the momentum going with targeted questions: &#8220;What triggers this event?&#8221; or &#8220;What are the failure scenarios here?&#8221; When discussions hit an impasse, document it as a hot spot and move forward. That first hour should feel almost chaotic, with ideas flowing and sticky notes multiplying across the wall. If you are not seeing this energy, you either need to bring in different perspectives or provide more concrete examples to jumpstart thinking.</p><p>After the first part, the wall should look similar to this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SD02!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SD02!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png 424w, https://substackcdn.com/image/fetch/$s_!SD02!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png 848w, https://substackcdn.com/image/fetch/$s_!SD02!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png 1272w, https://substackcdn.com/image/fetch/$s_!SD02!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SD02!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png" width="962" height="807" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:807,&quot;width&quot;:962,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78976,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SD02!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png 424w, https://substackcdn.com/image/fetch/$s_!SD02!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png 848w, https://substackcdn.com/image/fetch/$s_!SD02!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png 1272w, https://substackcdn.com/image/fetch/$s_!SD02!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41b3517f-a2d8-46d4-84db-9790c91c5c39_962x807.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, there are both:</p><ul><li><p>Events that are related to business, e.g. <em>Contract signed</em> or <em>Pass expired</em></p></li><li><p>Events that are technical, e.g. <em>Request sent to API</em> or <em>Button clicked</em></p></li></ul><p>The first thing you want to do is to get rid of the technical events, as they are of no interest:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0MFc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0MFc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png 424w, https://substackcdn.com/image/fetch/$s_!0MFc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png 848w, https://substackcdn.com/image/fetch/$s_!0MFc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png 1272w, https://substackcdn.com/image/fetch/$s_!0MFc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0MFc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png" width="819" height="807" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:807,&quot;width&quot;:819,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57028,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0MFc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png 424w, https://substackcdn.com/image/fetch/$s_!0MFc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png 848w, https://substackcdn.com/image/fetch/$s_!0MFc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png 1272w, https://substackcdn.com/image/fetch/$s_!0MFc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e07f466-8090-4791-975e-eb26a4b1f2ee_819x807.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Time to arrange your event landscape chronologically. You can work forward &#8211; starting with the trigger event and following the natural flow of time, which matches how we typically think about processes. It helps capture fine details and reduces the risk of missing steps.</p><p>Alternatively, work backward from the final outcome. It often reveals unexpected connections and alternative paths you might miss going forward but it is easier to overlook intermediate steps.</p><p>After grouping, you should see an image similar to this one:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b4qP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b4qP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png 424w, https://substackcdn.com/image/fetch/$s_!b4qP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png 848w, https://substackcdn.com/image/fetch/$s_!b4qP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png 1272w, https://substackcdn.com/image/fetch/$s_!b4qP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b4qP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png" width="1456" height="162" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:162,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34150,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b4qP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png 424w, https://substackcdn.com/image/fetch/$s_!b4qP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png 848w, https://substackcdn.com/image/fetch/$s_!b4qP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png 1272w, https://substackcdn.com/image/fetch/$s_!b4qP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785828e5-fbb0-487e-9d15-32d27e57111e_1464x163.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Now that you have your event timeline, it is time to identify the pivotal events that shape your process. Look for events that mark major transitions &#8211; where actions become hard to undo, like finalizing a payment, or where responsibility shifts between actors. These pivotal events often trigger new subprocesses or create natural process boundaries.</p><p>Each process will have several pivotal events, and they will help transform your linear 'snake' into something more meaningful:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dt2i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dt2i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png 424w, https://substackcdn.com/image/fetch/$s_!Dt2i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png 848w, https://substackcdn.com/image/fetch/$s_!Dt2i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png 1272w, https://substackcdn.com/image/fetch/$s_!Dt2i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dt2i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png" width="1456" height="624" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:624,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:64715,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dt2i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png 424w, https://substackcdn.com/image/fetch/$s_!Dt2i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png 848w, https://substackcdn.com/image/fetch/$s_!Dt2i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png 1272w, https://substackcdn.com/image/fetch/$s_!Dt2i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e22873-1d9d-4865-a4d2-907a6c5db0e0_1467x629.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It is worth mentioning that elements within each of the above groups should be closely related and focused on a specific purpose or business capability (high cohesion).</p><p>During the grouping, you might observe that there are unclear points, or participants want to add additional context to discussions. Mark them with hot spots (unclear points) or with comments (additional context):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zSgi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zSgi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png 424w, https://substackcdn.com/image/fetch/$s_!zSgi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png 848w, https://substackcdn.com/image/fetch/$s_!zSgi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png 1272w, https://substackcdn.com/image/fetch/$s_!zSgi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zSgi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png" width="1456" height="739" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:739,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:76857,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zSgi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png 424w, https://substackcdn.com/image/fetch/$s_!zSgi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png 848w, https://substackcdn.com/image/fetch/$s_!zSgi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png 1272w, https://substackcdn.com/image/fetch/$s_!zSgi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3958820-18c5-4dd2-88ac-4c2322c43b00_1467x745.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Your final task is transforming those event groupings into named process segments. Hand this responsibility to your participants &#8211; they know their business domains best.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VAH_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VAH_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png 424w, https://substackcdn.com/image/fetch/$s_!VAH_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png 848w, https://substackcdn.com/image/fetch/$s_!VAH_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png 1272w, https://substackcdn.com/image/fetch/$s_!VAH_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VAH_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png" width="1456" height="821" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96132,&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://newsletter.fractionalarchitect.io/i/157666461?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VAH_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png 424w, https://substackcdn.com/image/fetch/$s_!VAH_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png 848w, https://substackcdn.com/image/fetch/$s_!VAH_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png 1272w, https://substackcdn.com/image/fetch/$s_!VAH_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e8a82-a37e-4304-b79d-0f6eb5d34567_1467x827.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That is it. We are done with the high-level workshop. The result will be used during an in-depth <em>Process Level</em> workshop.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Warning: Subscribing may cause sudden urges to draw architecture diagrams on napkins. Subscribe anyway? (It's free!)</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#48 DDD Series: From Business Talk to Software Requirements]]></title><description><![CDATA[Every software project starts with confusing business talks and big promises. Here is how to make sense of them before writing a single line of code - lessons from 13 years in IT industry.]]></description><link>https://newsletter.fractionalarchitect.io/p/48-ddd-series-from-business-talk</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/48-ddd-series-from-business-talk</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 15 Feb 2025 08:02:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e58002c2-2bbc-40d9-b7ed-6a732d54c28b_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When we build software, we are always working in what we call a &#8220;domain&#8221; - basically, the business area we are focusing on. Think of it like this:</p><ul><li><p><strong>E-commerce</strong>. This includes everything about online shopping, from showing products and processing orders to handling payments and more.</p></li><li><p><strong>Taxes.</strong> Covering stuff like income tax, and business tax, making sure people follow tax rules, and working with tax policies.</p></li><li><p><strong>Healthcare.</strong> Managing patient info, scheduling doctor visits, keeping medical records, handling prescriptions, and so on.</p></li><li><p><strong>Education.</strong> Involves things like tracking homework, running online learning platforms, managing student sign-ups, and grading.</p></li><li><p><strong>Logistics.</strong> Managing warehouses, moving stuff around, keeping track of inventory, finding the best delivery routes, and scheduling deliveries.</p></li></ul><p>As you can see, it all depends on what industry you are in. Here is the interesting part - businesses in the same field often look pretty similar. They follow common patterns that show up again and again. But don't be fooled - even if they look alike, they never work exactly the same way.</p><p>That is why we need to really dig into understanding our business domain every time we build something new - or rebuild a legacy system.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><h2>Our Business Domain - Fitness</h2><p>So, imagine we have been hired to build an app that handles everything you can think of for a fitness studio. Sounds exciting, right?</p><p>Now, here is the thing - we can't just lock ourselves away, try to build every possible feature, and come back two years later with a finished product. That is usually a recipe for disaster - either we run out of money or end up with something nobody wants to use! Instead, we need to focus on creating a system that actually helps our customers and covers the most important stuff.</p><p>Great, but how do we figure out what these important processes are? Sure, we can use fancy techniques like Event Storming or Domain Storytelling. We will get different people together for workshops, brainstorm ideas, and map out how everything should flow.</p><p>But here is a secret - it usually starts way before that. It begins with ideas that come to you before you even think about planning workshops. Usually, you are invited to a meeting where someone tells you something like this:</p><ul><li><p>&#8220;We want to build a SaaS app that any fitness studio can use. It will handle everything - from making the first offer to planning diets.&#8221;</p></li><li><p>&#8220;We need to create and promote offers to our customers. When someone wants to join or renew their membership, they will sign a contract.&#8221;</p></li><li><p>&#8220;After they sign the contract, they will get a pass to access the studio.&#8221;</p></li><li><p>&#8220;And when their pass expires, we need to be able to offer them a new contract.&#8221;</p></li><li><p>&#8220;Oh, and we need some reports - maybe just showing how many passes we have sold to start with.&#8221;</p></li></ul><p>And a hundred other inputs like these.</p><p>Now, you might feel overwhelmed. But actually, you are lucky - I have been in situations where teams were just told &#8220;Just make it like app XYZ!&#8221; and that was it. </p><p><strong>That is what I call a red flag.</strong></p><p>So why am I happy with getting this surface-level info without all the details? Because the details will come later in those workshops you will organize.</p><p>Let's break down what we have learned and how we can use it for our first workshops:</p><p><strong>Starting with the first statement: &#8220;We want to build a SaaS app that any fitness studio can use...&#8221;</strong></p><p>This tells us something important - we are probably building a SaaS (Software as a Service) app for fitness studios. It is technical stuff, but it shows the business model - how we plan to make money. Write this down - you will want to talk about it with your team after the workshops.</p><p>Why? Sometimes there might be better ways to do things, and part of your job is speaking up if you see a better approach.</p><p><strong>Moving on to the next part: &#8220;We need to create and promote offers to our customers...&#8221;</strong></p><p>Now we are getting our first real requirements, which we will dig into during workshops. Someone needs to create offers and show them to both new and existing customers. If someone likes what they see, they will sign a contract. This gives us a framework for planning our workshops and knowing what to focus on. Some questions that pop up:</p><ul><li><p>Will we build the entire offer system in our app?</p></li><li><p>How will people see these offers? Through emails? In the app?</p></li><li><p>What if someone wants a discount?</p></li><li><p>Do they sign the contract online or at the studio?</p></li></ul><p>These are all things to figure out when you meet with the domain experts and decision-makers. It is great that we are already thinking of these questions - write them down for later.</p><p><strong>Looking at the next piece: &#8220;After they sign the contract...&#8221;</strong></p><p>We can now see five main business processes:</p><ul><li><p>Creating offers</p></li><li><p>Promoting offers</p></li><li><p>Preparing contracts</p></li><li><p>Signing contracts</p></li><li><p>Registering passes</p></li></ul><p>This last step - registering passes - happens after someone signs a contract. More questions to think about:</p><ul><li><p>How do customers get their passes?</p></li><li><p>Can they get them different ways - like in person, by email, or in the mail?</p></li></ul><p>These are all good things to bring up in future discussions.</p><p><strong>Let's look at managing existing customers: &#8220;And when their pass expires, we need to be able to offer them a new contract&#8230;&#8221;</strong></p><p>Aha! So when someone's pass is about to run out, we send them a new contract offer. This brings up more questions:</p><ul><li><p>What exactly counts as an expired pass?</p></li><li><p>Should we make offers before passes expire?</p></li><li><p>Should we include special renewal discounts?</p></li><li><p>Could some contracts renew automatically?</p></li></ul><p>Look at how much we have learned from just a short conversation. And this is just what we have thought of - imagine what will come up when you get everyone together to brainstorm.</p><p><strong>The last part talks about reports: &#8220;Oh, and we need some reports&#8230;&#8221;</strong></p><p>We want to track how many passes we are selling. This is another area to focus on. We should definitely check with the fitness studios about what reports they actually need. If nobody has asked them yet, that is a great question for the workshops: &#8220;Why haven't we talked to the people who will actually use this?&#8221;</p><h2>Summary</h2><p>This early analysis is valuable, and I really recommend doing it. It helps you:</p><ul><li><p>Get a head start on understanding what you are building</p></li><li><p>Spot potential problems before they become real headaches</p></li><li><p>Show up to workshops prepared with smart questions</p></li><li><p>Save time by focusing on what really matters</p></li></ul><p>When you break down conversations like this, you are not just collecting requirements but also starting to see the bigger picture of how everything fits together. Plus, it makes those upcoming workshops way more productive because you have already done some homework.</p><p>Next time you are starting a new project, try spending just an hour or two breaking down those initial conversations. You might be surprised at how many important questions and insights pop up, and your team will definitely appreciate having a clearer starting point for those deeper discussions.</p><p><strong>Good software starts with good understanding, and every little bit of preparation helps build that understanding stronger.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[#47 DDD Series: Get Your Head Around The Domain First]]></title><description><![CDATA[As developers, we often get caught up in the technical aspects of our code - the patterns, frameworks, and architecture - while losing sight of what truly matters: the business domain.]]></description><link>https://newsletter.fractionalarchitect.io/p/47-ddd-series-get-your-head-around</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/47-ddd-series-get-your-head-around</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 08 Feb 2025 08:02:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/551ac400-7253-4cae-b3bd-2840f27805ae_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Years ago, I decided to dive into Domain-Driven Design. Everyone in tech was talking about it, and I wanted to understand what the buzz was about. Like with any new topic, the challenge was figuring out where to begin.</p><p>I reached out to one of my mentors for advice. He said, "MJ, you need to get your hands on <a href="https://www.goodreads.com/book/show/179133.Domain_Driven_Design">the Blue Book of DDD</a>. Once you read it, everything will click. It is the best resource out there."</p><p>"Perfect, this should be straightforward. A couple of months of reading and I will have this DDD thing figured out," I thought to myself.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>I grabbed a copy. Now, <strong>nine years later</strong>, I can say it is worth its weight in gold. But - and there is always a "but" - it took me nine years of hands-on experience and reading other books (like <a href="https://www.goodreads.com/book/show/15756865-implementing-domain-driven-design">the Red one</a>) to reach the level where I am satisfied (but I am still learning!). Along the way, I have made every mistake: botched projects, misunderstood concepts, and architecture that were way more complex than it needed to be.</p><p>It has been an incredible ride, though I had to learn most lessons the hard way - through my own mistakes (and my team's).</p><p>Strategic Domain-Driven Design is not rocket science - it is not like quantum physics where you need to completely rewire your brain. However (yes, another "but"!), you do need to push past your comfort zone and break free from thinking purely in technical terms - all those providers, controllers, managers, and handlers.</p><p><strong>The real key is understanding the business.</strong></p><h2>Getting Your Head Around the Domain</h2><p>Every business has its domain - could be one, could be dozens, could be hundreds - where it operates and generates revenue. Starting at a new company or joining a new project can feel like drinking from a firehose - you are trying to prove your worth while juggling major decisions. It is like being thrown into a tornado of architecture diagrams, documentation, requirements, new team dynamics, and organizational politics. Even seasoned pros can get overwhelmed by this information overload.</p><p>With all this chaos, it is tempting to skip getting to know the business domain you are working in. Someone might tell you, "Don't worry, all the requirements are documented - we don't need to spend more time on business analysis."</p><p><strong>This is exactly how legacy nightmares begin.</strong></p><p>You need to be upfront about needing time to understand the domain and its processes - being new means you won't grasp everything just by reading documentation. You will need to run workshops - prepare for a few days for simpler businesses, possibly weeks (or months) for more complex ones.</p><p>Getting buy-in for this can be tough when you are still building trust. Usually, you get one shot at it. That first workshop has to deliver - if it is high-quality, gets people engaged, and sparks meaningful questions, you will have set the stage for future sessions. The key is to convince the others that it is really worth running it.</p><h2>Running Workshops</h2><p>So you are ready to kick off your first workshop. Priority number one is setting a clear goal - something concrete you can build on.</p><p>Typically, I focus on mapping out the most business-critical process - the one that will be at the heart of the system. Sometimes this process lives entirely in your system, sometimes pieces of it happen elsewhere. Take a process that includes submitting requests to government legal systems - you might have to wait weeks for a response before moving forward internally.</p><p>For this kickoff workshop, you want the heavy hitters - decision-makers who can actually approve changes, and domain experts who know the nitty-gritty of different areas (think logistics folks, accountants, sales teams, legal experts). If you are dealing with a legacy system, bring in the developers who have been in the trenches with it - they often understand the business logic better than anyone.</p><p>When planning the details:</p><ul><li><p><strong>Group Size</strong> - I cap it at ten people. Any more and I can't give everyone the attention they deserve. Smaller groups tend to have better discussions and everyone gets a chance to contribute meaningfully.</p></li><li><p><strong>Location</strong> - While remote can work, I lean toward in-person meetings (even though in general I am a remote-first person). People are generally more engaged face-to-face, and it is easier to read the room. Plus, you can't beat physical whiteboards and sticky notes for collaborative work (I still love you Miro!).</p></li><li><p><strong>Timing</strong> - My sweet spot is three 1.5-hour blocks spread across two days. Often we need more time, but that is fine - I just schedule follow-up sessions. Short, focused sessions beat long, draining ones where people check out mentally.</p></li></ul><p>Now you can start thinking about your approach. There are several proven methods but here are my favorite two:</p><ul><li><p><strong>Event Storming</strong> - this technique gets teams exploring complex business domains by mapping out events, commands, policies, actors, read models, external systems, and more. It is particularly effective at spotting domain (you can also call it business) events and tracking how information flows through the system.</p></li><li><p><strong>Domain Storytelling</strong> - a workshop format where you listen to stories about how people and systems work together within their domain, and you visualize these stories with a simple pictographic language, making complex processes surprisingly clear. It is great for discovering edge cases and getting everyone on the same page about how things actually work.</p></li></ul><p>It is also fine to combine both methods. I often start with Domain Storytelling to capture the big picture - it helps business stakeholders visualize how their processes flow at a high level (usually DS is a preferred way of doing it - don&#8217;t ask me why), and everyone can easily follow along. Once we have this shared understanding, I switch to Event Storming to dive deeper into specific processes we have identified.</p><p><strong>This post is the start of the series related to Domain-Driven Design. In the next week, we will focus on discovering the fitness domain.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Warning: Subscribing may cause sudden urges to draw architecture diagrams on napkins. Subscribe anyway? (It's free!)</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#46 Package Dependencies: Understanding and Mitigating Issues]]></title><description><![CDATA[Every line of code you don't write yourself is a potential security risk. Learn how to protect your software from attacks through third-party packages. From automation to manual reviews.]]></description><link>https://newsletter.fractionalarchitect.io/p/46-package-dependencies-understanding</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/46-package-dependencies-understanding</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 25 Jan 2025 08:00:47 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4086e6bb-2051-41a3-915f-8851e9ca30d8_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In today's world of software development, we can't build everything ourselves. That is why we use third-party packages, which become part of our software supply chain, alongside our own code. We typically manage them through managers like NPM or NuGet.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>But there is a catch. While we keep an eye on our own code, we don't have the same control over external packages. Whether they are open-source or paid ones, changes in their code might slip by unnoticed, creating security risks.</p><p>Let's say you need to validate API parameters in your application. Instead of writing this from scratch, you find a popular open-source library, version 1.34.0. It looks great - hundreds of thousands of projects use it, and your tests show it works perfectly.</p><p>But what if someone discovers a major security hole in version 1.34.0? The library team releases version 1.34.1 with a fix, but if your team misses this update, your application stays vulnerable. An attacker could use this known weakness to break into your system.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xDDW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xDDW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png 424w, https://substackcdn.com/image/fetch/$s_!xDDW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png 848w, https://substackcdn.com/image/fetch/$s_!xDDW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png 1272w, https://substackcdn.com/image/fetch/$s_!xDDW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xDDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png" width="643" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:643,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60812,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xDDW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png 424w, https://substackcdn.com/image/fetch/$s_!xDDW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png 848w, https://substackcdn.com/image/fetch/$s_!xDDW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.png 1272w, https://substackcdn.com/image/fetch/$s_!xDDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50ebc2a7-b753-4411-95da-e7b6cfd695e1_643x825.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>That is why keeping packages updated is crucial.</strong> Package providers often release updates to fix bugs and add features. But new versions can also bring their own problems - like version 1.35.0 accidentally introducing a new security flaw that goes unnoticed.</p><p>Watch out for "dead projects" too - libraries that nobody maintains anymore. These are more likely to have security problems. If you find one, switch to something else quickly. If you can't find a good replacement, consider building the feature yourself or even taking over the project's development within your company (e.g. by forking).</p><p>Be suspicious if a package that hasn't changed in years suddenly gets an update. This could be someone trying to slip in malicious code. Take your time to verify these unexpected updates before using them.</p><p><strong>Such issues happen because your software is only as secure as its weakest part</strong>. Even with good monitoring, we might miss update notifications or not realize their importance. Sometimes we delay updates because they require big code changes.</p><p>One good solution is using tools like Dependabot in GitHub. It watches your dependencies and can even create automatic update requests. While this helps keep everything current, you still should check each update carefully. If you know an update might cause problems, plan time for it - especially if your current version has some security issues.</p><p>Another valuable approach is conducting monthly package audits. Set aside time each month to review your dependencies, checking for security advisories, recent updates, and overall package health. During these reviews, evaluate metrics like download counts, GitHub stars, and recent commits to gauge if packages are still actively maintained. Also, examine release notes and changelogs for potential security implications. <strong>This way you can identify risky dependencies before they become problems</strong> and it lets you plan migrations away from problematic packages well in advance.</p><p>How do you deal with keeping packages up to date?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#45 The Raw Truth About Self-Publishing My First Technical Book: 800+ Copies, $11K, and 850 Hours]]></title><description><![CDATA[Want to write a technical book? Think twice. Here is my story of self-publishing a software architecture book&#8212;from the initial decision through writing, pricing, and real sales numbers.]]></description><link>https://newsletter.fractionalarchitect.io/p/45-the-raw-truth-about-self-publishing</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/45-the-raw-truth-about-self-publishing</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 18 Jan 2025 15:40:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9c2b8a19-7628-44a7-966c-81a1e123f64c_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A week ago, my <a href="https://mastersoftwarearchitecturebook.com/">&#8220;Master Software Architecture&#8221;</a> book reached a milestone: 800 copies sold (combining ebooks and physical copies). While I am incredibly happy about this achievement, you might wonder: is this a lot compared to what I planned? That is one of the many topics I will explore in today's post.</p><p>I want to share the complete journey with you, answering questions like: How much has the book earned? Why did I choose the self-publishing route over a traditional publisher? How did I plan and execute the writing process? What were my initial expectations? How did I figure out the right pricing? And what are the pros and cons I have discovered along the way?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>My hope is that by sharing this story&#8212;from its very beginning until now&#8212;I can help you make a good decision if you are considering writing your own technical book.</p><p>They say if you don't know where to start, start at the beginning. So that is exactly what I will do.</p><h2>When Did I First Think About Writing a Book?</h2><p>The story begins in 2012, at the start of my professional programming journey. Like any junior developer, my main concern was simply surviving another month without making a fool of myself. My knowledge was limited, but it was just beginning.</p><p>As the years passed, I found myself exploring various areas of software development. From infrastructure to backend, frontend to third-party integrations, I eventually became a part-time consultant (next to my full-time job) specializing in payment providers and authentication systems.</p><p>Each new project offered a different perspective on software development. I worked with legacy systems and greenfield projects, in both hierarchical and flat organizations, from small startups to large enterprises. Looking back, it is amazing how quickly time flew by and how much I learned from both my mentors and the challenges I faced.</p><p>Around 2020, my perspective on software systems fundamentally shifted. After witnessing numerous systems built with unnecessary complexity, I began focusing on two key principles: simplicity and evolution.</p><p>But let me be clear: <strong>simplicity does not mean stupidity</strong>. A well-designed system can adapt and grow, regardless of future changes. You can follow and adapt patterns to meet your business needs&#8212;whether that means starting with a simple App Service and later migrating to Kubernetes, or evolving today's modular monolith into tomorrow's distributed system.</p><p>I frequently received feedback like &#8220;I didn't think about it this way&#8221; or &#8220;It opened my eyes.&#8221; <strong>This was the trigger that inspired me to write a book</strong>, sharing my thought process that had proven successful in 80% of the situations I encountered. Of course, <strong>it will never be a silver bullet covering 100% of cases</strong>. When you hear about a &#8220;magical&#8221; method that is &#8220;the&#8221; way, remember it is just &#8220;a&#8221; way&#8212;one of many possibilities.</p><p>In 2022, I began collecting materials and created what I thought was a rough plan (though looking back, I would hardly even call it that). While I initially planned to write the book in 2023, a full-time opportunity in artificial intelligence&#8212;a field I had been interested in since my studies&#8212;took priority.</p><p>When 2024 arrived, I made a decisive choice: this would be the year I finally wrote my book. I left my full-time job to focus on this goal. Interestingly, I had two potential books in mind, so I created a LinkedIn poll to let my audience help decide which one I should write.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QZiz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QZiz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png 424w, https://substackcdn.com/image/fetch/$s_!QZiz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png 848w, https://substackcdn.com/image/fetch/$s_!QZiz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png 1272w, https://substackcdn.com/image/fetch/$s_!QZiz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QZiz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png" width="526" height="1074" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1074,&quot;width&quot;:526,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:169345,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QZiz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png 424w, https://substackcdn.com/image/fetch/$s_!QZiz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png 848w, https://substackcdn.com/image/fetch/$s_!QZiz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png 1272w, https://substackcdn.com/image/fetch/$s_!QZiz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa17203a-1fd0-4b35-a653-8673d6a90d77_526x1074.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, the margin wasn't overwhelming&#8212;55% versus 45%. Still, the decision was made: &#8220;Ode To Software Architecture&#8221; would be my focus. T<strong>hat LinkedIn post on March 21, 2024, marked the beginning of what would become five months of intense work and dedication.</strong></p><h2>Self-Publishing Versus Traditional Publishing</h2><p>One of the first crucial decisions you will face is choosing between self-publishing and working with a traditional publisher. Both paths have their advantages and drawbacks&#8212;what matters is understanding what is important to you and whether you can manage the self-publishing journey independently.</p><p>Here are the key factors I considered:</p><ul><li><p><strong>Reach.</strong> If you don't have a significant following (like Gergely Orosz, for example), reaching a broad audience with your first self-published book can be challenging&#8212;I learned this the hard way. After publishing, I dove into research about typical sales figures. The pattern became clear: first-time authors typically sell 200-300 books in their first year. For a self-published book, reaching 1,000 sales in the first year is considered a success.</p></li><li><p><strong>Royalties.</strong> Based on publicly available information and discussions in the author community, traditional publishers typically offer an upfront payment of $3,000-5,000, with royalties of 5-8% on physical book sales and 10-20% on ebooks (sometimes after meeting certain sales thresholds). In contrast, self-publishing platforms (Leanpub, Gumroad, and others) offer 80-90% royalties on ebook sales. Physical book economics through print-on-demand services are less favorable (I earn something between $1-5 on each sale via Amazon KDP).</p></li><li><p><strong>Creative Freedom.</strong> Working with a traditional publisher involves extensive back-and-forth about content, writing style, and book structure. This makes sense&#8212;they have a reputation to maintain. For me, the ability to express myself naturally was paramount. I wanted to use simple language, share practical examples, and follow my specific structure. <strong>This was the deciding factor in choosing my path.</strong></p></li><li><p><strong>Copy Editing.</strong> Traditional publishers include professional copy editing services. They will assign someone to review your manuscript for grammar, sentence structure, and phrasing. With self-publishing, you need to hire them independently.</p></li><li><p><strong>Beta Readers and Reviewers.</strong> Self-publishing means finding your own beta readers and reviewers. Surprisingly, this wasn't as difficult as I expected&#8212;I put out calls on social media, and several colleagues volunteered (some even approached me directly). Traditional publishers typically have established networks of reviewers.</p></li><li><p><strong>Marketing.</strong> While I can't speak comprehensively about traditional publishers' marketing support, they do offer built-in reach and reputation&#8212;almost everyone in tech knows names like O'Reilly or Manning. With self-publishing, you are responsible for all marketing efforts.</p></li></ul><p>Having weighed all these factors, I decided to self-publish my book. The main challenge was finding the right platform that could help with reach, especially since I didn't have a large community behind me. After exploring my options, I settled on <a href="https://leanpub.com/">Leanpub</a>. Their royalty structure was refreshingly straightforward: they take 20% of each sale (while taking care of things like collecting VAT), while 80% goes directly to the author. The platform's credibility was reinforced by the fact that many respected authors in the software architecture space&#8212;like Gregor Hohpe, Alberto Brandolini, and Simon Brown&#8212;had published their books there.</p><h2>My Expectations</h2><p>Before diving into writing, I did my homework. I studied other authors' sales figures, read countless posts about maintaining writing consistency, and consulted colleagues who had published their own books. Based on this research, I set clear goals:</p><ul><li><p>Sell 5,000 copies in the first year</p></li><li><p>Start with an ebook, refine it based on early reader feedback, then release the physical version</p></li><li><p>Write at least 20 pages daily, aiming for around 400 pages total</p></li></ul><p>Was I being naive with these expectations? Let's explore what actually happened.</p><h2>Writing</h2><p>I started writing on March 22, 2024, just one day after the poll results came in. The first step was creating a comprehensive plan using a Miro board, mapping out topics and structure. While the overall plan proved accurate over time, some parts evolved (sadly, I no longer have that original Miro board). I spent about a week developing this initial outline, sharing it with my mastermind group (Radek Maziarka, Kamil B&#261;czek, and Krzysztof Owsiany) and the &#8220;Order of Devs&#8221; Discord for feedback. Their input was invaluable and helped shape the final structure before I wrote my first word.</p><p>Initially, I tried maintaining a rigid schedule of writing eight hours daily. While I managed to keep this pace for 2-3 weeks, eventually I hit a wall. Creative work for such extended periods proved unsustainable, so I adapted my approach.</p><p>My new routine was simple: wake up, have coffee, and start writing. Some days were incredibly productive&#8212;I could write for 13-14 hours (my record was 16 hours), producing up to 20 pages. Other days, I might only manage 3-5 hours and 5 pages. I set just one rule: write at least 5 pages daily. In the entire writing period, I only fell short of this goal 3-4 times.</p><p>This approach worked wonderfully. The key lesson? Listen to yourself. When you can't write, don't force it. <strong>Find your own rhythm. Also, don't measure yourself against other authors.</strong></p><p>If you don&#8217;t know it yet, my book is divided into 8 key steps and 2 extras:</p><ul><li><p>Step 1: Understand Software Architecture</p></li><li><p>Step 2: Discover Your Business Domain</p></li><li><p>Step 3: Recognize the Environment Around You</p></li><li><p>Step 4: Choose Deployment Strategy</p></li><li><p>Step 5: Define Release Strategy</p></li><li><p>Step 6: Focus On Testing</p></li><li><p>Step 7: Evolve Your Architecture</p></li><li><p>Step 8: Don't Forget About Security</p></li><li><p>Extra 1: Other Engineering Practices</p></li><li><p>Extra 2: Architecture Exercises</p></li></ul><p>My initial writing strategy was strictly sequential&#8212;starting with Step 1 and methodically moving forward. However, like my daily writing schedule, this linear approach ultimately proved too rigid. I discovered a more effective method: focusing first on topics I was most passionate about, such as discovering business domains, release strategies, architectural evolution, and security. I left the topics that interested me less, like deployment strategies and testing, for later. This approach clicked, and it served me well through the 5 months of writing.</p><p>Once I completed a substantial portion of each section, I sent it to my beta readers: Kamil Kie&#322;basa and Jos&#233; Roberto Ara&#250;jo. I am incredibly grateful for their exceptional feedback. Their input helped me refine my ideas, fill in gaps, and most importantly, validate that my content was valuable and well-presented. I would then incorporate their suggestions and send the revised sections back for another review.</p><p>On March 28, I ordered my book cover through Fiverr. I received it two days later:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y2pK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y2pK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png 424w, https://substackcdn.com/image/fetch/$s_!Y2pK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png 848w, https://substackcdn.com/image/fetch/$s_!Y2pK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png 1272w, https://substackcdn.com/image/fetch/$s_!Y2pK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y2pK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png" width="1456" height="1040" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2832771,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y2pK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png 424w, https://substackcdn.com/image/fetch/$s_!Y2pK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png 848w, https://substackcdn.com/image/fetch/$s_!Y2pK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png 1272w, https://substackcdn.com/image/fetch/$s_!Y2pK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F748c518d-cadf-4512-8a1c-6d4b6b1569c3_3780x2700.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Throughout the process, I also actively engaged with both my LinkedIn community and colleagues, seeking input on technical aspects of the book. Here are some examples:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f6H5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f6H5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png 424w, https://substackcdn.com/image/fetch/$s_!f6H5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png 848w, https://substackcdn.com/image/fetch/$s_!f6H5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png 1272w, https://substackcdn.com/image/fetch/$s_!f6H5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f6H5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png" width="525" height="627" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:627,&quot;width&quot;:525,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78536,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f6H5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png 424w, https://substackcdn.com/image/fetch/$s_!f6H5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png 848w, https://substackcdn.com/image/fetch/$s_!f6H5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png 1272w, https://substackcdn.com/image/fetch/$s_!f6H5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b1faa4a-3607-4b18-a2b4-b3c895024f47_525x627.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2U0U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2U0U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png 424w, https://substackcdn.com/image/fetch/$s_!2U0U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png 848w, https://substackcdn.com/image/fetch/$s_!2U0U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png 1272w, https://substackcdn.com/image/fetch/$s_!2U0U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2U0U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png" width="525" height="552" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:552,&quot;width&quot;:525,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65010,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2U0U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png 424w, https://substackcdn.com/image/fetch/$s_!2U0U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png 848w, https://substackcdn.com/image/fetch/$s_!2U0U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png 1272w, https://substackcdn.com/image/fetch/$s_!2U0U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7281aaa5-47ba-47d0-9ee9-2b8e8d7678b7_525x552.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In April, <a href="https://blog.pragmaticengineer.com/author/gergely/">Gergely Orosz</a> gave me invaluable advice: regularly share draft excerpts from my book. This suggestion proved brilliant&#8212;it allowed me to publicly validate my content as I wrote. I continued this practice throughout the writing process, gaining feedback and building interest along the way.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ej-x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ej-x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png 424w, https://substackcdn.com/image/fetch/$s_!ej-x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png 848w, https://substackcdn.com/image/fetch/$s_!ej-x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png 1272w, https://substackcdn.com/image/fetch/$s_!ej-x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ej-x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png" width="583" height="798" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:583,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:393929,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ej-x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png 424w, https://substackcdn.com/image/fetch/$s_!ej-x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png 848w, https://substackcdn.com/image/fetch/$s_!ej-x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png 1272w, https://substackcdn.com/image/fetch/$s_!ej-x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcccea6ed-282e-4c63-ad5c-3d42b22458c0_583x798.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In May, I hit my first major roadblock. I noticed my creativity had dried up&#8212;I was going through the motions of writing, but the quality was suffering. Rather than push through, I made a crucial decision: take a complete week off from writing. This proved to be exactly what I needed. When I returned to the keyboard, my mind was brimming with fresh ideas, and I easily found my rhythm again.</p><p>By the end of May, I began searching for a copy editor to elevate my book to professional standards. I had one key requirement: they needed to be from the United States, since I was primarily targeting US readers (below are my all-time stats from my Substack) and wanted American English.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f10E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f10E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png 424w, https://substackcdn.com/image/fetch/$s_!f10E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png 848w, https://substackcdn.com/image/fetch/$s_!f10E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png 1272w, https://substackcdn.com/image/fetch/$s_!f10E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f10E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png" width="768" height="529" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:529,&quot;width&quot;:768,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59828,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f10E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png 424w, https://substackcdn.com/image/fetch/$s_!f10E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png 848w, https://substackcdn.com/image/fetch/$s_!f10E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png 1272w, https://substackcdn.com/image/fetch/$s_!f10E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F849a3b5c-2e3d-4452-8fe9-f4599b3a5304_768x529.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I found my editor through Fiverr, and on June 10, 2024, I sent them the first 200 pages of my manuscript.</p><p>While waiting for the edited pages, I continued writing the next 200 pages. When the second crisis hit in June, I knew exactly what to do. I applied the same strategy&#8212;a week-long break&#8212;and once again, it worked perfectly.</p><p>I received the edited first half back on July 9, and spent several days reviewing the changes. On July 14, I sent the second batch of approximately 200 pages to my editor. While waiting for the second half, I made another significant decision: changing the book's title. I was receiving consistent feedback that &#8220;Ode To Software Architecture&#8221; didn't clearly convey the book's content. I created another poll to gather input, and that is how &#8220;Ode To Software Architecture&#8221; transformed into &#8220;Master Software Architecture.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CsKO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CsKO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png 424w, https://substackcdn.com/image/fetch/$s_!CsKO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png 848w, https://substackcdn.com/image/fetch/$s_!CsKO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png 1272w, https://substackcdn.com/image/fetch/$s_!CsKO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CsKO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png" width="514" height="638" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:638,&quot;width&quot;:514,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90980,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CsKO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png 424w, https://substackcdn.com/image/fetch/$s_!CsKO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png 848w, https://substackcdn.com/image/fetch/$s_!CsKO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png 1272w, https://substackcdn.com/image/fetch/$s_!CsKO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2236cfd7-ac0f-4317-afce-9b3f267f332d_514x638.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The last step before publication was securing reviewers who could provide rigorous, constructive feedback. Two experienced reviewers stepped forward: Jose Luis Latorre and Martin Dilger (author of the Leanpub bestseller <a href="https://leanpub.com/eventmodeling-and-eventsourcing">&#8220;Understanding Eventsourcing</a>&#8221;). I also specifically sought out Urs Enzler, knowing his reputation for thorough, unvarnished feedback would be invaluable.</p><p>Thanks to detailed critiques, I was able to make significant improvements to the book.</p><p>Throughout the writing process, I also gathered pricing feedback from multiple sources: social media interactions, direct inquiries, and Leanpub's data collection. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T44u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T44u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png 424w, https://substackcdn.com/image/fetch/$s_!T44u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png 848w, https://substackcdn.com/image/fetch/$s_!T44u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png 1272w, https://substackcdn.com/image/fetch/$s_!T44u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T44u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png" width="665" height="383" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7792bd05-94a2-461e-8301-27703c12d04d_665x383.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:383,&quot;width&quot;:665,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66868,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!T44u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png 424w, https://substackcdn.com/image/fetch/$s_!T44u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png 848w, https://substackcdn.com/image/fetch/$s_!T44u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png 1272w, https://substackcdn.com/image/fetch/$s_!T44u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7792bd05-94a2-461e-8301-27703c12d04d_665x383.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Based on this research, I initially structured the pricing with two tiers:</p><ul><li><p>Minimum price: $20</p></li><li><p>Recommended price: $26</p></li></ul><p>This flexible pricing model, unique to Leanpub, allows readers to pay the minimum price or choose to pay more if they find additional value in the book&#8212;there is no upper limit. After observing the market response, I later simplified the pricing to a flat $19, occasionally offering promotional discounts.</p><p>Finally, on August 26, the book was published.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b7eN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b7eN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png 424w, https://substackcdn.com/image/fetch/$s_!b7eN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png 848w, https://substackcdn.com/image/fetch/$s_!b7eN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png 1272w, https://substackcdn.com/image/fetch/$s_!b7eN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b7eN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png" width="524" height="824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:524,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:528720,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b7eN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png 424w, https://substackcdn.com/image/fetch/$s_!b7eN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png 848w, https://substackcdn.com/image/fetch/$s_!b7eN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png 1272w, https://substackcdn.com/image/fetch/$s_!b7eN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29e1a80e-0c82-4472-b757-9d7267e21b5d_524x824.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Guest Authors</h2><p>Rather than following the traditional approach of having one or two forewords, I invited five experts to share their perspectives on the key drivers of successful software architecture:</p><ul><li><p><strong>Vladik Khononov.</strong> Author of &#8220;Learning Domain-Driven Design&#8221; and &#8220;Balancing Coupling in Software Design.&#8221; While we had known each other online, we finally met in person at Infoshare 2024 where we were both speakers.</p></li><li><p><strong>Oskar Dudycz.</strong> The &#8220;Leonardo da Vinci of Event Sourcing,&#8221; whom I have had the pleasure of knowing personally for several years.</p></li><li><p><strong>Milan Jovanovi&#263;.</strong> A distinguished software architect and one of the two most prominent content creators in the C# and .NET ecosystem.</p></li><li><p><strong>Milan Milanovi&#263;.</strong> Chief Technology Officer and well-known content creator.</p></li><li><p><strong>Denis &#268;ahuk.</strong> Known for his pragmatic and smart approach to software development, Denis was previously a guest on my YouTube channel.</p></li></ul><p>I am really happy and grateful to have them contribute to my book. Their insights add great value for readers, and honestly, seeing their names in my book still makes me smile.</p><h2>The Numbers Behind the Book</h2><p>After all the planning, writing, and editing, let's look at the results:</p><p><strong>Readership</strong></p><ul><li><p>Total readers: 810</p><ul><li><p>Ebook copies: 728 (+11 refunds = 1.5%)</p></li><li><p>Physical copies: 82</p></li></ul></li></ul><p><strong>Financial Results</strong></p><ul><li><p>Leanpub royalties to date: $11,138.88</p></li><li><p>Amazon KDP royalties: pending</p></li></ul><p><strong>Pricing Insights</strong></p><p>During the period of the two-tier pricing model, the purchasing patterns were revealing:</p><ul><li><p>65% of readers chose the minimum price</p></li><li><p>35% opted to pay above minimum</p><ul><li><p>Most paid between $21-26</p></li><li><p>About 10 readers chose to pay even more</p></li></ul></li></ul><p><strong>Time Investment</strong></p><ul><li><p>Total hours: approximately 850</p><ul><li><p>Pre-launch work: 753 hours</p></li><li><p>Post-launch activities: ~97 hours</p></li></ul></li></ul><p><strong>Costs</strong></p><ul><li><p>Copy editor: ~$1,000 (usually it costs between $1,000 and $2,000)</p></li><li><p>Leanpub Pro Plan: $12.99/month</p></li><li><p>Grammarly: $90/4 months (1x quarterly + 1x monthly plan)</p></li><li><p>Deepl Pro: ~$10/month</p></li><li><p>Facebook &amp; Google Ads: $100</p></li></ul><p><strong>Reader Response</strong></p><ul><li><p>Goodreads Rating: 4.83</p></li></ul><h2>Unexpected Surprise</h2><p>Just days after publication, I received an incredible opportunity&#8212;an invitation from GOTO Book Club, probably the biggest tech book club in the world, to discuss my book in an interview. With their YouTube channel reaching 1 million subscribers, this was exactly the kind of exposure I was hoping for. The interview took place on September 6, just a week and a half after the book's release.</p><p>What made this even more special was that I could choose my interviewer. I invited Artur Skowro&#324;ski, and we had a fantastic conversation. You can watch the recording here:</p><div id="youtube2-cI9dfQLTXlU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;cI9dfQLTXlU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/cI9dfQLTXlU?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>Final Reflections</h2><p>Looking back, do I feel happy about publishing my first book? It is complicated. My initial goal was ambitious&#8212;5,000 sales in the first year. That turned out to be naive, but I am still on track to reach 1,000 sales, which I later learned is actually quite an achievement for a first-time self-published technical book.</p><p>The journey taught me invaluable lessons: how to write clear, accessible content, how to structure complex knowledge, and it significantly improved my written English. My beta readers and reviewers opened my eyes to new concepts I hadn't considered. And there is no better feeling than hearing someone say it is the best software architecture book they have read.</p><p>But I have to be honest&#8212;the writing process was exhausting. The creative aspect is a double-edged sword. It is incredibly engaging and interesting, but it drains your energy over the long run. At this point, I can't even think about writing another book.</p><p>Still, there is something incredibly rewarding about seeing a years-old dream become reality.</p><p>So, is writing a book worth it? Absolutely. Would I write another big book right now? No way&#8212;I am completely drained.</p><p>Good luck, and fingers crossed for your own writing journey!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#44 From My Diary: What Years of Testing Have Taught Me]]></title><description><![CDATA[Theory is one thing; reality is another. Seven testing patterns that I have seen again and again. No theory&#8212;just hard-earned insights.]]></description><link>https://newsletter.fractionalarchitect.io/p/44-from-my-diary-what-years-of-testing</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/44-from-my-diary-what-years-of-testing</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 11 Jan 2025 08:01:40 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b0944c21-9419-448a-a8d0-9e82916e033d_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We have all heard about how crucial testing is. Shift left, shift right, traditional testing. Pyramids, inverted pyramids, and diamonds. End-to-end, integration, and unit tests. Acceptance, regression, smoke tests, and who knows what else.</p><p>How do you avoid drowning in this sea of information? How should you approach a testing strategy for your application?</p><p>There is no single answer &#8211; it all depends on a multitude of different factors. What I want to share with you is something of a personal diary &#8211; seven patterns I have noted over the years while building various applications. I hope it will help you decide which way to go.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>The following fragment comes from the testing strategy step in my <a href="https://mastersoftwarearchitecturebook.com/">Master Software Architecture book</a>:</p><blockquote><p><em>Theory is one thing; reality is another. You can blindly follow concepts, but what really matters is what works well in your specific context. Over years of working with various systems, I have gathered key observations that I would like to share.</em></p><p><em><strong>Every time we prioritized integration tests over unit tests, we observed increased endpoint reliability and stability.</strong> However, this approach inadvertently resulted in a decline in code structure and its quality. The focus on overall functionality came at the expense of maintaining well-designed code at the chunk level.</em></p><p><em><strong>When we focused too much on unit tests and too little on integration tests, we were able to keep our code well structured and it was easy to modify.</strong> The downside was that our endpoints often failed to perform as expected due to insufficient integration tests. Even though unit tests passed, we had many issues integrating multiple chunks.</em></p><p><em><strong>Focusing mainly on end-to-end tests in greenfield applications almost always led to huge technical debt and, eventually, an inverted pyramid of tests.</strong> The plan was to start with end-to-end tests and gradually add other types of tests. However, this approach often failed because there was never enough time to add additional tests due to the constant addition of new features.</em></p><p><em><strong>End-to-end tests have always been the most helpful for us when working with legacy projects.</strong> When no tests were in place, the easiest approach before refactoring was to cover key business processes with E2E tests. And when such tests did exist, they were the only way to understand how the process worked, especially in the absence of domain experts.</em></p><p><em><strong>Flaky end-to-end tests often caused frustration and neglect.</strong> When there were hundreds or thousands (ouch!) of such tests, running them took several hours. Sometimes, some tests would fail randomly, so we had to rerun that part of the suite. Then they would pass, but we couldn&#8217;t be sure if other tests had affected the results. So we had to run them again, and then other tests failed. This led to a repetitive cycle of testing and retesting.</em></p><p><em><strong>The amount of stuff we had to mock was a good indicator of how well our test was designed.</strong> Each time we needed many mocks, the test was unstable and useless. It was a trigger for us to review and redesign the code we were testing.</em></p><p><em><strong>Shifting our focus to behaviors rather than all possible combinations resulted in the creation of more effective tests.</strong> By concentrating on the expected outcomes and interactions, we were able to develop tests that were well-structured, reliable, and easier to maintain. This behavioral approach allowed us to better align our testing with customer requirements.</em></p></blockquote><p>As you can see, in some cases it is a game of trade-offs (similar to other topics related to software architecture). The key is finding the right balance for your specific context. Too much focus on integration tests might improve endpoint reliability but could impact code quality. Unit tests can help maintain clean, modifiable code but might miss critical integration issues. End-to-end tests could be invaluable for legacy systems yet potentially troublesome in other cases as they are slow and flaky.</p><p>Rather than dogmatically following a single testing approach or methodology, the most effective strategy involves carefully weighing these trade-offs against your project's unique needs, team dynamics, and business requirements. <strong>Remember that testing strategies should evolve as your application grows and changes</strong> &#8211; what works perfectly in the early stages of development might need adjustment as the system matures.</p><p>What are your observations when you come to the test topics?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#43 Oops, I Deployed It Again: Learning from Our Continuous Deployment Fails]]></title><description><![CDATA[While we have managed to make our deployments successful most of the time, there is still that little percentage where human nature kicks in. Learn about the most common mistakes we encountered.]]></description><link>https://newsletter.fractionalarchitect.io/p/43-oops-i-deployed-it-again-learning</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/43-oops-i-deployed-it-again-learning</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 04 Jan 2025 08:01:05 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d4e7d49a-3b3a-4b45-aaf5-819bd8ba3301_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Happy New Year!</strong></p><p>Last year, I had the opportunity to speak at several conferences including Devox, Infoshare, .NET Day Switzerland, and DevConf. While I covered various topics, I found myself drawn repeatedly to one of my favorites: <strong>continuous deployments</strong>.</p><p>I still remember my first encounter with this concept. It left me both skeptical and fascinated. Skeptical, because I wasn't used to the idea of fully automating the entire software development cycle - no dedicated testing phases, no manual approvals, just rapid feedback loops. And at the time, every presentation I saw was purely theoretical. It wasn't a widely adopted practice yet, more of an aspirational goal than reality. Whenever I asked speakers about their actual experience with it, the answers were: "Oh, we have tried it in a test environment" or "Just for a hobby project."</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>Being someone who loves turning theory into practice, I decided to look at this idea at the company I was working for several years ago. To my delight, it was approved, and we made it happen. In the end, everyone was quite happy with the result - customers, the company, and the developers.</p><p>That success led me to implement it in more organizations, including one large-scale with complex, established processes (yes, it was possible!). Each implementation brought its own challenges and experiences, teaching me invaluable lessons along the way.</p><p>Before going deeper, let's look at some eye-opening data. <a href="https://cd.foundation/wp-content/uploads/sites/78/2024/04/State-of-CICD-Report-April-22-2024-Updated.pdf?utm_referrer=https%3A%2F%2Fcd.foundation%2Fstate-of-cicd-2024%2F">A study by SlashData and the Continuous Delivery Foundation</a> tracked deployment frequencies across years, and the results might surprise you. Despite what the tech buzz on social media might suggest, the reality is quite different. Think continuous deployment is everywhere? The data tells a different story - only about 10% of surveyed teams deploy multiple times per day.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SMsJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SMsJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png 424w, https://substackcdn.com/image/fetch/$s_!SMsJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png 848w, https://substackcdn.com/image/fetch/$s_!SMsJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png 1272w, https://substackcdn.com/image/fetch/$s_!SMsJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SMsJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png" width="1264" height="698" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:698,&quot;width&quot;:1264,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SMsJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png 424w, https://substackcdn.com/image/fetch/$s_!SMsJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png 848w, https://substackcdn.com/image/fetch/$s_!SMsJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.png 1272w, https://substackcdn.com/image/fetch/$s_!SMsJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ace2e6-9b2f-4771-a011-37a1cacfb322_1264x698.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And you know what? That's perfectly fine. Continuous deployment isn't a one-size-fits-all solution - sometimes it simply doesn't make sense for a particular context, team, or product.</p><p>Anyway, coming to the heart of this post. I want to share with you the real mistakes we have been continuously making. Each one has taught us valuable lessons, <strong>but here is the honest truth</strong>: even after all these years, I can't claim to have found a perfect solution. While we have managed to make our deployments successful 98% of the time, there is still that 2% where human nature kicks in - someone forgets a crucial step, makes an unexpected mistake (yes, myself included!), and things go sideways.</p><h2>Showing hidden features</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JLz8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JLz8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp 424w, https://substackcdn.com/image/fetch/$s_!JLz8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp 848w, https://substackcdn.com/image/fetch/$s_!JLz8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp 1272w, https://substackcdn.com/image/fetch/$s_!JLz8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JLz8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp" width="500" height="375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:460522,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JLz8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp 424w, https://substackcdn.com/image/fetch/$s_!JLz8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp 848w, https://substackcdn.com/image/fetch/$s_!JLz8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp 1272w, https://substackcdn.com/image/fetch/$s_!JLz8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3730cd1a-c6f4-4b92-a301-37e72013ecc2_500x375.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here is a classic pitfall we have run into time and time again: accidentally revealing features that were supposed to stay under wraps until a big marketing event. <strong>I can already hear you saying "But feature flags exist, you fool!"</strong> And yes, you are absolutely right - they do.</p><p>But here is the thing - even with four-eyes checks, about once every 20 or 30 deployments, someone (doesn't matter how experienced they are) forgets to add (or set) that crucial feature flag. And just like that... BANG! A feature that was meant to be unveiled at next month's marketing event is suddenly live for everyone to see.</p><p>Simple mistake, painful consequences. :)</p><h2>Issues while touching a database</h2><p>Now it is time for a particularly tricky challenge - managing database changes when you are running multiple versions of your application simultaneously (whether through blue-green, rolling, or canary deployments). The complexity here isn't in any specific type of change - it could be adding a column, changing a data type, or migrating data to a new structure. Your challenge lies in orchestrating these changes across parallel versions without breaking anything.</p><p>Every database change needs a carefully thought-out plan:</p><ul><li><p>First, map out your entry point - what is the very first change that needs to happen? This could be adding a nullable column or setting up a temporary transition state.</p></li><li><p>Next, outline each subsequent step in detail, understanding how both old and new versions of your application will interact with the database during each phase.</p></li><li><p>Finally, develop a rollback strategy for every single step. Think of it as your safety net - you need to know exactly what to do if things go sideways.</p></li></ul><p>Well, even with perfect planning, things can still go wrong during deployment. This is one of those skills that comes with experience. In the beginning, you will likely stub your toe a few times - it is almost a rite of passage. But with each deployment, each mistake, and each recovery, you will build up the knowledge that will help you prevent such issues.</p><p>In one of my previous posts, I described this problem in detail (based on a real-world example):</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;8a02a86a-f350-491c-afc3-bea109ef77b8&quot;,&quot;caption&quot;:&quot;In the last post about deployment strategies, I promised I wouldn&#8217;t leave the topic of database challenges when we have to support various, parallel application versions. It is the perfect time to face it. I will walk you through several real-world scenarios I have encountered frequently in my past projects.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;#31 The Parallel Puzzle: Solving Database Changes Across Parallel Versions&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:218430604,&quot;name&quot;:&quot;MJ&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/440b2b60-5b91-4bf0-922b-4c1db21e6e92_1080x1080.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-10-12T07:01:25.032Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90bcdaf7-ca6d-4b58-8a24-d7649b5c73c7_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.fractionalarchitect.io/p/31-the-parallel-puzzle-solving-database&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:149997770,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Fractional Architect&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554a159-c5ba-4833-bb8f-9608f36361a6_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>UI issues that were not caught by automation</h2><p>One of the best lessons I learned while working with continuous deployments was to accept artifacts that can occur in production. What do I mean by an artifact? For example, we can accept that while the key business process works fine (validated by our automated tests), there is a chance that something minor might not work as expected. </p><p>Let me explain.</p><p>Imagine that inside your application there is a modal window that is part of a business-critical process. This window contains some kind of a form, and additionally two buttons - one to cancel, and another one to submit. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NmmC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NmmC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png 424w, https://substackcdn.com/image/fetch/$s_!NmmC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png 848w, https://substackcdn.com/image/fetch/$s_!NmmC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png 1272w, https://substackcdn.com/image/fetch/$s_!NmmC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NmmC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png" width="440" height="374.468085106383" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:658,&quot;resizeWidth&quot;:440,&quot;bytes&quot;:28465,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NmmC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png 424w, https://substackcdn.com/image/fetch/$s_!NmmC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png 848w, https://substackcdn.com/image/fetch/$s_!NmmC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png 1272w, https://substackcdn.com/image/fetch/$s_!NmmC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f40ad2d-16c1-4cd5-8a92-6167d4aff4a4_658x560.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>After one of your CSS changes, someone spots in the production environment that buttons are outside of the modal, floating somewhere around:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RsGm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RsGm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png 424w, https://substackcdn.com/image/fetch/$s_!RsGm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png 848w, https://substackcdn.com/image/fetch/$s_!RsGm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png 1272w, https://substackcdn.com/image/fetch/$s_!RsGm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RsGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png" width="522" height="463.3176470588235" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:679,&quot;width&quot;:765,&quot;resizeWidth&quot;:522,&quot;bytes&quot;:32203,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RsGm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png 424w, https://substackcdn.com/image/fetch/$s_!RsGm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png 848w, https://substackcdn.com/image/fetch/$s_!RsGm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png 1272w, https://substackcdn.com/image/fetch/$s_!RsGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb028dc65-3b55-4bea-b12f-9774aa32b038_765x679.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>How was that possible? While your automated tests can verify your critical business process perfectly well, they might miss these kinds of visual details. Sure, your tests can confirm that buttons exist, find them, and execute the action, but they won't catch if a button suddenly appears in the wrong spot on the page. It is a blind spot in automation that you need to keep in mind when setting up continuous deployment. But here is the point: you can quickly react and deploy the new version (I prefer it over the rollback, but you can also roll it back) within minutes or hours, thanks to the automation that you have.</p><h2>Failures caused by updating libs</h2><p>Library updates are an integral part of development life. Whether they are internal or third-party. The trigger could be anything from needing a new feature to avoiding a security vulnerability. But regardless of why you are updating, it is the aftermath that can give you a real headache.</p><p>Take this common scenario. Everything compiles perfectly, all tests pass with green color, but then you hit runtime and... surprise! </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4s3A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4s3A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png 424w, https://substackcdn.com/image/fetch/$s_!4s3A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png 848w, https://substackcdn.com/image/fetch/$s_!4s3A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png 1272w, https://substackcdn.com/image/fetch/$s_!4s3A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4s3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png" width="1278" height="431" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:431,&quot;width&quot;:1278,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!4s3A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png 424w, https://substackcdn.com/image/fetch/$s_!4s3A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png 848w, https://substackcdn.com/image/fetch/$s_!4s3A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png 1272w, https://substackcdn.com/image/fetch/$s_!4s3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb8067f0-11c1-4128-bfbc-036d2095f18b_1278x431.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It is similar to the modal example earlier - you might update an image library and while your automated tests happily verify that the image tags exist in the HTML, they won't catch that the images themselves are rendering incorrectly.</p><p>This is a relatively simple example, but it illustrates a broader point. Good observability tools (looking at you, <a href="https://sentry.io/welcome/">Sentry</a>!) can help you catch these issues before your users do, but it is still a classic mistake that you need to watch out for.</p><h2>Summary</h2><p>Continuous deployment is a powerful practice, but it is important to approach it with eyes wide open. While the examples I have shared might seem discouraging, they are part of the learning process that every team goes through. The key isn't to achieve perfection - it is to learn from each incident and maintain the ability to respond quickly when things go wrong. And remember, what matters most is finding the rhythm that works for your team, your product, and mainly your customers.</p><p>If you are interested in a general overview (where these mistakes are one of the topics), feel free to watch a video from one of my talks called &#8220;<em>Oops, I deployed it again: a survivor&#8217;s guide to continuous deployment</em><strong>&#8221;:</strong></p><div id="youtube2-Wb6mRmLWceY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Wb6mRmLWceY&quot;,&quot;startTime&quot;:&quot;484s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Wb6mRmLWceY?start=484s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#42 Architect With Confidence: Key Learning Resources of 2024]]></title><description><![CDATA[From groundbreaking books and conference talks to practical articles - 2024 brought a lot of excellent materials around software architecture. I share the resources that resonated most with me.]]></description><link>https://newsletter.fractionalarchitect.io/p/42-architect-with-confidence-key</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/42-architect-with-confidence-key</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 28 Dec 2024 08:00:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4778fc5d-46c0-4d31-b45d-ad1ca1421549_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last December, my software architecture resources roundup on LinkedIn gained significant traction. The post shared top books, articles, and repositories for architects.</p><p>This year, I am moving the annual list to my newsletter, focusing exclusively on 2024's outstanding books, talks, and other resources. It has been a remarkable year for architectural knowledge, with excellent publications and insights worth sharing.</p><p>I will focus mainly on software architecture, but also on related topics. Let's start with books.</p><h2>Books</h2><p>Writing <a href="https://mastersoftwarearchitecturebook.com">"Master Software Architecture"</a> dominated my 2024, which meant less technical reading than usual. The book's demanding creation process consumed most of my energy and focus until August. Once I finished the manuscript, I dove back into reading and discovered several exceptional titles published this year (in random order):</p><ol><li><p><a href="https://leanpub.com/platformstrategy">Platform Strategy</a> by Gregor Hohpe</p></li><li><p><a href="https://www.manning.com/books/architecture-modernization">Architecture Modernization</a> by Nick Tune</p></li><li><p><a href="https://leanpub.com/eventmodeling-and-eventsourcing">Understanding Eventsourcing</a> by Martin Dilger</p></li><li><p><a href="https://www.amazon.com/Balancing-Coupling-Software-Design-Addison-Wesley-ebook/dp/B09RV3Z3TP">Balancing Coupling in Software Design</a> by Vladik Khononov</p></li><li><p><a href="https://www.amazon.com/Accidental-CIO-Agile-Playbook-Leaders/dp/1119612098">The Accidental CIO</a> by Scott Millett</p></li></ol><h2>Talks</h2><p>Next, I would like to share my curated selection of the most impactful architecture talks from 2024. I have arranged these without any particular ranking to focus on their individual merits:</p><ol><li><p>So You Want to Build An Event Driven System? by James Eastham</p><div id="youtube2-qcJASFx-F5g" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;qcJASFx-F5g&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/qcJASFx-F5g?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></li><li><p>An Introduction to Residuality Theory by Barry O&#8217;Reilly</p><div id="youtube2-_MPUoiG6w_U" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_MPUoiG6w_U&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/_MPUoiG6w_U?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></li><li><p>Let's build the worst Event Sourcing system! by Oskar Dudycz</p><div id="youtube2-20zvAJAhqS0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;20zvAJAhqS0&quot;,&quot;startTime&quot;:&quot;861s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/20zvAJAhqS0?start=861s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></li><li><p>Architects Aren&#8217;t the Smartest People in the Room by Gregor Hohpe</p><div id="youtube2-f21WtcJg8ZA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;f21WtcJg8ZA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/f21WtcJg8ZA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></li><li><p>Design more decoupled services with one weird trick by Udi Dahan</p><div id="youtube2-mT5bhj1Wygg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;mT5bhj1Wygg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/mT5bhj1Wygg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></li></ol><h2>Articles</h2><p>These articles and blog posts hit home for me in 2024:</p><ol><li><p><a href="https://www.architecture-weekly.com/p/deduplication-in-distributed-systems">Deduplication in Distributed Systems: Myths, Realities, and Practical Solutions </a>by Oskar Dudycz</p></li><li><p><a href="https://www.milanjovanovic.tech/blog/clean-architecture-the-missing-chapter">Clean Architecture: The Missing Chapter</a> by Milan Jovanovi&#263;</p></li><li><p><a href="https://newsletter.pragmaticengineer.com/p/the-biggest-ever-global-outage-lessons">The biggest-ever global outage: lessons for software engineers</a> by Gergely Orosz</p></li><li><p><a href="https://tidyfirst.substack.com/p/the-documentation-tradeoff">The Documentation Tradeoff</a> by Kent Beck</p></li><li><p><a href="https://craftingtechteams.substack.com/p/3-surprising-lessons-you-can-adopt">3 Surprising lessons you can adopt from Extreme Programming</a> by Denis &#268;ahuk</p></li></ol><p>Additionally, I invite you to read one article from my newsletter which was the most popular one in 2024. It shows you how to frame technical decisions in business language that resonates with stakeholders:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;55a99093-d8e4-4bc1-8841-40b3cef6238b&quot;,&quot;caption&quot;:&quot;Picture this: A meeting room full of business leaders. A software expert walks in, excited to share ideas that could help the company grow.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;#35 A Tech Sales Guide: Stop Selling Technicalities, Start Selling Outcomes&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:218430604,&quot;name&quot;:&quot;MJ&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/440b2b60-5b91-4bf0-922b-4c1db21e6e92_1080x1080.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-11-09T08:01:10.874Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5a0eacb-cfdd-4c4e-80d4-91887625d186_1456x1048.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.fractionalarchitect.io/p/35-a-tech-sales-guide-stop-selling&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:151257434,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:8,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Fractional Architect&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554a159-c5ba-4833-bb8f-9608f36361a6_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Repos</h2><p>Unfortunately, I haven&#8217;t found any interesting repo in 2024 that would show you some architectural concerns and explain them with real-world examples. However, two existing repos remain invaluable for anyone serious about domain-driven design and system modularization:</p><ol><li><p><a href="https://github.com/kgrzybek/modular-monolith-with-ddd">Modular Monolith with DDD</a> (.NET 8) by Kamil Grzybek</p></li><li><p><a href="https://github.com/evolutionary-architecture/evolutionary-architecture-by-example">Evolutionary Architecture by Example</a> (.NET 9) by Kamil B&#261;czek and Maciej Jedrzejewski</p></li></ol><h2>Summary</h2><p>Looking back at 2024, I can't help but feel optimistic about where software architecture is heading. More teams are embracing fundamentals, and thoughtfully considering system coupling - changes I witness daily in my consulting work. The resources I have shared capture this momentum perfectly. I can't wait to hear which ones resonated with you and what you will build next.</p><p><strong>Keep building amazing things, and see you next year with more architectural adventures!</strong></p>]]></content:encoded></item><item><title><![CDATA[#41 Step Four of Evolutionary Architecture: Focus on Complexity]]></title><description><![CDATA[Tackle complexity before it takes over your system. Early detection and action can prevent major rewrites and endless maintenance headaches.]]></description><link>https://newsletter.fractionalarchitect.io/p/41-step-four-of-evolutionary-architecture</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/41-step-four-of-evolutionary-architecture</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 21 Dec 2024 08:01:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/db2f9221-e2f3-4e96-b07d-ff0614dc6c2c_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the past few weeks, we have looked at keeping things simple, ensuring we can maintain our code, and planning for growth. Now it is time to tackle the last step: dealing with complexity.</p><p>Your app will probably get complex (or at least complicated), even if it doesn't get enormous traction. Like in real life - you start with a simple house, but then you add a garage, a garden, maybe a swimming pool. Before you know it, you have got a whole neighborhood.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>The same happens with code. Maybe you start with a basic user login. Then you add password reset. Then social media login. Then two-factor auth. Then single-sign-on. It gets complicated.</p><p>Your business will also change - it always does. Take an insurance company. They start with car insurance: checking driving history, car value, and accident risk. Simple enough. Then they add home insurance. Now you need to handle property values, natural disaster risks, and security systems. Different rules, different checks. Next comes life insurance. Suddenly you are dealing with health records, age calculations, and beneficiary management. </p><p>Each type seems similar on the surface - it is all insurance, right? But the rules are completely different. Your code starts filling up with "if this is car insurance, check X, but if it is home insurance, check Y, and if it is life insurance, check Z.&#8221; Before you know it, you are drowning in conditional statements.</p><p>The infrastructure side also brings its own complexity. Imagine a startup app - one web server, one database. Works great at first. Then traffic grows. The app gets slow. Adding a cache helps with speed. A message broker handles the communication. One database can't keep up, so you add replicas. The web server maxes out, forcing you to add more servers and a load balancer. And so on. Suddenly your simple system turned into a distributed one. Now you are facing node coordination, data syncing across databases, and network failures. What used to be "it works on my machine" becomes "which of these 20 machines is causing the problem?"</p><p>Complexity builds up everywhere - new features, business rules, servers, databases. And the more complex your system gets, the harder it becomes to maintain it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rcp1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rcp1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png 424w, https://substackcdn.com/image/fetch/$s_!rcp1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png 848w, https://substackcdn.com/image/fetch/$s_!rcp1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png 1272w, https://substackcdn.com/image/fetch/$s_!rcp1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rcp1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png" width="925" height="359" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:359,&quot;width&quot;:925,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23884,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rcp1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png 424w, https://substackcdn.com/image/fetch/$s_!rcp1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png 848w, https://substackcdn.com/image/fetch/$s_!rcp1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.png 1272w, https://substackcdn.com/image/fetch/$s_!rcp1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611d33b3-cf41-4d3f-b13d-493853d377fb_925x359.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>How can you address such problems?</p><p><strong>In the case of infrastructure,</strong> keep an eye on your system from the start. Add monitoring tools early. When you add new pieces, make sure you can see how they are performing. Also, try to automate as much of your infrastructure as possible, already from the start. Write code to handle server setup, configuration, and deployment. That way, when your system grows from 2 components to 20, you won't lose track of what is running where or how it all fits together.</p><p>Without good automation and monitoring, you will get overwhelmed trying to manage everything by hand. One small mistake in server configuration, one forgotten setting, and your whole system can break in ways that take hours to debug.</p><p><strong>As your code grows</strong>, simple entity-level logic isn't enough anymore. At first, putting behavior directly in entities worked fine. But when these need to work together, it might be time for another solution.</p><p>What you can do is create an aggregate that watches over related entities. Think of aggregates as rule enforcers -  they keep all operations consistent and prevent unauthorized changes. Example? A <em>Prescription</em> aggregate makes sure only the prescribing doctor can cancel their prescriptions. Or a <em>BindingContract aggregate</em> allows (or disallows) to sign an <em>Annex.</em></p><p><strong>As your business changes, </strong>update your architecture to match. Keep refining the system&#8217;s boundaries - split them when they grow too big, merge them when it makes sense, and drop them when they are no longer needed. Here is an example coming from my book:</p><blockquote><p>Private medical clinics that use our software also want to offer telemedicine. We extend the <em>Patient Treatment</em> bounded context to accommodate this change. It looks like it fits there &#8211; after all, it is just another treatment method.</p><p>However, with telemedicine, the patient does not need to come for an appointment, and there is no physical examination. Additionally, no follow-up appointment will be planned. We start wondering if this is a good idea, but the decision is to leave it as it is.</p><p>Three months later, clinics decide to offer specialized treatment. When a patient needs a consultation with an external specialist, they have to call the specialist and book an appointment.</p><p>Once a month, all specialists collaborating with the clinic send their invoices. Then, the clinic sends another invoice to the patient. As this is another treatment method, you decide to extend the <em>Patient Treatment</em> again, despite the process being entirely different from the initial state.</p><p>Problems arise. Maintenance requires increasing effort. More than one development team is needed. Too many people are working in the same area, and communication between them begins to fail. Terms start to be used in different contexts&#8212; Doctor refers to either an internal doctor or an external specialist. The former is on a contract of employment with the clinic, while the latter sends invoices to the clinic.</p><p>Ultimately, <em>Patient Treatment</em> becomes enormous, and you spot that the scope, rules, terms, and behaviors are completely different from what was initially defined.</p><p>The wise decision is to split it now into several new bounded contexts:</p><ul><li><p><strong>Telemedicine.</strong> This covers remote patient consultations and treatment. It includes virtual visits, digital communication, and remote monitoring of patients.</p></li><li><p><strong>On-site Treatment.</strong> This represents the initial process of patient treatment where the patient visits the clinic, is examined, agrees to the treatment plan, and starts the treatment.</p></li><li><p><strong>Specialized Treatment.</strong> This handles interactions with external specialists and ensures that the collaboration with them is streamlined and distinct from the internal operations</p></li></ul></blockquote><p>Managing complexity is an ongoing challenge, not a one-time fix. As your system evolves, keep watching for signs that your architecture needs to adapt. Whether it is infrastructure growing beyond your ability to manage it manually, entities that need new ways to enforce rules, or bounded contexts that no longer fit their original purpose - be ready to make changes.</p><p>Last thing to remember: what worked perfectly six months ago might need a complete redesign today, and that is perfectly normal in the life of a growing system.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#40 Step Three of Evolutionary Architecture: Focus on Growth]]></title><description><![CDATA[Your application's success might lead to handling massive user loads in specific modules. This is where the growth step of evolutionary architecture comes in - helping you solve such issues.]]></description><link>https://newsletter.fractionalarchitect.io/p/40-step-three-of-evolutionary-architecture</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/40-step-three-of-evolutionary-architecture</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 14 Dec 2024 08:01:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1c360060-5acb-4689-917c-fbbcd0990e9b_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After exploring <a href="https://newsletter.fractionalarchitect.io/p/38-step-one-of-evolutionary-architecture">simplicity</a> and <a href="https://newsletter.fractionalarchitect.io/p/39-step-two-of-evolutionary-architecture">maintainability</a> in my previous posts, let's tackle the next big challenge: growth. What happens when success strikes and your app suddenly needs to handle hundreds of thousands or even millions of users?</p><p>Think about concert ticket sales. Let&#8217;s take Taylor Swift concerts as an example. Or if we hop in a time machine, imagine the chaos of The Beatles fans in 1964 or Queen enthusiasts in 1982 rushing to buy tickets at once. In these scenarios, certain parts of your ticketing application - like the ticket catalog, checkout, and payments modules - get slammed with traffic. However, other modules sit mostly idle.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>This is where a modular monolith can start showing its limitations. Sure, you can scale up by adding more instances, but there is a catch: spinning up new instances takes precious time, and you are forced to scale everything, even the parts that don't need it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JRwK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JRwK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png 424w, https://substackcdn.com/image/fetch/$s_!JRwK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png 848w, https://substackcdn.com/image/fetch/$s_!JRwK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png 1272w, https://substackcdn.com/image/fetch/$s_!JRwK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JRwK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png" width="1456" height="883" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:883,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:219957,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JRwK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png 424w, https://substackcdn.com/image/fetch/$s_!JRwK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png 848w, https://substackcdn.com/image/fetch/$s_!JRwK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.png 1272w, https://substackcdn.com/image/fetch/$s_!JRwK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a20e6-7378-4099-8136-77003037dba6_2092x1268.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Plus, some modules in your application might need frequent updates while others remain relatively stable. Yet with a modular monolith, every small change in one module means redeploying the entire application - even the modules that haven't changed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kmT1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kmT1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png 424w, https://substackcdn.com/image/fetch/$s_!kmT1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png 848w, https://substackcdn.com/image/fetch/$s_!kmT1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png 1272w, https://substackcdn.com/image/fetch/$s_!kmT1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kmT1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png" width="1456" height="470" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:470,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111367,&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;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kmT1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png 424w, https://substackcdn.com/image/fetch/$s_!kmT1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png 848w, https://substackcdn.com/image/fetch/$s_!kmT1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png 1272w, https://substackcdn.com/image/fetch/$s_!kmT1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8bde446-2a49-4524-b0d3-e897e0bd5de1_2086x674.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When your application's growing pains start affecting both your team and customers through slower performance and frustrated users, it is time to take action. Let's say your ticket catalog module becomes the bottleneck - from time to time fans can't even browse available events.</p><p>What could be a solution? Extract the problematic module from your modular monolith and turn it into its own independent deployment unit. This could be a microservice, a nanoservice, or any other self-contained deployment unit. By separating it, you can scale and modify it independently from the rest of your application (of course, if there is no tight coupling between them).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xcAC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xcAC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png 424w, https://substackcdn.com/image/fetch/$s_!xcAC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png 848w, https://substackcdn.com/image/fetch/$s_!xcAC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!xcAC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xcAC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png" width="514" height="556.3917525773196" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1050,&quot;width&quot;:970,&quot;resizeWidth&quot;:514,&quot;bytes&quot;:82066,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xcAC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png 424w, https://substackcdn.com/image/fetch/$s_!xcAC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png 848w, https://substackcdn.com/image/fetch/$s_!xcAC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!xcAC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64d5f90-7d72-44f9-b7a0-bba4ac2f90a3_970x1050.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once you have separated the ticket catalog, you gain precise control. Need to handle a surge of fans browsing concert tickets? Scale up just the catalog service. Making updates to how tickets are displayed? Deploy changes to the catalog alone - the rest of your application keeps running untouched.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j1Hs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j1Hs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png 424w, https://substackcdn.com/image/fetch/$s_!j1Hs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png 848w, https://substackcdn.com/image/fetch/$s_!j1Hs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png 1272w, https://substackcdn.com/image/fetch/$s_!j1Hs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j1Hs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png" width="1456" height="438" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:438,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78876,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j1Hs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png 424w, https://substackcdn.com/image/fetch/$s_!j1Hs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png 848w, https://substackcdn.com/image/fetch/$s_!j1Hs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png 1272w, https://substackcdn.com/image/fetch/$s_!j1Hs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde5f6cfd-9373-460a-a1ca-0061af9beff2_1926x580.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This separation comes with a trade-off: as your system becomes a distributed one, your services now need to talk across network boundaries which means higher latency and exposure to network errors and partitions.</p><p>You can no longer rely on simple internal communication methods like direct references, facades, or gateways that work when everything lives in the same application.</p><p>Instead, you have two main options:</p><ol><li><p>Set up a message broker like RabbitMQ to handle communication between your ticket catalog and the main application. This is usually the recommended approach, as it keeps your services loosely coupled and more resilient.</p></li><li><p>Have your main application call the ticket catalog's public API (like REST endpoints). While simpler to implement initially, this creates a direct dependency between services and might make your system more brittle.</p></li></ol><p><strong>Keep in mind that not every application will face these challenges.</strong> Many systems will run perfectly fine without ever needing to handle massive user loads. And even if your application does experience significant growth, scaling your modular monolith horizontally might still be the simplest and most effective solution.</p><p>Don't rush to break apart your application into a distributed system just because it is a trending approach - make architectural decisions based on real needs, not hypothetical scenarios. The goal is to find the sweet spot between scalability and complexity that matches your actual requirements.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#39 Step Two of Evolutionary Architecture: Focus on Maintainability]]></title><description><![CDATA[If you notice that your system is becoming increasingly difficult to maintain, this is a red flag. You need to address it before it becomes an unmaintainable monster. Don't wait until it is too late.]]></description><link>https://newsletter.fractionalarchitect.io/p/39-step-two-of-evolutionary-architecture</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/39-step-two-of-evolutionary-architecture</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 07 Dec 2024 08:00:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/97fa7412-2f7f-4fe0-9672-e1c63d6883ab_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Keeping things simple is one of the most underrated aspects of software development. I wrote about <a href="https://newsletter.fractionalarchitect.io/p/38-step-one-of-evolutionary-architecture">this</a> recently. If you want your system to last and grow smoothly over time, aim for an architecture that is intentionally boring. Trust me, boring is beautiful here.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>At some point, we need to think about other aspect of our system - like how easy it is to maintain. Maintainability is the second step in our evolutionary architecture approach.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!urwj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!urwj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png 424w, https://substackcdn.com/image/fetch/$s_!urwj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png 848w, https://substackcdn.com/image/fetch/$s_!urwj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png 1272w, https://substackcdn.com/image/fetch/$s_!urwj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!urwj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png" width="1207" height="351" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:351,&quot;width&quot;:1207,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34223,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!urwj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png 424w, https://substackcdn.com/image/fetch/$s_!urwj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png 848w, https://substackcdn.com/image/fetch/$s_!urwj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.png 1272w, https://substackcdn.com/image/fetch/$s_!urwj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3594bc66-9989-45ac-909e-b9dff9f10410_1207x351.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you start simple, your system naturally becomes easier to maintain. You don't have a bunch of external components like cache or data streaming tools to worry about. Fewer moving parts means fewer things can break, which makes maintenance much smoother. Though let's be real - if your code is a spaghetti, even the simplest system will be a headache to maintain ;)</p><p>The tricky thing about keeping the system simple is that your early decisions can come back to bite you and your team as the system evolves. Every system faces different growing pains depending on its context.</p><p>When certain parts of your code start expanding faster than others, your simple design might not scale well with them. Some modules turn out to be way more complicated than you first thought. Plus, as your organization grows and you want different teams working independently, those early simple choices might actually get in the way, negatively affecting maintainability.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dSEb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dSEb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png 424w, https://substackcdn.com/image/fetch/$s_!dSEb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png 848w, https://substackcdn.com/image/fetch/$s_!dSEb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png 1272w, https://substackcdn.com/image/fetch/$s_!dSEb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dSEb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png" width="641" height="359" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:359,&quot;width&quot;:641,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10944,&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;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dSEb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png 424w, https://substackcdn.com/image/fetch/$s_!dSEb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png 848w, https://substackcdn.com/image/fetch/$s_!dSEb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png 1272w, https://substackcdn.com/image/fetch/$s_!dSEb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d63978b-233b-4d75-9bb4-53709a5f9a07_641x359.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Example? Imagine this scenario: You start with a simple setup - one assembly and four developers. Life is good. When someone needs to change something in a module (represented by a folder in the assembly), the team huddles up, discusses it, and makes it happen. Clean and straightforward.</p><p>But then your system grows. Now there are three teams, each owning different modules. And here is where that simple structure starts causing headaches. Every time one team wants to update a third-party package - even for their own module - they have to:</p><ol><li><p>Notify other teams</p></li><li><p>Wait for them to review and approve</p></li></ol><p>What was once a quick decision now turns into a slow, multi-team coordination flow. Your simple, single-assembly approach has become a bottleneck that is actually making things more complicated, not less. That is a classic example of when simplicity from the past can handcuff you in the present.</p><p>Code changes become a real headache too. With three teams of four developers each, you have twelve people all trying to push code into the same assembly throughout the day. That means constant merge conflicts and developers wasting time resolving them instead of building features. What used to be a smooth workflow with a small team turned into a daily battle with Git.</p><p>There is no magic solution to these growing pains - you need to find what works best for your situation. In our example above, one approach would be to break each module into its own separate assembly. But this is just one way to go - the key is to choose what makes sense for your specific needs.</p><p>How do you spot a maintenance problem? Simple: your team starts feeling the pain. And how do you know you have fixed it? Even simpler: that pain disappears and your team can work smoothly again. No need for complex metrics or fancy formulas here - just good old common sense will tell you everything you need to know.</p><p>How do you deal with maintaining the growing system?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#38 Step One of Evolutionary Architecture: Focus on Simplicity]]></title><description><![CDATA[Let's face it - overcomplicating things is in our DNA as developers. That is exactly why we need to fight it and keep things simple. Want to learn how? Check out our evolutionary steps.]]></description><link>https://newsletter.fractionalarchitect.io/p/38-step-one-of-evolutionary-architecture</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/38-step-one-of-evolutionary-architecture</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 30 Nov 2024 08:03:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/68db9685-e1a6-4c55-9734-da6a4598de09_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before we start today&#8217;s post, I would like to let you know that my &#8220;Master Software Architecture&#8221; <strong>book is finally available on Amazon as a paperback!</strong> You can find it <a href="https://www.amazon.com/gp/product/B0DMW4GXVZ">here</a> (you can change the marketplace by switching to .de, .it, .fr in the URL).</p><p>Two years ago, Kamil B&#261;czek and I created a repository demonstrating the evolution of a Fitness Studio application. We structured it around four key evolutionary steps we identified.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6s9S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6s9S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png 424w, https://substackcdn.com/image/fetch/$s_!6s9S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png 848w, https://substackcdn.com/image/fetch/$s_!6s9S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png 1272w, https://substackcdn.com/image/fetch/$s_!6s9S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6s9S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png" width="1207" height="351" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:351,&quot;width&quot;:1207,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128040,&quot;alt&quot;:&quot;&quot;,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!6s9S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png 424w, https://substackcdn.com/image/fetch/$s_!6s9S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png 848w, https://substackcdn.com/image/fetch/$s_!6s9S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.png 1272w, https://substackcdn.com/image/fetch/$s_!6s9S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F641c3e2d-8eb7-466a-ad58-eaba00638404_1207x351.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each step represents a distinct phase in your application's maturity. This series will break down all the steps so you can understand them better.</p><p>Today we will focus on the first one - simplicity.</p><p>When starting a new app, we often get excited and want to throw in every cool tech we have heard about - Kubernetes, Kafka, Redis, microservices, you name it. And it is natural - we are developers, and we love trying new things! </p><p>Here is the thing - we often get caught up copying what big companies like Netflix or Amazon are doing. But that is a trap. Their problems and scale are nothing like what most of us are building. Their systems are solving totally different challenges, dealing with traffic levels our apps may never see.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>When we overcomplicate things from the start, we create a mess. Systems end up with too many moving parts talking to each other. New team members struggle to understand what is going on. Bugs become a nightmare to track down. And don't even get me started on the costs - they spiral out of control. All because we let our tech dreams run wild instead of keeping things simple.</p><p>You know what is funny? This keeps happening even though we are smart people. So what is the deal? From what I have observed, it is not about being smart - it is about wisdom. And that wisdom? You only get it from years of building different systems and, yeah, screwing up along the way. Those face-palm moments when things go wrong? They are actually our best teachers.</p><p>We spend years learning this hard truth: there is no one-size-fits-all architecture that works for everyone. What works depends on your specific situation - your team's skills, your company's setup, and what your business needs. People keep talking about "context" because it really is everything.</p><blockquote><p><em>Context is king</em> - and they are right.</p></blockquote><p>In this first step - Simplicity - we are not reinventing the wheel. The goal is dead simple: build the most straightforward solution that works right now.</p><p>Here is the catch: we should stick to keeping things simple no matter how far along we are. But it is trickiest at the start because that is when we have to make the most decisions. And guess what? That is exactly when we know the least about what we are building and how it will be used.</p><p>This problem is known and is called the <em>Project Paradox.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0JcM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0JcM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png 424w, https://substackcdn.com/image/fetch/$s_!0JcM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png 848w, https://substackcdn.com/image/fetch/$s_!0JcM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png 1272w, https://substackcdn.com/image/fetch/$s_!0JcM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0JcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png" width="1080" height="544" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:544,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37348,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0JcM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png 424w, https://substackcdn.com/image/fetch/$s_!0JcM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png 848w, https://substackcdn.com/image/fetch/$s_!0JcM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png 1272w, https://substackcdn.com/image/fetch/$s_!0JcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc0ef8ed-7062-4d7d-b8d0-58670f448a8b_1080x544.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The graph makes perfect sense - by the time we actually understand things well, most of the big decisions are already behind us. Ironic, right?</p><p>That is why starting super simple is like a cheat code. We push the big decisions into the future, when we will actually know enough to make smart choices. Instead of guessing early, we learn as we go.</p><p>OK, but what does it mean to start simple?</p><p>Think about starting with a modular monolith instead of microservices. You dodge all those distributed system headaches - no network failures, no latency issues, no need for retry logic. Everything runs in one process, so modules just talk to each other directly (by reference, gateway, facade) or use events within the in-memory queue.</p><p>Yeah, here is a spicy one - consider using initially an in-memory queue instead of something external like RabbitMQ. Sure, you might lose some messages if the system crashes, but maybe that is okay for now. You are trading some reliability for much simpler maintenance. As always, in such cases use your common sense.</p><p>Or take databases. Instead of giving each module its own database (physical split), use database schemas (logical split) to keep things separate. So, each module will have its own schema. It is simpler but still keeps your data organized.</p><p>Instead of jumping straight to Kubernetes, start with a simple deployment using e.g. Azure App Service, or AWS Elastic Beanstalk. You will spend way less time on infrastructure and can focus on what your app actually needs to do.</p><p>Skip the fancy caching system at first. Instead of setting up Redis right away, leverage the power of your database engine to a maximum, or in the simplest scenario use your application&#8217;s memory cache (if the application runs on a single instance).</p><p>And so on for all areas of your application.</p><p>Think of every change like it is coming out of your own pocket - you are paying for the servers, maintenance, all of it. Once you start thinking this way, you will get better at spotting unnecessary complexity. It is like developing a sixth sense for what is really needed versus what is just cool to have.</p><p>Trust me, it will change how you look at every decision.</p><p>Curious about seeing this in action? Check out our <a href="https://github.com/evolutionary-architecture/evolutionary-architecture-by-example">Evolutionary Architecture by Example repository</a>. We also have a <a href="https://discord.gg/BGxYkHFCCF">Discord channel</a> where you can ask questions and join the discussion.</p><p>What do you think about such an approach?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#37 Verify Before Production: Stress Testing for Production Readiness]]></title><description><![CDATA[Stress tests can help you spot performance issues before they occur and ensure your application is ready for success at every stage of growth. Let's have a look at when and how to run them.]]></description><link>https://newsletter.fractionalarchitect.io/p/37-verify-before-production-stress</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/37-verify-before-production-stress</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 23 Nov 2024 08:00:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bfe92cdb-334e-43d9-ac0e-b4a2ae8e7726_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Another week, another type of tests. This time we will look at tests often confused with <a href="https://newsletter.fractionalarchitect.io/p/36-verify-before-deploy-load-testing">load tests</a>. Ladies and gentlemen, it is stress-testing time!</p><p>It may seem difficult to tell the difference between the two since they both check how your application performs against the traffic that comes to it. The key difference is that load testing checks how your application performs under expected traffic (with some overhead) for a given period, while stress testing has a different mission: it pushes your application to its limits to see how it behaves under extreme conditions, such as when traffic suddenly spikes to double its usual volume.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7ICk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7ICk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png 424w, https://substackcdn.com/image/fetch/$s_!7ICk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png 848w, https://substackcdn.com/image/fetch/$s_!7ICk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png 1272w, https://substackcdn.com/image/fetch/$s_!7ICk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7ICk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png" width="604" height="441.74293059125966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00130895-96c1-40c6-82ba-b0e94290523f_778x569.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:569,&quot;width&quot;:778,&quot;resizeWidth&quot;:604,&quot;bytes&quot;:23187,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7ICk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png 424w, https://substackcdn.com/image/fetch/$s_!7ICk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png 848w, https://substackcdn.com/image/fetch/$s_!7ICk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.png 1272w, https://substackcdn.com/image/fetch/$s_!7ICk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00130895-96c1-40c6-82ba-b0e94290523f_778x569.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This helps you find weak spots and confirm if your application can handle expected user spikes - think of big moments like the NBA Finals or Black Friday sales.</p><p>It also reveals when your current setup might need an upgrade or a complete overhaul by showing where and when your application starts to break under pressure.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eoZW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eoZW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png 424w, https://substackcdn.com/image/fetch/$s_!eoZW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png 848w, https://substackcdn.com/image/fetch/$s_!eoZW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png 1272w, https://substackcdn.com/image/fetch/$s_!eoZW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eoZW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png" width="1116" height="513" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:513,&quot;width&quot;:1116,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47543,&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;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eoZW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png 424w, https://substackcdn.com/image/fetch/$s_!eoZW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png 848w, https://substackcdn.com/image/fetch/$s_!eoZW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png 1272w, https://substackcdn.com/image/fetch/$s_!eoZW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4af7dc4-f9c6-40f5-be5d-ddcb216b87bc_1116x513.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>By monitoring your application during stress tests, you will see how quickly it scales and what costs you might face over time. It will help you prevent nasty surprises in production - like your app crashing under heavy traffic or your cloud bill skyrocketing unexpectedly. The best part? You can do all this testing in a controlled environment.</p><p>There is also no need to reinvent the wheel - you can reuse everything you have already set up for load testing, including your test scenarios and known bottlenecks. And just like load testing, where you run your stress tests depends on your specific context and your software development process. It can be run on the canary candidate, blue or green environment, UAT, staging, or wherever.</p><p>But here is an important difference: timing. You would not run your stress tests as often as load tests. They are more expensive and they test extreme situations that don't happen every day. To keep things practical, I suggest running stress tests in the following situations:</p><ol><li><p><strong>Before releasing the MVP</strong>. This is the time to discover the true limitations of your application. If your product takes off quickly, you will know in advance where your application's weaknesses are. This way you can decide what to do - accept it or fix it (both options are fine, of course, depending on your context).</p></li><li><p><strong>Before big traffic events</strong> like Black Friday. We have all been there - refreshing a ticket website that is struggling to keep up with thousands of customers. Your users deserve better than that frustrating experience.</p></li><li><p><strong>After launching a high-impact feature </strong>that you expect will be heavily used. Think about new social media features or the game-changing functionality your users have been asking for.</p></li><li><p><strong>Before entering a new market.</strong> Whether you are expanding geographically (e.g., from Europe to Asia), targeting a new customer segment, or entering a new industry, you need to know if your infrastructure can handle different traffic patterns. Each market can bring its own challenges and different peak usage times.</p></li><li><p><strong>On a regular schedule</strong> that makes sense for your product - maybe monthly, quarterly, or a few times per year. There is no one-size-fits-all approach here; watch your patterns and adjust your testing frequency accordingly.</p></li></ol><p>Okay, now you know when it can be done. Now you may be wondering how to do it. What tool to use? One of my favorite ways to test the performance of my applications is to use <a href="https://k6.io/">Grafana k6</a> (no paid advertising, this is something I use and like).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jx5T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jx5T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png 424w, https://substackcdn.com/image/fetch/$s_!Jx5T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png 848w, https://substackcdn.com/image/fetch/$s_!Jx5T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png 1272w, https://substackcdn.com/image/fetch/$s_!Jx5T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jx5T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png" width="1208" height="529" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:529,&quot;width&quot;:1208,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:156300,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Jx5T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png 424w, https://substackcdn.com/image/fetch/$s_!Jx5T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png 848w, https://substackcdn.com/image/fetch/$s_!Jx5T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png 1272w, https://substackcdn.com/image/fetch/$s_!Jx5T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f6c9276-b0b9-4356-97e9-5512f14b1af0_1208x529.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The setup is not that complicated and the UX is really good.</p><p>Of course, it doesn&#8217;t matter whether you choose k6 or another testing tool (e.g., JMeter). The key is to start implementing stress tests strategically and systematically.</p><p>Remember, stress testing is not just another checkbox in your testing routine - it is your early warning system, and I like to call it an &#8220;ass-saver&#8221;. While it might seem like extra work, it is far better to discover your application's breaking point in a controlled environment than during a crucial event with real users.</p><p>Now, go forth and stress test - but don't stress about it! ;)</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#36 Verify Before Deploy: Load Testing for Production Readiness]]></title><description><![CDATA[Knowing how your application behaves under expected traffic before production helps you find problems and set proper resource limits. This prevents a lot of issues when real users start using app.]]></description><link>https://newsletter.fractionalarchitect.io/p/36-verify-before-deploy-load-testing</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/36-verify-before-deploy-load-testing</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 16 Nov 2024 08:01:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1d74a82a-60ef-4b63-ba32-748ba2d9afb7_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the common problems in building systems of any kind is expected traffic. Often, we do not know what to expect&#8212;especially when we are building a greenfield application and about to release it for the first time.</p><p>Then, we release it and observe the growing number of users. We monitor how the application works, and suddenly it stops working due to too much traffic. We are stressed as now we have to react fast to this situation to make the application available.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p>Instead, you could perform load and stress tests before you even think about releasing the application to the public, and thanks to it you know the numbers up in front. <strong>Today, I would like to focus on load testing</strong> which helps you check how your application performs under defined traffic for a given period.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q6eE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q6eE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png 424w, https://substackcdn.com/image/fetch/$s_!q6eE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png 848w, https://substackcdn.com/image/fetch/$s_!q6eE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png 1272w, https://substackcdn.com/image/fetch/$s_!q6eE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q6eE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png" width="1212" height="569" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:569,&quot;width&quot;:1212,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:43442,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!q6eE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png 424w, https://substackcdn.com/image/fetch/$s_!q6eE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png 848w, https://substackcdn.com/image/fetch/$s_!q6eE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.png 1272w, https://substackcdn.com/image/fetch/$s_!q6eE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4c90b3c-4746-49cc-aa2d-c0e97bf702cf_1212x569.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Let&#8217;s assume you have developed an MVP that hasn&#8217;t been released yet. Based on your analysis, you expect around 50,000 concurrent users in the first month.</p><p>It is much better to discover problems now than when real users are hitting your system. No one wants to be firefighting issues while customers are complaining and executives are breathing down your neck. Load testing lets you find and fix bottlenecks before they become real problems.</p><p>What should you test? Focus on what matters most.</p><p>Think about it - users will not constantly update their profile picture or reset passwords. But they will hammer certain features hard. If you are running a ticketing platform, the checkout flow will get slammed. Payment processing might become your bottleneck. User default address updates? Not so much.</p><p>Put pressure where it counts. Identify your high-traffic features and load test them properly. Don't waste time load-testing everything equally - it is not how your app will be used in real life.</p><p>First, figure out which parts of your app need load testing. Focus on features you expect users to use the most. Sounds simple, right? Well, it depends.</p><p>If your app is not live yet, you are making educated guesses. Sometimes these guesses are good, sometimes they are shots in the dark.</p><p>Let me give you an example:</p><ul><li><p>In a large hardware company, you might know exactly what is coming: 25,000 devices syncing their data exactly at 3 pm every day. That is a clear target to test for.</p></li><li><p>It would be trickier in a startup. Your users might surprise you by using features you didn't expect, or your whole business model might pivot next month and this will completely change your expected numbers.</p></li></ul><p>If you already have a live application, check your analytics. The data will show you exactly where users are piling up.</p><p><strong>The key is being realistic about how much you can predict.</strong> Sometimes you know exactly what is coming. Other times, you are making your best guess and need to stay flexible.</p><p>Once you have spotted your high-traffic areas, you will need a solid test plan. Here is what should be in it:</p><ul><li><p><strong>The scenarios you want to test.</strong> Thanks to the discovery, you have a list of areas you want to subject to load testing. Now, you need to develop specific scenarios for these areas. These scenarios will outline the actions and conditions you want to test. I recommend preparing scenarios that imitate the regular user flow. For example, in the case of buying tickets, your test should mirror the user&#8217;s journey from accessing the home page, searching for the event, opening the event page, selecting the number of tickets, proceeding to the checkout page, and completing the payment.</p></li><li><p><strong>The number of concurrent users.</strong> It defines how many users you want to imitate to generate the expected traffic. This number may vary between different areas; for example, one area might typically handle 25,000 concurrent users while another might handle 100,000. I also recommend adding 20-30% for each load test because it gives you a certain reserve in case the traffic increases fast in the production.</p></li><li><p><strong>The time limitation to perform load tests.</strong> Load tests should not run indefinitely, as this can incur costs and delay feedback. It is advisable to set a time limit, such as running each load test for approximately 30 seconds, with all tests completed within 10-15 minutes.</p></li></ul><p>One common pitfall is assuming that users will follow a predictable pattern. For example, a 70% discount on a popular item may not be spread evenly over 15 minutes for 15,000 users (1,000 users per minute). Instead, you might see most of the users in the first few seconds. <strong>Be cautious of such scenarios!</strong></p><p>The last aspect to consider is where and when to run load tests. This is a nuanced question with no single answer; it depends on your specific context.</p><p>Load testing should not be a one-time action but a repeatable process. Ideally, it should be conducted for every change made to the production code. However, this may not always be feasible (as discussed in previous steps). Therefore, there are various approaches to scheduling load tests.</p><p>If you deploy the application multiple times per day (like in continuous deployment), it makes sense to run load tests each time the commit is pushed to production. This way, load tests will be a part of your deployment pipeline.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3jxm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3jxm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png 424w, https://substackcdn.com/image/fetch/$s_!3jxm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png 848w, https://substackcdn.com/image/fetch/$s_!3jxm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png 1272w, https://substackcdn.com/image/fetch/$s_!3jxm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3jxm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png" width="1333" height="191" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:191,&quot;width&quot;:1333,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36290,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3jxm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png 424w, https://substackcdn.com/image/fetch/$s_!3jxm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png 848w, https://substackcdn.com/image/fetch/$s_!3jxm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png 1272w, https://substackcdn.com/image/fetch/$s_!3jxm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F112a6e5e-f390-4264-accc-a3f76ce8fcf9_1333x191.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Some companies can't just push code whenever they want. Maybe you are dealing with banking software or medical systems - places where every release needs serious vetting. In these cases, your load tests happen before your scheduled releases - think quarterly or bi-annual deployments. You will run them in staging or UAT environments, giving yourself plenty of time to catch and fix issues before the big release day.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SYnX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SYnX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png 424w, https://substackcdn.com/image/fetch/$s_!SYnX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png 848w, https://substackcdn.com/image/fetch/$s_!SYnX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png 1272w, https://substackcdn.com/image/fetch/$s_!SYnX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SYnX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png" width="995" height="193" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:193,&quot;width&quot;:995,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25914,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SYnX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png 424w, https://substackcdn.com/image/fetch/$s_!SYnX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png 848w, https://substackcdn.com/image/fetch/$s_!SYnX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png 1272w, https://substackcdn.com/image/fetch/$s_!SYnX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4a6784-9f73-45cf-aa74-e419ccbc291a_995x193.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>It is less frequent than continuous testing, but that is fine - it matches how you actually ship code. <strong>The key is having a testing rhythm that fits your release cycle.</strong></p><p>How do you handle load tests in your application?</p><div><hr></div><p><strong>Join 100,000 architects and engineers building apps and transforming workflows with&nbsp;<a href="https://eu1.hubs.ly/H0cgThl0">Budibase</a>.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#35 A Tech Sales Guide: Stop Selling Technicalities, Start Selling Outcomes]]></title><description><![CDATA[As engineers, we love our technical solutions, but business leaders speak a different language. Learn how to turn your technical proposals into outcomes that the business cares about.]]></description><link>https://newsletter.fractionalarchitect.io/p/35-a-tech-sales-guide-stop-selling</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/35-a-tech-sales-guide-stop-selling</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 09 Nov 2024 08:01:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d5a0eacb-cfdd-4c4e-80d4-91887625d186_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Picture this: A meeting room full of business leaders. A software expert walks in, excited to share ideas that could help the company grow.</p><div class="pullquote"><p>We must extract part of our modular monolith to a microservice and move to Kubernetes. This way we can easily handle traffic spikes in the Appointment Scheduling module.</p></div><p>That was it. The moment he used technical terms like "modular monolith," their eyes rolled over. His chance to get support for changes vanished in seconds.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The thing you need to be aware of</h2><p>Most often - in about 90% of cases from my experience - business people don't care about technical terms like cloud platforms, databases, microservices, or system architecture. What catches their attention are numbers that directly matter to the business:</p><ul><li><p>How much can we reduce our monthly operating costs?</p></li><li><p>Can we cut customer delivery time from 2 days to 2 hours?</p></li><li><p>How many new customers can we handle without hiring more staff?</p></li><li><p>What is the return on investment, and how soon will we see it?</p></li><li><p>How much revenue are we losing due to current system limitations?</p></li></ul><p>These questions about costs, speed, and business growth are what business leaders care about. How we achieve it - whether through Kubernetes, microservices, or any other technical solution - is why they hired us - software engineers - in the first place.</p><p>Think of it like <strong>hiring a builder to renovate your house</strong>. You care about:</p><ul><li><p>How much will it cost?</p></li><li><p>When will it be finished?</p></li><li><p>Will it increase your property value?</p></li></ul><p>You don't need to know about the specific brand of power tools, types of screws, or construction techniques. You trust the builder's expertise to choose the right tools and methods. That is their job.</p><h2>Selling outcomes, not technicalities</h2><p>Having all of the above in your mind, always try to find the outcome of your change and sell it. Here are some examples:</p><p><strong>Scenario 1 - The current monthly operating costs of the cloud are $100,000</strong></p><p>Don't get caught in the trap of explaining technical details about switching services and databases. Instead, focus on the bottom line: <strong>"Our solution can cut operating costs in half, saving $50,000 every month."</strong></p><p>Now comes the most important part - the investment cost. Let's look at two scenarios:</p><p>If the migration costs $1 million, you will need 20 months just to break even ($50,000 &#215; 20 months = $1 million). For an application that is only planned to run for 1.5 years, this would be a poor investment.</p><p>But change the numbers, and the story changes dramatically. If migration costs only $50,000, or if your application will run for 10 years, suddenly you are looking at substantial long-term savings.</p><p><strong>Scenario 2 - Our customers complain about delivery time</strong></p><p>When proposing a solution to speed up delivery, many engineers would dive into technical details, listing all the components and systems we need to change. This is a common mistake.</p><p>Instead, focus on the business impact: <strong>We can reduce delivery time by at least 25%</strong>. In real terms, this means cutting down from 4 days to 3 days per delivery. <strong>The implementation will cost between $10,000 and $30,000</strong>.</p><p>This kind of communication gives business leaders exactly what they need - a clear picture of improvement (X% faster delivery) and cost (Y dollars). Even if you can't provide exact costs (and let's be honest, who can? &#128516;), having a rough range - whether it is thousands, tens of thousands, or hundreds of thousands - gives them enough information to make a business decision.</p><p><strong>Scenario 3 - One of the components will reach the end of support in May next year</strong></p><p>Avoid the common technical trap of discussing security vulnerabilities like supply chain attacks. These terms mean little to business leaders and don't convey urgency.</p><p>Instead, focus on the business risk: <strong>"We must complete this migration by January. </strong>After that date, we lose official support,<strong> </strong>which<strong> creates a serious risk of customer data theft and exposure."</strong></p><p>This message hits home because it translates a technical deadline into real business consequences. Data breaches mean lawsuits, damaged reputation, lost customers, and potential regulatory fines. No business leader wants to explain to customers why their data was compromised because we missed a critical deadline.</p><p>Here are a few other examples presented as one-liners:</p><ol><li><p>&#8220;We need to implement proper caching mechanisms&#8221; &#8594; <strong>&#8220;We can reduce customer wait times from 3 seconds to under 1 second&#8221;</strong></p></li><li><p>&#8220;Our system needs horizontal scaling and load balancing&#8221; &#8594; <strong>&#8220;We can handle Black Friday sales peaks without website crashes, preventing $100K in lost sales&#8221;</strong></p></li><li><p>&#8220;We should migrate to a newer version of the payment gateway API&#8221; &#8594; <strong>&#8220;We are losing $5,000 monthly in declined transactions that newer payment systems would approve&#8221;</strong></p></li><li><p>&#8220;Our logging and monitoring infrastructure needs improvement&#8221; &#8594; <strong>&#8220;We can detect and fix problems before customers notice them, reducing support tickets by 30%&#8221;</strong></p></li><li><p>&#8220;The authentication system needs to be refactored&#8221; &#8594; <strong>&#8220;We can cut customer login time from 7 to 1 second, reducing shopping cart abandonment rate by 15%&#8221;</strong></p></li></ol><p>As engineers, we are passionate about our solutions. We see the technical beauty and understand why upgrading this database or refactoring that code is "obviously" important. But when we talk in technical terms, we speak a foreign language to business stakeholders. Then we get frustrated when they don't see the "obvious" benefits. And they get frustrated because they can't understand the jargon. A lose-lose situation.</p><h2>Don&#8217;t sell refactoring</h2><p>When it comes to refactoring, less talk is often better. Instead of explicitly asking for "refactoring time," simply include it in your regular feature development estimates. When you say "This feature will be delivered in this sprint", that time already includes necessary code improvements.</p><p>For larger refactoring efforts (like replacing major components), don't sell it as refactoring at all. Find the business value and lead with that. &#8220;We found an issue in our application and have an option to get rid of it. If we do it:&#8221;</p><ul><li><p>"This change will cut our response times in half"</p></li><li><p>"We can reduce error rates by 30%"</p></li><li><p>"This will allow us to add new features twice as fast"</p></li><li><p>"We will cut our monthly cloud costs by 25%"</p></li></ul><p>Can you see how different this communication is? No explicit mention of &#8220;refactoring&#8221;. It is the same work, but entirely different framing. You are not hiding the refactoring - you are simply focusing on what matters to the business. That is it.</p><p>What is your biggest challenge when explaining technical solutions to non-technical people?</p><div><hr></div><p><strong><a href="https://eu1.hubs.ly/H0cgThl0">Budibase</a>&nbsp;saves architects and engineers 100s of hours building apps&nbsp;and automating workflows securely.</strong></p>]]></content:encoded></item><item><title><![CDATA[#34 Break The Silos: Own Software Architecture As a Team]]></title><description><![CDATA[Instead of having the ivory tower of architects dictating decisions, let the entire development team own the architecture of their solutions. This creates an environment where everyone can grow.]]></description><link>https://newsletter.fractionalarchitect.io/p/34-break-the-silos-own-software-architecture</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/34-break-the-silos-own-software-architecture</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 02 Nov 2024 08:01:39 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3b9ef4dd-8d8c-4216-a3c6-b22e9bf7f907_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Back in 2011 when I started working in tech, many companies had this stupid setup: Architects would sit isolated from developers, like kings in their castles. They would hand down their decisions from above, and developers had to follow them blindly. Want to change something? You had to beg for their blessing first. We called these their "ivory towers" - and yeah, it was as inefficient and frustrating as it sounds.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><p><strong>First issue:</strong> When architects sit far from dev teams, they are clueless about real problems. They don't code with the team, so they have no idea what headaches their designs cause in day-to-day work. You need to get your hands dirty to know if something works.</p><p><strong>Second:</strong> When architects just draw diagrams all day, they get rusty. They lose touch with tools, don't keep up with new programming languages, and basically start to live in their own bubble. Out of touch with tech, stuck in their old ways, and more focused on theory than what actually works.</p><p><strong>Third: </strong>This setup kills developer growth. When all architecture decisions come from above, we stop caring about system design. We turn into code monkeys, mindlessly producing features without thinking about the bigger picture, and the consequences it has for our business.</p><p>Oh man, I had no clue back then how much I would dislike this kind of setup in the future and how hard I would fight it at every company I worked at. But damn, it was worth every battle.</p><p>What could it look like? My take as an experienced architect:</p><p><strong>The whole development team owns the architecture of their code - period.</strong> Whether they are working on a small part (like payments or scheduling) or the whole app if it is smaller.</p><p>Don't care if an idea comes from a junior or senior dev. Everyone gets an equal say. But here is the key: <strong>the whole team needs to discuss and agree on decisions</strong>. No room for egos or "I am the boss" attitudes here. In one of my previous articles, I described how to organize the work within such a team and make meaningful and democratic decisions using <a href="https://newsletter.fractionalarchitect.io/p/dont-play-alone-ride-a-carousel-with">a developer carousel</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-wi5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-wi5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png 424w, https://substackcdn.com/image/fetch/$s_!-wi5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png 848w, https://substackcdn.com/image/fetch/$s_!-wi5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png 1272w, https://substackcdn.com/image/fetch/$s_!-wi5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-wi5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png" width="419" height="375.7057793345009" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/edbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:571,&quot;resizeWidth&quot;:419,&quot;bytes&quot;:32686,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-wi5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png 424w, https://substackcdn.com/image/fetch/$s_!-wi5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png 848w, https://substackcdn.com/image/fetch/$s_!-wi5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png 1272w, https://substackcdn.com/image/fetch/$s_!-wi5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbd8f99-0acf-44d7-94a7-01708968d81e_571x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Some people will argue: "That only works for small companies." BS. While yes, changing from ivory towers takes time (humans hate changing habits, so it is a pain, I agree), it is totally doable if you take it step by step. I have worked at tiny companies and large-scale organizations - this shift can work anywhere but sometimes it will require tons of politics.</p><p>When multiple teams work on a large system, one great way to share knowledge and keep architecture in line with business needs is setting up an "architecture guild." As Jakub Nabrdalik puts it:</p><blockquote><p><em><strong>How the guild works</strong></em></p><p><em>The guild meets regularly once per 2 weeks, but also has meetings ad-hoc to address urgent issues when they arise. When the guild meets, it discusses the problems and work required, invites all the relevant people (outside of the guild), schedule the necessary research, creates an RFC document to gather all possible input from people with the knowledge on the issue matter, chooses the person responsible for getting the decision done.</em></p><p><em><strong>Who is responsible</strong></em></p><p><em>Every 2 weeks one person from the guild is chosen as an acting Speaker of the guild. That person holds personal responsibility, for making sure, that the guild makes the decision in efficient manner. For every issue discussed by the guild, a person responsible will be chosen. If there are no volunteers, the Speaker of the guild is responsible. The Speaker is also on an on-duty of the architecture guild, where she is responsible for answering all the questions from outside of the guild.</em></p></blockquote><p>Here is my take on organizing a guild: Just read <a href="https://github.com/jakubnabrdalik/architecture-guild">Jakub's repo</a>. The first time I set up a guild, I basically copied his approach word-for-word. Then adjusted it with the next iterations to our needs. Now whenever someone asks me how to do it, I just send them his guide. <strong>Important note from me:</strong> Anyone can join the guild, no matter of experience. The only rule? You need to actively participate. That's it.</p><p>When you let the whole team make architectural decisions, good things happen. No more knowledge trapped with just a few people, everyone owns the architecture, developers grow way faster, and honestly - it is just way more fun to work in this kind of environment.</p><p>What do you think of a setup where the entire software development team is involved in architectural decisions? How does it look in your team?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[#33 Be Careful: Exploding Costs That Might Kill Your Product]]></title><description><![CDATA[Infrastructure costs can unexpectedly increase and harm your project success. Here are several common issues that repeatedly cause budget problems in software projects.]]></description><link>https://newsletter.fractionalarchitect.io/p/33-be-careful-exploding-costs-that</link><guid isPermaLink="false">https://newsletter.fractionalarchitect.io/p/33-be-careful-exploding-costs-that</guid><dc:creator><![CDATA[MJ]]></dc:creator><pubDate>Sat, 26 Oct 2024 07:01:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/50fce785-1bf7-4625-9824-4c2ae099d0c1_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>All architectural decisions involve trade-offs. This is widely understood. However, there is one aspect that is often overlooked: the financial implications.</p><p>Several factors can lead to unexpected costs. These include inadequate preparation for denial of service attacks (DoS &amp; DDoS), excessive logging without considering the need for it, massive use of expensive storage tiers, and implementing auto-scaling without limits.</p><p>I cover all of these topics at conferences in my talk "What Every Software Architect Should Know About Infrastructure". It is time to describe them here as well.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.fractionalarchitect.io/subscribe?"><span>Subscribe now</span></a></p><h2>Being prepared for DoS &amp; DDoS</h2><p>This year, around May or June (I can't remember exactly), I saw a thread on Reddit where someone described their problematic situation. In short, they received a $104k bill for hosting their static website.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qqsN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qqsN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!qqsN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!qqsN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!qqsN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qqsN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.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;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qqsN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!qqsN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!qqsN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!qqsN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab59a0a4-1e15-46f2-8d85-f8c724b4cac0_1920x1080.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You might ask, "What? Over $100k for a static site? That is insane." Yes, it is. The reason for such an amount was a denial of service attack. In the starter plan, the hosting provider charges $55 per 100 GB of bandwidth above the first 100 GB, which is free.</p><p>There were different opinions about this situation. Some people said that it was the author's fault and that he should have read and analyzed the pricing information first, which explicitly stated that the provider charges $55 per 100 GB. Other opinions were that the provider should have some built-in mechanisms to defend against DDoS attacks in such cases. I think both sides are right to a certain extent, but this is not the time to find the guilty. Instead, let's look at what can be done to avoid such a situation.</p><p>Denial of service attacks usually occur in one of three layers: 7 (application), 4 (transportation), and 3 (network).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lfUc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lfUc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png 424w, https://substackcdn.com/image/fetch/$s_!lfUc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png 848w, https://substackcdn.com/image/fetch/$s_!lfUc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png 1272w, https://substackcdn.com/image/fetch/$s_!lfUc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lfUc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png" width="1237" height="881" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:881,&quot;width&quot;:1237,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:138799,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lfUc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png 424w, https://substackcdn.com/image/fetch/$s_!lfUc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png 848w, https://substackcdn.com/image/fetch/$s_!lfUc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png 1272w, https://substackcdn.com/image/fetch/$s_!lfUc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3d9d8d-a2d8-4826-b4b8-f94bd6b91d48_1237x881.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first step you can take is to minimize potential points of attack. The math is simple - the fewer points, the better.</p><p>Next, you can use out-of-the-box solutions from the cloud providers. In Azure, this is <a href="https://learn.microsoft.com/en-us/azure/frontdoor/front-door-overview">Azure Frontdoor</a>, and in AWS, it is <a href="https://aws.amazon.com/shield/">AWS Shield</a>. Another option is to use third parties like <a href="https://www.cloudflare.com/en-gb/ddos/">Cloudflare</a>. I really like the latter because it offers seamless integration with the aforementioned clouds + it's pretty cheap.</p><h2>Mistakes that cost a lot</h2><p>Another example of exploding costs was <a href="https://cara.app/explore">the Cara app</a>. Here is the story (according to <a href="https://www.linkedin.com/posts/gergelyorosz_an-app-using-a-serverless-backend-went-viral-activity-7204565896638447616-jUbe/">Gergely Orosz</a>):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XLqV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XLqV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png 424w, https://substackcdn.com/image/fetch/$s_!XLqV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png 848w, https://substackcdn.com/image/fetch/$s_!XLqV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png 1272w, https://substackcdn.com/image/fetch/$s_!XLqV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XLqV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png" width="569" height="659" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:659,&quot;width&quot;:569,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128840,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XLqV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png 424w, https://substackcdn.com/image/fetch/$s_!XLqV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png 848w, https://substackcdn.com/image/fetch/$s_!XLqV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png 1272w, https://substackcdn.com/image/fetch/$s_!XLqV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50149ec0-fd04-474d-84f3-817bff364f9b_569x659.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In short, the Cara app used serverless on Vercel and it worked perfectly. The problem was that at some point the app went viral and incurred extreme costs ($98k to run it for a few days).</p><p>I think this is a good lesson for anyone building a public-facing application that has the potential to go viral, and when I say be ready, I mean at least one of the following.</p><h4><strong>Have enough money ready</strong></h4><p>Think of this as having a safety net:</p><ul><li><p>Secure investment funding (venture capital, angel investors, or personal capital)</p></li><li><p>Be prepared for significant infrastructure costs</p></li><li><p>Scale infrastructure dynamically based on demand</p></li></ul><p><strong>Advantage:</strong> Guaranteed service availability for all users</p><p><strong>Challenge:</strong> Requires money (sometimes a lot of money)</p><h4><strong>Controlled scaling with limits</strong></h4><p>With this approach, you need to implement scaling boundaries:</p><ul><li><p>Set clear infrastructure limits (e.g., 2-3 server instances)</p></li><li><p>Accept that some users may experience service unavailability during peak times</p></li><li><p>Communicate limitations transparently to users</p></li></ul><p><strong>Advantage:</strong> Predictable costs and manageable infrastructure</p><p><strong>Challenge:</strong> Potential user dissatisfaction during high-demand periods</p><h4>Cost-optimized infrastructure from day one</h4><p>Here, you have to focus on optimization from the start of application development:</p><ul><li><p>Optimize application performance and resource usage</p></li><li><p>Aim for significantly reduced operational costs (e.g., 10% of unoptimized costs)</p></li><li><p>Implement efficient caching strategies</p></li><li><p>Choose cost-effective service providers and technologies</p></li></ul><p><strong>Advantage:</strong> Balance between cost and performance</p><p><strong>Challenge:</strong> Requires a lot of initial optimization efforts (but you will benefit a lot from it)</p><h2>The hidden costs of storage</h2><p>One of the most common problems I see when it comes to high infrastructure costs is data storage. I can't count the number of times I have seen files stored in the hot tier of the cloud while being accessed extremely infrequently.</p><p>At first glance, when a cloud provider charges $0.023 per GB for a hot tier, it might seem negligible. For applications storing just a few hundred megabytes, the monthly cost is indeed minimal&#8212;around two cents. However, the real challenge emerges when your application's storage needs grow exponentially.</p><p>Consider building a social media application. Let's break down this scenario:</p><ul><li><p>User base: 10,000,000 users</p></li><li><p>Storage allowance: 100 images per user</p></li><li><p>Maximum image size: 5 MB</p></li></ul><p>Doing the math:</p><p><code>10,000,000 users &#215; 100 images &#215; 5 MB = 5 PB = $115k per month</code></p><p>Shocking, isn't it? This shows why we can't be misled by looking at small-scale costs. What seems like pennies can quickly escalate to six figures when operating at scale.</p><h2>High costs generated by logs</h2><p>As a software developer, I know firsthand that we developers have a habit: we love to log everything. And when I say everything, I really mean everything!</p><p>Let me share an example that shows just how expensive this can get. In one project I was involved in, the forecasted logging cost was about $10k per month. But guess what? The real bill ended up being more than $100k per month! That's ten times more than was planned for.</p><p>What was the problem? We discovered the team was logging tons of information that nobody ever looked at or used.</p><p>The solution was simple but effective: they cut down on unnecessary logs and in the end, switched to a different logging platform. This meant only keeping the logs that actually helped us monitor and fix issues in our system. Sometimes less really is more &#8211; especially when it comes to your cloud bill.</p><h2>TL;DR</h2><p>Unexpected infrastructure costs can explode due to the following factors:</p><ol><li><p><strong>DDoS attacks</strong>. A static website got a $104k bill due to unprotected bandwidth charges.</p></li><li><p><strong>Viral success without preparation</strong>. The Cara team faced a $98k bill for running a viral application for several days.</p></li><li><p><strong>Hot storage misuse.</strong> What seems cheap ($0.023/GB) can scale to $115k/month for a social media app with 10M users.</p></li><li><p><strong>Excessive logging.</strong> One project's logging costs jumped from $10k to $100k/month due to logging unnecessary data.</p></li></ol><p>Solutions include:</p><ul><li><p>Using DDoS protection (Cloudflare, AWS Shield, Azure Frontdoor)</p></li><li><p>Having funding ready or implementing controlled scaling</p></li><li><p>Optimizing infrastructure from day one</p></li><li><p>Using appropriate storage tiers</p></li><li><p>Logging only necessary information</p></li></ul><p>What are your thoughts on exploding costs? Have you ever faced such a situation in your project/product?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.fractionalarchitect.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Fractional Architect! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>