<?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[Shaping Shifts]]></title><description><![CDATA[Documenting my journey in learning about adaptive software systems.]]></description><link>https://www.shapingshifts.com</link><image><url>https://substackcdn.com/image/fetch/$s_!BVwH!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5989d0df-5644-4d51-8f63-49d2aca2be22_456x456.png</url><title>Shaping Shifts</title><link>https://www.shapingshifts.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 18 May 2026 04:33:56 GMT</lastBuildDate><atom:link href="https://www.shapingshifts.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Alex Kaserbacher]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[shapingshifts@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[shapingshifts@substack.com]]></itunes:email><itunes:name><![CDATA[Alex Kaserbacher]]></itunes:name></itunes:owner><itunes:author><![CDATA[Alex Kaserbacher]]></itunes:author><googleplay:owner><![CDATA[shapingshifts@substack.com]]></googleplay:owner><googleplay:email><![CDATA[shapingshifts@substack.com]]></googleplay:email><googleplay:author><![CDATA[Alex Kaserbacher]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Harness Engineering. The Real Skill Behind AI-Assisted Development.]]></title><description><![CDATA[In my last newsletter I argued that architectural judgment stays human.]]></description><link>https://www.shapingshifts.com/p/harness-engineering-the-real-skill</link><guid isPermaLink="false">https://www.shapingshifts.com/p/harness-engineering-the-real-skill</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 21 Apr 2026 05:02:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qYQa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my last newsletter I argued that architectural judgment stays human. AI agents generate code, but we as architects decide which trade-offs to make and why. So how do you actually work with AI agents in a way that leverages your judgment?</p><p>I&#8217;ve found that the biggest lever is the environment you build around the agent. The constraints, feedback loops, and evaluation criteria that shape what the agent produces. Birgitta B&#246;ckeler writes about this process (called harness engineering) in detail<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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 harness</h2><p>A harness is everything surrounding the agent. What it can see, what feedback it gets, what constraints it operates under. You define what &#8220;good&#8221; looks like, and the harness tells the agent when it&#8217;s not there yet.</p><p>Think of reconciliation loops in Kubernetes. You declare the target state. A reconciler works toward it. You don&#8217;t micromanage the steps. You define what &#8220;good&#8221; looks like and let the system figure out how to get there.</p><p>Harness engineering works the same way. You encode your judgment into the harness and the agent reconciles toward it.</p><h2>Fitness functions as a harness</h2><p>I recently built the first version of an AI-native architectural analysis tool. I started by building the evaluation layer.</p><p>First, I defined fitness functions. These encode my architectural judgment about what &#8220;good&#8221; means for this specific system. One example: the tool sends a text summary of the codebase to an LLM, so I defined a token cost fitness function. It measures the token count of the generated summary and fails if it exceeds 12,000 tokens. That threshold encodes a judgment: the summary must fit in a single LLM context window with room for the analysis prompt. Other fitness functions cover findings quality, schema conformance, and parser coverage.</p><p>Then I built a dashboard to compare approaches against these functions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qYQa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qYQa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png 424w, https://substackcdn.com/image/fetch/$s_!qYQa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png 848w, https://substackcdn.com/image/fetch/$s_!qYQa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png 1272w, https://substackcdn.com/image/fetch/$s_!qYQa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qYQa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png" width="874" height="626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:626,&quot;width&quot;:874,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74993,&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://www.shapingshifts.com/i/194588574?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.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_!qYQa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png 424w, https://substackcdn.com/image/fetch/$s_!qYQa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png 848w, https://substackcdn.com/image/fetch/$s_!qYQa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.png 1272w, https://substackcdn.com/image/fetch/$s_!qYQa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4002f1f-8b8f-4120-8ba5-5d88742efbfa_874x626.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_!Y7wJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y7wJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png 424w, https://substackcdn.com/image/fetch/$s_!Y7wJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png 848w, https://substackcdn.com/image/fetch/$s_!Y7wJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png 1272w, https://substackcdn.com/image/fetch/$s_!Y7wJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y7wJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png" width="1250" height="795" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:795,&quot;width&quot;:1250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104812,&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://www.shapingshifts.com/i/194588574?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.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_!Y7wJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png 424w, https://substackcdn.com/image/fetch/$s_!Y7wJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png 848w, https://substackcdn.com/image/fetch/$s_!Y7wJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.png 1272w, https://substackcdn.com/image/fetch/$s_!Y7wJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50089a22-1d08-4a04-93ef-e02b5cf2e293_1250x795.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>Only then did I let AI agents implement solutions. The harness was already in place.</p><p>The dashboard lets you compare solutions against your judgment. When an approach scores poorly on a fitness function, you see it immediately.</p><h2>Fitness Functions are target state contracts.</h2><p>When you put your architectural judgment into the evaluation layer, every AI-generated solution gets measured against it automatically. You can fan out multiple agents exploring different approaches and let the harness pick the winner.</p><p>The judgment is still yours. You chose the fitness functions, you decided what &#8220;good&#8221; looks like. Now that judgment is encoded in something durable and repeatable.</p><p>This comes with a risk. Fitness functions can encode the wrong judgment. If you optimize for token cost alone, the agent will produce summaries that are short but miss critical architectural details. The harness is only as good as the judgment you put into it. That&#8217;s why you need multiple fitness functions that balance each other, and why you should revisit them as you learn more about your problem.</p><p>Build the evaluation before the implementation. Let the harness carry your judgment. Evaluate constantly.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>B&#246;ckeler, B. (2025). Harness Engineering. <a href="https://martinfowler.com/articles/harness-engineering.html">martinfowler.com</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[AI Won't Replace Your Judgment. But AI Can Sharpen It.]]></title><description><![CDATA[AI coding agents already stand out in writing code from a specification.]]></description><link>https://www.shapingshifts.com/p/ai-wont-replace-your-judgment-but</link><guid isPermaLink="false">https://www.shapingshifts.com/p/ai-wont-replace-your-judgment-but</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 07 Apr 2026 05:01:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BVwH!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5989d0df-5644-4d51-8f63-49d2aca2be22_456x456.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI coding agents already stand out in writing code from a specification. Give them a bounded problem where architectural decisions are predefined, and they produce high-quality code very fast. They&#8217;re also good at explaining trade-offs for architectural decisions. I recently prompted Claude about multi-tenant isolation strategies and it answered with three approaches, listing latency and complexity costs for each.</p><p>This leaves the question: what is left for us software architects?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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>The answer is judgment. And what I&#8217;ve found is that AI can serve as something unexpected: a flight simulator for developing it.</p><h2>Why judgment stays human</h2><p>Let me go back to that tenant-isolation example. The AI laid out three strategies with their technical characteristics: latency, throughput, isolation level, implementation cost. All useful. But I was the one who recognized that the relevant dimension to evaluate wasn&#8217;t any of those. It was the fact that one strategy handled high load by rejecting requests to protect other tenants. In this specific business context, that&#8217;s unacceptable. The AI couldn&#8217;t know that.</p><p>That was a judgment call requiring understanding of consequences across the whole system and its relationship to the business context. I knew which question to ask, out of all the possible questions. I brought the lens that mattered. LLMs can surface technical characteristics, but they cannot understand your business context well enough to make the trade-off decision for you.</p><h2>The flight simulator</h2><p>So if judgment is our core contribution, how do we get better at it?</p><p>Researchers on expert intuition tell us that two things matter: a domain with learnable patterns, and enough practice with timely feedback. Kahneman and Klein call this the foundation of &#8220;naturalistic decision-making&#8221;. It&#8217;s how firefighters, chess players, and surgeons build expert intuition<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><p>I tried to create exactly that environment using AI. Working conversationally with Claude, I had it suggest possible solutions and implement whichever one I chose. I made the architectural decisions; Claude handled the code. This let me iterate on decisions in minutes instead of days, stripping away implementation time so I could focus purely on architectural thinking. It&#8217;s a flight simulator for architects.</p><h2>An important caveat</h2><p>This approach works best for quality attributes you can measure quickly and holistically. In my case, I was trying to improve latency, so I had an objective measure to optimize for: load and performance tests. When I deployed a bad decision, I immediately felt it in declining numbers. When I got it right, the improvement was just as visible. That tight feedback loop is what makes the practice effective.</p><p>Other attributes are harder. Maintainability across 17 teams? That feedback loop doesn&#8217;t fit in a practice project. But for the attributes you *can* measure (like latency, throughput or availability) this is the fastest feedback loop an architect has ever had.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Kahneman, D. &amp; Klein, G. (2009). Conditions for Intuitive Expertise: A Failure to Disagree. *American Psychologist*, 64(6), 515&#8211;526.</p></div></div>]]></content:encoded></item><item><title><![CDATA[How I Set Up Claude Code for Learning about Architecture]]></title><description><![CDATA[Recently, I was digging into streaming architectures for a client.]]></description><link>https://www.shapingshifts.com/p/how-i-set-up-claude-code-for-learning</link><guid isPermaLink="false">https://www.shapingshifts.com/p/how-i-set-up-claude-code-for-learning</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 24 Mar 2026 06:01:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BVwH!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5989d0df-5644-4d51-8f63-49d2aca2be22_456x456.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently, I was digging into streaming architectures for a client. Starting with the usual reading of articles and books, I wondered if this was the best way to approach this topic. I felt the urge to build something, to learn by doing.</p><p>Before AI-assisted coding, spinning up a full practice environment (Docker, Kafka, Flink, a load generator with out-of-order events) would have eaten all the time I had for actual learning. Now, I spun up an entire practice project with minimum effort. Using that, I only implemented the parts with the highest learning payoff. For streaming systems this was choosing watermarks, windowing strategies and implementing channels. What I automated was all the boilerplate: setting up a docker swarm, installing Kafka and Flink as well as implementing a sample application which emits a high load of events (with some of them being out-of-order).</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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>Project-based learning helps discover gaps in your knowledge much better than passive reading &#8230; and now you can engineer the learning environment yourself with an AI agent acting as a feedback loop.</p><p>For example, the learning project forced me to decide between different watermark strategies. Even though I knew what watermarks were from my distributed systems classes at university, I did not have a deep and thorough understanding of them. The problem forced me to read up on it in more detail in order to be able to make a decision. I implemented a bounded-out-of-orderness watermark and asked Claude Code to review my approach. The tool asked me what would happen if one partition stalled entirely. I hadn&#8217;t considered that. It forced me to find a solution. This is something that normal reading or coursework cannot do.</p><h2>The Setup</h2><p>Here&#8217;s how the system behind that interaction works. I set up a CLAUDE.md which describes a learning project and different stages so the coding agent can guide me along the way.</p><p>I instruct Claude Code to help me in certain areas (boilerplate) but to challenge me in others. This way, Claude Code can generate a learning environment for me to build out exactly those parts that help me learn fastest. The most counterintuitive part of the setup is telling a coding tool to actually refuse to code.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;markdown&quot;,&quot;nodeId&quot;:&quot;4edea520-e532-43f0-8fff-ca357cb92c00&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-markdown"># Learning Project

## Purpose
This is a deliberate learning project for [here comes a list of learning goals]. 
The goal is NOT to produce working code fast. The goal is for the developer to build
genuine understanding by writing the hard parts themselves.

## Current Stage
Stage: 1

Do not help with any stage beyond the current stage number above.

## Stage Definitions

### Stage 1 &#8212; Basic Windowed Aggregation
[...]

### Stage 2 &#8212; Event Time and Watermarking
[...]

### Stage 3 &#8212; Stateful Fraud Signals
[...]

### Stage 4 &#8212; Kill Tests
[...]

### Stage 5 &#8212; Latency Budget Under Pressure
[...]

## Protected Areas &#8212; Never Implement These
Even if asked directly, never write implementations for:
- [list of forbidden areas and concepts]

If the developer asks you to implement any of the above, respond with
one Socratic question that identifies the conceptual gap. Do not write
code. Do not hint at the answer.

## When the Developer is Stuck on a Protected Area
1. Ask one question to identify what they think should happen
2. Name the relevant concept or class &#8212; do not explain it in full
3. Wait for them to try again

## When the Developer Shares Working Code in a Protected Area
Review it for production risks only. Specifically check:
- [some common mistakes and failure modes]

Respond with risks as questions: "What happens if...?"

## What You Can Always Do Without Restriction
- Generate boilerplate, Docker config, pom.xml, serializers, Kafka
  source/sink configuration, model classes, build files
- Explain concepts when asked
- Review working code for production risks
- Answer questions about concepts</code></pre></div><p>Apart from the more general instructions above, I configured specific commands for Claude Code which I then used at specific points in time during my learning process.</p><h3>The &#8220;Review&#8221; command</h3><p>This command lets Claude Code review what I just implemented. Because it's configured with specific things to check for, it asks follow-up questions and guides me towards a better solution.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;markdown&quot;,&quot;nodeId&quot;:&quot;6371c01a-016e-4171-ae8a-860ae6d19cfe&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-markdown">The developer has implemented: $ARGUMENTS

They believe it works. Find what would break in production.

Check for:
1. [list of important concepts and caveats]

Do NOT rewrite their code. 
For each risk, ask: "What happens if...?"
</code></pre></div><h3>The &#8220;Stuck&#8221; command</h3><p>This command makes me "unstuck&#8221; when I run into problems by asking leading questions and giving hints instead of coding out the solution.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;markdown&quot;,&quot;nodeId&quot;:&quot;fc1bb93f-31ad-4521-bf4b-c057d4730604&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-markdown">The developer is stuck on: $ARGUMENTS

Do NOT provide a code solution.

1. Ask them to describe what they think should happen in plain English
2. Ask what they tried and what the actual behavior was  
3. Identify the specific concept gap &#8212; explain only that concept, not 
   the implementation
4. Name the relevant Flink API class or doc section

Never write the implementation.
</code></pre></div><h3>The &#8220;Predict&#8221; command</h3><p>This command forces me to predict what will happen during a failure scenario before I run it, then helps me reconcile any gap between prediction and reality. The below example is specific to the technology I was learning about (streaming systems).</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;markdown&quot;,&quot;nodeId&quot;:&quot;2275126c-57ad-424d-acf0-c92fc202219a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-markdown">The developer is about to run Kill test: $ARGUMENTS

Ask them these four questions. Do not continue until all are answered:

1. What state exists right now, and where does it live?
2. What was the last checkpoint, and what does it contain?
3. What events have arrived since the last checkpoint?
4. What do you expect the output topic to contain after recovery?

Once they answer all four, say only: "Run it."

After they report the outcome, help them reconcile any difference 
between their prediction and reality.
</code></pre></div><h2>Future Plans</h2><p>I plan on developing this out into a ready-to-use template for future learning projects which I will open source. I will keep you updated on the progress over the following weeks.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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[Autonomy Sliders, Slow Productivity Engineers and a Surprising Book on Vibe Coding]]></title><description><![CDATA[Here are three things I&#8217;ve found interesting this week:]]></description><link>https://www.shapingshifts.com/p/autonomy-sliders-slow-productivity</link><guid isPermaLink="false">https://www.shapingshifts.com/p/autonomy-sliders-slow-productivity</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 01 Jul 2025 05:00:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7657e76f-c86b-4a0e-8091-0a82a85507b0_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Here are three things I&#8217;ve found interesting this week:</p><h2>#1 The Autonomy Slider</h2><p>When building autonomous (AI) agents, we have control over the level of autonomy we give those agents. A self-driving car, for example, might assist you in driving around corners, parking sideways or changing lanes. You might also outsource the entire job of transportation to it: bring me from A to B.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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>Now, the idea of an <em>autonomy slider</em> (as Andrej Karpathy calls it in the talk linked below) is exactly that: giving users a choice over how autonomous AI agents should be. I mostly use <a href="https://www.cursor.com/">Cursor</a> for AI-augmented development and I do so on multiple &#8220;levels&#8221;: using code completion features to write/refactor individual functions all the way up to using the chat interface to write bigger chunks of code (the autonomy slider is turned up fully). This can even be extended by using tools like RooCode, which fully automates feature development including design and testing.</p><p>Now, I don&#8217;t want to argue in favor of one autonomy level over the other in coding; I use the example to illustrate autonomy sliders. Andrej stresses the importance of including autonomy sliders when building useful AI agents.</p><p>Check out the talk here:</p><div id="youtube2-LCEmiRjPEtQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;LCEmiRjPEtQ&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/LCEmiRjPEtQ?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>#2 The Slow Productivity Engineer</h2><p>There are few authors who have influenced by thinking as much as Cal Newport. In his newest book, <a href="https://www.goodreads.com/book/show/197773418-slow-productivity">Slow Productivity</a>, he defines <em>pseudo-productivity</em> as &#8220;using visible activity as a crude proxy for actual productivity." Being the dominant way we think about knowledge work since the 21st century, he states that</p><blockquote><p>Long work sessions that don't immediately produce obvious contrails of effort become a source of anxiety--it's safer to chime in on email threads and "jump on" calls than to put your head down and create a bold new strategy.</p></blockquote><p>Instead, Newport defines an alternative: Slow Productivity. He argues that by focusing on different things, we actually increase the outcomes of the effort we put in.</p><blockquote><p>A philosophy for organizing knowledge work efforts in a sustainable and meaningful manner, based on the following three principles:</p><ol><li><p>Do fewer things.</p></li><li><p>Work at a natural pace.</p></li><li><p>Obsess over quality.</p></li></ol></blockquote><p>In InfoQ&#8217;s <a href="https://www.infoq.com/podcasts/productivity-play-better-software-engineers/">Engineering Culture Podcast</a>, Holly Cummins made some remarks about productivity metrics and software engineering that reminded me a lot of Newport&#8217;s ideas. </p><h3>#3 A Surprising Book on Vibe Coding</h3><p>What do artists like Neil Young, U2, Metallica, Red Hot Chili Peppers, AC/DC, System of a Down, Eminem and many more have in common? Every one of them had at least one record produced by <a href="https://en.wikipedia.org/wiki/Rick_Rubin">Rick Rubin</a>.</p><p>As I enjoyed his book <a href="https://www.goodreads.com/book/show/60965426-the-creative-act">The Creative Act</a> (get the hardcover, the binding is great), I was surprised to learn that he teamed up with Anthropic to write a book about vibe coding. Check it out here: <a href="https://www.thewayofcode.com/">https://www.thewayofcode.com/</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_!cetD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cetD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cetD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cetD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cetD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cetD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!cetD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cetD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cetD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cetD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F614557ee-58a2-4840-9d27-ac8f9ea815e6_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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[LLMs, Human Intelligence and Monoliths]]></title><description><![CDATA[Here are two things that I found interesting this week:]]></description><link>https://www.shapingshifts.com/p/llms-human-intelligence-and-monoliths</link><guid isPermaLink="false">https://www.shapingshifts.com/p/llms-human-intelligence-and-monoliths</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 24 Jun 2025 05:01:47 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/559723bb-240f-4338-9952-54111dec4a25_1024x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Here are two things that I found interesting this week:</p><h2>#1 Are LLMs inhibiting human intelligence?</h2><p>Your brain grows by solving hard problems and struggling with them. That&#8217;s the point of <a href="https://en.wikipedia.org/wiki/Neuroplasticity">neuroplasticity</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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>For some time, I&#8217;ve been worried that my extensive use of LLMs in problem solving challenges inhibits my ability to learn and prevents my skills and knowledge from adapting and improving. Evidence now seems to be emerging about this, indicating that we need to think more about when to use those tools to preserve cognitive ability.</p><p>A <a href="https://arxiv.org/pdf/2506.08872">study</a> I&#8217;ve discovered this week states the following:</p><blockquote><p>AI tools, while valuable for supporting performance, may unintentionally hinder deep cognitive processing, retention, and authentic engagement with written material. If users rely heavily on AI tools, they may achieve superficial fluency but fail to internalize the knowledge or feel a sense of ownership over it.</p></blockquote><p>What&#8217;s also interesting about this study is that it shows diminishing ownership over LLM-assisted text. I was wondering whether this could extend to development teams. Could teams using AI for coding extensively feel less ownership about it? This would be an interesting research question.</p><h2>#2 The GitHub Monolith</h2><p>When watching Gergely Orosz&#8217; interview with GitHub CEO Thomas Dohmke, one thing stuck out to me: GitHub is still operating mostly on a monolithic system. I would be interested in digging deeper into how they do this reliably at such a scale.</p><p>When I teach Microservices I emphasize two main criteria which should make you think about including deployment boundaries: (1) supporting varying load patterns (i.e. part A has to scale at a different rate/frequency than part B) and (2) improving team independence (i.e. teams want to use different technologies and deploy independently from other teams). GitHub seems to have done this by splitting out the Copilot API (which clearly has different load patterns than the main GitHub platform) and GitHub Actions.</p><p>Anyway, check out the full interview here: </p><div id="youtube2-2oq__5tDFZI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;2oq__5tDFZI&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/2oq__5tDFZI?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://www.shapingshifts.com/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 Shaping Shifts! 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[Integration Strategies for Microservices: Choreography and Orchestration]]></title><description><![CDATA[What starlings can teach us about decentralized workflows &#8212; exploring how choreography and orchestration shape communication and coordination in microservice architectures.]]></description><link>https://www.shapingshifts.com/p/integration-strategies-for-microservices</link><guid isPermaLink="false">https://www.shapingshifts.com/p/integration-strategies-for-microservices</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 08 Apr 2025 05:00:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JmC6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Starlings are birds originally native to Europe. In the 19th century, a businessman named Eugene Schieffelin introduced them to North America. According to an urban legend, his motivation was to bring this species to America so that every bird mentioned in Shakespeare&#8217;s works would be present there.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JmC6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JmC6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JmC6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JmC6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JmC6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JmC6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg" width="1456" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:795828,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.shapingshifts.com/i/160638420?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JmC6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JmC6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JmC6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JmC6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9946ffcc-a60c-455c-9d1c-a383da127dd6_2044x1347.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">"<a href="https://www.flickr.com/photos/23267638@N06/52458932269">starling</a>" by <a href="https://www.flickr.com/photos/23267638@N06/">amdolu</a> is licensed under CC BY-NC 2.0.</figcaption></figure></div><p>Although this story is <a href="https://www.nytimes.com/2022/04/11/science/starlings-birds-shakespeare.html">widely disputed</a>, starlings are a magnificent and interesting species of birds. What makes them particularly fascinating is their collective behavior in flocks. Starling flocks contain up to thousands of birds and provide mesmerizing, coordinated flight patterns (called murmurations) - all while individual birds follow simple rules like maintaining distance, aligning with neighbors, and steering towards the flock&#8217;s center.</p><div id="youtube2-34jaUM6eqb4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;34jaUM6eqb4&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/34jaUM6eqb4?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://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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>What is so intriguing about these phenomena is that they work without central control, relying instead on communication between individual birds. To bring these ideas back to software systems, today I want to discuss a concept called choreography.</p><h3>Choreography</h3><p>Imagine your starling birds now as microservices. Choreography is a communication strategy that integrates parts without requiring central control. Individual services execute a workflow by transmitting information to each other in a decentralized manner. This is done by emitting events, which are notifications of something that happened, without knowing who will handle them. I have written about events in &#8220;<a href="https://www.shapingshifts.com/p/event-driven-communication-and-its">Event-Driven Communication and Its Effects on Team Independence</a>&#8221;:</p><blockquote><p>Events are statements of facts that occurred. The emitting module releases an event, letting others know something happened, like "new order placed" or "order canceled". They never induce a direct reply because replying to statements of facts would not make much sense. Events have an effect that commands or queries do not. The producer has no knowledge of the receiving modules, their behavior, or what they do with the data. It releases the event and considers its job done, reducing the coupling between modules. Events are often used in combination with the publish-subscribe pattern. [&#8230;] Usually, any module interested in a specific type of event can subscribe to it.</p></blockquote><p>What happens in choreographed workflows is that the overall workflow emerges as a pattern of independent reactions between services, rather than being explicitly defined in a single place. Because each service's activation logic is embedded locally, the overall workflow behavior becomes distributed across services.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SRaL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SRaL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png 424w, https://substackcdn.com/image/fetch/$s_!SRaL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png 848w, https://substackcdn.com/image/fetch/$s_!SRaL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png 1272w, https://substackcdn.com/image/fetch/$s_!SRaL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SRaL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png" width="1456" height="684" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:684,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:260523,&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://www.shapingshifts.com/i/160638420?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.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_!SRaL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png 424w, https://substackcdn.com/image/fetch/$s_!SRaL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png 848w, https://substackcdn.com/image/fetch/$s_!SRaL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.png 1272w, https://substackcdn.com/image/fetch/$s_!SRaL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F276da0d3-c538-44ab-ad54-0f692752035a_2518x1183.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></p><p>While this emergent behavior seen in choreographed systems and starling flocks benefits the autonomy of individual services, the lack of explicit workflow logic representation in a single location can sometimes cause issues, such as errors that are hard to trace. This is why an alternative approach to choreography exists, which is known as orchestration.</p><h3>Orchestration</h3><p>Placing workflow logic within a single microservice, which then controls the invocation of other services, is known as orchestration, and the central microservice is correspondingly called an <strong>orchestrator</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1ogc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1ogc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png 424w, https://substackcdn.com/image/fetch/$s_!1ogc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png 848w, https://substackcdn.com/image/fetch/$s_!1ogc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png 1272w, https://substackcdn.com/image/fetch/$s_!1ogc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1ogc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png" width="1456" height="958" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:958,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:595611,&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://www.shapingshifts.com/i/160638420?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.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_!1ogc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png 424w, https://substackcdn.com/image/fetch/$s_!1ogc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png 848w, https://substackcdn.com/image/fetch/$s_!1ogc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.png 1272w, https://substackcdn.com/image/fetch/$s_!1ogc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff6730cf-48d6-4a04-b2e7-73c2bfaf0b9a_2680x1764.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></p><p>While the invoked services have no knowledge about the orchestrator, the other way around is (obviously) the case. In this way, orchestrators are able to centralize workflows and complex invocation logic - with all the trade-offs this creates.</p><h3>Conclusion</h3><p>Clearly, neither choreography nor orchestration is inherently and objectively superior. As I personally lean towards choreography, especially when the communication crosses teams and bounded contexts, I acknowledge that orchestration provides value in depicting workflows which require some tasks to be executed in a certain order. However, I always try to build my module boundaries around these consistency/order requirements such that I use orchestration more often within those bounded contexts. This way, the communication overhead that comes with extending orchestrated systems does not cross team boundaries and the knowledge of the process coordination remains local and within the same team.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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[How Organizational Distance Shapes Component Integration]]></title><description><![CDATA[How to select integration strategies by assessing physical, cultural, and temporal proximity between teams.]]></description><link>https://www.shapingshifts.com/p/how-organizational-distance-shapes</link><guid isPermaLink="false">https://www.shapingshifts.com/p/how-organizational-distance-shapes</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 01 Apr 2025 05:01:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xxCU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>What Is Organizational Distance?</h3><p>Organizational distance describes how far apart two teams are within a communication network. Teams sharing the same office space and interacting daily have a small organizational distance. In contrast, teams situated in separate units&#8212;or even different organizations&#8212;and located on different continents have a large organizational distance.</p><h3>Measuring Organizational Distance</h3><p>Quantifying organizational distance precisely is challenging, but it&#8217;s possible to get an intuitive sense of it by considering a few key questions:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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><em>How often do you interact with the other team?</em> <br>Frequent interactions, such as daily conversations, indicate a smaller organizational distance. Less frequent communication typically suggests greater distance.</p><p><em>How much physical or digital space do you share with the other team?</em> <br>Sharing more space generally reduces organizational distance. Physical space includes working on the same office floor, using common interaction areas, or having shared lunch spaces. Digital spaces might involve using shared chatrooms, forums, or collaboration tools. Typically, physical interaction implies a smaller organizational distance compared to purely remote interaction.</p><p><em>How much cultural overlap exists between your team and the other team?</em> <br>Teams with significant cultural overlap often find it easier to develop a common understanding of problems and solutions. Conversely, cultural differences, particularly when teams are spread across multiple time zones or geographic regions, usually increase organizational distance.</p><p>The organizational distance between teams significantly influences the type of integration they should select. The figure below illustrates that cross-team integration has multiple dimensions, represented here along three distinct axes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xxCU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xxCU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!xxCU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!xxCU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!xxCU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xxCU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.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;:63777,&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://www.shapingshifts.com/i/159811803?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.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_!xxCU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!xxCU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!xxCU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!xxCU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb585df-9594-467b-be30-e7e5af3e7e89_1600x900.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></p><h3>Technical Axis</h3><p>Synchronous, direct communication (e.g., calling a REST interface) is most suitable for teams with close organizational distance, as they can more easily collaborate on evolving their APIs together. For teams separated by greater distance, techniques like API versioning can help manage changes more effectively.</p><p>In contrast, asynchronous and indirect communication&#8212;often implemented using middleware&#8212;decouples the runtime behavior of interacting components. Asynchronous messaging reduces coupling by using flexible, immutable event schemas or backward-compatible message formats and by eliminating the need for immediate responses. This approach allows each team evolve its components more independently, increasing autonomy and minimizing mutual disruptions.</p><h3>Domain Axis</h3><p>Domain-Driven Design outlines several <a href="https://github.com/ddd-crew/context-mapping">integration patterns</a> that are strongly influenced by organizational distance.</p><p>Patterns such as Shared Kernel or Partnership are most suitable for teams with close organizational ties, due to the tight coordination and shared understanding required. In contrast, teams separated by larger organizational distances benefit from patterns like Open Host Service or Anticorruption Layer, as these explicitly introduce translation layers that manage differences between the domain models of each team.</p><h3>Interaction Axis</h3><p>The book Team Topologies introduces clear <a href="https://teamtopologies.com/key-concepts">interaction modes</a> to describe team relationships. For example, the collaboration mode implies close organizational distance and is typically recommended only for short-term, intensive interactions. In contrast, the X-as-a-Service mode supports a more stable, long-term relationship and is better suited to teams separated by larger organizational distances.</p><h3>Conclusion</h3><p>Teams with shorter organizational distances typically benefit from synchronous, direct integration patterns combined with close collaboration. Conversely, teams separated by greater organizational distances should prefer asynchronous communication patterns and explicit domain-model translations, such as an anti-corruption layer:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CYUP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CYUP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!CYUP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!CYUP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!CYUP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CYUP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.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;:64969,&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://www.shapingshifts.com/i/159811803?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.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_!CYUP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!CYUP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!CYUP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!CYUP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e6b075b-09f6-4f9d-8d76-5d25accd4221_1600x900.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></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xTs4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xTs4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!xTs4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!xTs4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!xTs4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xTs4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de9af4fc-b3f6-420d-b740-317246780c98_1600x900.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;:54162,&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://www.shapingshifts.com/i/159811803?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.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_!xTs4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!xTs4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!xTs4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!xTs4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9af4fc-b3f6-420d-b740-317246780c98_1600x900.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></p><p>In general, a larger area in the diagram indicates greater organizational distance. Therefore, when integrating with a component owned by a distant team, it is advisable to avoid patterns in the center of the graph, instead favoring those toward the outer layers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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[Four Book Recommendations]]></title><description><![CDATA[I have been writing this newsletter since September last year, but I&#8217;ve never shared books I like, which heavily inspire articles here.]]></description><link>https://www.shapingshifts.com/p/four-book-recommendations</link><guid isPermaLink="false">https://www.shapingshifts.com/p/four-book-recommendations</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 18 Mar 2025 06:01:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5989d0df-5644-4d51-8f63-49d2aca2be22_456x456.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have been writing this newsletter since September last year, but I&#8217;ve never shared books I like, which heavily inspire articles here.</p><p>So I wanted to use this week&#8217;s article to make up for this. Here are four books I think you should read:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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><h1>Team Topologies: Organizing Business and Technology Teams for Fast Flow</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8eh3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8eh3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8eh3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8eh3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8eh3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8eh3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg" width="234" height="350.64935064935065" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1001,&quot;resizeWidth&quot;:234,&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_!8eh3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8eh3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8eh3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8eh3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44a299c-6a30-40c9-b6a4-5bb17c0c2a95_1001x1500.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book applies agile principles to organizational design. It introduces four different team types and interaction modes, which includes stream-aligned teams and platform teams.</p><p>Read this book if you are interested in organizational aspects influencing software architecture or if you are currently in a role where you drive organizational change.</p><h1>Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nqma!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nqma!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Nqma!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Nqma!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Nqma!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nqma!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg" width="236" height="354" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1000,&quot;resizeWidth&quot;:236,&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;: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_!Nqma!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Nqma!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Nqma!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Nqma!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d124357-a5fa-47bd-bf2d-3c045420ba63_1000x1500.jpeg 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>Written by members of the <a href="https://dora.dev/">DevOps Research and Assessment (DORA)</a> team, this book includes powerful insights into the delivery performance of software development teams. They not only write about hypothetical scenarios but present a wide array of empirical data to support their arguments. One of the most prominent concepts from the book are the four key metrics: Deployment Frequency, Lead Time for Changes, Change Failure Rate, Time to Restore Service</p><p>Read this book if you are in senior technical roles and want to advance your organization&#8217;s value delivery.</p><h1>Building Evolutionary Architectures: Automated Software Governance</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XL1W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XL1W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XL1W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XL1W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XL1W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XL1W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg" width="266" height="349.0813648293963" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:266,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!XL1W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XL1W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XL1W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XL1W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10872185-8bd5-4c44-a7c6-34da7fb450da_1143x1500.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book not only introduces the powerful idea of architectural fitness functions but also discusses useful patterns and strategy to build systems which can evolve long-term in changing contexts.</p><h1>Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NQyz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NQyz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NQyz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NQyz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NQyz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NQyz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg" width="272" height="356.95538057742783" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1143,&quot;resizeWidth&quot;:272,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!NQyz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NQyz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NQyz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NQyz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ec0136-4ba1-4c3d-bdb8-ca94188df35a_1143x1500.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This book is one of the most-read books for building highly scalable, distributed information systems. Topics include distributed database clusters, data streaming and message-oriented communication.</p><p>Read this book if you are in any way involved in building distributed systems, especially with high reliability or performance requirements.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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[Assessing Component Autonomy: Strengthen Your Software’s Adaptability]]></title><description><![CDATA[Evaluate and enhance the autonomy of your software components.]]></description><link>https://www.shapingshifts.com/p/assessing-component-autonomy-strengthen</link><guid isPermaLink="false">https://www.shapingshifts.com/p/assessing-component-autonomy-strengthen</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 11 Mar 2025 06:01:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!R9_a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my previous article, &#8220;<a href="https://www.shapingshifts.com/p/build-adaptable-and-resilient-software">Build Adaptable and Resilient Software Systems by Unlocking Component Autonomy</a>&#8221;, I emphasized autonomy as a critical property of well-designed software components:</p><blockquote><p>When a system&#8217;s components become too interdependent, even a small change can have wide-ranging effects. For example, if a modification in one component triggers changes in several others, it signals architectural entanglement. This issue is especially problematic when different teams are responsible for different components, because any change requires extensive communication and coordination across teams, disrupting priorities and backlogs. Such complexity not only increases technical overhead but also adds organizational and communication burdens, ultimately resulting in longer lead times and a higher likelihood of errors.</p><p>[&#8230;]</p><p>In software architecture, autonomy means that a system&#8217;s component can operate and evolve independently, reducing the need for frequent (inter-team) coordination.</p><p>Autonomy is not binary; it exists on a spectrum from total dependency to complete independence. Instead of viewing autonomy as something you either have or do not have, individual entities should always strive to become more autonomous. Therefore, if your team is working on a component that ranks low on the scale, you should seek ways to increase its autonomy rather than accepting its dependency.</p></blockquote><p>In the article, I also outlined several distinct aspects of component autonomy, summarized here:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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><ul><li><p>Functional Autonomy: Each component should have a clearly defined and distinct responsibility, ensuring its functionality is clearly separated from other system parts. This minimizes coordinated changes across components.</p></li><li><p>Data Autonomy: Components should independently manage their internal data without relying on shared mutable data or schemas, preventing data-driven changes from cascading across components.</p></li><li><p>Runtime Autonomy: Components should operate independently at runtime, remaining functional even when related services become temporarily unavailable. They should include mechanisms enabling continued operation without immediate external input.</p></li><li><p>Activation Autonomy: Component with high activation autonomy decide independently when to perform actions instead of depending on external triggers or orchestrators. This self-driven behavior enhances responsiveness and reduces external dependency.</p></li><li><p>Scaling Autonomy: Autonomous components can handle increased loads independently without external bottlenecks limiting their performance. Their scalability primarily depends on their own design and allocated resources.</p></li><li><p>Deployment Autonomy: Teams should be able to update or redeploy their components independently, without requiring synchronized changes in other system areas. This autonomy supports frequent releases and minimizes system-wide disruptions.</p></li><li><p>Solution Autonomy: Solution autonomy allows teams responsible for a component to independently choose technologies, tools, and strategies. This freedom fosters innovation and rapid adaptation to changing business needs.</p></li></ul><p>After discussions with some of you who&#8217;ve sent me feedback, I have added another aspect - you&#8217;ll find it in the original article but I also will summarize it here:</p><h3><strong>Infrastructure Autonomy</strong></h3><p>Component teams with low infrastructure autonomy rely on manual work by other teams to provision infrastructure they need. Conversely, teams with high infrastructure autonomy can independently provision and manage their infrastructure, often supported by platform or infrastructure teams providing self-service capabilities. Teams with high infrastructure autonomy rarely trigger additional manual tasks in other teams, as they utilize provided self-service infrastructure tools:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R9_a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R9_a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png 424w, https://substackcdn.com/image/fetch/$s_!R9_a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png 848w, https://substackcdn.com/image/fetch/$s_!R9_a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png 1272w, https://substackcdn.com/image/fetch/$s_!R9_a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R9_a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png" width="1381" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:1381,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:135576,&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://www.shapingshifts.com/i/158587831?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.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_!R9_a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png 424w, https://substackcdn.com/image/fetch/$s_!R9_a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png 848w, https://substackcdn.com/image/fetch/$s_!R9_a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.png 1272w, https://substackcdn.com/image/fetch/$s_!R9_a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20c4df96-39b1-47bc-9f18-ce56d29970dc_1381x601.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></p><p>As part of my regular architecture reviews with clients, I pay special attention to component autonomy. To facilitate this, I've developed heuristics to assess component autonomy systematically. In this article, I share these heuristics, structured as key questions designed to help you evaluate autonomy across all aspects. Throughout the listing, the component being evaluated will be referred to as "Component A".</p><h3><strong>Functional Autonomy</strong></h3><p><em>When you make changes to Component A, do you typically need to adjust other components to maintain the overall correctness of the system? If so, how many components are affected?<br></em>A high number of affected components indicates low functional autonomy. If you cannot modify Component A without simultaneously adjusting and redeploying other components, it suggests that Component A's functional boundaries are not well-defined. This issue might arise from unclear or overlapping responsibilities or from components bypassing clearly defined interfaces and directly depending on Component A's internal implementation.</p><p><em>Do changes in Component A often cascade into larger system modifications, suggesting a lack of clear boundaries in functionality?<br></em>If changing Component A frequently requires adjustments to multiple other components, this signals unclear functional boundaries and a higher level of architectural coupling. Ideally, modifications should have a limited impact radius, affecting as few additional components as possible.</p><h3><strong>Data Autonomy</strong></h3><p><em>When modifying the data stored by Component A or its associated schema, do you also need to adapt or update other components?<br></em>If the answer is yes, it suggests that Component A relies on shared mutable data, significantly reducing its autonomy. Dependence on shared mutable data typically requires synchronized changes and coordinated deployments across multiple components to prevent system errors. Ideally, components should manage their own data independently, minimizing cross-component dependencies.</p><h3><strong>Runtime Autonomy</strong></h3><p><em>When a related service or dependency becomes (temporarily) unavailable, can Component A continue operating effectively?<br></em>To assess this, first identify all components that Component A communicates with, including data providers, synchronous and asynchronous services, orchestrators, and data sinks. Next, evaluate how Component A behaves when each of these components is unavailable. Can it still function normally and continue processing requests without immediate external input?</p><p>Discuss these scenarios with your team or leverage Chaos Engineering (TODO link <a href="https://en.wikipedia.org/wiki/Chaos_engineering">https://en.wikipedia.org/wiki/Chaos_engineering</a>) techniques to simulate and test component resilience under failure conditions.<br></p><h3><strong>Activation Autonomy</strong></h3><p><em>Does Component A independently decide when to act, or does it rely on external triggers?<br></em>Assess the conditions under which Component A initiates tasks. If other components control or heavily influence when Component A executes its tasks, this indicates lower activation autonomy.</p><p><em>When changes occur in Component A, how many other components require modifications?<br></em>Frequent simultaneous updates to other components alongside Component A suggest lower activation autonomy. This happens because other components have excessive knowledge of, or dependency on, Component A's execution logic, increasing the system&#8217;s coupling.</p><p><em>Do many of your team's tasks depend on changes in components beyond Component A?<br></em>If the internal logic or interfaces of other components frequently trigger changes within Component A, it demonstrates a lack of isolation in activation logic, further reducing activation autonomy.</p><h3><strong>Scaling Autonomy</strong></h3><p><em>Are there other components (or infrastructure) that have the same scaling behavior as Component A?<br></em>If other components share the same scaling pattern as Component A, it indicates they must handle similar throughput levels. This dependency can become problematic if any of these components cannot meet the required throughput, potentially creating bottlenecks and limiting Component A&#8217;s ability to scale independently.</p><p><em>Does Component A perform non-business-related actions (like committing transactions or cleaning up data) solely to maintain consistency?<br></em>These actions suggest there may be cross-component consistency constraints, especially in distributed systems. Such constraints typically introduce additional overhead, requiring components to perform extra work that can impede their independent scalability.</p><h3><strong>Deployment Autonomy</strong></h3><p><em>When deploying Component A, do you have to deploy other components at the same time? Does deploying Component A require stopping, restarting, or redeploying other components?<br></em>Consider the extent to which deploying Component A affects other parts of the system. If deployment of Component A frequently involves modifying or coordinating with other components&#8212;or requires collaboration with other teams&#8212;this indicates lower deployment autonomy.</p><p><em>Does your team have the authority and flexibility to update and release Component A independently, without obtaining approval or coordination from other teams or central entities?<br></em>Frequent and efficient deployments depend heavily on a team's autonomy. Cross-team communication and coordination can significantly slow down deployments and introduce unnecessary overhead.</p><h3><strong>Infrastructure Autonomy</strong></h3><p><em>Does the need for infrastructure changes by Component A induce manual work in other teams?<br></em>If infrastructure changes for Component A routinely depend on manual tasks from other teams (such as platform or infrastructure teams), this indicates low infrastructure autonomy. For example, if Component A requires new data storage, low autonomy would mean another team needs to provision it manually. In contrast, high infrastructure autonomy would allow your team to directly self-serve and quickly integrate pre-configured infrastructure resources, minimizing dependency and delays.</p><h3><strong>Solution Autonomy</strong></h3><p><em>Does the team responsible for Component A have the freedom to adopt technological solutions or make decisions about Component A&#8217;s design and evolution without needing extensive coordination with other teams?<br></em>Two key aspects influence this: First, Component A must be architecturally isolated enough to enable technological independence, allowing the team to freely select programming languages, databases, or frameworks. Second, the organizational culture should empower teams by granting them sufficient freedom to explore, choose, and implement their own solutions, rather than strictly regulating the technologies and processes they use.</p><h3><strong>Summary</strong></h3><p>Below, you&#8217;ll find all aspects of autonomy and their associated review questions:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PQO5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PQO5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png 424w, https://substackcdn.com/image/fetch/$s_!PQO5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png 848w, https://substackcdn.com/image/fetch/$s_!PQO5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png 1272w, https://substackcdn.com/image/fetch/$s_!PQO5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PQO5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png" width="1456" height="2316" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2316,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:937062,&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://www.shapingshifts.com/i/158587831?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.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_!PQO5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png 424w, https://substackcdn.com/image/fetch/$s_!PQO5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png 848w, https://substackcdn.com/image/fetch/$s_!PQO5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.png 1272w, https://substackcdn.com/image/fetch/$s_!PQO5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7490b5a-eadb-4edf-9d70-4bd3dc6ebda7_1600x2545.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></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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[Build Adaptable and Resilient Software Systems by Unlocking Component Autonomy]]></title><description><![CDATA[A practical guide to decoupling, scaling, and self-governance strategies that empower independent components for adaptable, reliable, and evolvable systems.]]></description><link>https://www.shapingshifts.com/p/build-adaptable-and-resilient-software</link><guid isPermaLink="false">https://www.shapingshifts.com/p/build-adaptable-and-resilient-software</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 25 Feb 2025 06:00:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I regularly perform architecture reviews across different companies. Most stakeholders want their systems to be evolvable, adaptable, and reliable over the long term. One particular thing I often observe hindering this goal is a lack of autonomy. Let me explain.</p><p>When a system&#8217;s components become too interdependent, even a small change can have wide-ranging effects. For example, if a modification in one component triggers changes in several others, it signals architectural entanglement. This issue is especially problematic when different teams are responsible for different components, because any change requires extensive communication and coordination across teams, disrupting priorities and backlogs. Such complexity not only increases technical overhead but also adds organizational and communication burdens, ultimately resulting in longer lead times and a higher likelihood of errors.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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>To mitigate these challenges, it is essential to design systems where each component is as autonomous as possible. This lays the groundwork for long-term adaptability, evolvability, and reliability.</p><h3><strong>What is Autonomy?</strong></h3><p>Autonomy comes from the greek words <em>autos </em>(self) and <em>nomos </em>(law). It refers to an entity&#8217;s ability to make its own decisions and govern its actions independently. In other words, when an entity is autonomous, the decisions of others do not directly affect its behavior. For example, if one entity acts and another is <em>forced</em> to respond <em>immediately</em>, then at least one of them is not fully autonomous. (strong emphasis on the words &#8220;forced&#8221; and &#8221;immediately&#8221;. If another entity has chosen to react and can do so eventually and on their own terms, it is still autonomous)</p><p>In software architecture, autonomy means that a system&#8217;s component can operate and evolve independently, reducing the need for frequent (inter-team) coordination.</p><p>Autonomy is not binary; it exists on a spectrum from total dependency to complete independence. Instead of viewing autonomy as something you either have or do not have, individual entities should always strive to become more autonomous. Therefore, if your team is working on a component that ranks low on the scale, you should seek ways to increase its autonomy rather than accepting its dependency.</p><p>Let's consider the following example (shown in the figure below): Component A is called by an orchestrator. Whenever the orchestrator deems it necessary to call Component A, it will decide to do so (1). Once invoked, Component A contacts Component C because it needs C to update its internal state (2). Component A can only report back after confirming that Component C&#8217;s task is complete. In addition, Component A reads data from a data schema that it shares with Component B (3).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ws0s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ws0s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png 424w, https://substackcdn.com/image/fetch/$s_!ws0s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png 848w, https://substackcdn.com/image/fetch/$s_!ws0s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png 1272w, https://substackcdn.com/image/fetch/$s_!ws0s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ws0s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png" width="1357" height="513" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:513,&quot;width&quot;:1357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84075,&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://www.shapingshifts.com/i/157540368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.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_!ws0s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png 424w, https://substackcdn.com/image/fetch/$s_!ws0s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png 848w, https://substackcdn.com/image/fetch/$s_!ws0s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.png 1272w, https://substackcdn.com/image/fetch/$s_!ws0s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ccdec7e-1960-4873-9ff4-b23852155da8_1357x513.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 autonomous is Component A? Not very much. Consider these issues:</p><ul><li><p>Component A does not decide when to be invoked; the orchestrator makes that decision.</p></li><li><p>Component A depends on Component C being available to respond to the orchestrator.</p></li><li><p>Component A can only scale to the degree that Component C can.</p></li><li><p>If Component B changes the shared data schema, Component A&#8217;s code must be adapted and redeployed.</p></li></ul><h3><strong>Aspects of Autonomy</strong></h3><p>It is not only the case that autonomy isn&#8217;t binary, it&#8217;s also multi-dimensional. Rather than being defined by a single attribute, autonomy encompasses multiple aspects that capture its various facets. Let&#8217;s look at each in turn.</p><h4><strong>Functional Autonomy</strong></h4><p>Components must have clear responsibilities and well-defined boundaries that separate them from one another. When these boundaries are fuzzy or unclear, components end up sharing responsibilities, which means that changes in one component often force changes in others.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WWn5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WWn5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png 424w, https://substackcdn.com/image/fetch/$s_!WWn5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png 848w, https://substackcdn.com/image/fetch/$s_!WWn5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png 1272w, https://substackcdn.com/image/fetch/$s_!WWn5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WWn5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png" width="1402" height="958" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:958,&quot;width&quot;:1402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:224744,&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://www.shapingshifts.com/i/157540368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.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_!WWn5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png 424w, https://substackcdn.com/image/fetch/$s_!WWn5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png 848w, https://substackcdn.com/image/fetch/$s_!WWn5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.png 1272w, https://substackcdn.com/image/fetch/$s_!WWn5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1b728be-8068-4c7f-bab8-ea4fe961ebd7_1402x958.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 example on the left shows low functional autonomy. Component B is shared across contexts, meaning that both rely on the same domain model contained within the component. In domain-driven design, this is called a shared kernel. Although shared kernels can be advantageous in some cases, they inherently hinder functional autonomy. This is especially problematic when two different teams are responsible for the two bounded contexts. In such situations, implementing shared kernels requires high communication bandwidth between teams&#8212;a significant drawback if the teams are separated by a large organizational distance (I have written about this in &#8220;<a href="https://www.shapingshifts.com/p/connecting-teams-and-modules-selecting">Connecting Modules Across Teams: Selecting Integration Mechanisms Based on Team Distance</a>&#8221;).</p><p>The example on the right has clear boundaries of responsibility. In this scenario, the shared Component B is replaced by an explicit integration point between the two bounded contexts, resulting in clear boundaries of responsibility.</p><p>Here are some strategies to increase functional autonomy:</p><ul><li><p>Components should expose only what is necessary through explicit interfaces while keeping internal details hidden. Interaction between components should occur solely through these interfaces, with no side channels. This interface might take the form of an API or use an intermediary such as a message queue. If the integration crosses deployment boundaries, I recommend using asynchronous and indirect communication, as I have arguerd in "<a href="https://www.shapingshifts.com/p/network-communication-and-leaky-abstractions">Network Communication And Leaky Abstractions</a>".</p></li><li><p>A component should be as small as necessary to fulfill its purpose. This idea aligns with the Unix philosophy of &#8220;do one thing and do it well&#8221; and is reflected in the <a href="https://en.wikipedia.org/wiki/Single-responsibility_principle">Single Responsibility Principle</a>.</p></li></ul><h4><strong>Data Autonomy</strong></h4><p>Shared data often undermine a component's autonomy&#8212;especially when components rely on a common, mutable data schema. When multiple components depend on a shared schema, any changes to that schema force every dependent component to adapt. To enhance data autonomy, ensure that each component manages its internal state independently, without relying on shared data.</p><p>One important caveat is that shared data does not harm autonomy if it is <strong>immutable</strong>. For example, if several components read from an append-only storage&#8212;where existing data cannot be altered and new data can only be appended&#8212;then data autonomy is maintained. In summary, avoid using shared mutable data or schemas to ensure each component can operate independently.</p><h4><strong>Runtime Autonomy</strong></h4><p>Consider two scenarios involving separately deployed services that communicate over a network (both are depicted in the figure below): In the example on the left, the order service makes a synchronous call to the inventory service before approving an order. This means the order is approved only after the inventory has reserved the products. In this case, the order service needs the inventory service to be available during its operation, resulting in lower runtime autonomy.</p><p>In the example on the right, the order service informs the inventory service about an incoming order asynchronously&#8212;using an event, for example. Once the event is committed to the middleware, the order service continues processing without blocking and waiting for a response. If inventory is insufficient, the inventory service can asynchronously notify the order service, which then decides how to proceed. Here, the order service does not depend on the inventory service&#8217;s availability for the transaction, which significantly increases its runtime autonomy.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U9wx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U9wx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png 424w, https://substackcdn.com/image/fetch/$s_!U9wx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png 848w, https://substackcdn.com/image/fetch/$s_!U9wx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png 1272w, https://substackcdn.com/image/fetch/$s_!U9wx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U9wx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png" width="1307" height="585" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:585,&quot;width&quot;:1307,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136908,&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://www.shapingshifts.com/i/157540368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.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_!U9wx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png 424w, https://substackcdn.com/image/fetch/$s_!U9wx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png 848w, https://substackcdn.com/image/fetch/$s_!U9wx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.png 1272w, https://substackcdn.com/image/fetch/$s_!U9wx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8d0eee9-34db-47d4-95f4-0e45aff84f02_1307x585.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>You can increase runtime autonomy by applying a few strategies:</p><ul><li><p><strong>Deploy Components Independently</strong>: Ensure components run as separate processes. If components share the same process, they inherently lack runtime autonomy.</p></li><li><p>Decouple the runtime behavior of components by employing <strong>asynchronous communication</strong> such as notifications, state transfers, or event sourcing. I have detailed out these approaches in &#8220;<a href="https://www.shapingshifts.com/p/event-driven-communication-and-its">Event-Driven Communication and Its Effects on Team Independence</a>&#8221;.</p></li><li><p><strong>Handle Responses Optimistically:</strong> Avoid waiting for immediate answers from dependent services. Instead, resolve issues optimistically. For example, if the inventory is insufficient, the system might automatically trigger a restock or, alternatively, the order service could notify the user of a potential delay.</p></li></ul><h4><strong>Activation Autonomy</strong></h4><p>High activation autonomy means that a component should determine on its own when to act rather than relying on other components to decide when it is invoked. In other words, <strong>only</strong> the component itself should know when specific actions need to be performed.</p><p>This approach contrasts with orchestration patterns, where an orchestrator is responsible for triggering actions in other components. Contrary, in systems designed with high activation autonomy, each component reacts to environmental cues and decides independently whether to take action.</p><p>Consider an example: suppose you need to build a workflow where bookings over $1,000 must be reported. One component processes the bookings, and a separate component handles reporting.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qitH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qitH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png 424w, https://substackcdn.com/image/fetch/$s_!qitH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png 848w, https://substackcdn.com/image/fetch/$s_!qitH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png 1272w, https://substackcdn.com/image/fetch/$s_!qitH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qitH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png" width="1386" height="551" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:551,&quot;width&quot;:1386,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:160372,&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://www.shapingshifts.com/i/157540368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.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_!qitH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png 424w, https://substackcdn.com/image/fetch/$s_!qitH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png 848w, https://substackcdn.com/image/fetch/$s_!qitH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.png 1272w, https://substackcdn.com/image/fetch/$s_!qitH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5491fe-dee5-45f0-bd4d-4ec57ac9d144_1386x551.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><strong>Low Activation Autonomy (Left Example):</strong></p><p>Here, the reporting component depends on both its internal logic and on an external orchestrator to determine when it should run. As a result, any change in the activation logic requires modifying both the reporting component and the orchestrator.</p><p><strong>High Activation Autonomy (Right Example):</strong></p><p>In the right example, all the knowledge about reporting sits within the reporting component. There is no need for coordination and one singular point of change. The difference is that communication over self-contained facts that are modelled after the domain (events) gives the receiving component the power to decide whether they need to take action. The activation logic is isolated within the component instead of distributed over multiple components, giving it activation autonomy.</p><h4><strong>Scaling Autonomy</strong></h4><p>In &#8220;<a href="https://www.shapingshifts.com/p/beyond-linear-scaling-how-software">Beyond Linear Scaling: How Software Systems Behave Under Load</a>&#8221;, I discussed factors that limit the scalability of components. Two factors are particularly relevant in this context: The first one are bottlenecks or resources shared with other components, which can inhibit the throughput of each individual component. Another is the additional work that a system needs to perform to maintain consistency and coherency. As I wrote in the article:</p><div><hr></div><p><em>In certain systems, adding more load can actually decrease throughput. Let's examine the following system:</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_!qy-9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qy-9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png 424w, https://substackcdn.com/image/fetch/$s_!qy-9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png 848w, https://substackcdn.com/image/fetch/$s_!qy-9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png 1272w, https://substackcdn.com/image/fetch/$s_!qy-9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qy-9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png" width="830" height="452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:452,&quot;width&quot;:830,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77384,&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://www.shapingshifts.com/i/157540368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.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_!qy-9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png 424w, https://substackcdn.com/image/fetch/$s_!qy-9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png 848w, https://substackcdn.com/image/fetch/$s_!qy-9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.png 1272w, https://substackcdn.com/image/fetch/$s_!qy-9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcbd79a4-600c-4f72-b7b9-bad03a26d685_830x452.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><em>The three subtasks each have their own data storage, either persistently through separate data stores or ephemerally via caches. Let's assume the system must maintain consistency to respond correctly. Imagine one subtask updating data in its own storage; the system must then propagate these changes to other storages using a transaction.</em></p><p><em>This has significant consequences. Not only do the subtasks need to stop responding until a consistent state is restored, but the process of re-establishing this state requires additional work before the system can resume service. This overhead negatively affects throughput: as more load is added, the throughput actually decreases&#8212;a phenomenon often observed in real-world throughput metrics.</em></p><div><hr></div><p>If a component depends on other components to scale up its throughput&#8212;whether through resource contention, bottlenecks, or the extra work needed for consistency&#8212;it exhibits low scaling autonomy.</p><p>Here are strategies to increase scaling autonomy:</p><ul><li><p>Lower resource contention by providing sufficient resources and enable components to acquire the resources they need through self-service interfaces (for example, using cloud infrastructure).</p></li><li><p>Minimize coherency overhead by avoiding to enforce strict consistency across components when possible, as doing so introduces extra work and tightly couples components&#8217; scaling behaviors.</p></li></ul><h4><strong>Deployment Autonomy</strong></h4><p>High deployment autonomy is evident when teams can deploy components independently without impacting other deployments. For example, if deploying Component A requires a team to stop, restart, or redeploy Component B, the system exhibits low deployment autonomy. This low autonomy forces teams into frequent, error-prone coordination and hinders their ability to deploy updates on their own schedules.</p><h4><strong>Solution Autonomy</strong></h4><p>One factor often overlooked when focusing solely on technical details is the autonomy of the team responsible for a component. In &#8220;<a href="https://www.shapingshifts.com/publish/posts/detail/155762463?referrer=%2Fpublish%2Fposts">Designing Effective Cross-Team Dynamics For Platform Teams</a>&#8221;, I argued that team autonomy is one of the three pillars for building successful and motivated teams:</p><blockquote><p>Adopting a team-first perspective is essential for resolving these challenges. We need to focus on designing valuable and productive interactions between platform and application teams. A useful framework for this is outlined in Steven Pinker&#8217;s book &#8220;Drive: The Surprising Truth About What Motivates Us&#8221;. Pinker identifies three key factors that motivate individuals and teams:</p><p>Autonomy: The ability to make decisions, reflect on them, and adapt as needed.</p><p>Mastery: The opportunity to perform work and receive feedback to improve skills.</p><p>Purpose: The sense of working towards something achievable and worthwhile.</p><p>[&#8230;]</p><p>Autonomy</p><p>Just as I prefer choosing my own route to a destination, autonomous teams need control over their solution space and the authority to make decisions within it. They must also be able to gather and incorporate both external and internal feedback, as well as prioritize their work within their areas of responsibility.</p></blockquote><p>Solution autonomy describes the socio-technical dynamic in which teams can decide how to build, test and deploy the components they are responsible for. This means to fully empower development teams to build each component using appropriate patterns, technologies, tools, and programming languages&#8212;rather than being constrained by a pre-defined set of rules imposed by external architecture or governance teams.</p><h3><strong>Importance of Aspects</strong></h3><p>Not all aspects of autonomy carry the same weight; development teams must determine which are more or less important in their context. For example, runtime, scaling, and deployment autonomy are essential when prioritizing reliability, while functional, data, and solution autonomy are key to ensuring long-term evolvability.</p><p>It is important to consider all autonomy aspects because autonomous components can make your system more dynamic in the future. Make clear trade-off decisions only if certain aspects play only a minor role in your context (which is rare). For instance, you might decide, &#8220;We trade off invocation autonomy for the significant benefit of monitoring orchestrated workflows.&#8221; Keep in mind that such trade-offs can incur substantial costs in your system&#8217;s evolvability and long-term adaptability across many dimensions. I have written about some of those dimensions in &#8220;<a href="https://www.shapingshifts.com/p/reactive-systems-designing-systems">Reactive Systems: Designing Systems for Multi-Dimensional Change</a>&#8221;.</p><h3><strong>Improved Example</strong></h3><p>In the example at the beginning of the article, I have outlined reasons for low autonomy. Having introduced some vocabulary, we can now map those issues to the autonomy aspects:</p><p>&#8226; Component A does not decide when to be invoked; the orchestrator makes that decision. (<strong>low activation autonomy</strong>).</p><p>&#8226; Component A depends on Component C being available to respond to the orchestrator. (<strong>low runtime autonomy</strong>).</p><p>&#8226; Component A can only scale to the degree that Component C can. (<strong>low scaling autonomy</strong>).</p><p>&#8226; If Component B changes the shared data schema, Component A&#8217;s code must be adapted and redeployed. (<strong>low data and deployment autonomy</strong>).</p><p>To improve the autonomy of both Component A and Component C, I made the following design adjustments:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6Pdl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Pdl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png 424w, https://substackcdn.com/image/fetch/$s_!6Pdl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png 848w, https://substackcdn.com/image/fetch/$s_!6Pdl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png 1272w, https://substackcdn.com/image/fetch/$s_!6Pdl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Pdl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png" width="1339" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:549,&quot;width&quot;:1339,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96669,&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://www.shapingshifts.com/i/157540368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.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_!6Pdl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png 424w, https://substackcdn.com/image/fetch/$s_!6Pdl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png 848w, https://substackcdn.com/image/fetch/$s_!6Pdl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.png 1272w, https://substackcdn.com/image/fetch/$s_!6Pdl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55b1cd90-4e1f-4436-bc4c-651ed78083d4_1339x549.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></p><p>(1) <strong>Increase Activation Autonomy:</strong> Component A now independently decides which system events warrant a reaction.</p><p>(2) <strong>Increase Runtime and Activiation Autonomy:</strong> Instead of waiting synchronously for a response from Component C, Component A now notifies C about the necessary changes and then handles responses asynchronously. This adjustment boosts Component A&#8217;s runtime autonomy and also enhances Component C&#8217;s activation autonomy.</p><p>(3) <strong>Increase Data and Deployment Autonomy:</strong> Components A and B now maintain redundant data storage and separate data schemas. They communicate necessary state transitions through a message queue, which increases both components&#8217; data and deployment autonomy.</p><h3><strong>Conclusion</strong></h3><p>Autonomy is not guaranteed. Autonomy is something you need to <em>buy. </em>And I mean that in the literal sense, because there is a cost. For example, achieving data autonomy might require additional storage for redundant data, and increasing activation autonomy could reduce the convenience of explicit, sequential monitoring. Every design decision involves trade-offs, and your task is to balance these within your context.</p><p>My advice is simple: increase the autonomy of each component as much as possible, and only compromise when absolutely necessary. I have seen too many systems become brittle over time because developers and architects failed to consider autonomy. If you aim for long-term adaptability, evolvability and reliability, ensure to take all aspects of autonomy into account.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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[Network Communication And Leaky Abstractions]]></title><description><![CDATA[Synchronous communication in distributed systems is a leaky abstraction. Discover how asynchronous messaging builds resilient systems that decouple services from unpredictable network failures.]]></description><link>https://www.shapingshifts.com/p/network-communication-and-leaky-abstractions</link><guid isPermaLink="false">https://www.shapingshifts.com/p/network-communication-and-leaky-abstractions</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 18 Feb 2025 06:01:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HLCQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Method and function calls are simple, right? You call a function by its name and pass in parameters, then the function returns - everything happens in a clearly defined order. However, things get more complicated in distributed systems. Imagine Service A calling Service B <em>synchronously </em>and <em>directly</em> over a network:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kfvm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kfvm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png 424w, https://substackcdn.com/image/fetch/$s_!kfvm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png 848w, https://substackcdn.com/image/fetch/$s_!kfvm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png 1272w, https://substackcdn.com/image/fetch/$s_!kfvm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kfvm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png" width="779" height="201" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:201,&quot;width&quot;:779,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33702,&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_!kfvm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png 424w, https://substackcdn.com/image/fetch/$s_!kfvm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png 848w, https://substackcdn.com/image/fetch/$s_!kfvm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png 1272w, https://substackcdn.com/image/fetch/$s_!kfvm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F628d4289-9281-4675-aaa5-d67cea86f3ba_779x201.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Service A sends a request (1) and then waits for Service B&#8217;s response. Service B processes the request (2) and sends back a response (3). Then Service A receives the response and resumes (4). In a local call, the CPU jumps directly to the function&#8217;s memory address. Over a network, though, messages travel over unreliable links. They might be delayed, dropped, or even lost if Service B is down.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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>Synchronous network calls mask network issues by mimicking local procedure calls. This is a leaky abstraction: the network&#8217;s unreliability eventually shows up in your code. If Service B is unavailable or slow, Service A must handle retries, timeouts, or implement circuit breakers. This adds complexity and creates tight runtime coupling between services.</p><p>Instead, <em>asynchronous</em> and <em>indirect</em> communication makes network properties explicit. With asynchronous communication, Service A sends a request and continues processing other tasks, handling the response later through a callback. Indirect communication means that neither the caller nor the receiver is directly connected; they interact through an intermediary, such as a message queue or append-only storage.</p><p>To approach why the networks nature is more explicit in this sort of communication, let&#8217;s look at two examples and list out the kinds of assumptions the calling service makes about the underlying network. This is a proxy for the degree of coupling, since it shows how much the calling service needs to now about the network and the called service.</p><p>The first example is <em>synchronous </em>and<em> direct </em>communication between services. Like in the figure above, let&#8217;s assume that Service A contacts Service B. It has the following assumption about the communication with Service B:</p><ul><li><p>&#8220;I know that Service B exists&#8221;</p></li><li><p>&#8220;I know where Service B is located so I can directly contact it&#8221;</p></li><li><p>&#8220;I will get a response from Service B in time&#8221;</p></li></ul><p>If any of these assumptions fail, Service A must deal with the error. Service B is not available? Service A needs to retry the request. Service B takes a long time to respond? Service A needs to track a timeout. Either way, there is a lot of burden on Service A to handle fallback mechanisms. Network failures leak into the implementation of Service A, increasing its complexity and its coupling to Service B.</p><p>Now, let&#8217;s look at <em>asynchronous </em>and <em>indirect </em>communication, more specifically a request/reply pattern. This discussion similarly applies to other forms of messaging, like publish/subscribe or event mechanisms.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HLCQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HLCQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png 424w, https://substackcdn.com/image/fetch/$s_!HLCQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png 848w, https://substackcdn.com/image/fetch/$s_!HLCQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png 1272w, https://substackcdn.com/image/fetch/$s_!HLCQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HLCQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png" width="1033" height="363" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:363,&quot;width&quot;:1033,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66870,&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_!HLCQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png 424w, https://substackcdn.com/image/fetch/$s_!HLCQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png 848w, https://substackcdn.com/image/fetch/$s_!HLCQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.png 1272w, https://substackcdn.com/image/fetch/$s_!HLCQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8f411bd-c9b5-414d-a12f-8b5fcb94083d_1033x363.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>Here are the assumptions that Service A has about the communication with Service B:</p><ul><li><p>&#8220;I send a message to Message Queue 1 and someone will handle it.&#8221;</p></li><li><p>&#8220;Eventually, I will receive a response on Message Queue 2 which my internal callback will handle.&#8221;</p></li></ul><p>There are much less assumptions which leak failure modes into the implementation of Service A. Since it is already implemented in a way where it handles responses <em>eventually</em>, the unreliability of the network is already baked into the design of the communication.</p><p>Using this form of communication forces you to design for failure. It includes all failure modes of network connections as first-class in the design of the communication protocol. Designing a service that sends requests and handles responses asynchronously means that you are forced to design the service in a way where responses come back at an arbitrary time and the service should be able to handle it. This mitigates potential network failures like increased latency or dropped connections and puts solutions to those failure modes <em>in the design of the communication.</em></p><p>Another interesting example where asynchronous communication shines is that it helps to decouple individual services over the dimension of time.</p><h4><strong>(De-)coupling in Time</strong></h4><p>Think about cooking soup. Some tasks, like cutting onions and heating water, can happen simultaneously, but other steps must occur in a strict order, like adding ingredients only after preparation is complete. Similarly, software systems are often built in a way where certain parts/routines need to be executed before other parts can be executed. We call this <em>temporal coupling.</em> An example I witnessed recently was a data pipeline that stored data in a shared database and another pipeline read out of that shared database. Both pipelines were coupled <em>temporally </em>because one pipeline needed to execute before the other one.</p><p>Similarly, synchronous communication over networks always leads to temporal coupling. When Service A call Service B, it is dependent on the latter&#8217;s timing and availability. If Service B is down or responds slowly, due to the synchronous call&#8217;s blocking nature, Service A has to wait and delay potentially waiting upstream services.</p><p>The goal should be to design distributed systems where individual services can operate independently over time, instead of coupling them by relying on certain execution orders. Using asynchronous communication helps here. As I have mentioned above, designing systems in this way better reflects the reality of potentially unreliable network communication.</p><p>Let&#8217;s look at an example. Say you have an order service which checks an inventory service to check for availability of products before confirming the order to the user. The order service looks like this internally:</p><pre><code>function processOrder(order) {
  // Synchronous call: wait for the response
  const inventoryStatus =   inventoryService.checkAvailability(order.items);
  
  if (inventoryStatus.available) {
    console.log('Inventory available, processing order.');
    // Continue processing the order
  } else {
    console.log('Item out-of-stock, notifying customer.');
    // Handle out-of-stock scenario
  }
}</code></pre><p>With asynchronous communication, we again use an intermediary. Let&#8217;s implement two message queues in this example, one for sending requests and one for responses:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h1IN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h1IN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png 424w, https://substackcdn.com/image/fetch/$s_!h1IN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png 848w, https://substackcdn.com/image/fetch/$s_!h1IN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png 1272w, https://substackcdn.com/image/fetch/$s_!h1IN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h1IN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png" width="1031" height="287" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:287,&quot;width&quot;:1031,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48063,&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_!h1IN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png 424w, https://substackcdn.com/image/fetch/$s_!h1IN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png 848w, https://substackcdn.com/image/fetch/$s_!h1IN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.png 1272w, https://substackcdn.com/image/fetch/$s_!h1IN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d92741d-d3d8-452e-bd2f-cbd015fe7932_1031x287.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 order service uses a callback which is being invoked as soon as a response is sent over the responding message queue:</p><pre><code>function processOrder(order) {
  // Asynchronous call: continue processing without waiting
  inventoryService.checkAvailabilityAsync(order.items, (inventoryStatus) =&gt; {
    if (inventoryStatus.available) {
      console.log('Inventory available, processing order.');
      // Continue processing the order
    } else {
      console.log('Item out-of-stock, notifying customer.');
      // Handle out-of-stock scenario
    }
  });
  
  // Other independent tasks can be performed here without waiting
  console.log('Order received; processing will continue once inventory is confirmed.');
}</code></pre><p>The second example has lower temporal coupling since the order service has no expectations about the availability of the inventory service. All it is concerned about is sending requests to a message queue and receiving responses from another one which invokes its callback.</p><h4><strong>Drawbacks of Asynchronous Communication</strong></h4><p>While this post advocates for asynchronous communication, it&#8217;s important to note that it comes with its own challenges&#8212;such as managing message ordering, debugging flows, and handling eventual consistency.</p><p>I don&#8217;t want to convince you to use asynchronous and indirect communication in every case but to use its strength in making network properties more explicit in the system&#8217;s architecture. One rule of thumb I have had good experience with is to incorporate domain boundaries: using asynchronous, indirect communication when communicating across bounded contexts (usually event-driven communication) but being more open to synchronous, direct communication within bounded contexts. If you want to know more about bounded contexts, check out my post &#8220;<a href="https://www.shapingshifts.com/p/a-case-against-one-model-to-rule">A Case Against 'One Model to Rule Them All&#8217;</a>&#8221;.</p><p>By designing with asynchronous, indirect communication, you build systems that naturally account for network unreliability, reduce tight coupling, and allow services to operate independently&#8212;making your distributed architecture more robust, scalable and adaptable.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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[Designing Effective Cross-Team Dynamics For Platform Teams]]></title><description><![CDATA[Discover how to transform platform teams from bottlenecks into powerful enablers.]]></description><link>https://www.shapingshifts.com/p/designing-effective-cross-team-dynamics</link><guid isPermaLink="false">https://www.shapingshifts.com/p/designing-effective-cross-team-dynamics</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Sun, 26 Jan 2025 14:31:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cpAX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few weeks ago, I drove from Vienna to Salzburg on the highway (known as the "Autobahn" in Austria). It was just before Christmas, I was in a holiday hurry, and my main goal was to arrive in Salzburg as quickly (and safely) as possible. The Autobahn was, therefore, an obvious choice: its multi-lane roads and high-speed limits made it the ideal route for a swift journey. While I could have taken alternative streets (keep in mind that using the Autobahn in Austria requires a toll), the Autobahn best suited my needs. Moreover, if my objectives had been different&#8212;such as exploring the countryside or enjoying scenic drives&#8212;I might have selected entirely different roads.</p><p>Although this example might seem trivial, it illustrates an interesting dynamic also present in software development: certain teams provide infrastructure and operations (the Autobahn) for other teams, who then choose to utilize&#8212;or bypass&#8212;this infrastructure to achieve their specific goals.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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>We typically distinguish between two types of teams. There are teams that produce code that represents the end user&#8217;s domain. In this post, we call these sorts of teams <strong>application teams</strong>. In contrast, there are teams that produce an environment for application teams to operate in, most often by providing the infrastructure needed to execute their code. In a sense, they are the teams building and maintaining the highway, while application teams are responsible for transporting people efficiently. We call the second type of team <strong>platform teams</strong>.</p><h3><strong>When Platform Teams Become a Bottleneck</strong></h3><p>The dynamics between application teams and platform teams are often complex. While in some smaller contexts, application teams build and operate their software solutions without needing other teams to help, they usually develop their software on some platform - be it on a cloud platform, embedded platform or operating system. The responsibility of platform teams is to manage these platforms.</p><p>Platform teams can be internal (within the same company) or external, such as when application teams utilize a public cloud platform. For the remainder of this post, we'll focus on the dynamics between application teams and <em>internal</em> platform teams, though much of the discussion also applies to external ones.</p><p>Platform teams play a pivotal role within organizations by delivering central infrastructure, which can inadvertently position them as potential bottlenecks. To prevent this, platform teams must navigate particular challenges and avoid specific pitfalls.</p><h4>TicketOps</h4><p>Organizations should avoid delays caused by application teams waiting on platform teams. This often happens when platform teams rely excessively on manual processes to deliver infrastructure and services. For example, an application team may need to release a new service version but must first submit a ticket to the platform team to reconfigure the production environment. Waiting for the ticket to be resolved creates significant friction within the organization. This not only leads to finger-pointing and debates over prioritization and misalignment but also slows down the application team's delivery speed.</p><p>This reliance on tickets and manual work for the interaction between application and platform teams is often framed as <em>TicketOps</em>.</p><h4><strong>Governance</strong></h4><p>While it is understandable that platform teams fear application teams adopting a wide variety of tools, frameworks, and programming languages&#8212;which can lead to a disorganized and unmanageable ecosystem&#8212;the primary method used to address this complexity is often governance. Governance typically involves imposing strict rules to limit technological diversity, primarily through safelisting approved tools and technologies.</p><p>However, this approach has two significant drawbacks:</p><p>First, strict enforcement of current technologies can severely hinder the adoption of new tools and methodologies, disregarding the specific needs of individual teams. This rigidity transforms the platform from a value-adding resource into a burden for development teams, ultimately stifling innovation and limiting the organization's ability to adapt to emerging trends.</p><p>Second, teams with unique requirements that do not fit within the governed solutions may find the platform overly restrictive. This can lead them to seek workarounds or wait for platform teams to implement necessary adaptations, which can slow down delivery speed and reduce overall efficiency.</p><h4><strong>Over-Engineering and Thick Platforms</strong></h4><p>When platform teams attempt to implement and support a wide array of technologies, infrastructure, and configuration options, they can quickly become overwhelmed by the sheer number of capabilities integrated into the platform. This not only makes the platform harder to use but also increases the burden on platform teams to maintain the complexity, keep everything up-to-date, and respond to a broad range of change requests from application teams.</p><h3><strong>Addressing Challenges in Team Dynamics</strong></h3><p>The issues discussed are primarily social in nature, presenting themselves as technical symptoms exacerbated by technical inefficiencies. To effectively tackle these problems, the central question should be: What do application and platform teams truly need?</p><p>Adopting a team-first perspective is essential for resolving these challenges. We need to focus on designing valuable and productive interactions between platform and application teams. A useful framework for this is outlined in Steven Pinker&#8217;s book &#8220;<a href="https://www.goodreads.com/book/show/6452796-drive">Drive: The Surprising Truth About What Motivates Us</a>&#8221;. Pinker identifies three key factors that motivate individuals and teams:</p><ul><li><p><strong>Autonomy</strong>: The ability to make decisions, reflect on them, and adapt as needed.</p></li><li><p><strong>Mastery</strong>: The opportunity to perform work and receive feedback to improve skills.</p></li><li><p><strong>Purpose</strong>: The sense of working towards something achievable and worthwhile.</p></li></ul><p>Let&#8217;s explore how we can address each of these areas to enhance team dynamics.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cpAX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cpAX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png 424w, https://substackcdn.com/image/fetch/$s_!cpAX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png 848w, https://substackcdn.com/image/fetch/$s_!cpAX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png 1272w, https://substackcdn.com/image/fetch/$s_!cpAX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cpAX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png" width="1055" height="954" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:954,&quot;width&quot;:1055,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111507,&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_!cpAX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png 424w, https://substackcdn.com/image/fetch/$s_!cpAX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png 848w, https://substackcdn.com/image/fetch/$s_!cpAX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.png 1272w, https://substackcdn.com/image/fetch/$s_!cpAX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0135b784-f40d-47c3-9d3b-0e046d823d9e_1055x954.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><h4><strong>Autonomy</strong></h4><p>Just as I prefer choosing my own route to a destination, autonomous teams need control over their solution space and the authority to make decisions within it. They must also be able to gather and incorporate both external and internal feedback, as well as prioritize their work within their areas of responsibility.</p><p>Often, the dynamics between application and platform teams can impede the autonomy of both, especially when responsibilities are divided between development and operations. For instance, application teams building software and then handing it off to platform teams for operation can undermine the responsibility and autonomy of all involved.</p><p>Let&#8217;s look at two strategies to increase autonomy:</p><h5><strong>Self-Service</strong></h5><p>Self-service interfaces should be the primary mode of interaction between application and platform teams. By leveraging self-service tools, development teams can provision the necessary artifacts and infrastructure provided by the platform team&#8212;ranging from databases and middleware to container infrastructure, documentation, and entire application/service blueprints. Self-service interfaces have two essential properties: first, invoking the self-service interface does not require or cause manual work from the platform team. Second, application teams manage the lifecycle of the provisioned artifacts, including creation, updating, and deletion. The platform team provides blueprints and tools for the application team to make handling those artifacts easier.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CzHy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CzHy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png 424w, https://substackcdn.com/image/fetch/$s_!CzHy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png 848w, https://substackcdn.com/image/fetch/$s_!CzHy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png 1272w, https://substackcdn.com/image/fetch/$s_!CzHy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CzHy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png" width="1175" height="603" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:603,&quot;width&quot;:1175,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119488,&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_!CzHy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png 424w, https://substackcdn.com/image/fetch/$s_!CzHy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png 848w, https://substackcdn.com/image/fetch/$s_!CzHy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.png 1272w, https://substackcdn.com/image/fetch/$s_!CzHy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecdad6d9-028e-417f-a92b-889c79f390f5_1175x603.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></p><p>In contrast to the TicketOps approach, where application teams depend on platform teams to perform tasks and wait for ticket resolution, self-service interfaces clearly delineate responsibilities. Platform teams focus on providing a seamless developer experience, while application teams handle their own infrastructure needs using the provided tools - the self-service interface is then merely a tool they use to make their jobs easier.</p><h5><strong>Team APIs</strong></h5><p>Team APIs are a valuable tool for making interactions between teams more explicit, thus increasing autonomy. As I have written in &#8220;<a href="https://www.shapingshifts.com/p/the-power-of-team-apis-streamlining">The Power of Team APIs: Streamlining Cross-Team Interactions</a>&#8221;:</p><p><em>By formulating a Team API, development teams can publish typical and deliberately designed interaction points for other teams. It contains everything about the team that other teams need to know to contact it and provides context to make interactions more productive. Usually, this means</em></p><ul><li><p><em>describing what the team's responsibility is: what modules or features are they responsible for?</em></p></li><li><p><em>answering whether the team provides value to end-users or development teams (e.g. as a platform or enabling team)</em></p></li><li><p><em>listing what the team provides for other teams. This could be technical concerns like an API or social aspects such as consulting.</em></p></li><li><p><em>stating how to reach the team</em></p></li><li><p><em>describing what the team is currently working on and what other teams it relies on to achieve its goals.</em></p></li></ul><p>(Check out the post for an example of a Team API).</p><p>Platform and application teams can use Team APIs to define their interactions and establish a clear-cut separation of responsibility. Platform teams specifically should mention what self-services they offer and when application teams should contact them, e.g. to communicate improvement ideas for the platform.</p><h4><strong>Mastery</strong></h4><p>Creating exceptional products that teams are proud of and users love is one of the most fulfilling parts of software development. Achieving mastery, both individually and collectively as a team, is crucial for reaching these goals. Here are two approaches to foster mastery within application and platform teams:</p><h5><strong>Lower Cognitive Load</strong></h5><p>Cognitive load refers to the amount of information an individual or team can process at any given time. It exists on an individual but also on a team basis. Each team has a limit of complexity they handle reliably and sustainably. Multiple things increase team cognitive load, for example the complexity coming from programming languages and frameworks (also called intrinsic cognitive load), the complexity of tools a team uses to approach tasks such as continuous deployment or monitoring (also called extraneous cognitive load) and the complexity of mastering the domain (also called germane cognitive load).</p><p>To enhance mastery, teams should minimize intrinsic and extraneous cognitive load to foxcus on germane cognitive load. Teams should be as good as possible in mastering their domain since this is the area where the users of their product derive the most value from. A team that is heads over in details of their technical setup is much less effective than a team that can focus on writing value-adding business code.</p><p>Therefore, both application and platform teams profit from focusing on their domain. For application teams, this is mostly the business domain of the application they are building and for platform teams this is the technical domain of the infrastructure they are maintaining. Further, platform teams can help in lowering the cognitive load of application teams (the extraneous cognitive load specifically).</p><h5><strong>Your Platform Is a Product</strong></h5><p>Platform teams should treat the platform they build as a product, with developers as their customers. Just as those maintaining a highway strive to provide the fastest and safest routes, platform teams should aim to maximize the developer experience.</p><p>Adopting a product mindset involves</p><ul><li><p>gathering requirements for the product: engaging with application teams, observing they issues they are facing and looking for opportunities to lower their cognitive load</p></li></ul><ul><li><p>developing a product ownership: prioritizing tasks and assigning product ownership roles to ensure the platform evolves in line with user needs.</p></li><li><p>gathering and incorporating feedback: Continuously seeking and integrating feedback to improve the platform, as detailed in my post &#8220;<a href="https://www.shapingshifts.com/p/course-correction-implementing-effective">Course Correction: Implementing Effective Feedback</a>&#8221;.</p></li></ul><h4><strong>Purpose</strong></h4><p>Purpose in software development arises from striving towards meaningful goals and recognizing the positive impact on users. Application teams often experience this directly by seeing how their software enhances users' lives. Platform teams, while their users are developers, should also find purpose in making their developers happy and effective. There are two important things that platform teams can keep in mind and use as tools to improve their sense of purpose.</p><h5><strong>Making developers happy</strong></h5><p>Platform teams should monitor developer satisfaction using metrics like the <a href="https://en.wikipedia.org/wiki/Net_promoter_score">Net Promoter Score</a>. This involves regularly surveying developers to gauge their likelihood of recommending the platform to other teams, providing holistic feedback on the platform&#8217;s effectiveness and areas for improvement.</p><h5><strong>Thinnest Viable Platform</strong></h5><p>Based on the term &#8220;minimum viable product&#8221;, platform teams should strive to create the thinnest viable platform that delivers value to users. Instead of building a huge platform up-front and only later recognizing that developers don&#8217;t want to use it, strive to build a platform iteratively and incrementally: start with the smallest, most impactful features that address user needs, build, gather feedback, and refine the platform incrementally. &#8230; rinse and repeat.</p><p>By doing that platform teams will find that they are much more effective in building a platform their users want - with constantly and continuously delivering value along the way.</p><h3><strong>An overview</strong></h3><p>To summarize the strategies and tools discussed:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rOou!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rOou!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png 424w, https://substackcdn.com/image/fetch/$s_!rOou!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png 848w, https://substackcdn.com/image/fetch/$s_!rOou!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png 1272w, https://substackcdn.com/image/fetch/$s_!rOou!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rOou!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png" width="1456" height="554" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:554,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93780,&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_!rOou!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png 424w, https://substackcdn.com/image/fetch/$s_!rOou!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png 848w, https://substackcdn.com/image/fetch/$s_!rOou!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.png 1272w, https://substackcdn.com/image/fetch/$s_!rOou!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58591986-3822-49b7-b7d7-4a3f5f2aa096_2098x798.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><h3><strong>Conclusion</strong></h3><p>Designing effective interfaces between platform and application teams is challenging, but crucial for organizational success. By carefully crafting self-service tools and fostering autonomy, mastery, and purpose, platform teams can transform from potential bottlenecks into powerful enablers. Implementing the strategies outlined in this post will help you move closer to achieving a harmonious and efficient team dynamic, ultimately driving innovation and productivity across your organization.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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><h3><strong>Further Reading</strong></h3><p>If you want to learn more about cognitive load and the dynamics between application and platform teams, I recommend the book &#8220;<a href="https://www.goodreads.com/book/show/44135420-team-topologies">Team Topologies</a>&#8221; (they use the term stream-aligned teams as a more specific term for application teams who are aligned to a value stream).</p><p>I have compiled a few ideas and practices in the realm of platform engineering over at <a href="https://www.embarc.de/architektur-spicker/14-platform-engineering/">my companies website</a> (in German &#127465;&#127466;).</p>]]></content:encoded></item><item><title><![CDATA[The Power of Team APIs: Streamlining Cross-Team Interactions]]></title><description><![CDATA[Software modules communicate with each other.]]></description><link>https://www.shapingshifts.com/p/the-power-of-team-apis-streamlining</link><guid isPermaLink="false">https://www.shapingshifts.com/p/the-power-of-team-apis-streamlining</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 07 Jan 2025 06:01:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OKcO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Software modules communicate with each other. Be it via APIs, event-driven mechanisms, or even shared storage. As software developers, we became aware that explicitly defining and documenting these communication channels is essential for the maintainability and long-term evolvability of the system.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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><p>If the system has a sufficient size, those software modules are likely not maintained by one single team. Usually, multiple teams work together and often separate their areas of responsibility by allocating specific modules to certain teams. The structure of the software system and the communication structure between the development teams mirror each other, as I have elaborated in &#8220;<a href="https://www.shapingshifts.com/p/the-homomorphic-force-when-software">The Homomorphic Force: When Software and Team Structures Reinforce Each Other</a>&#8221;.</p><p>In that article, I also discussed how carefully crafting explicit cross-team communication channels along with technical communication plays a crucial role in aligning teams to the system&#8217;s structure:</p><blockquote><p>If you have decoupled development teams, make sure to decouple the modules themselves as well. Use technical patterns like asynchronous communication, independently deployable services, and decentralized data storage. Use communication patterns to decouple teams. Co-locate teams that need to work tighter together and actively separate teams that don&#8217;t. Make sure that only the communication channels that are necessary due to product dependencies are the ones being actively used. Not all communication is good; what we want is focused communication between specific teams.</p></blockquote><p>However, as we have many tools to describe technical cross-module communication (like OpenAPI or EventCatalog), we barely have any tools to describe social cross-team communication. A few years back, while reading the book <a href="https://www.goodreads.com/book/show/44135420-team-topologies">Team Topologies</a>, I discovered Team APIs - a tool that helps us make those social communication channels more explicit.</p><h3><strong>What is a Team API?</strong></h3><p>By formulating a Team API, development teams can publish typical and deliberately designed interaction points for other teams. It contains everything about the team that other teams need to know to contact it and provides context to make interactions more productive. Usually, this means</p><ul><li><p>describing what the team's responsibility is: what modules or features are they responsible for?</p></li><li><p>answering whether the team provides value to end-users or development teams (e.g. as a platform or enabling team)</p></li><li><p>listing what the team provides for other teams. This could be technical concerns like an API or social aspects such as consulting.</p></li><li><p>stating how to reach the team</p></li><li><p>describing what the team is currently working on and what other teams it relies on to achieve its goals.</p></li></ul><p>The following figure shows an example of a Team API for a hypothetical development team at a music streaming service. It is based on the "<a href="https://github.com/TeamTopologies/Team-API-template">Team API Template</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_!OKcO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OKcO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png 424w, https://substackcdn.com/image/fetch/$s_!OKcO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png 848w, https://substackcdn.com/image/fetch/$s_!OKcO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png 1272w, https://substackcdn.com/image/fetch/$s_!OKcO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OKcO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png" width="1456" height="2091" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2091,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:272164,&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_!OKcO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png 424w, https://substackcdn.com/image/fetch/$s_!OKcO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png 848w, https://substackcdn.com/image/fetch/$s_!OKcO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.png 1272w, https://substackcdn.com/image/fetch/$s_!OKcO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5881d960-87cc-4973-8ca7-f8236739fe9c_1751x2515.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></p><h3><strong>Conclusion</strong></h3><p>Defining technical communication explicitly is crucial. Social communication lacks the same methodological profoundness and toolchain. Team APIs are an effective solution to make team responsibility and cross-team communication more transparent and explicit.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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[Beyond Bottlenecks: Strategies to Reduce Contention in High-Load Systems]]></title><description><![CDATA[Struggling with slowdowns under load? How to tackle contention, reduce bottlenecks, and keep your applications running smoothly.]]></description><link>https://www.shapingshifts.com/p/how-to-improve-throughput-in-high</link><guid isPermaLink="false">https://www.shapingshifts.com/p/how-to-improve-throughput-in-high</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 17 Dec 2024 06:01:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In &#8220;<a href="https://www.shapingshifts.com/p/beyond-linear-scaling-how-software">Beyond Linear Scaling: How Software Systems Behave Under Load</a>&#8221;, I discussed how contention can be a significant obstacle to a system&#8217;s scalability. In that article, I provided an example that illustrates how tasks compete for limited shared resources:</p><blockquote><p>[Shared resources] could be computational (e.g., CPU), network-related (e.g., bandwidth), or infrastructure (e.g., a lock on a common table). If one subtask exhausts the shared resource, the other subtasks slow down significantly or may even need to stop and wait until enough resources become available again.</p><p>[&#8230;] As resources become increasingly saturated, subtasks effectively interfere with each other, and the gain in throughput per additional load unit slows down.</p></blockquote><p>In this article, I want to discuss contention in greater detail and outline several strategies to mitigate its adverse effects. Let&#8217;s begin by examining the problem more closely&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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><h3><strong>What is contention?</strong></h3><p>In general, contention occurs when multiple processes compete for the same constrained resource or architectural bottleneck. The bottleneck effectively sets the system&#8217;s throughput, so overall throughput cannot exceed the bottleneck&#8217;s capacity.</p><p>Bottlenecks may appear in various forms, including resource limitations or architectural congestion points.</p><h4><strong>Resource Bottlenecks</strong></h4><p>When a system (and all its parts) depend on a limited resource pool, contention arises as these resources become depleted. This can be computing power (like CPU), bandwidth on a network, or locks on a common database table. As the load grows, the resource pool shrinks, forcing processes to wait longer and slowing throughput growth. Eventually, resources can be exhausted to the point where no further increase in throughput is possible.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2jxM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2jxM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png 424w, https://substackcdn.com/image/fetch/$s_!2jxM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png 848w, https://substackcdn.com/image/fetch/$s_!2jxM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png 1272w, https://substackcdn.com/image/fetch/$s_!2jxM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2jxM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png" width="1133" height="605" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:605,&quot;width&quot;:1133,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:108569,&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_!2jxM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png 424w, https://substackcdn.com/image/fetch/$s_!2jxM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png 848w, https://substackcdn.com/image/fetch/$s_!2jxM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.png 1272w, https://substackcdn.com/image/fetch/$s_!2jxM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a29a150-f48d-49bb-aa6e-3f6e4384a93c_1133x605.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></p><h4><strong>Congestion points</strong></h4><p>Contention can also occur independently of available resources due to congestion points in the system&#8217;s architecture. If a particular bottleneck caps a system&#8217;s throughput&#8212;for instance, as in the figure below, three units&#8212;then no matter how much extra load you add, the maximum throughput remains three.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ig5V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ig5V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png 424w, https://substackcdn.com/image/fetch/$s_!ig5V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png 848w, https://substackcdn.com/image/fetch/$s_!ig5V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png 1272w, https://substackcdn.com/image/fetch/$s_!ig5V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ig5V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png" width="525" height="461" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:461,&quot;width&quot;:525,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33324,&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_!ig5V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png 424w, https://substackcdn.com/image/fetch/$s_!ig5V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png 848w, https://substackcdn.com/image/fetch/$s_!ig5V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.png 1272w, https://substackcdn.com/image/fetch/$s_!ig5V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba26f594-96ab-433a-bb80-2a45ebed0755_525x461.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></p><p>These congestion points can be services within a process flow or infrastructural elements like message queues. They are common in distributed architectures. Consider multiple services relying on a single downstream service: as concurrency rises, the downstream service becomes overwhelmed, leading to longer response times and overload. This problem is especially severe in systems that rely on synchronous communication since congestion in one component can cascade through the entire system.</p><p>There are two broad strategies to lower contention: reducing demands on the bottleneck or increasing its capacity. Let&#8217;s discuss both in more detail.</p><h3><strong>Reducing Demands</strong></h3><p>Contention arises when bottlenecks face excessive load. One way to address this issue is by lowering those demands. The following sections describe four approaches to accomplish this.</p><h4><strong>Approach #1: Reduce Resource Bottlenecks by Shifting Resource Usage</strong></h4><p>If the bottleneck involves a shared resource, consider shifting the workload to another type of resource. For example, you could alleviate a network bandwidth bottleneck by compressing data before sending it. This reduces network demand but increases CPU load due to the additional overhead of executing a compression algorithm. Following this example is a good idea if network bandwidth is constrained but CPU capacity is available more broadly.</p><h4><strong>Approach #2: Reduce Congestion Points by Replicating State</strong></h4><p>Let&#8217;s examine the following 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_!WaZr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WaZr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png 424w, https://substackcdn.com/image/fetch/$s_!WaZr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png 848w, https://substackcdn.com/image/fetch/$s_!WaZr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png 1272w, https://substackcdn.com/image/fetch/$s_!WaZr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WaZr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png" width="999" height="543" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2473838-0b68-41f3-a545-076d20e8537c_999x543.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:543,&quot;width&quot;:999,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:98208,&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_!WaZr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png 424w, https://substackcdn.com/image/fetch/$s_!WaZr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png 848w, https://substackcdn.com/image/fetch/$s_!WaZr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.png 1272w, https://substackcdn.com/image/fetch/$s_!WaZr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2473838-0b68-41f3-a545-076d20e8537c_999x543.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></p><p>There is substantial communication both between Service 1 and Service 3 and between Service 2 and Service 3. Service 3 holds data that the other two services need. As a result, for every task these services perform, they must query Service 3, making it a congestion point. Once Service 3 becomes overloaded, neither Service 1 nor Service 2 can complete their tasks or fulfill requests.</p><p>An alternative approach is to replicate the data. By having Service 1 and Service 2 each store their own copy of the data previously held solely by Service 3, the system now looks as follows:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ox9j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ox9j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png 424w, https://substackcdn.com/image/fetch/$s_!ox9j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png 848w, https://substackcdn.com/image/fetch/$s_!ox9j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png 1272w, https://substackcdn.com/image/fetch/$s_!ox9j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ox9j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png" width="1037" height="643" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:643,&quot;width&quot;:1037,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106475,&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_!ox9j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png 424w, https://substackcdn.com/image/fetch/$s_!ox9j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png 848w, https://substackcdn.com/image/fetch/$s_!ox9j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.png 1272w, https://substackcdn.com/image/fetch/$s_!ox9j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac59a5a1-ee31-4d54-bfeb-6cc5782b9ad7_1037x643.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></p><p>With this change, Service 1 and Service 2 are less dependent on Service 3. Even if Service 3 fails, both can continue serving requests. Communication between the services is now reduced and focuses primarily on maintaining eventual consistency across the replicated data.</p><h4><strong>Approach #3: Avoid Unnecessary Calls by Using Backoff and Circuit Breakers</strong></h4><p>Repeatedly retrying calls to an already overloaded service only puts more burden on it. If every requesting service immediately retries failed requests, the stressed service may eventually crash.</p><p>One particular strategy to mitigate this issue is retrying with an exponential backoff. Instead of using a fixed retry interval (e.g., every 100 milliseconds), the requesting service gradually increases the waiting period between retries. By doing so, it reduces the incoming load on the already strained service and gives it a chance to recover.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J_b0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J_b0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png 424w, https://substackcdn.com/image/fetch/$s_!J_b0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png 848w, https://substackcdn.com/image/fetch/$s_!J_b0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png 1272w, https://substackcdn.com/image/fetch/$s_!J_b0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J_b0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png" width="1015" height="791" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:791,&quot;width&quot;:1015,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:99328,&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_!J_b0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png 424w, https://substackcdn.com/image/fetch/$s_!J_b0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png 848w, https://substackcdn.com/image/fetch/$s_!J_b0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.png 1272w, https://substackcdn.com/image/fetch/$s_!J_b0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb465c27-e9f6-4a2c-8017-c579b3043e73_1015x791.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></p><p>However, exponential backoff alone is not always sufficient. Consider a scenario with three services: A, B, and C. Service A calls B, and B calls C to fulfill the request. If C becomes unreliable, then B retries with exponential backoff, delaying A&#8217;s requests further. As discussed in the section &#8220;What is contention?&#8221; this is a typical behavior in distributed systems, where failure in one service cascades through large parts of the system.</p><p>Circuit breakers help address this issue by halting communication with unresponsive services. They do this by <a href="https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern">incorporating one of three states</a>:</p><blockquote><p>Closed state</p><p>When everything is normal, the circuit breakers remained closed, and all the request passes through to the services as shown below. If the number of failures increases beyond the threshold, the circuit breaker trips and goes into an open state.</p><p>Open state</p><p>In this state circuit breaker returns an error immediately without even invoking the services. The Circuit breakers move into the half-open state after a timeout period elapses. Usually, it will have a monitoring system where the timeout will be specified.</p><p>Half-open state</p><p>In this state, the circuit breaker allows a limited number of requests from the service to pass through and invoke the operation. If the requests are successful, then the circuit breaker will go to the closed state. However, if the requests continue to fail, then it goes back to Open state.</p></blockquote><p>Examples of circuit breaker implementations are <a href="https://github.com/Netflix/Hystrix">Hystrix</a> and <a href="https://github.com/Netflix/Hystrix">Sentinel</a>.</p><h4><strong>Approach #4: Use Asynchronous Processing</strong></h4><p>Most of the issues described above stem from the synchronous nature of communication. One service invokes another and must wait for its response before continuing its work.</p><p>Asynchronous processing can decouple this runtime behavior, for example, by using message queues to buffer requests before they reach a bottleneck. I once worked on a system that needed to handle numerous 3D-rendering requests in parallel, but we could only render four images at a time due to licensing constraints on the rendering engine. To mitigate congestion, we introduced a message queue in front of the engine. Although users still had to wait for their rendering tasks to complete, we could immediately return a meaningful response as soon as we placed their request in the queue.</p><h3><strong>Increasing Capacity</strong></h3><p>Besides reducing demands on bottlenecks, you can use the second broad strategy mentioned above: increasing the bottleneck&#8217;s throughput.</p><h4><strong>Approach #5: Optimize Throughput By Performance Tuning</strong></h4><p>This might seem obvious, but it&#8217;s still worth emphasizing. Concentrate your performance optimization efforts on known bottlenecks: refine database queries, add read replicas, or improve code efficiency in areas especially prone to congestion. This provides the best return on investment for your performance-tuning initiatives.</p><h4><strong>Approach #6: Improve Elasticity By Autoscaling</strong></h4><p>For addressing bottlenecks, elasticity and efficient resource utilization are crucial. As I wrote in &#8220;<a href="https://www.shapingshifts.com/p/reactive-systems-designing-systems">Reactive Systems: Designing Systems for Multi-Dimensional Change</a>&#8221;, systems are elastic if they</p><blockquote><p>[&#8230;] can scale up or down in small increments, without manual intervention, to support increasing and decreasing load patterns.</p></blockquote><p>The article also provided the following figure to illustrate the idea of elasticity:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cblE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cblE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png 424w, https://substackcdn.com/image/fetch/$s_!cblE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png 848w, https://substackcdn.com/image/fetch/$s_!cblE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png 1272w, https://substackcdn.com/image/fetch/$s_!cblE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cblE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png" width="1456" height="874" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd928281-df00-4773-b103-13453aa837b8_2880x1728.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:874,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:184123,&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_!cblE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png 424w, https://substackcdn.com/image/fetch/$s_!cblE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png 848w, https://substackcdn.com/image/fetch/$s_!cblE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.png 1272w, https://substackcdn.com/image/fetch/$s_!cblE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd928281-df00-4773-b103-13453aa837b8_2880x1728.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></p><p>Leverage autoscaling capabilities offered by platforms like Kubernetes or public cloud providers and ensure sufficient resource availability to handle usage spikes.</p><h4><strong>Approach #7: Improve Elasticity By Splitting Bottlenecks</strong></h4><p>It is not only autoscaling that enables elasticity but also the system&#8217;s architecture. Smaller, more modular, and individually deployable components are easier to scale than large, monolithic deployments with long startup times. I also discussed this in &#8220;<a href="https://www.shapingshifts.com/p/reactive-systems-designing-systems">Reactive Systems: Designing Systems for Multi-Dimensional Change</a>&#8221;:</p><blockquote><p>Applications deployed as a single process (deployment monoliths) are harder to scale horizontally due to longer start times, resource intensity, and reliance on session state.</p><p>Meanwhile, splitting applications helps them become reactive to changes in load. Two things are important here. First, you can split along functionality and arrive at smaller deployables, which then form the entire system by integrating over network communication (e.g., microservices). Second, you can partition the input range among deployables. Narrower responsibilities (e.g., handling customers only with last names beginning with A-C) reduce the load on individual nodes and make smaller-scale increments possible. Combining both strategies leads to the best outcomes in terms of elasticity, i.e., the ability to scale up and down, on demand, and in small increments.</p></blockquote><h3><strong>Conclusion</strong></h3><p>The approaches in this article are only a subset of all strategies to lower the effects of contention. Because resolving one bottleneck often exposes another, it&#8217;s best to iteratively refine your system rather than attempting perfect upfront planning. Identify the most restrictive bottleneck, apply the approaches outlined above, and then move on to the next one. Repeat this process until you&#8217;ve reduced system contention to an acceptable level. In a sufficiently complex environment, you may never eliminate contention entirely&#8212;but you can make it manageable.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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[Beyond Linear Scaling: How Software Systems Behave Under Load]]></title><description><![CDATA[Why adding more resources doesn't always increase throughput and how concurrency, contention, and coherency impact it.]]></description><link>https://www.shapingshifts.com/p/beyond-linear-scaling-how-software</link><guid isPermaLink="false">https://www.shapingshifts.com/p/beyond-linear-scaling-how-software</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 10 Dec 2024 06:01:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I remember giving a presentation on serverless computing a few years ago, where I illustrated the concept of scalability as follows:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iwPt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iwPt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png 424w, https://substackcdn.com/image/fetch/$s_!iwPt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png 848w, https://substackcdn.com/image/fetch/$s_!iwPt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png 1272w, https://substackcdn.com/image/fetch/$s_!iwPt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iwPt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png" width="925" height="744" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:744,&quot;width&quot;:925,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33840,&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_!iwPt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png 424w, https://substackcdn.com/image/fetch/$s_!iwPt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png 848w, https://substackcdn.com/image/fetch/$s_!iwPt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.png 1272w, https://substackcdn.com/image/fetch/$s_!iwPt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0158b51-9aae-41d9-b1c5-d3a56401dff9_925x744.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><figcaption class="image-caption">Figure 1</figcaption></figure></div><p>The figure shows linear scaling, a line growing and shooting infinitely to the top. For each added load unit, you get an equal gain in throughput (e.g., the number of users or data records the system can handle). There are certain (and very specific) situations where scalability works like that; for example, independently parallelizable tasks like text search, where each subtask looks for keywords in separate parts of the entire text. The result is then a matter of combining outputs from the previously executed subtasks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X6EB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X6EB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png 424w, https://substackcdn.com/image/fetch/$s_!X6EB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png 848w, https://substackcdn.com/image/fetch/$s_!X6EB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png 1272w, https://substackcdn.com/image/fetch/$s_!X6EB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X6EB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png" width="1046" height="521" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:521,&quot;width&quot;:1046,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61484,&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_!X6EB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png 424w, https://substackcdn.com/image/fetch/$s_!X6EB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png 848w, https://substackcdn.com/image/fetch/$s_!X6EB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.png 1272w, https://substackcdn.com/image/fetch/$s_!X6EB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F227f20ed-37f9-4306-b081-2f4803b14775_1046x521.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>However, this is different from how scalability works in general. As soon as you look at entire, complex systems instead of individual, parallelizable algorithms, the issue gets more complicated&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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><h3><strong>Concurrency</strong></h3><p>The first issue such a system often encounters is hitting a resource limit &#8212; for example, when subtasks share a resource pool and reach its capacity. Initially, the throughput increases approximately linearly, but as it approaches the resource limit, the gain in throughput gradually diminishes and fades out.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b6BX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b6BX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png 424w, https://substackcdn.com/image/fetch/$s_!b6BX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png 848w, https://substackcdn.com/image/fetch/$s_!b6BX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png 1272w, https://substackcdn.com/image/fetch/$s_!b6BX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b6BX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png" width="1182" height="732" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:732,&quot;width&quot;:1182,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68911,&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_!b6BX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png 424w, https://substackcdn.com/image/fetch/$s_!b6BX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png 848w, https://substackcdn.com/image/fetch/$s_!b6BX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.png 1272w, https://substackcdn.com/image/fetch/$s_!b6BX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33c574a-e39f-422b-82b6-1b43a5a9522e_1182x732.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><figcaption class="image-caption">Figure 3</figcaption></figure></div><p>In these cases, the system&#8217;s throughput is limited by its concurrency and may hit an upper bound once it exhausts the available resource pool.</p><h3><strong>Shared Resources</strong></h3><p>Subsystems competing for resources may also inhibit throughput gain. Let's look at the following 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_!3ztr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3ztr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png 424w, https://substackcdn.com/image/fetch/$s_!3ztr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png 848w, https://substackcdn.com/image/fetch/$s_!3ztr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png 1272w, https://substackcdn.com/image/fetch/$s_!3ztr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3ztr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png" width="1049" height="603" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:603,&quot;width&quot;:1049,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83183,&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_!3ztr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png 424w, https://substackcdn.com/image/fetch/$s_!3ztr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png 848w, https://substackcdn.com/image/fetch/$s_!3ztr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png 1272w, https://substackcdn.com/image/fetch/$s_!3ztr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F589754bf-492e-4e7e-99fe-ac6740ad534d_1049x603.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 4</figcaption></figure></div><p>Although the subtasks can run concurrently, they depend on a shared resource. This shared resource could be computational (e.g., CPU), network-related (e.g., bandwidth), or infrastructure (e.g., a lock on a common table). If one subtask exhausts the shared resource, the other subtasks slow down significantly or may even need to stop and wait until enough resources become available again.</p><p>This slows down scalability and disrupts the linear increase in throughput compared to the example before. As resources become increasingly saturated, subtasks effectively interfere with each other, and the gain in throughput per additional load unit slows down.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9ek1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9ek1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png 424w, https://substackcdn.com/image/fetch/$s_!9ek1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png 848w, https://substackcdn.com/image/fetch/$s_!9ek1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png 1272w, https://substackcdn.com/image/fetch/$s_!9ek1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9ek1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png" width="1199" height="748" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:748,&quot;width&quot;:1199,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:92411,&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_!9ek1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png 424w, https://substackcdn.com/image/fetch/$s_!9ek1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png 848w, https://substackcdn.com/image/fetch/$s_!9ek1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png 1272w, https://substackcdn.com/image/fetch/$s_!9ek1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34fd2f77-74c8-4bac-bf2e-9615d2b47e95_1199x748.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 5</figcaption></figure></div><p>In this scenario, the system's throughput is limited by its subparts contention over shared resources. As you can see, the gain of throughput per additional load unit slows considerably.</p><h3><strong>Maintaining Consistency</strong></h3><p>In certain systems, adding more load can actually decrease throughput. Let's examine the following 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_!fYhy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fYhy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png 424w, https://substackcdn.com/image/fetch/$s_!fYhy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png 848w, https://substackcdn.com/image/fetch/$s_!fYhy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png 1272w, https://substackcdn.com/image/fetch/$s_!fYhy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fYhy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png" width="830" height="452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:452,&quot;width&quot;:830,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77384,&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_!fYhy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png 424w, https://substackcdn.com/image/fetch/$s_!fYhy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png 848w, https://substackcdn.com/image/fetch/$s_!fYhy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png 1272w, https://substackcdn.com/image/fetch/$s_!fYhy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564981bd-34e6-45f0-beb6-0e81494b9348_830x452.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 6</figcaption></figure></div><p>The three subtasks each have their own data storage, either persistently through separate data stores or ephemerally via caches. Let's assume the system must maintain consistency to respond correctly. Imagine one subtask updating data in its own storage; the system must then propagate these changes to other storages using a transaction.</p><p>This has significant consequences. Not only do the subtasks need to stop responding until a consistent state is restored, but the process of re-establishing this state requires additional work before the system can resume service. This overhead negatively affects throughput: as more load is added, the throughput actually decreases&#8212;a phenomenon often observed in real-world throughput metrics.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_DY5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_DY5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png 424w, https://substackcdn.com/image/fetch/$s_!_DY5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png 848w, https://substackcdn.com/image/fetch/$s_!_DY5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png 1272w, https://substackcdn.com/image/fetch/$s_!_DY5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_DY5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png" width="1180" height="763" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/debf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:763,&quot;width&quot;:1180,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113093,&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_!_DY5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png 424w, https://substackcdn.com/image/fetch/$s_!_DY5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png 848w, https://substackcdn.com/image/fetch/$s_!_DY5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png 1272w, https://substackcdn.com/image/fetch/$s_!_DY5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdebf45b4-4350-4535-a3e8-0e4ec36920d6_1180x763.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 7</figcaption></figure></div><p>Thus, the throughput of the system is limited by the amount of coherency it needs to maintain.</p><h3><strong>The Universal Scalability Law</strong></h3><p>The dynamics I laid out above are described in a model called the <strong>Universal Scalability Law</strong>, formulated by researcher Neil Gunther back in 1993:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VOL5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VOL5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png 424w, https://substackcdn.com/image/fetch/$s_!VOL5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png 848w, https://substackcdn.com/image/fetch/$s_!VOL5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png 1272w, https://substackcdn.com/image/fetch/$s_!VOL5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VOL5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png" width="626" height="160" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:160,&quot;width&quot;:626,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23041,&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_!VOL5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png 424w, https://substackcdn.com/image/fetch/$s_!VOL5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png 848w, https://substackcdn.com/image/fetch/$s_!VOL5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png 1272w, https://substackcdn.com/image/fetch/$s_!VOL5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d15892e-5645-4074-b9fb-8401beb380a5_626x160.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Figure 8</figcaption></figure></div><p>C(N) represents the relative throughput given a load of N. It is relative in the sense that X(N) defines the absolute throughput, and C(N) = X(N) / X(1).</p><p>Gunther refers to the scalability effects from above as "The Three Cs":</p><ul><li><p><strong>Concurrency</strong>-limited scalability is proportionally linear because &#945; = 0 and &#946; = 0  (see Figure 1). You should expect a scaling limit, as shown in Figure 3, but the equation above does not explicitly contain one. (<em>Note: </em>To illustrate effects such as reaching a resource limit more intuitively, the illustrations above use the absolute throughput (X(N)) on their vertical axis instead of the relative throughput (C(N)) discussed in this section. Gunther also provides a generalized form of the equation for X(N).)</p></li><li><p><strong>Contention</strong>-limited scalability is the effect of slowing down throughput gains, as shown in Figure 5. It occurs when &#945; &gt; 0 and &#946; still equals 0.</p></li><li><p><strong>Coherency</strong>-limited scalability is the negative throughput gain due to extra work to keep the system consistent, as shown in Figure 7. It is the case when &#945; and &#946; are both greater than 0.</p></li></ul><h3><strong>How to Use the Universal Scalability Law</strong></h3><p>Suppose you have made a few measurements by subjecting the system under a particular load and measuring its throughput. You can use the equation above to extrapolate further data points. This helps you assess load scenarios that you have not measured yet or are not able to measure. Gunther states that you need at least around six data points to do this.</p><p>You could also take measurements, fit a curve from the above equation, and estimate values for contention (&#945;) and coherency (&#946;). These estimates, alongside the system's throughput, could serve as holistic fitness functions evaluating the scalability properties of your system. In "<a href="https://www.shapingshifts.com/p/architectural-fitness-functions-building">Architectural Fitness Functions: Building Effective Feedback Mechanisms for Quality Attributes</a>", I have written about holistic fitness functions:</p><blockquote><p>We need effective and (if possible) automated [feedback] mechanisms, especially for quality attributes. The book "Building Evolutionary Architectures: Automated Software Governance" introduced a term for feedback mechanisms on quality attributes borrowed from evolutionary algorithms: (architectural) fitness functions.</p><p>In short, an (architectural) fitness function evaluates the system with regard to a quality attribute. You can distinguish fitness functions by the scope of their evaluation:</p><p>[&#8230;]</p><p>Fitness functions can also be holistic. They test the entire system or large parts of it and assess specific quality attributes. For example, they might measure response times or observe the system after being put under load. Holistic fitness functions are usually more complex and expensive to build.</p></blockquote><h3><strong>Conclusion</strong></h3><p>The Universal Scalability Law not only provides deeper intuitions into how scalability works but also aids in analyzing a system&#8217;s behavior under load. It serves as both a mental model and a practical tool for evaluating a system&#8217;s scalability. You can use the insights generated by the model to discover and prioritize improvements to reduce contention and coherency overhead as needed.</p><h3><strong>Further Reading and References</strong></h3><p>If you want to understand the Universal Scalability Law in more detail and discover further usage scenarios and tools, I recommend <a href="http://www.perfdynamics.com/Manifesto/USLscalability.html">this article</a> by Neil Gunther.</p><p>For a more elaborated discussion on scalability models and how to obtain the graphs from above, see &#8220;<a href="https://arxiv.org/pdf/0809.2541">Getting in the Zone for Successful Scalability</a>&#8221;.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! I publish a new article every Tuesday. Subscribe for free to receive new ones directly to your inbox.</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[Reactive Systems: Designing Systems for Multi-Dimensional Change]]></title><description><![CDATA[How to design socio-technical systems that adapt to changes in multiple dimensions, like functionality or technology.]]></description><link>https://www.shapingshifts.com/p/reactive-systems-designing-systems</link><guid isPermaLink="false">https://www.shapingshifts.com/p/reactive-systems-designing-systems</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 03 Dec 2024 06:01:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2mcd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I follow the literature and discussions about reactive systems and appreciate what's happening in this area. Building distributed, data-intensive systems is very complex, and publications like the <a href="https://www.reactivemanifesto.org/">Reactive Manifesto</a> and the <a href="https://www.reactiveprinciples.org/">Reactive Principles</a> provide fantastic resources to help you manage this complexity. However, I think most discussions in the reactive systems community focus on reliability and scalability, i.e., building systems that are reactive to changes in load or infrastructure failure. This is crucial to building reactive systems, but I believe what's missing in the conversation is the inclusion of a broader set of change drivers.</p><p>This article aims to define an reactive system as a socio-technical system (involving both the technical system as well as the individuals and teams maintaining it) that is able to sense changes from multiple dimensions and transform accordingly, either immediately or over time. It is likely that not all dimensions are relevant for every system, so it is the responsibility of developers and architects to identify the most important ones and design the system accordingly.</p><p>In this article, I will discuss several dimensions that I have been brainstorming over the last few days. I will also lay out broadly what properties a system should have to be adaptive to each dimension.</p><h3><strong>Functionality</strong></h3><p>Functionality is the dimension where change occurs most frequently. That&#8217;s because the main purpose of software systems is to deliver value to users by providing functionality. Demands on functionality change often. New usage ideas and things like regulations typically drive these changes. Additionally, users, often subtly, start using the software differently due to changes in the context in which it is embedded.</p><p>Developers should be able to implement changes to functionality without much ceremony. Once central roles, groups, or committees need to acknowledge work, break it down to teams, and coordinate implementation across many parts of the system, the system loses certain reactive properties. Instead of a single cell in the system needing to react to a particular change, adaptions lead to a shock across the entire system. This leads to complex agreements and time dependencies. Teams then often must build solutions together and deploy all changes simultaneously.</p><p>Use Domain-driven Design, especially bounded contexts, to decouple modules. This will assign each module a clear boundary of functionality. In addition, as I have written in &#8220;<a href="https://www.shapingshifts.com/p/a-case-against-one-model-to-rule">A Case Against 'One Model to Rule Them All&#8217;</a>&#8221;, you should consider the responsibilities of development teams as well:</p><blockquote><p>One very important thing is that a bounded context must be small enough to be clearly assignable to a development team. Don't spread the responsibility of bounded contexts over multiple teams; this only leads to unclear responsibility and makes it harder to establish a ubiquitous language within the bounded context because more people are involved. If you have a bounded context too large for a single team, consider splitting it.</p></blockquote><p>Check out this post for more information on bounded contexts. Extending that idea to include the autonomy of teams, <a href="https://www.goodreads.com/book/show/44135420-team-topologies">Team Topologies</a> introduces the concept of stream-aligned teams:</p><blockquote><p>[&#8230;] the team is empowered to build and deliver customer or user value as quickly, safely, and independently as possible, without requiring hand-offs to other teams to perform parts of the work.</p></blockquote><p>As you&#8217;ll discover in the rest of the post, I believe team autonomy serves as one of the main pillars of managing all dimensions of change.</p><h4><strong>Reactive Property</strong></h4><p>A system that is reactive in this dimension allows teams to implement most functionality as independently as possible and with little coordination. If coordination is needed, it is explicit and takes place over well-defined social and technical interfaces.</p><h3><strong>Usage and Load</strong></h3><p>Load patterns are inherently difficult to predict. Imagine your task is to predict how much hardware you need to support a given workload. You are almost guaranteed to guess too high or too low and end up over- or under-provisioning hardware. Some solutions, especially in cloud computing, counteract this problem by providing increasingly smaller scale-units, with newer technologies that can scale individual functions (Function as a Service). In combination with self-service APIs, these infrastructures can be spun up and torn down at the touch of a button. This enables autoscaling functionality, which scales the infrastructure based on the demand - for example, the current load the system is experiencing.</p><p>Besides infrastructure, you need to consider other aspects as well to support <em>increasing</em> and <em>decreasing</em> load patterns. Applications deployed as a single process (deployment monoliths) are harder to scale horizontally due to longer start times, resource intensity, and reliance on session state.</p><p>Meanwhile, splitting applications helps them become reactive to changes in load. Two things are important here. First, you can split along functionality and arrive at smaller deployables, which then form the entire system by integrating over network communication (e.g., microservices). Second, you can partition the input range among deployables. Narrower responsibilities (e.g., handling customers only with last names beginning with A-C) reduce the load on individual nodes and make smaller-scale increments possible. Combining both strategies leads to the best outcomes in terms of elasticity, i.e., the ability to scale up and down, on demand, and in small increments.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2mcd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2mcd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png 424w, https://substackcdn.com/image/fetch/$s_!2mcd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png 848w, https://substackcdn.com/image/fetch/$s_!2mcd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png 1272w, https://substackcdn.com/image/fetch/$s_!2mcd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2mcd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png" width="1456" height="874" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:874,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:184123,&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_!2mcd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png 424w, https://substackcdn.com/image/fetch/$s_!2mcd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png 848w, https://substackcdn.com/image/fetch/$s_!2mcd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.png 1272w, https://substackcdn.com/image/fetch/$s_!2mcd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac4feebc-7509-41e5-8d57-73e633b16d45_2880x1728.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><h4><strong>Reactive Property</strong></h4><p>A system that is reactive in this dimension can scale up or down in small increments, without manual intervention, to support increasing and decreasing load patterns.</p><h3><strong>Technological Foundation</strong></h3><p>Innovation in cross-cutting technical foundations includes not only frameworks, programming languages, or libraries but also patterns, cloud services, and hardware specifications. There is something new or different seemingly every day. How do you cope with this, especially in large applications?</p><p>Smaller deployables help here since they are more reactive to changes in their technological foundation. Teams maintaining individual services can experiment with and adopt new concepts without necessarily affecting the entire application. While a change in programming language or underlying frameworks probably requires rework in larger parts of monolithic applications, individual services communicating over a network can completely differ in their implementation or technology. This means experimenting with technological innovations in a single, isolated service is much easier and less risky.</p><h4><strong>Reactive Property</strong></h4><p>A system that is reactive in this dimension can absorb technological innovations by experimenting with them within a subset of the system and then, if the innovations prove beneficial, gradually adopt them across the entire system.</p><h3><strong>Methodology</strong></h3><p>Similar to technological foundations, changes to methodology can be more easily adopted by autonomous cells within the system rather than by the entire system at the same time. In this context, these autonomous cells are teams.</p><p>Innovation in methodology is related to ways of working and communication. This includes adopting team processes (like switching from Scrum to Kanban) or introducing new ways of working, such as conducting regular internal team reviews. Autonomous teams can decide to try out methodologies and adapt them if they prove successful.</p><p>Teams know best what works in their day-to-day communication and collaboration, so it is crucial that they be allowed to decide autonomously how to facilitate that. Organizations should not prevent variation in methodology but support cross-team communication so that teams can share their experiences and inspire ideas among other teams.</p><h4><strong>Reactive Property</strong></h4><p>A system that is reactive in this dimension allows multiple development teams to use different methodologies. This includes the team's internal workflows as well as communication principles and patterns used when interacting with other teams.</p><h3><strong>Conclusion</strong></h3><p>This list of change dimensions is not complete. There are nuances to the dimensions mentioned above, as well as completely different dimensions that I did not mention but which may play a role, often only within specific contexts. What&#8217;s important is that you are aware of change dimensions in your particular context and design a system that is reactive to those.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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><h3>Further Reading</h3><p>If you want to learn more about microservices (as mentioned in the section &#8221;Functionality&#8221;), I recommend <a href="https://www.goodreads.com/book/show/58672723">Building Microservices</a> by Sam Newman.</p>]]></content:encoded></item><item><title><![CDATA[Beyond the Numbers: When Measures Become Misguided Targets]]></title><description><![CDATA[Discover how misused metrics can lead to unintended consequences in software development, as explained by Goodhart's Law, and how to avoid these pitfalls.]]></description><link>https://www.shapingshifts.com/p/beyond-the-numbers-when-measures</link><guid isPermaLink="false">https://www.shapingshifts.com/p/beyond-the-numbers-when-measures</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 26 Nov 2024 06:00:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ALu2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2016, Wells Fargo was the 3rd largest bank in the United States by assets. However, that same year, regulators subjected the bank to massive scrutiny due to widespread fraud, resulting in fines totaling $185 million. What happened?</p><p>About 15-20 years before the fraud's 2016 revelation, the bank recognized significant growth potential in cross-selling products. Cross-selling is a method in which companies focus on existing clients and offer incentives for purchasing additional products instead of seeking new customers. In banking, this means, e.g., to convince checking account clients to add savings accounts or mortgages.</p><p>Wells Fargo began tracking its success in cross-selling by measuring the average number of products held by customers. While cross-selling itself is not fraudulent, Wells Fargo executives were so eager to maximize revenues that they pressured sales employees to boost this metric (the number of banking products customers held). To meet this increasingly unattainable sales target, employees began opening accounts using customers' data without consent. <a href="https://www.abi.org/abi-journal/rules-amendments-effective-in-december-wells-fargo-under-fire-for-sales-practices">Research</a> by the American Bankruptcy Institute Journal revealed that employees "opened as many as 1.5 million checking and savings accounts, and more than 500,000 credit cards, without customers' authorization.&#8221;</p><p>The focus on a specific metric, combined with immense pressure to reach targets within the same metric, led to unintended behavior. Wells Fargo's story is not a singular occurrence. Similar examples include urban legends such as the <a href="https://skeptics.stackexchange.com/questions/22375/did-a-soviet-nail-factory-produce-useless-nails-to-improve-metrics">Soviet nail factory</a>, where factories met production quotas by making either tiny or massive nails that were useless, depending on whether they were measured by quantity or weight. Another urban legend is <a href="https://joshlinkner.com/the-cobra-effect/">India's "cobra effect,"</a> where a bounty on cobras led people to breed them for profit, ultimately increasing the cobra population.</p><p>In 1975, the statistician Charles Goodhart described this effect in an <a href="https://www.econbiz.de/Record/problems-of-monetary-management-the-u-k-experience-goodhart-charles/10002525062">article</a>. His idea was later coined as Goodhart's Law and is often paraphrased as:</p><blockquote><p>When a measure becomes a target, it ceases to be a good measure.</p></blockquote><p>Measuring the number of average banking products per customer is not wrong in itself. In software development, we do this all the time. We track technical aspects like CPU load, network latency, and lines of code as well as functional aspects like daily active users, purchases, and registrations. There's nothing wrong with gathering data and using it to make informed decisions, right?</p><p>Goodhart's Law targets the intention with which metrics are used. Measuring is beneficial, but using metrics as targets and goals can be problematic. Let's dive deeper into this dynamic.</p><h3><strong>Metrics in Software Development</strong></h3><p>Software development is product development. Every software team builds a software product that others use to derive value. It follows that the quality of this product matters since users prefer products of higher quality. In software, this usually concerns things users recognize, like performance, reliability, and usability. It also includes things developers observe, like maintainability, extensibility, and operability.</p><p>These aspects are often subjective and difficult to quantify. Think of a product you like using, such as your phone or bike. Why do you like it? What you will likely come up with is a gut feeling rather than hard, data-based evidence. However, we like to use metrics to make quality aspects measurable and to implement a baseline that we can improve on. In "<a href="https://www.shapingshifts.com/p/architectural-fitness-functions-building">Architectural Fitness Functions: Building Effective Feedback Mechanisms for Quality Attributes</a>", I wrote:</p><blockquote><p>You can gather feedback on multiple aspects. One of the most crucial are important quality attributes, like performance or reliability: Do we need to build a software service that is both highly scalable and highly available? Is high performance crucial for our product? We need to assess whether the system we build holds up to those aspects.</p><p>We need effective and (if possible) automated mechanisms, especially for quality attributes. The book "Building Evolutionary Architectures: Automated Software Governance" introduced a term for feedback mechanisms on quality attributes borrowed from evolutionary algorithms: (architectural) fitness functions.</p></blockquote><p>In short, an (architectural) fitness function evaluates the system with regard to a quality attribute.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k-4v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k-4v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png 424w, https://substackcdn.com/image/fetch/$s_!k-4v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png 848w, https://substackcdn.com/image/fetch/$s_!k-4v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png 1272w, https://substackcdn.com/image/fetch/$s_!k-4v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k-4v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png" width="1456" height="291" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:291,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:187475,&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_!k-4v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png 424w, https://substackcdn.com/image/fetch/$s_!k-4v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png 848w, https://substackcdn.com/image/fetch/$s_!k-4v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png 1272w, https://substackcdn.com/image/fetch/$s_!k-4v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75036c6f-a331-48e4-92d7-8c98036ede23_2880x576.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><p>These fitness functions can act as metrics to circle back evaluative or corrective information (i.e., feedback) to the development team, helping to detect areas for improvement.</p><p>It is precisely in this usage of feedback as corrective information where Goodhart's Law becomes relevant. As soon as you use metrics as a framework for evaluation and decision-making, issues can start to arise. Focusing on a few metrics tends to narrow your view of the system. People start asking, "Why is the metric down?" instead of reasoning about the actual quality of the entire system. We use metrics because the aspects we care about, such as subjective quality, are often fuzzy and not directly measurable. While we aim to achieve something intangible, we rely on metrics as proxies for that goal. When we conflate the two, we risk prioritizing actions that improve the metric at the expense of the actual objective. Metrics are not the goal itself.</p><p>Take test coverage, for example. It measures the proportion of code statements exercised by the unit tests in a test suite. This is a proxy metric because the goal we want to achieve is software that functions correctly and test coverage that helps approximate the correct functionality of the software. However, taking it as a goal can be problematic. Incentivizing teams and individuals to hit 90% test coverage can encourage writing "easy" tests that cover a lot of code, especially under time pressure. Think of testing getters and setters. Other examples of proxy metrics are measuring cyclomatic complexity or the load placed on a particular service.</p><h3><strong>Holistic Metrics</strong></h3><p>You can classify fitness functions on a scale from atomic to holistic. I provided an overview of this characterization in "<a href="https://www.shapingshifts.com/p/architectural-fitness-functions-building">Architectural Fitness Functions: Building Effective Feedback Mechanisms for Quality Attributes</a>":</p><blockquote><p><strong>Atomic</strong> fitness functions evaluate a part of the system on a specific quality attribute, like measuring the length of methods within classes or monitoring the status of nodes within a system. Those fitness functions are easier to build, but they only give you a narrow view of the system's quality.</p><p>Fitness functions can also be <strong>holistic</strong>. They test the entire system or large parts of it and assess specific quality attributes. For example, they might measure response times or observe the system after being put under load. Holistic fitness functions are usually more complex and expensive to build.</p></blockquote><p>A rule of thumb: The more the fitness function (or metrics in general) leans towards the atomic side of the scale, the more it is prone to Goodhart's Law. To discuss this effect in detail, we must first discuss the difference between outputs and outcomes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ALu2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ALu2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png 424w, https://substackcdn.com/image/fetch/$s_!ALu2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png 848w, https://substackcdn.com/image/fetch/$s_!ALu2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png 1272w, https://substackcdn.com/image/fetch/$s_!ALu2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ALu2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png" width="1456" height="1001" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1001,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:350465,&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_!ALu2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png 424w, https://substackcdn.com/image/fetch/$s_!ALu2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png 848w, https://substackcdn.com/image/fetch/$s_!ALu2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.png 1272w, https://substackcdn.com/image/fetch/$s_!ALu2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F973a1101-5413-48dd-a2d9-cfc240b51dee_2880x1980.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>Outputs are the deliverables of our software project - specifically, its code and executables. Outcomes are the effects these deliverables create in the world, like users interacting with the system or developers interacting with the code. The more you focus on measuring outputs instead of outcomes, the more you are building fitness functions on the atomic side. Meanwhile, focusing on measuring outcomes leads to producing holistic fitness functions since you are more likely to measure <strong>the actual effect of the system acting in its context.</strong></p><p>Measurements on outcomes do have issues as well. Not only are they more challenging to obtain, but they are also more prone to bias and distortion since not all aspects that affect the measurement are the ones you intend to measure. Take a holistic, outcome-focused measurement like the number of daily active users. It's a metric that is less prone to Goodhart's Law because it is harder to game. However, if daily active users go down, what is the root cause? Is the system's performance or usability degrading? Do newer features not prove valuable for users? Or is it because alternative, competing products outperform ours? Figuring this out is complex, and the metric alone can't give us an answer, only an indication.</p><h3><strong>Gaming Is a Systemic Symptom, Not the Fault of Individuals</strong></h3><p>Above, I often phrased actions as &#8220;gaming the system.&#8221; I want to clarify that I do not believe metric gaming is the fault of teams or individuals. &#8220;Gaming&#8221; is a response to a flawed system of measurements and metrics. If leaders put pressure on developers to achieve a certain percentage of test coverage, they should not be surprised if the quality and purpose of some automated tests decline. Blame the flawed metric and incentive, not the individuals.</p><h3><strong>Conclusion</strong></h3><p>When building metrics and fitness functions, it is important to consider Goodhart&#8217;s Law. Avoid using atomic feedback mechanisms as targets; instead, focus on improving holistic measurements. Use atomic mechanisms as useful indicators to identify where to dig deeper after observing degradation in holistic metrics.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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><h3><strong>Further Reading</strong></h3><p>If you want to read more about the Wells Fargo cross-selling scandal, check out the article on <a href="https://en.wikipedia.org/wiki/Wells_Fargo_cross-selling_scandal">Wikipedia</a>.</p>]]></content:encoded></item><item><title><![CDATA[Architectural Decisions and Incremental Product Development]]></title><description><![CDATA[Discover strategies to avoid unmaintainable, fragile systems by making strategic architectural decisions in agile development.]]></description><link>https://www.shapingshifts.com/p/architectural-decisions-and-incremental</link><guid isPermaLink="false">https://www.shapingshifts.com/p/architectural-decisions-and-incremental</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 19 Nov 2024 06:01:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DFtP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Agile development teams continuously produce small product increments. Each increment delivers additional value to users, often associated with new or improved functional capabilities (features).</p><p>That approach leads to local optimizations. You build and release features over a longer period of time, always focusing on the next increment. After a while, you might find that your system grew and became unmaintainable, fragile, and unreliable. To some degree, we need strategic decisions, principles, and rules to keep this in check. However, too much of this can result in over-engineering and rigidity.</p><p>Let&#8217;s discuss how to strike a balance between short-sightedness and over-engineering.</p><h3><strong>Product Increments and Quality Attributes</strong></h3><p>We can&#8217;t reason about a successful software product by only focusing on functionality and features. Each system must uphold certain properties like reliability, performance, or security. We call those properties quality attributes. You can only fulfill quality attributes by following foundational concepts or principles, often cutting across many parts of your system. Need to support millions of users simultaneously? You could rely on established and scalable infrastructure from a public cloud vendor. Need to provide calculation results within a few milliseconds? Maybe you front-load expensive calculations by caching intermediate results across all calculation modules. Need to make sure that specific functionality is easily modifiable by developers? Your team could decide to design a bounded context around the functionality and extract it into its module.</p><p>When you develop a particular product increment, you plan on delivering value to your users. So you need to deal with some quality attributes immediately, while others won&#8217;t play a role in the upcoming increment. For example, if you plan to deliver new calculation modules, you may want to design a caching solution to reach your performance goals. But, if your product does not yet need to support millions of users, you could delay decisions about this quality attribute.</p><h3><strong>Product Increments and Strategic Decisions</strong></h3><p>Your first consideration should always be: &#8220;What do we need to consider in the upcoming increments to fulfill the quality attributes we aim for?&#8221; If this is the first iteration where you need one service to talk to another, you must at least decide which communication mechanism you want to use.</p><p>You could delay other considerations, e.g., how to communicate with that third-party API if the corresponding user story is four iterations down the road. You only have to make sure that your current architecture does not impede that implementation when it comes up. That's where having an architectural vision (a rough idea of the target architecture you are currently aiming for) helps reduce risks and mitigate issues that might come up down the road.</p><p>After identifying a highly relevant decision for your next product increment, you want to identify potential options to solve that question. Having many options is a good thing because it increases your decision flexibility.</p><h3><strong>Options and How to Deal With Them</strong></h3><p>Your knowledge of a particular option may affect your confidence in building an increment that meets certain quality attributes. Choosing an option you are less optimistic about is okay if you can easily migrate to another option later on.</p><p>Figure 1 shows that. The vertical dimension shows your confidence in the option, while the horizontal dimension depicts the cost of migrating away from it to another option. Each field in the quadrant shows how to deal with a given option.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DFtP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DFtP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png 424w, https://substackcdn.com/image/fetch/$s_!DFtP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png 848w, https://substackcdn.com/image/fetch/$s_!DFtP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png 1272w, https://substackcdn.com/image/fetch/$s_!DFtP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DFtP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png" width="1456" height="1191" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1191,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:411923,&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_!DFtP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png 424w, https://substackcdn.com/image/fetch/$s_!DFtP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png 848w, https://substackcdn.com/image/fetch/$s_!DFtP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png 1272w, https://substackcdn.com/image/fetch/$s_!DFtP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c05aa80-3d2d-41cb-ba27-cd27f9c5069f_2880x2356.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 1: Evaluating options</figcaption></figure></div><p></p><h4><strong>Just do it</strong></h4><p><em>Example</em>: A team chooses a familiar message bus and knows it achieves the required throughput, which is critical for achieving performance goals. The message bus also supports an open standard (Java Message Service). That makes it interchangeable with other messaging solutions if the throughput nevertheless turns out to be insufficient.</p><p>Options where you have high confidence their implementation will achieve your quality attributes with low migration costs are ideal. They have shallow risks, and you should implement them directly.</p><h4><strong>Evaluate fast</strong></h4><p><em>Example: </em>A team must choose a relational database. First, it will find out which DBMS best supports its load-heavy query patterns. It decides to hide the database behind a Java Persistence API abstraction and tires out different database management systems in production.</p><p>When you are unsure about the outcome of implementing the option but it is easily exchangeable, you should evaluate it as fast as possible. You can even assess multiple options, e.g., by trying one solution and switching it out for another. You could also release one solution to half of your users while releasing another solution to the other (A/B testing).</p><h4><strong>Evaluate and close migration options</strong></h4><p><em>Example</em>: All development teams in the company are familiar with Kotlin. Kotlin is known to be appropriate for building readable code and supporting maintainability. A newly formed team responsible for implementing mathematical models decides on the programming language they want to use. Most team members favor Kotlin. But some worry about using a JVM-based language for complex mathematical models, fearing it may hurt performance. So, they decided to build a Proof of Concept in Kotlin, validating whether performance criteria are met. After it turned out to be the case, they did not evaluate other options further and continued working with Kotlin.</p><p>With high confidence in an option but high migration costs, you should figure out the riskiest parts of implementing the option and evaluate them quickly. Afterward, don&#8217;t actively keep migration paths open; go with the chosen option. (Note: that holds if requirements for quality attributes are believed to stay stable. If they change and evolve, it might be reasonable to keep migration paths open nevertheless).</p><h4><strong>Evaluate and keep migration options open</strong></h4><p><em>Example</em>: Two development teams want to split functionality between their microservices. They came up with an idea of which functionality should belong to which service but remain skeptical about whether this split is a good idea. They decide to implement the solution but ensure future refactorings remain possible. So, they aim for a consistent tech stack to ease moving code between the services (or merging the services into one).</p><p>In this case, switching is both challenging and likely. The way to go here is to think strategically about migration paths and actively keep them open until the confidence in the solution rises.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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><h4><strong>Conclusion</strong></h4><p>Strategically handling decisions and their options is essential in agile product development. Address necessary questions for upcoming iterations. At the same time, actively keep necessary migration paths open and delay decisions you do not have to make right now. Figure 2 summarizes this idea.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Oy5E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Oy5E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png 424w, https://substackcdn.com/image/fetch/$s_!Oy5E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png 848w, https://substackcdn.com/image/fetch/$s_!Oy5E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png 1272w, https://substackcdn.com/image/fetch/$s_!Oy5E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Oy5E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png" width="1456" height="1638" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1638,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:524849,&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_!Oy5E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png 424w, https://substackcdn.com/image/fetch/$s_!Oy5E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png 848w, https://substackcdn.com/image/fetch/$s_!Oy5E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png 1272w, https://substackcdn.com/image/fetch/$s_!Oy5E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3c5e421-aa4a-47d7-90a0-bde99fac3d53_2880x3240.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 2: Workflow for handling decisions in incremental product development</figcaption></figure></div>]]></content:encoded></item><item><title><![CDATA[My Journey to Unravel the Agile Mindset]]></title><description><![CDATA[Why Agile is more than a set of methodologies&#8212;it's a mindset crucial for navigating the complexities of software development. How embracing change and valuing people leads to true agility.]]></description><link>https://www.shapingshifts.com/p/my-journey-to-unravel-the-agile-mindset</link><guid isPermaLink="false">https://www.shapingshifts.com/p/my-journey-to-unravel-the-agile-mindset</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 12 Nov 2024 06:01:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4hWq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><em>"The tactical result of an engagement forms the base for new strategic decisions because victory or defeat in a battle changes the situation to such a degree that no human acumen is able to see beyond the first battle. In this sense one should understand Napoleon's saying: "I have never had a plan of operations."</em></p><p><em>Therefore no plan of operations extends with any certainty beyond the first contact with the main hostile force."</em></p><p><em>- Field Marshal Helmuth von Moltke the Elder</em></p></blockquote><p>I started professional software development sometime around 2013. It was at a time when Agile methodologies like Scrum were already quite established in teams and organizations. It seemed to me that it had morphed into a default choice in software development. Working like that made sense to me. Instead of doing exhaustive planning up front and shipping software after long development and testing phases, we went for shorter feedback cycles that enabled us to incorporate customer feedback earlier. Being new to software development, I thought this was a good thing (spoiler alert: today, I still think it is).</p><p>Nevertheless, my understanding was too superficial to assume that Agile methodologies are a good idea simply based on the fact they were the default choice for most teams I worked in. I wanted to understand the mindset and reasoning behind this way of working. I wanted to dig deeper.</p><h4><strong>Software Development and Complexity</strong></h4><p>Before we discuss Agile as a mindset and its methodologies, let's take a step back by looking at a conceptual model from complexity theory: The Cynefin Framework categorizes problems into five buckets: simple, complicated, complex, chaotic, and disorder. Its purpose as a sense-making framework is to contextualize problems and choose appropriate solution strategies.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4hWq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4hWq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4hWq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4hWq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4hWq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4hWq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg" width="800" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:76238,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4hWq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4hWq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4hWq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4hWq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35eb84a8-21fb-4e2c-8c78-c88b05b3edad_800x711.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Source: Wikipedia</figcaption></figure></div><p>The first section contains <strong>clear</strong> problems. In this area, solutions to problems are predictable and repeatable. Thus, we have existing best practices (or checklists) to solve them. <strong>Complicated</strong> problems are a little more difficult. They require expert knowledge to analyze, but we can follow a clear plan to arrive at a solution.</p><p>There are some problems that we can grasp only in hindsight. Here, we face <strong>complex</strong> problems. Outcomes are unpredictable. We must experiment to find out what works. There are also <strong>chaotic</strong> problems where we cannot gather enough understanding to conduct experiments in the first place. The space of <strong>confusion</strong> sits in the middle. That means our problem should reside in one of the other spaces, but determining which one presents challenges, so we rely on familiar solution patterns that may not be the best choice.</p><p>Software development lives in the space of complex problems. Why is that? First, we do not know beforehand how our users will use the system's functionality and in what combination they will do so. Second, we do not know what the best approach to solving the problem is in the first place. Also, we work in a fast-changing software development ecosystem. New frameworks and dependency versions appear daily. All the reasons above make it very hard to predict what will happen after we have started developing software systems.</p><p>Martin Fowler <a href="https://www.martinfowler.com/articles/newMethodology.html">argues</a> that software development is primarily a design activity, a creative process that is hard to plan. Unlike civil engineering's plan-driven approaches, more predictable "construction work" is a small part of software development.</p><p>Classical approaches in our discipline heavily relied on up-front plans and up-front design. That neglected the complex nature we are dealing with. It treats software development as a complicated problem without considering the unpredictability of user needs, the context in which the system operates, and the evolution of the software development ecosystem.</p><h4><strong>Agile Is About Responding to Change</strong></h4><p>Responding to change is a central pillar. In the face of uncertainty, it makes sense to work in small increments and decrease the amount of up-front planning since the plan would need to change anyway. A better approach is to conduct experiments, fail as fast as possible, and learn from the assumptions we have made. A consequence of this line of thought is that we want to deliver our system early and regularly to get feedback as fast as possible.</p><p>But what changes do we need to respond to in the first place? First, requirements change. They change because it is much easier to argue about a system, its features, and the usage workflow when customers can try and experience the system in the first place. Even when our users would perfectly know about the features and how they will use them, we would still need to factor in changing requirements. The reason for that is the evolving world around us. Our company might decide to enter a new market... or new competitors might be emerging. Changes in the business world are <a href="https://www.goodreads.com/book/show/38315.Fooled_by_Randomness">highly unpredictable</a>, as every stock trader would tell you.</p><p>Second, we have to deal with an evolving software development ecosystem. Operating systems, container orchestrators, cloud environments, frameworks, and libraries are only examples of tools we use in our day-to-day development. All of them evolve independently and sometimes in unexpected directions. Some of them have security issues that need to be fixed urgently. On top of that, new tools emerge, often unpredictably. Could you have predicted the impact of Docker before it was released and widely adopted?</p><h4><strong>Agile Is About People</strong></h4><p>As we have discussed above, software development is creative work. As with other creative work, individuals are not replaceable and make unique contributions to the software product. Each individual has a background, experiences, strengths, and weaknesses that can uniquely and positively impact the team and its work results. Therefore, we should treat people as first-class citizens in the software development process instead of handling them like replaceable gears in a factory.</p><h4><strong>Agile Is a Mindset</strong></h4><p>After the end of World War II, inhabitants of the Melanesian islands in the South Pacific practiced what anthropologists later coined "Cargo Cult." During the war, Allied forces dropped packaged equipment and food items onto military bases stationed on the islands. This profoundly affected the islanders since the military shared some of the goods with them, significantly increasing their standard of living. After the war, when military bases were removed from the islands, inhabitants were short of supply and the abundance they brought.</p><p>The (scientifically disputed) theory is that inhabitants of the island believed technologies (such as airplanes, headsets, and landing towers) were worshipping relics to spiritual entities who dropped equipment and food packages onto the island. What happened was that the islanders began to build their airplanes, headsets, and landing towers out of straw and practiced military formations with wooden weapons as a spiritual act. The spiritual worship did not result in packages being dropped from the air.</p><p>The message is that implementing Agile methodologies without adopting Agile principles and mindsets is problematic. Using processes like Scrum or XP only works as far as you adapt the holding beliefs as well. Otherwise, you will land on an island full of buzzwords without embracing Agile as what it truly is: a mindset.</p><p>Out of that mindset follow the practices: we write tests and embrace continuous delivery because it makes it easier for us to deliver working software faster and more often. We hold daily stand-ups to determine if team members can help each other clear away impediments because we believe Agile is about people first. We conduct experiments to see what works and what doesn't work. And we want to release software more often because it helps us collaborate with our customers in the first place.</p><h4><strong>Agile Is No Means to an End</strong></h4><p>One of the fundamental problems with Agile lies in its adoption. Superficial adoption of the methodologies and thinking it might be a silver bullet is a significant obstacle. We need a deep understanding of the mindset behind the methods&#8212;organization-wide, not only technical but also from leadership positions and beyond.</p><p>What is essential for Agile teams is to have a safe space to try things out, potentially fail, and have room to learn and adapt. Leadership and management must embrace that. It is fundamental not to see those methodologies as a control mechanism but as a mindset that helps to deliver features faster, embrace people as creatives and make room for experimentation and growth.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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><h4><strong>Further Reading and References</strong></h4><p>In &#8220;<a href="https://www.martinfowler.com/articles/newMethodology.html">The New Methodology</a>&#8221;, Martin Fowler wrote about his thoughts about the Agile movement in 2005.</p><p><a href="http://agilemanifesto.org/">The "Manifesto for Agile Software Development"</a> states the most central principles of Agile software development.</p><p>In &#8221;<a href="https://www.youtube.com/watch?v=N7oz366X0-8">The Cynefin Framework</a>&#8221;, its creator David Snowden describes elements and applications.</p>]]></content:encoded></item><item><title><![CDATA[My 10 Highlights From the 2024 DORA Report]]></title><description><![CDATA[Discover how the latest DORA report reveals surprising pros and cons of AI and platform engineering.]]></description><link>https://www.shapingshifts.com/p/my-10-highlights-from-the-2024-dora</link><guid isPermaLink="false">https://www.shapingshifts.com/p/my-10-highlights-from-the-2024-dora</guid><dc:creator><![CDATA[Alex Kaserbacher]]></dc:creator><pubDate>Tue, 05 Nov 2024 06:00:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vkDK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In late October, the DORA (DevOps Research and Assessment) research program released its latest annual <a href="https://cloud.google.com/blog/products/devops-sre/announcing-the-2024-dora-report">&#8220;Accelerate State of DevOps&#8221; report</a>, surveying over 90,000 individuals involved in software development organizations. It is the tenth installation in a series of yearly reports summarizing how organizations put in place practices of DevOps as well as related disciplines and the effects they observe.</p><p>As I do every year, I have read the report with great interest. The central part of this year&#8217;s report covers topics currently in broad discussion, such as the adoption of artificial intelligence in the software delivery workflow and platform engineering.</p><p>Below, I have summarized my key highlights. The text draws heavily from the information in the report. After reading my summary, I encourage you to dive deeper by reading the full report.</p><h3><strong>Adoption of AI leads to both positive and negative effects</strong></h3><p>An overwhelming proportion of survey participants (75.9%) said they use AI in at least one of their daily work tasks. It is most often used for writing, optimizing, and documenting code, summarizing information, or explaining unfamiliar code. Unsurprisingly, this broad adoption has both positive and negative consequences for individuals and development workflows.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vkDK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vkDK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png 424w, https://substackcdn.com/image/fetch/$s_!vkDK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png 848w, https://substackcdn.com/image/fetch/$s_!vkDK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png 1272w, https://substackcdn.com/image/fetch/$s_!vkDK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vkDK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png" width="1456" height="1078" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1078,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:239751,&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_!vkDK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png 424w, https://substackcdn.com/image/fetch/$s_!vkDK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png 848w, https://substackcdn.com/image/fetch/$s_!vkDK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.png 1272w, https://substackcdn.com/image/fetch/$s_!vkDK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd89c1f46-1784-46f9-a18c-027788caf4ab_2880x2133.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><h4><strong>Impact on individuals</strong></h4><p>Noticeable adoption of AI leads to an increase in flow (the degree of focus individuals achieve), job satisfaction (individuals overall feeling about their job) and productivity (the degree of effectiveness individuals feel in their job).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ahnw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ahnw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png 424w, https://substackcdn.com/image/fetch/$s_!Ahnw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png 848w, https://substackcdn.com/image/fetch/$s_!Ahnw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!Ahnw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ahnw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png" width="1456" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:137362,&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_!Ahnw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png 424w, https://substackcdn.com/image/fetch/$s_!Ahnw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png 848w, https://substackcdn.com/image/fetch/$s_!Ahnw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!Ahnw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a0aa68-fc44-4814-8110-d04e59988c3e_1596x1052.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><figcaption class="image-caption">Source: 2024 Accelerate State of DevOps Report</figcaption></figure></div><p>Interestingly, it also leads to a decrease in time spent doing valuable work. The report describes valuable work as &#8220;development-related tasks, like coding, [&#8230;] while less-valuable, even toilsome, work typically includes tasks associated with organizational coordination, like attending meetings.&#8221; The authors hypothesize that AI mainly automates valuable work. This is the development-related work from the description above. Meanwhile, the amount of non-valuable work, like organizational coordination, stays the same.</p><p>I want to share a personal observation about AI-generated code. Writing code feels valuable. However, fixing AI-generated code does not. I can count many times when I felt accomplished after implementing a complex algorithm. I would not have felt that if I had just fixed and optimized an AI suggestion.</p><h4><strong>Impact on development workflows</strong></h4><p>AI adoption drives documentation and code quality and enhances code review speed. The degree of quality is derived from the subjective evaluation of survey participants, leaving some room for misinterpretation. Yet, I think on this scale and for this order of magnitude, it is a good indicator of spotting trends like 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_!SW3K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SW3K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png 424w, https://substackcdn.com/image/fetch/$s_!SW3K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png 848w, https://substackcdn.com/image/fetch/$s_!SW3K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png 1272w, https://substackcdn.com/image/fetch/$s_!SW3K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SW3K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png" width="1456" height="987" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:987,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140691,&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_!SW3K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png 424w, https://substackcdn.com/image/fetch/$s_!SW3K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png 848w, https://substackcdn.com/image/fetch/$s_!SW3K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png 1272w, https://substackcdn.com/image/fetch/$s_!SW3K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4608c07-b99a-4c5b-bc67-9dddccf4c44d_1580x1071.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Source: 2024 Accelerate State of DevOps Report</figcaption></figure></div><p>Surprisingly, AI adoption leads to lower delivery stability, including the change failure rate and the rate at which teams need to make adjustments after release. So, releases that include AI-generated code tend to be more unreliable. The authors think this might be because AI-generated code increases the batch size of releases. Larger batches are often less reliable, leading to more required changes after release.</p><h3><strong>Improving delivery speed and product quality is not the primary driver for AI adoption</strong></h3><p>One thing that surprised me the most is that AI adoption is not mainly driven by the desire to increase quality or delivery speed. It is more driven by <em>external</em> pressure, such that others could improve product quality and delivery speed by leveraging AI, and you might fall behind as an individual or organization. However, even if it is not the primary driver for adoption, AI still increases productivity. Only 10% of participants reported negative impacts; the other 90% reported at least slight productivity increases, with 35% accounting for them as moderate or extreme.</p><h3><strong>Most developers tweak AI-generated code</strong></h3><p>Most teams do not release AI-generated code to production, only passing <em>automated</em> checks. Most of the time, however, AI-generated code goes through a human's brain at some point before deployment. Copy-pasting AI-generated code often needs manual adjustments. One participant in the report's interview compared the situation to "the early days of StackOverflow, [when] you always thought people on StackOverflow are really experienced, you know, that they will know exactly what to do. And then, you just copy and paste the stuff, and things explode".</p><h3><strong>Companies across industries adopt AI at the same rate</strong></h3><p>Industries adopt technologies at vastly different speeds and timescales. However, AI shows no significant difference in adoption rates across industries. What is notable is that organization size predicts AI adoption, with smaller organizations being more aggressive in AI adoption than larger organizations.</p><h3><strong>As with AI, the adoption of platform engineering leads to both positive and negative effects</strong></h3><p>Internal developer platforms positively impact surveyed participants' individual performance and their organizations. The most significant factors noted in the report are:</p><ul><li><p>Higher levels of individual and team productivity (8% and 10%, respectively). Productivity describes the extent to which an individual or team feels efficient.</p></li><li><p>An organization's overall performance rises by 6%. This measures the organization's ability to deliver software and business value quickly.</p></li></ul><p>The negative impacts, however, were surprising to me. The report notes that there are two major adverse effects organizations leveraging internal developer platforms observe:</p><p>First, throughput (the time it takes for code to reach production and how often code is deployed to production) decreases by 8% compared to organizations not using a platform. Second, delivery stability (the change failure rate and the rate at which rework is needed after release) decreases by 14%.</p><p>Multiple forces are at work here. The decrease in throughput could be explained by additional automation steps performed by the platform that are required before release to production, like security checks and testing. Additionally, if a platform is mandatory for development teams, ill-fitted platform functionality could also decrease productivity and throughput.</p><p>The drop in delivery stability may be due to increased automation. It lowers the bar for developers to push code since more automation potentially spots more issues. The report also states that a platform might make rollbacks easier, "empowering teams to experiment and deliver changes, which results in an increased level of change failure and rework."</p><h3><strong>User-centricity leads to better products</strong></h3><p>User-centricity is the degree to which teams align their priorities to their users&#8217; needs. User-centricity is positive across the board:&nbsp;</p><ul><li><p>It makes developers happy by inducing a sense of purpose in their work.&nbsp;</p></li><li><p>It is the only factor that makes software delivery performance less critical to product success.&nbsp;</p></li></ul><p>As the report states:</p><blockquote><p>&#8220;We find that when organizations know and understand users&#8217; needs, stability and throughput of software delivery are not a requirement for product quality. Product quality will be high as long as the user experience is at the forefront.&#8221;</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VWQU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VWQU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png 424w, https://substackcdn.com/image/fetch/$s_!VWQU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png 848w, https://substackcdn.com/image/fetch/$s_!VWQU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!VWQU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VWQU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png" width="1456" height="926" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:926,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:398257,&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_!VWQU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png 424w, https://substackcdn.com/image/fetch/$s_!VWQU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png 848w, https://substackcdn.com/image/fetch/$s_!VWQU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!VWQU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bc44880-32f3-43f5-9c5a-9feec297e77c_1595x1014.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Source: 2024 Accelerate State of DevOps Report</figcaption></figure></div><h3><strong>Internal documentation, combined with user-centricity, is powerful</strong></h3><p>Besides user-centrality, the quality of internal documentation plays a significant role in product quality. As the figure below shows, the combination of both factors has substantial positive implications. The report states that this is because internal documentation can act as a magnifier for user feedback and propagate it across the team.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yahV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yahV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png 424w, https://substackcdn.com/image/fetch/$s_!yahV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png 848w, https://substackcdn.com/image/fetch/$s_!yahV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png 1272w, https://substackcdn.com/image/fetch/$s_!yahV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yahV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:468919,&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_!yahV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png 424w, https://substackcdn.com/image/fetch/$s_!yahV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png 848w, https://substackcdn.com/image/fetch/$s_!yahV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png 1272w, https://substackcdn.com/image/fetch/$s_!yahV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28689990-875e-42c2-828d-98c6d8d226ee_1669x928.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Source: 2024 Accelerate State of DevOps Report</figcaption></figure></div><h3><strong>Unstable organizational priorities lead to decreases in productivity and increases in burnout</strong></h3><p>The authors write:</p><blockquote><p>&#8220;We all know the feeling. You&#8217;ve spent the last few months working on a new feature. You know it&#8217;s the right thing to build for your users, you are focused and motivated. Suddenly, or seemingly so, the leadership team decides to change the organization&#8217;s priorities. Now it&#8217;s unclear whether your project will be paused, scrapped, Frankensteined, or mutated.&#8221;</p></blockquote><p>Shifting priorities leads to disruptions, and constantly doing so has profound negative effects on teams and individuals, especially the burnout rate. Persistent priority changes and the accompanying uncertainties place a burden on employees.</p><h3><strong>Moving to the cloud may be harmful if the provided flexibility is not used</strong></h3><p>Only if organizations take advantage of the main characteristics of cloud computing (on-demand self-service, broad network access, resource pooling, rapid elasticity, and flexible infrastructure) can they make the most out of a transformation to the cloud. The report goes even further and states that organizations moving to the cloud and not using the full potential might be better off staying in a more traditional data center:</p><blockquote><p>&#8220;Organizations may be better off staying in the data center if they are not willing to radically transform their application or service. Of course, to accomplish this, it is not simply adopting tools or technologies, but often an entire new paradigm in designing, building, deploying, and running applications.&#8221;</p></blockquote><h3><strong>Organizations across all industries can achieve high levels of software delivery performance</strong></h3><p>Software delivery performance and the organization's industry are independent. Even though each industry has its challenges, there is no industry prone to high delivery performance and no industry where delivery performance can't be improved.</p><h3><strong>Conclusion</strong></h3><p>I found this year's report especially interesting because it addresses two widely discussed topics: the usage of Artificial Intelligence in software development and platform engineering. I was not surprised that both approaches have obvious drawbacks besides their upsides; however, some particular drawbacks (such as platform engineering being able to lower throughput and delivery stability in some cases) raised my eyebrow. The report hypothesized several reasons, which I found sensible in the first place. However, the topics and issues raised in the report will require me to do more thinking and writing in the future.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.shapingshifts.com/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 Shaping Shifts! 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>