<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Optimist Engineer]]></title><description><![CDATA[Experiences, learnings, and inspiration about Software Engineering, Technical Leadership, and Technical Growth, with a bit of optimism. Interesting for Tech Leads and software makers from Startups to medium-sized companies.]]></description><link>https://newsletter.optimistengineer.com</link><image><url>https://substackcdn.com/image/fetch/$s_!Rspq!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c8c36d-e4b0-4695-b613-313d621c2839_392x392.png</url><title>The Optimist Engineer</title><link>https://newsletter.optimistengineer.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 06 Oct 2026 20:20:09 GMT</lastBuildDate><atom:link href="https://newsletter.optimistengineer.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Marcos Fermín Lobo]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[hello@optimistengineer.com]]></webMaster><itunes:owner><itunes:email><![CDATA[hello@optimistengineer.com]]></itunes:email><itunes:name><![CDATA[Marcos F. Lobo 🗻🧭]]></itunes:name></itunes:owner><itunes:author><![CDATA[Marcos F. Lobo 🗻🧭]]></itunes:author><googleplay:owner><![CDATA[hello@optimistengineer.com]]></googleplay:owner><googleplay:email><![CDATA[hello@optimistengineer.com]]></googleplay:email><googleplay:author><![CDATA[Marcos F. Lobo 🗻🧭]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[[The A-Side] The AI Stack, Part 1: Building Product-First (#169)]]></title><description><![CDATA[Are you building AI products but feeling lost in the endless noise of new frameworks, hype, and technical terms?]]></description><link>https://newsletter.optimistengineer.com/p/the-a-side-the-ai-stack-part-1-building</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-a-side-the-ai-stack-part-1-building</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Tue, 06 Oct 2026 17:42:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/44694101-d2f7-4edc-bfcf-387b895a581b_1408x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Are you building AI products but feeling lost in the endless noise of new frameworks, hype, and technical terms?</p><p>If you are a <strong>Software Engineer or Tech Lead</strong> and you are looking for <strong>a clear mental model to navigate the modern AI engineering stack</strong>, then this email is for you.</p><p>In today&#8217;s issue, I want to share <strong>the first part of a three-part series on the essential layers of AI engineering</strong>, based on the framework developed by author and researcher Chip Huyen. Today, we start at the very top.</p><p>Here is what else we are covering in this issue:</p><ul><li><p><strong>The Read-Only Memory:</strong> The incredible trajectory of Chip Huyen, from a small farming village in Vietnam to teaching Machine Learning at Stanford.</p></li><li><p><strong>The Open Thread Club:</strong> Tackling presentation anxiety, and why imagining the audience naked completely fails in practice.</p></li><li><p><strong>The Rendezvous:</strong> Key upcoming software events in Las Vegas, Madrid, and Geneva.</p></li></ul><p>Before you continue, if you enjoy my work and would like to support the newsletter, I&#8217;d really appreciate it if you shared it with a fellow engineer:</p><p style="text-align: center;"><strong><a href="https://wa.me/?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#128154; On WhatsApp</a></strong> | <strong><a href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/">&#128153; On LinkedIn</a></strong> | <strong><a href="https://bsky.app/intent/compose?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#129653; Bluesky</a></strong></p><p>Or simply forward this email to someone who might find it useful.</p><h2>The Read-Only Memory</h2><p>Today you learn a bit more about <strong>Chip Huyen</strong>, the author of the <a href="https://learning.oreilly.com/library/view/ai-engineering/9781098166298/">AI Engineering book</a> (which I recommend without getting paid).</p><p>After high school, her three-day trip to Brunei turned into a three-year journey across Asia, Africa, and South America. To fund her travels, she wrote about the people she met and eventually published four books of stories in Vietnamese. During that time, she worked as a Bollywood extra, a casino hostess, and a street performer. Years later, after initially being rejected by Stanford, she reapplied, was admitted, and went on to teach Machine Learning Systems there.</p><p><strong>But there is one detail about Chip</strong> that I find even more interesting in the spirit of your list.</p><p>When she shared her story at Stanford, she explained that she came from a small farming village in Vietnam, didn&#8217;t have internet at home until she reached university, and wasn&#8217;t even accepted by Stanford at first. Once there, she admitted she was afraid of public speaking because she thought her accent would make it hard for others to understand her. A public speaking course at Stanford helped her gain confidence and change that perception.</p><p><strong>And there is a second, particularly lovely layer to this</strong>: when she started teaching Machine Learning Systems, she published the course materials and publicly asked other professionals to review the notes and provide feedback. The course eventually became the foundation for *Designing Machine Learning Systems*.</p><div><hr></div><p>In this section, we will focus on biographies of computer pioneers, forgotten historical whitepapers that remain entirely relevant, and independent blog posts that question the status quo of our industry.</p><p><strong>Would you like to suggest some?</strong> I hear you! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have something for you!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have something for you!</span></a></p><h2>The Open Thread Club</h2><p>On this occasion, a reader asked this:</p><blockquote><p>For performing talks and presentations, does imagining people naked actually work to temper my nerves?</p><p><em>&#8212; Nervous Anonymous Presenter</em></p></blockquote><p>I will confess here and now that: <strong>yes, I&#8217;ve tried this</strong>.</p><p>Only once. Why? It did not work for me.</p><p><strong>Two tricks that actually work for me</strong>:</p><ul><li><p>If I have a friend in the audience, I focus my talk on that person, and it really helps to temper.</p></li><li><p>Focus your view &#8220;into the void&#8221;. What does this mean? Avoid eye contact with people in the audience and, instead, keep your eyes in the blank spaces between the public attending to your talk. Like that, the public has the feeling you are keeping eye contact (which could be good), but you are not affected by their reactions.</p></li></ul><p><strong>Do you have any tricks?</strong> Share it!</p><p>This person is starting with making talks and presentations and asked this in the context of reading this&#128071;&#127995;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;61a1485e-163f-4ae4-9ae3-ac7a774220b3&quot;,&quot;caption&quot;:&quot;I must confess that, at some point in my career, I found it really interesting and satisfying to share my experiences with others. It wasn't the case in the beginning, I can tell you.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Benefits of speaking at Tech Summits&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:40136239,&quot;name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&quot;,&quot;bio&quot;:&quot;Senior Software Engineer and Tech Lead with 20+ years of experience. Currently building a SaaS product on a cloud-based microservices architecture. Previously worked at CERN managing OpenStack services in the IT CLOUD group.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!7roK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9211d7-f06d-4d11-b17c-4f1af3d2df5a_3264x1836.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-06-05T06:28:55.189Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce351f37-42b7-4325-a5f5-bb5083814ec6_1024x1024.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/benefits-of-speaking-at-tech-summits&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:139615757,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1659382,&quot;publication_name&quot;:&quot;The Optimist Engineer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Rspq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c8c36d-e4b0-4695-b613-313d621c2839_392x392.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><p>In this space, we will address real dilemmas about architecture, technical friction, or leadership situations you send anonymously.</p><p>Instead of giving theoretical or dogmatic answers, I will respond honestly, sharing my own past mistakes in similar situations and the lessons I learned while trying to solve them.</p><p><strong>You can start participating RIGHT NOW!</strong> Click the button below and tell me your story so I can answer in the next issue &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have a tale to share!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have a tale to share!</span></a></p><h2>The Rendezvous</h2><p>The events of this week.</p><ul><li><p>Are you going to <strong><a href="https://aws.amazon.com/es/events/reinvent/">re:Invent 2026</a></strong> in Vegas (USA)? It will happen from <strong>November 30th to December 4th</strong>.</p></li><li><p>In Madrid (Spain), the <strong><a href="https://sessionize.com/devfest-madrid-2026/">Dev Fest 2026</a></strong> will be held on <strong>November 27th</strong>.</p></li><li><p>In Geneva (Switzerland), from <strong>December 9th to 10th</strong>, the <strong><a href="https://community2.cncf.io/events/details/cncf-kcd-suisse-romande-presents-kcd-suisse-romande-2026/">KCD Suisse Romande 2026</a></strong> will run in English and French.</p></li></ul><div><hr></div><p><strong>A radar of events about software engineering and technical leadership</strong>.</p><p>The priority here is not to be exclusively massive conferences, but to give visibility to smaller, local encounters or emerging initiatives. If you are organizing a conference or know of an event worth sharing, the channel is open for you to send it to me and share it with the community.</p><p><strong>Do you own an event or summit?</strong> Drop me an email! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I know about an event!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!"><span>&#128231; I know about an event!</span></a></p><h2>The A-Side</h2><p>Today, we&#8217;re looking at the <strong>Application Development Layer (Product-First)</strong>.</p><p>This is the layer where most of the user experience is built. The idea is pretty simple:</p><blockquote><p>Get as much value as possible from existing foundation models using traditional software engineering, without changing the model itself.</p></blockquote><p>Chip Huyen highlights three main areas here:</p><p>&#128073;&#127996; <strong>Systematic &amp; Rigorous Evaluation</strong></p><p>Evaluating probabilistic models is one of the hardest parts of building AI systems. A simple &#8220;<em>looks good to me</em>&#8221; approach doesn&#8217;t scale very far.</p><p>The goal is to move from informal vibe checks to automated and reproducible evaluation pipelines. One approach is <strong>AI-as-a-judge</strong>, where a more capable LLM evaluates the output of another model against a defined set of criteria.</p><p>If you <strong>want</strong>, I can treat this <strong>AI-as-a-judge</strong> approach in future editions. Write me in the comments!</p><p>&#128073;&#127996; <strong>Prompt Engineering &amp; Context Management</strong></p><p>This is where techniques like <strong>RAG (Retrieval-Augmented Generation)</strong> become useful.</p><p>Instead of expecting the model to know everything, we provide it with the relevant business context at runtime. For example, company policies or product documentation can be retrieved from a vector database and included in the prompt.</p><p>The idea is to give the model the facts it needs, when it needs them, rather than relying entirely on what it learned during training.</p><p>&#128073;&#127996; <strong>AI Interfaces &amp; Control Logic</strong></p><p>This is about everything around the model: how users interact with it, how we orchestrate agents, and how we constrain what the system can actually do.</p><p>That might mean using patterns such as Plan-and-Act, enforcing structured outputs with JSON schemas, or adding guardrails to deal with things like prompt injection, unsafe content, or unexpected model behaviour.</p><p>&#129488; <strong>A real-world example</strong></p><p>Imagine you&#8217;re building an enterprise customer support assistant.</p><p>You probably don&#8217;t need to train your own LLM. You can provide company policies and product information through RAG, evaluate the responses using an AI-as-a-judge approach, and constrain the output to a well-defined JSON schema that your application can safely consume.</p><p>That&#8217;s a lot of product value without touching the model weights.</p><p>&#9757;&#127996; <strong>The key takeaway</strong></p><p>A huge amount of the practical value businesses are getting from AI today is being created in this layer.</p><p>And that&#8217;s an important point: you can build surprisingly capable AI products without ever training or fine-tuning a model.</p><p>So, what does this layer <strong>Application Layer </strong>actually look like at a glance?</p><ul><li><p><strong>Evaluation:</strong> Move beyond informal vibe checks towards automated, reproducible evaluation.</p></li><li><p><strong>Context:</strong> Use RAG and retrieval systems to give models access to the information they need at runtime.</p></li><li><p><strong>Control:</strong> Use guardrails, agent orchestration and structured outputs to make AI systems more predictable and useful.</p></li></ul><p>But there&#8217;s a limit.</p><p>What happens when prompt engineering and RAG aren&#8217;t enough? What if you need the model to behave in a very specific way that simply doesn&#8217;t fit into the context you can provide?</p><p>That&#8217;s when we need to go one level deeper.</p><p><strong>Next week, we&#8217;ll look at how we can adapt the &#8220;brains&#8221; of these models themselves.</strong></p><p>As always, if you have thoughts, questions, or disagree with something I&#8217;ve written, drop me a reply or leave a comment. I read and reply to all of them.</p><p>Be safe,<br>Marcos</p>]]></content:encoded></item><item><title><![CDATA[[The A-Side] Why you should stop giving your company unpaid overtime (#168)]]></title><description><![CDATA[The "honeymoon phase" feels great, but scaling changes who the company cares about]]></description><link>https://newsletter.optimistengineer.com/p/the-a-side-why-you-should-stop-giving</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-a-side-why-you-should-stop-giving</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 30 Sep 2026 15:58:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c43ffa6f-4b36-4a7e-988a-a162969ebbca_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>SURVEY! SURVEY!</strong></p><p>Looking forward to hearing from you about the new format of the newsletter. <strong>Tell me here! &#128071;&#127995;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://forms.gle/SK6MrBUrTuzzwekZ7&quot;,&quot;text&quot;:&quot;Drive me in!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://forms.gle/SK6MrBUrTuzzwekZ7"><span>Drive me in!</span></a></p><div><hr></div><p><em>We love</em> to believe that <strong>treating our startup like a family</strong> means they will protect our careers when they finally scale.</p><p><strong>That is the biggest lie we swallow in this industry</strong>.</p><p>If you are a Software Engineer and you are looking to navigate corporate growing pains without sacrificing your own growth, then this email is for you.</p><p>I want to tackle the <em><strong>brutal reality</strong></em> of the startup honeymoon phase in <strong>The A-Side</strong>. We will break down what happens when your company scales beyond a thousand people and why your career suddenly stops being their priority.</p><p>To complement that reality check:</p><ul><li><p><strong>The Read-Only Memory:</strong> Simon Sinek&#8217;s personal wake-up call about faking professional happiness.</p></li><li><p><strong>The Open Thread Club:</strong> Rethinking your baseline loyalty to the company when AI anxiety creeps in.</p></li><li><p><strong>The Rendezvous:</strong> Upcoming November engineering summits in Barcelona, Lisbon, and San Francisco.</p></li></ul><p>Before you continue, if you enjoy my work and would like to support the newsletter, I&#8217;d really appreciate it if you shared it with a fellow engineer:</p><p style="text-align: center;"><strong><a href="https://wa.me/?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#128154; On WhatsApp</a></strong> | <strong><a href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/">&#128153; On LinkedIn</a></strong> | <strong><a href="https://bsky.app/intent/compose?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#129653; Bluesky</a></strong></p><p>Or simply forward this email to someone who might find it useful.</p><h2>The Read-Only Memory</h2><p>Today, I bring you <strong>Simon Sinek</strong>. This person has a book I would like to recommend (I&#8217;m not getting paid for it)</p><blockquote><p><strong><a href="https://simonsinek.com/books/start-with-why">Start with the Why</a></strong></p><p><em>&#8212; Simon Sinek</em></p></blockquote><p>The story that I bring you today is very related to the topic you will read in The A-Side (down in this email).</p><p>When his first company seemed to be doing reasonably well, a friend was the first person to notice that something didn&#8217;t add up. <strong>Sinek admits that he had been pretending for some time to be happier</strong> and more successful than he actually felt. It was that conversation, not professional success, that enabled him to start changing his life.</p><p>Did this happen to you?</p><div><hr></div><p>In this section, we will focus on biographies of computer pioneers, forgotten historical whitepapers that remain entirely relevant, and independent blog posts that question the status quo of our industry.</p><p><strong>Would you like to suggest some?</strong> I hear you! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have something for you!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have something for you!</span></a></p><h2>The Open Thread Club</h2><p>Following up on the main topic of The A-Side today (read down in the mail), I don&#8217;t bring you a question from readers. Not because I don&#8217;t have any about this topic, but quite the opposite, including concerns about &#8220;I&#8217;m worried about the AI taking my job&#8221;.</p><p>Today, I bring you something I wrote some time ago, so:</p><ul><li><p>Instead of worrying about &#8220;will the company fire me?&#8221;</p></li><li><p>Just think, &#8220;What should be my position in regard to the company I&#8217;m working for&#8221;</p></li></ul><p>Read the full email here &#128071;&#127995;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;006119db-900d-4f97-a3cf-409051c2a3d2&quot;,&quot;caption&quot;:&quot;I&#8217;m done working in this company; I will quit.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How can you tell your work at a company is basically DONE?&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:40136239,&quot;name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&quot;,&quot;bio&quot;:&quot;Senior Software Engineer and Tech Lead with 20+ years of experience. Currently building a SaaS product on a cloud-based microservices architecture. Previously worked at CERN managing OpenStack services in the IT CLOUD group.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!7roK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9211d7-f06d-4d11-b17c-4f1af3d2df5a_3264x1836.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-06-25T02:00:32.258Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/321ab45e-7f54-4e35-acfa-4788bb64850f_1024x1536.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/how-can-you-tell-your-work-at-a-company&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:165805660,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:10,&quot;comment_count&quot;:8,&quot;publication_id&quot;:1659382,&quot;publication_name&quot;:&quot;The Optimist Engineer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Rspq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c8c36d-e4b0-4695-b613-313d621c2839_392x392.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><p>In this space, we will address real dilemmas about architecture, technical friction, or leadership situations sent anonymously by you.</p><p>Instead of giving theoretical or dogmatic answers, I will respond with honesty, sharing my own past mistakes in similar situations and the lessons I took away when trying to solve them.</p><p><strong>You can start participating RIGHT NOW!</strong> Click the button below and tell me your story so I can answer in the next issue &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have a tale to share!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have a tale to share!</span></a></p><h2>The Rendezvous</h2><p>From now on, you should start targeting summits and conferences happening in November, so I can bring you 3 during that month.</p><ul><li><p>The <a href="https://2026.es.pycon.org/en/">PyConES 2026</a> is happening in Barcelona (Spain) next <strong>November 6th to 8th</strong>.</p></li><li><p>In Lisbon (Portugal), the <strong><a href="https://websummit.com/">Web Summit 2026</a></strong> starts <strong>November 9th and ends on the 12th</strong>.</p></li><li><p>If you are in the San Francisco area (USA), you will have the <strong><a href="https://qconsf.com/">QCon San Francisco 2026</a></strong> from <strong>November 16th to 20th</strong>.</p></li></ul><p>If you attend some of those, tell me how it goes!</p><div><hr></div><p><strong>A radar of events about software engineering and technical leadership</strong>.</p><p>The priority here is not to be exclusively massive conferences, but to give visibility to smaller, local encounters or emerging initiatives. If you are organizing a conference or know of an event worth sharing, the channel is open for you to send it to me and share it with the community.</p><p><strong>Do you own an event or summit?</strong> Drop me an email! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I know about an event!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!"><span>&#128231; I know about an event!</span></a></p><h2>The A-Side</h2><p><strong>Every developer starts in the honeymoon phase</strong>.</p><p>When a startup is small, say under 500 people, it&#8217;s easy to feel that your work really matters. You know the people around you, you can see the impact of what you&#8217;re building, and you&#8217;re close enough to the company&#8217;s mission to feel part of it.</p><p><strong>Motivation is high. Sometimes very high</strong>.</p><p>You might even find yourself going the <em>extra mile</em>, working late or taking on more than you probably should, because you genuinely care about what you&#8217;re building.</p><p><strong>Then the company grows</strong>. 800 people. 1,000. 2,000.</p><p><strong>More layers of management appear</strong>. Teams get reorganised. Processes multiply. Decisions take longer. And at some point, you hear someone say:</p><blockquote><p>This isn&#8217;t what it used to be.</p><p><em>&#8212; You team mates, in the coffe break</em></p></blockquote><p><strong>It&#8217;s tempting to blame the company</strong>. But most of the time, it&#8217;s not that simple.</p><p>As a company grows, the way it operates has to change. <strong>The focus shifts towards</strong> products, revenue, efficiency, organisational goals and, increasingly, doing more with less. AI is only adding more pressure to that equation.</p><p>And somewhere along the way, <strong>your individual career can stop being a priority</strong> for the people at the top.</p><p>That doesn&#8217;t necessarily mean your manager doesn&#8217;t care. They might care a lot. They may simply have 15 other things competing for their attention and very little room to protect your interests.</p><p><strong>&#128073;&#127996; So be careful about where you put your extra effort</strong>.</p><p>There&#8217;s nothing wrong with caring about your company. But <strong>your career is ultimately yours</strong>.</p><p>Put some of that extra mile into your own skills, your own projects, your network and your growth.</p><p>Because when the company changes, restructures, or moves on to its next priority, those are the things that stay with you.</p><p><strong>&#128073;&#127996; Invest in yourself first</strong>.</p><p>If you want more honest thoughts on navigating engineering careers, Tech Lead roles, and the path towards Staff Engineer:</p><p><strong>Read the full list here</strong> &#8594; <strong><a href="https://newsletter.optimistengineer.com/t/tech-lead">https://newsletter.optimistengineer.com/t/tech-lead</a></strong></p><p>Be safe,<br>Marcos</p>]]></content:encoded></item><item><title><![CDATA[[The A-Side] The SPDD Workflow: From Story to Code (#167)]]></title><description><![CDATA[How to turn vague business requirements into a predictable engineering loop]]></description><link>https://newsletter.optimistengineer.com/p/the-a-side-the-spdd-workflow-from</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-a-side-the-spdd-workflow-from</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Tue, 22 Sep 2026 17:22:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/af1c6fd8-a94d-45db-80ee-971dbc3a2cad_2053x1676.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The industry is selling you a pretty convincing story about AI coding assistants.</p><p>Give them a two-line requirement, they say, and AI will take care of the rest: architecture, code, tests, the lot. But what happens when generating code becomes faster than understanding what that code is actually doing?</p><p><strong>If you&#8217;re a software engineer</strong> trying to spend less time fighting AI hallucinations and more time building reliable, predictable workflows, <strong>this issue is for you</strong>.</p><div><hr></div><p>Hey! As you know, I&#8217;m trying out a new format for the newsletter, and <strong>I&#8217;d love to hear what you think about it!</strong> Please take just 1 minute to complete this short survey.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://forms.gle/nuNGhvpaRNgrr8ax6&quot;,&quot;text&quot;:&quot;Let's go to the survey!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://forms.gle/nuNGhvpaRNgrr8ax6"><span>Let's go to the survey!</span></a></p><div><hr></div><p>In today&#8217;s issue, we dive into <strong>The A-Side and take a closer look at Structured Prompt-Driven Development</strong> (SPDD). We&#8217;ll walk through the <strong>workflow loop that helps keep your intent aligned</strong> with the code, and why doing the analysis first matters more than jumping straight into the canvas.</p><p>And there&#8217;s more:</p><ul><li><p><strong>The Read-Only Memory:</strong> Donald E. Knuth once offered a $2.56 reward for finding errors in his books. A small detail that says a lot about his approach to technical work, and about being open about mistakes.</p></li><li><p><strong>The Open Thread Club:</strong> What happens when a C-Level demo goes well enough that, suddenly, your demo is expected to become a production application?</p></li><li><p><strong>The Rendezvous:</strong> A quick look at upcoming SRE, CloudNative, and Python events in Salt Lake City, London, and Rapperswil.</p></li></ul><p>Before you continue, if you enjoy my work and would like to support the newsletter, I&#8217;d really appreciate it if you shared it with a fellow engineer:</p><p style="text-align: center;"><strong><a href="https://wa.me/?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#128154; On WhatsApp</a></strong> | <strong><a href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/">&#128153; On LinkedIn</a></strong> | <strong><a href="https://bsky.app/intent/compose?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#129653; Bluesky</a></strong></p><p>Or simply forward this email to someone who might find it useful.</p><p>Thanks, as always, for reading.</p><h2>The Read-Only Memory</h2><p>Do you know who <strong>Donald E. Knuth</strong> is?</p><blockquote><p>Donald Ervin Knuth is an American computer scientist and mathematician. He is a professor emeritus at Stanford University. He is the 1974 recipient of the ACM Turing Award, informally considered the Nobel Prize of computer science.[4] Knuth has been called the &#8220;father of the analysis of algorithms&#8221;.</p></blockquote><p>But that&#8217;s not the main reason why I mention Donald today. Watch this out!I found on his <a href="https://www-cs.stanford.edu/~knuth/books.html">Standfor&#8217;s web page</a> that <strong>Knuth personally pays $2.56 to anyone who finds a genuine error in his books</strong>. It is not merely a symbolic reward; he has maintained the system for decades and publishes lists of errors so that readers can verify them. There is something highly unusual for an academic of his stature in publicly turning his own mistakes into an opportunity for others to contribute.</p><p><strong>Who would you say NEVER would do that from the nowadays technology spectrum?</strong> Write it in a comment!</p><div><hr></div><p>In this section, we will focus on biographies of computer pioneers, forgotten historical whitepapers that remain entirely relevant, and independent blog posts that question the status quo of our industry.</p><p><strong>Would you like to suggest some?</strong> I hear you! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have something for you!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have something for you!</span></a></p><h2>The Open Thread Club</h2><p>Today&#8217;s topic on The Open Thread Club, I think, is happening in those companies where innovation is the goal of the company. Lately, I've read about many &#8220;AI Labs&#8221; created either as a whole company or as dedicated/supperpowered group/team.</p><blockquote><p>How to build a quick prototype that everybody knows will be declared <em>production-ready</em> just after the demo?</p><p><em>&#8212; Anonymous streessed developer</em></p></blockquote><p>That question summarizes the question that arrived in my mailbox a couple of months ago.</p><p>This developer told me, in detail:</p><blockquote><ul><li><p><em>We have to develop an AI-based project and demo it to the C-Level board.</em></p></li><li><p><em>We need several apps to make this happen.</em></p></li><li><p><em>We have a very demanding timeline to deliver value.</em></p></li><li><p><em>My concern is that if we build these apps without a minimum level of testing and CI/CD, and the project proves its value, we could end up in trouble when we need to iterate and make it production-ready because of the technical debt we&#8217;ve accumulated.</em></p></li></ul></blockquote><p>First, did you face the situation when a prototype becomes <em>automagically</em> into a production-ready product just because the C-Level member (you choose) says so? Because this is the case of this person.</p><p>Second, do not try to fight that situation: you will fail. Instead, you can do something else.</p><p><strong>&#128214; My take</strong><span>: Do implement those minimal tests and the complete CI/CD, even if your requirements say &#8220;do not </span><em><span>lose</span></em><span> time on that&#8221;. You are a developer accountable for the work you do and, as such, you have to ensure you put in place </span><em><span>the right</span></em><span> quality to ensure the success of your apps.</span></p><p><span>Depending on the project, </span><em><span>the right</span></em><span> level of X is different. </span><strong>When you work on a project like the one described</strong>:</p><ol><li><p>You will avoid too many tests and <strong>focus on the happy path</strong> to ensure that your next changes do not <em>f*ck up</em> the app.</p></li><li><p>You will implement the <strong>automatic CI/CD</strong> run. For me, the automation is included in the minimum. Why? You need speed to deliver new versions of your app fast, and the automation gives you precisely that.</p></li></ol><p>Hope this helps!</p><div><hr></div><p>In this space, we will address real dilemmas about architecture, technical friction, or leadership situations you send anonymously.</p><p>Instead of giving theoretical or dogmatic answers, I will respond with honesty, sharing my own past mistakes in similar situations and the lessons I took away when trying to solve them.</p><p><strong>You can start participating RIGHT NOW!</strong> Click the button below and tell me your story so I can answer in the next issue &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have a tale to share!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have a tale to share!</span></a></p><h2>The Rendezvous</h2><ul><li><p><strong><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/">KubeCon &amp; CloudNativeCon North America 2026</a></strong>. KubeCon is one of my favourites, and it&#8217;s coming next <strong>November 9th to 12th in Salt Lake City, Utah</strong>.</p></li><li><p>If you&#8217;re in an SRE role, this is for you. In London, the <strong><a href="https://www.iqpc.com/events-observability-sre-summit">Observability and SRE Summit</a></strong> will happen on <strong>21st and 22nd of October</strong>.</p></li><li><p>For those Python lovers in Europe, the <strong><a href="https://www.python-summit.ch/">Swiss Python Summit</a></strong> will happen in <strong>Rapperswil on October 22nd and 23rd</strong>.</p></li></ul><p>If you go to some of those, tell us how it goes!</p><div><hr></div><p><strong>A radar of events about software engineering and technical leadership</strong>.</p><p>The priority here is not to be exclusively massive conferences, but to give visibility to smaller, local encounters or emerging initiatives. If you are organizing a conference or know of an event worth sharing, the channel is open for you to send it to me and share it with the community.</p><p><strong>Do you own an event or summit?</strong> Drop me an email! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I know about an event!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!"><span>&#128231; I know about an event!</span></a></p><h2>The A-Side</h2><p>In the previous chapter, we introduced what SPDD is and the problem that it tries to solve.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:215843963,&quot;url&quot;:&quot;https://newsletter.optimistengineer.com/p/the-a-side-a-guide-to-spdd-what-is&quot;,&quot;publication_id&quot;:1659382,&quot;embedding_publication_id&quot;:1659382,&quot;publication_name&quot;:&quot;The Optimist Engineer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Rspq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c8c36d-e4b0-4695-b613-313d621c2839_392x392.png&quot;,&quot;title&quot;:&quot;[The A-Side] A Guide to SPDD: What is SPDD? Prompts as First-Class Artefacts (#166)&quot;,&quot;truncated_body_text&quot;:&quot;The industry is selling you a massive lie about AI coding assistants.&quot;,&quot;date&quot;:&quot;2026-09-15T16:44:28.795Z&quot;,&quot;like_count&quot;:4,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:40136239,&quot;name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&quot;,&quot;handle&quot;:&quot;optimistengineer&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!7roK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9211d7-f06d-4d11-b17c-4f1af3d2df5a_3264x1836.jpeg&quot;,&quot;bio&quot;:&quot;Senior Software Engineer and Tech Lead with 20+ years of experience. Currently building a SaaS product on a cloud-based microservices architecture. Previously worked at CERN managing OpenStack services in the IT CLOUD group.&quot;,&quot;profile_set_up_at&quot;:&quot;2023-01-08T14:02:25.595Z&quot;,&quot;reader_installed_at&quot;:&quot;2023-01-08T14:01:52.367Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:1634011,&quot;user_id&quot;:40136239,&quot;publication_id&quot;:1659382,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:1659382,&quot;name&quot;:&quot;The Optimist Engineer&quot;,&quot;subdomain&quot;:&quot;optimistengineer&quot;,&quot;custom_domain&quot;:&quot;newsletter.optimistengineer.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Experiences, learnings, and inspiration about Software Engineering, Technical Leadership, and Technical Growth, with a bit of optimism. Interesting for Tech Leads and software makers from Startups to medium-sized companies.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35c8c36d-e4b0-4695-b613-313d621c2839_392x392.png&quot;,&quot;author_id&quot;:40136239,&quot;primary_user_id&quot;:40136239,&quot;theme_var_background_pop&quot;:&quot;#FF9900&quot;,&quot;created_at&quot;:&quot;2023-05-14T13:09:39.984Z&quot;,&quot;email_from_name&quot;:&quot;Marcos F. Lobo from The Optimist Engineer&quot;,&quot;copyright&quot;:&quot;Marcos Ferm&#237;n Lobo&quot;,&quot;founding_plan_name&quot;:&quot;Founding Member&quot;,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false,&quot;logo_url_wide&quot;:null}},{&quot;id&quot;:5694045,&quot;user_id&quot;:40136239,&quot;publication_id&quot;:5582181,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:5582181,&quot;name&quot;:&quot;AI Native Compass&quot;,&quot;subdomain&quot;:&quot;ainativecompass&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;From Cloud Native to AI Native&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ab8b593-88fd-4bc6-950d-c7b3599879c7_600x600.png&quot;,&quot;author_id&quot;:40136239,&quot;primary_user_id&quot;:null,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2025-07-08T12:01:09.632Z&quot;,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Marcos F. Lobo &#128507;&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:&quot;en&quot;,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false,&quot;logo_url_wide&quot;:null}},{&quot;id&quot;:5694077,&quot;user_id&quot;:40136239,&quot;publication_id&quot;:5582213,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:5582213,&quot;name&quot;:&quot;Br&#250;jula AI Native&quot;,&quot;subdomain&quot;:&quot;ainativebrujula&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;De Cloud Native a AI Native&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37991e0c-0d09-4a6e-96a7-ed0d54ce069b_600x600.png&quot;,&quot;author_id&quot;:40136239,&quot;primary_user_id&quot;:null,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2025-07-08T12:04:50.514Z&quot;,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Marcos F. Lobo &#128507;&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:&quot;es&quot;,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false,&quot;logo_url_wide&quot;:null}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;status&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:1,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:{&quot;type&quot;:&quot;subscriber&quot;,&quot;tier&quot;:1,&quot;accent_colors&quot;:null},&quot;subscriber&quot;:null}}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;,&quot;source&quot;:null}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://newsletter.optimistengineer.com/p/the-a-side-a-guide-to-spdd-what-is?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web&amp;embedding_publication_id=1659382"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!Rspq!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c8c36d-e4b0-4695-b613-313d621c2839_392x392.png" loading="lazy"><span class="embedded-post-publication-name">The Optimist Engineer</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">[The A-Side] A Guide to SPDD: What is SPDD? Prompts as First-Class Artefacts (#166)</div></div><div class="embedded-post-body">The industry is selling you a massive lie about AI coding assistants&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">21 days ago &#183; 4 likes &#183; Marcos F. Lobo &#128507;&#129517;</div></a></div><p>Now, we go a bit deeper.</p><h2>&#128269; Why Analysis Comes Before the Canvas</h2><p>There is another important distinction in SPDD that is easy to miss.</p><p>The workflow does not necessarily go directly from requirements to the REASONS Canvas. There is an <strong>analysis step</strong> in between. Why?</p><p>&#9757;&#127996; Because before deciding how to change a system, w<strong>e need to understand the system we already have</strong>.</p><p>The analysis step examines relevant parts of the codebase and domain, identifies concepts, dependencies, risks, and possible design directions, and uses that information to create the context for the structured prompt.</p><p>A useful way to think about the distinction is:</p><blockquote><p><strong>Analysis asks: &#8220;What do we know about the problem and the existing system?&#8221;</strong></p><p><strong>REASONS asks: &#8220;Given that understanding, what exactly are we going to build?&#8221;</strong></p></blockquote><p>This separation is important because otherwise it would be very easy to ask an LLM to design a solution without giving it enough knowledge about the system it is changing.</p><p>And that is exactly the type of situation where AI assistants can confidently produce technically valid but contextually wrong solutions.</p><h2>&#128477;&#65039; The SPDD Workflow</h2><p>The exact commands depend on the tooling, but the OpenSPDD implementation provides a useful concrete representation of the SPDD workflow.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sr5-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sr5-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png 424w, https://substackcdn.com/image/fetch/$s_!sr5-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png 848w, https://substackcdn.com/image/fetch/$s_!sr5-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png 1272w, https://substackcdn.com/image/fetch/$s_!sr5-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sr5-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png" width="1456" height="1189" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1189,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:357159,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.optimistengineer.com/i/216168476?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.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_!sr5-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png 424w, https://substackcdn.com/image/fetch/$s_!sr5-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png 848w, https://substackcdn.com/image/fetch/$s_!sr5-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.png 1272w, https://substackcdn.com/image/fetch/$s_!sr5-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aaabc96-98ae-49d7-b0ab-0609a8f11321_2053x1676.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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 core flow is roughly:</p><pre><code><code>Business requirement
        &#8595;
     Analysis
        &#8595;
  REASONS Canvas
        &#8595;
 Code generation
        &#8595;
 Validation / tests
        &#8595;
 Human review
        &#8595;
     Sync
        &#8634;</code></code></pre><p>OpenSPDD currently provides commands for the main steps:</p><p><code>/spdd-analysis</code></p><p>Analyzes the requirement and relevant parts of the existing codebase.</p><p>The goal is to understand domain concepts, current implementation, risks, and possible design directions.</p><p><code>/spdd-reasons-canvas</code></p><p>Turns that understanding into the structured REASONS Canvas.</p><p>This is where requirements, entities, approach, structure, operations, norms, and safeguards are made explicit.</p><p><code>/spdd-generate</code></p><p>Uses the Canvas to generate code task by task.</p><p>The idea is that the model is no longer improvising the whole solution from a short prompt. It is executing a more explicit implementation plan.</p><p><code>/spdd-prompt-update</code></p><p>Used when the <strong>requirement or intended behavior changes</strong>.</p><p>This is an important distinction.</p><p>If we discover that the business requirement was wrong or incomplete, the intent should change first.</p><p>That gives us:</p><pre><code><code>Requirement change
        &#8595;
Prompt update
        &#8595;
Code update</code></code></pre><p><code>/spdd-sync</code></p><p>Used when the <strong>implementation changes without changing the intended behavior</strong>, for example because of a refactoring or implementation-level correction.</p><p>That produces the reverse direction:</p><pre><code><code>Code change
        &#8595;
Sync
        &#8595;
Prompt updated</code></code></pre><p>OpenSPDD currently also provides optional commands such as <code>/spdd-story</code>, <code>/spdd-api-test</code>, <code>/spdd-code-review</code>, and <code>/spdd-reverse</code>, but they are not the core of the workflow.</p><p>The important part is therefore not memorizing the commands.</p><p>The important part is understanding the loop.</p><h2>&#128260; The Interesting Part: Prompt &#8596; Code</h2><p>For me, this is the part that makes SPDD more interesting than a sophisticated prompt template.</p><p><strong>The relationship between intent and implementation works in both directions</strong>.</p><h3>When behavior changes</h3><p>Suppose the original requirement was:</p><blockquote><p>Premium customers can exceed their monthly usage quota.</p></blockquote><p>Later, the business changes its mind.</p><p>Now Premium customers must also respect a quota.</p><p>That is a <strong>behavior change</strong>.</p><p>The intent has changed, so we update the structured prompt first.</p><pre><code><code>New requirement
      &#8595;
Update REASONS Canvas
      &#8595;
Generate / modify code
      &#8595;
Review and test</code></code></pre><h3>When implementation changes</h3><p>Now suppose the behavior is still correct, but we refactor <code>BillingService</code> because we want to introduce a different internal abstraction.</p><p>&#9757;&#127996; That is an <strong>implementation change</strong>.</p><p>The intent has not changed.</p><p>We can therefore change the code first and synchronize the structured prompt afterwards.</p><pre><code><code>Refactoring
      &#8595;
Code changes
      &#8595;
Sync Canvas</code></code></pre><p>This distinction is one of the most useful ideas in SPDD.</p><ul><li><p>A behavior change means <strong>intent has changed</strong>.</p></li><li><p>A refactoring means <strong>implementation has changed while intent remains the same</strong>.</p></li></ul><p>If the code changes its behavior but the prompt does not reflect that change, the two artifacts are now telling different stories. That is effectively <strong>Prompt Debt</strong>.</p><p>And like technical debt, it may not hurt immediately. It tends to become expensive later, when someone uses the outdated artifact as the basis for the next change.</p><h2>&#128105;&#127995;&#8205;&#128187; What Changes for Engineers?</h2><p>This is where SPDD becomes more than an AI tooling discussion.</p><p>If AI becomes increasingly capable of writing implementation code, some engineering skills become even more important.</p><h3>1. Abstraction First</h3><p>Before asking AI to implement a feature, we need to understand the objects, boundaries, responsibilities, collaborations, and constraints involved.</p><p>The interesting engineering question becomes less:</p><blockquote><p>&#8220;Can I write this class?&#8221;</p></blockquote><p>and more:</p><blockquote><p>&#8220;Should this responsibility exist here in the first place?&#8221;</p></blockquote><p>That is not a new software engineering skill.</p><p>AI simply makes it more visible.</p><h3>2. Alignment</h3><p>Someone still needs to define what the system should do, what it should not do, and which constraints cannot be violated.</p><p>SPDD makes those decisions explicit in the structured prompt.</p><p>The goal is to resolve important disagreements before implementation rather than discovering them after hundreds of generated lines have already been produced.</p><h3>3. Iterative Review</h3><p>AI-generated code still needs human review.</p><p>In fact, the more code generation becomes automated, the more important it becomes to have a disciplined review loop.</p><p>That does not necessarily mean reading every generated line with equal attention.</p><p>It means reviewing the right things at the right level:</p><ul><li><p>Does the implementation match the requirement?</p></li><li><p>Does the design fit the existing architecture?</p></li><li><p>Are the domain concepts correct?</p></li><li><p>Are the safeguards being respected?</p></li><li><p>Are the generated tests actually validating the intended behavior?</p></li></ul><p>SPDD tries to make that review easier by giving reviewers something to inspect before the implementation itself is generated.</p><h2>&#9878;&#65039; What SPDD Does, and What It Doesn&#8217;t</h2><p>There is a temptation to interpret a framework like this as a way to make AI-generated code predictable.</p><p>That would be going too far.</p><p>SPDD does not eliminate LLM uncertainty, and it does not guarantee architectural correctness or software quality.</p><p>The authors explicitly describe the goal as keeping the model&#8217;s non-determinism within more controllable boundaries rather than eliminating it altogether.</p><p>That distinction matters.</p><p>SPDD can make intent more explicit.</p><p>It can make design decisions easier to review.</p><p>It can make successful prompts reusable.</p><p>It can provide a mechanism for keeping those artifacts aligned with the implementation.</p><p>But humans still have to decide whether the requirements are correct, whether the architecture makes sense, whether the trade-offs are acceptable, and whether the resulting software actually works.</p><p>That is probably the most useful way to think about the methodology.</p><p>Alright! Wrapping up for today.</p><h2>&#10024; Takeaways</h2><p>What interests me about SPDD is not the prompt template itself.</p><p>We&#8217;ve been writing structured requirements, architecture documents, coding standards, design documents, checklists, and implementation plans for years.</p><p>The more interesting idea is the <strong>lifecycle</strong>.</p><p>Instead of:</p><pre><code><code>Requirement &#8594; Chat &#8594; Code &#8594; Done</code></code></pre><p>SPDD proposes something closer to:</p><pre><code><code>Requirement
    &#8595;
Understanding
    &#8595;
Analysis
    &#8595;
Structured design
    &#8595;
Implementation
    &#8595;
Validation
    &#8595;
Synchronization
    &#8634;</code></code></pre><p>The prompt becomes part of the engineering system.</p><p>It captures not only what we want to build, but also the reasoning, structure, constraints, and implementation decisions that guide the AI.</p><p>And because the artifact is kept alongside the code, that knowledge has a chance to survive the individual chat session, the individual developer, and the individual change.</p><p><strong>That is the part I want to experiment with</strong>.</p><p>Because perhaps the interesting shift in AI-assisted software development isn&#8217;t that machines are getting better at writing code.</p><p>Perhaps it is that engineers are going to spend more of their time deciding <strong>what the code should mean before asking a machine to write it</strong>.</p><p>And that brings us back to the original question:</p><blockquote><p><strong>What happens when generating code becomes faster than understanding it?</strong></p></blockquote><p>Frameworks like SPDD are an attempt to make sure our engineering process keeps up.</p><p>In the AI era, software development may become less of a contest of model IQ and more a question of how effectively engineers can use their cognitive bandwidth to define, review, and evolve the systems they are building.</p><p>Be safe,<br>Marcos.</p>]]></content:encoded></item><item><title><![CDATA[[The A-Side] A Guide to SPDD: What is SPDD? Prompts as First-Class Artefacts (#166)]]></title><description><![CDATA[The industry is selling you a massive lie about AI coding assistants.]]></description><link>https://newsletter.optimistengineer.com/p/the-a-side-a-guide-to-spdd-what-is</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-a-side-a-guide-to-spdd-what-is</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Tue, 15 Sep 2026 16:44:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zR0g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The industry is selling you a massive lie about AI coding assistants.</p><p>They want you to believe that typing code faster automatically equals shipping products faster.</p><p>But local speed rarely translates to global throughput&#8230; <strong>unless you have a lot of money and the right framework</strong>.</p><p>Are you seeing your developers crank out code at record speeds while your actual release cycle remains stuck in the mud?</p><p>If you are a Tech Lead and you are looking to scale AI-generated code without sacrificing architectural integrity, then this email is for you.</p><p>We are stripping the magic away from these tools in <strong>The A-Side</strong>. I will show you how the SPDD framework turns disposable chats into first-class, version-controlled artifacts.</p><p>We need to stop treating prompts like used tissues.</p><p>And the rest of the stack is just as loaded:</p><ul><li><p><strong>The Read-Only Memory:</strong> Tim Berners-Lee and the radical 1993 decision to release the World Wide Web entirely for free.</p></li><li><p><strong>The Open Thread Club:</strong> A reader desperately needs help taming an exploding AI token budget.</p></li><li><p><strong>The Rendezvous:</strong> Upcoming developer summits in Bengaluru, Amsterdam, and Barcelona.</p></li></ul><p>Before continuing, if you like my work and you want to support it, I would appreciate it if you could share this newsletter with your peers via:</p><p style="text-align: center;"><strong><a href="https://wa.me/?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#128154; On WhatsApp</a></strong> | <strong><a href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/">&#128153; On LinkedIn</a></strong> | <strong><a href="https://bsky.app/intent/compose?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#129653; Bluesky</a></strong></p><p>Or just forward this email. Thanks in advance!</p><h2>The Read-Only Memory</h2><p>Today I bring you Tim Berners-Lee and his momentum when the World Wide Web was in place, and so a question came: </p><blockquote><p>how to spread this thing</p></blockquote><p>When the Web began to demonstrate its potential, he and his collaborator Robert Cailliau seriously considered the possibility of <strong>starting a company and charging for its use</strong>. </p><p>They even discussed various business models, but faced a problem: <strong>the experience with Gopher had shown</strong> that charging royalties could hinder the adoption of a technology still trying to take off, and that turning the Web into a commercial product could lead to the emergence of incompatible, fragmented versions. </p><p>Ultimately, they reached a conclusion unusual for creators of something with such immense economic potential: they were more interested in building something useful than in getting rich. </p><p>CERN finally opted to release the technology royalty-free on April 30, 1993, allowing anyone to use and develop it. Refs [<a href="https://home.cern/twenty-years-free-and-open-www/">1</a>], [<a href="https://www.w3.org/blog/2023/30th-anniversary-of-licensing-the-web-for-general-use-and-at-no-cost">2</a>]</p><p>I want to reinforce this sentence:</p><blockquote><p>[&#8230;] They were more interested in building something useful than in getting rich. [&#8230;]</p></blockquote><p><strong>Can you imagine that nowadays?</strong> I read you in the comments or replying this email.</p><div><hr></div><p>In this section, we will focus on biographies of computer pioneers, forgotten historical white papers that remain entirely relevant, and independent blog posts that question the status quo of our industry.</p><p><strong>Would you like to suggest some?</strong> I hear you! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have something for you!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have something for you!</span></a></p><h2>The Open Thread Club</h2><p>The following topic arrived quite soon in my inbox (as expected):</p><blockquote><p>My company wanted me and my team mates to waste money in AI as much as possible, so we did. Now, that the cost is higher than they expected, they want us to reduce the cost. I want to reduce the cost but not the usage</p><p><em>&#8212; Anonymous cost reducer</em></p></blockquote><p>This is a hot topic in my opinion. Reading on <a href="https://bsky.app/profile/marcosflobo.com">Bluesky</a>, I find many people struggling with this. <strong>Do you feel identified with this?</strong><span> I do. Would you have a take on this for our </span><em>Anonymous cost reducer</em><span> reader? Share it in the comments!</span>.</p><p><strong>&#128214; My take</strong>: The first thing I did was <strong><a href="https://github.com/rtk-ai/rtk">install rtk tool to save tokens</a></strong>. It actually works for me.</p><p>Second, I <strong>use Haiku by default</strong> (I&#8217;m using Claude Code), and I just switch to Sonnet when I want the plan and iterate over it. Opus is just for really complicated plans. Fable when I&#8217;m ending the month&#8230; and I still have budget :).</p><p>Just with that, I managed to keep my money burning under control.</p><p><strong>Any other tip you may have?</strong> Share it by replying to this email!</p><div><hr></div><p>In this space, we will address real dilemmas about architecture, technical friction, or leadership situations sent anonymously by you.</p><p>Instead of giving theoretical or dogmatic answers, I will respond with honesty, sharing my own past mistakes in similar situations and the lessons I took away when trying to solve them.</p><p><strong>You can start participating RIGHT NOW!</strong> Click the button below and tell me your story so I can answer in the next issue &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have a tale to share!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have a tale to share!</span></a></p><h2>The Rendezvous</h2><p>This week I bring you conferences in India, Europe, and the US.</p><ul><li><p>For you, reading from Bengaluru (India), <strong><a href="https://www.opensourceindia.in/">Open Source India 2026</a></strong>, happening on <strong>October 7th and 8th</strong>.</p></li><li><p>In Amsterdam (Netherlands), the <strong><a href="https://dev.events/conferences/world-summit-ai-2026-lakaptqg">World Summit AI 2026</a></strong> is coming on <strong>October 9th and 10th</strong>.</p></li><li><p>And for those RUST lovers, the <strong><a href="https://eurorust.eu/">EuroRust 2026</a></strong> will happen in Barcelona (Spain) and online from <strong>October 14th to 17th</strong>,</p></li></ul><div><hr></div><p><strong>A radar of events about software engineering and technical leadership</strong>.</p><p>The priority here is not to be exclusively massive conferences, but to give visibility to smaller, local encounters or emerging initiatives. If you are organizing a conference or know of an event worth sharing, the channel is open for you to send it to me and share it with the community.</p><p><strong>Do you own an event or summit?</strong> Drop me an email! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I know about an event!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!"><span>&#128231; I know about an event!</span></a></p><h2>The A-Side</h2><p>Are you seeing your developers <em>crank out code</em> at record speeds while your actual release cycle remains stuck in the mud?</p><p>Maybe that question is too <em>drastic</em>; I know. My point there is:</p><blockquote><p>How can we make our work with prompts more effective?</p></blockquote><p>PDD wants to ensure that as we scale AI-generated code, we don&#8217;t sacrifice quality or architectural integrity.</p><p><strong>&#9757;&#127996; Disclaimer</strong>: I have not tried this methodology yet. This is a summary of the framework, so you can get up to speed on this trend and give it a try.</p><p>Let&#8217;s go.</p><h2>&#127919; The Problem</h2><p>Individual coding speed is rarely the true bottleneck in the software delivery lifecycle. When teams adopt AI assistants without a framework, they often hit four friction points that kill throughput:</p><ul><li><p><strong>Ambiguous Requirements:</strong> Misunderstandings are turned into code faster, scaling the impact of every error.</p></li><li><p><strong>Review Fatigue:</strong> Pull requests become massive and frequent, making architectural inconsistencies harder to spot. For me, today, this is a huge impact.</p></li><li><p><strong>Integration Issues:</strong> <em>Generated</em> code does not automatically mean <em>aligned</em> code, leading to frequent testing failures.</p></li><li><p><strong>Production Risk:</strong> Reasoning about the risk of a change becomes nearly impossible as the volume of unmapped code rises.</p></li></ul><p>It&#8217;s like buying a Ferrari and driving it on muddy roads: the engine is powerful, but road conditions and traffic determine your arrival time.</p><p>Here is where this SPDD framework comes.</p><h2>&#128105;&#127997;&#8205;&#128187; What is SPDD? Prompts as First-Class Artifacts</h2><p>SPDD is an engineering method that treats prompts as version-controlled, reviewed, and reused assets.</p><p>Nice definition, right? Let&#8217;s dive in a bit</p><p>&#128073;&#127996; <strong>Instead of relying on disposable chats, teams use structured prompts to capture requirements, domain language, and design intent</strong>.</p><p>The backbone of this method is the <strong>REASONS Canvas</strong>, which guides the AI from high-level intent to concrete execution.</p><p><strong>Abstract parts (intent &amp; design)</strong></p><ul><li><p>R &#8212; Requirements: What problem are we solving, and what is DoD?</p></li><li><p>E &#8212; Entities: Domain entities and relationships.</p></li><li><p>A &#8212; Approach: The strategy of how we&#8217;ll meet the requirements.</p></li><li><p>S &#8212; Structure: Where the change fits in the system; components and dependencies.</p></li></ul><p><strong>Specific parts (execution)</strong></p><ul><li><p>O &#8212; Operations: Break the abstract strategy into concrete, testable implementation steps.</p></li></ul><p><strong>Common standards parts (governance)</strong></p><ul><li><p>N &#8212; Norms: Cross-cutting engineering norms (naming, observability, defensive coding, etc.).</p></li><li><p>S &#8212; Safeguards: Non-negotiable boundaries (invariants, performance limits, security rules, etc.).</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zR0g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zR0g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png 424w, https://substackcdn.com/image/fetch/$s_!zR0g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png 848w, https://substackcdn.com/image/fetch/$s_!zR0g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png 1272w, https://substackcdn.com/image/fetch/$s_!zR0g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zR0g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!zR0g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png 424w, https://substackcdn.com/image/fetch/$s_!zR0g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png 848w, https://substackcdn.com/image/fetch/$s_!zR0g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png 1272w, https://substackcdn.com/image/fetch/$s_!zR0g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ee16989-3410-4d47-aed9-ba9158203f76_697x1860.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">REASONS Canvas</figcaption></figure></div><p>SPDD enforces a &#8220;closed-loop&#8221; rule: when reality diverges or requirements change, you must fix the prompt first. This ensures the prompt remains the source of truth for the system&#8217;s logic.</p><p>&#9757;&#127996; <strong>Warning:</strong> Prompts are not tissues; don&#8217;t <em>toss</em> them after one use.</p><p>This is it for today&#8217;s issue. <strong>Next week, you will receive in your inbox the second part that completes</strong> this series: <strong>The SPDD Workflow: From Story to Code</strong>.</p><p>Be safe,<br>Marcos. </p>]]></content:encoded></item><item><title><![CDATA[[The A-Side] From Junior to Tech Lead: Act Like the Role Before You Get the Title (#165)]]></title><description><![CDATA[Adaptability, real-world impact, and visible metrics: The practical blueprint for non-linear engineering growth]]></description><link>https://newsletter.optimistengineer.com/p/the-a-side-from-junior-to-tech-lead</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-a-side-from-junior-to-tech-lead</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Thu, 10 Sep 2026 16:29:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/732e98cd-3fda-4e5b-99cd-7e27af19370a_572x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi ,</p><p><strong>Welcome to this very first issue of The Optimist Engineer with the new format.</strong></p><p>How many times have you been fed the lie that growing in tech is just a matter of accumulating years of experience?</p><p>The truth is that waiting quietly in your chair for someone to notice your hard work is a one-way ticket to career stagnation.</p><p>If you are a software engineer and you are looking to take control of your career path and actually land that next promotion, then <strong>this email is for you</strong>.</p><p>For <strong>The A-Side</strong> today, I am sharing the core strategies that truly drive professional success in our industry. We will break down exactly how to act for the role before you get the title and how to make your real-world impact undeniable with hard numbers.</p><p>That is just the start. Also in this edition:</p><ul><li><p><strong>The Read-Only Memory:</strong> Ada Lovelace&#8217;s forgotten attempt to design a steam-powered flying machine.</p></li><li><p><strong>The Open Thread Club:</strong> My take on surviving environments where management claims <em>every</em> task is a top priority.</p></li><li><p><strong>The Rendezvous:</strong> Upcoming tech events to put on your radar in Oslo, Bern, and Madrid.</p></li></ul><p><strong>&#128073;&#127996; I leave here a short survey to get your feedback about this new format.</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://forms.gle/iL7wnrmef97v3dhZ8&quot;,&quot;text&quot;:&quot;&#128203; I'll answer the survey!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://forms.gle/iL7wnrmef97v3dhZ8"><span>&#128203; I'll answer the survey!</span></a></p><p>Before continuing, if you like my work and you want to support it, I would appreciate it if you could share this newsletter with your peers via:</p><p style="text-align: center;"><strong><a href="https://wa.me/?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#128154; On WhatsApp</a></strong> | <strong><a href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/">&#128153; On LinkedIn</a></strong> | <strong><a href="https://bsky.app/intent/compose?text=Hey,%20I%27m%20an%20Optimister%20now,%20do%20you%20want%20to%20learn%20real-life%20lessons%20for%20thriving%20in%20Software%20Engineering,%20Technical%20Leadership,%20and%20Technical%20Growth%0A%0AJoin%20us%20%F0%9F%91%87%F0%9F%8F%BB%20https%3A//newsletter.optimistengineer.com/">&#129653; Bluesky</a></strong></p><p>Or just forward this email. Thanks in advance!</p><h2>The Read-Only Memory</h2><p>You are probably familiar with Ada Lovelace&#8217;s biography.</p><blockquote><p><strong>Augusta Ada King, Countess of Lovelace</strong><span> (10 December 1815 &#8211; 27 November 1852), also known as </span><strong>Ada Lovelace</strong><span>, was an English </span>mathematician<span> and </span>writer<span> chiefly known for work on </span>Charles Babbage<span>'s proposed mechanical general-purpose </span>computer<span>, the </span>analytical engine<span>. She was the first to recognise the machine had applications beyond pure calculation. Lovelace is often considered the first </span>computer programmer<span>.</span></p><p><span>&#8212; </span><em><span>Wikipedia</span></em></p></blockquote><p>But you may not know that <strong>her first major technical project wasn&#8217;t a computer</strong>: she wanted to build a flying machine.</p><p>Around the age of 12 or 13, she became fascinated by the flight of birds.</p><p>She didn&#8217;t just say she wanted to fly. She studied bird anatomy, investigated how their wings worked, and even conceived of a steam-powered flying machine. She herself described the idea of &#8203;&#8203;building something that would allow her to travel directly over mountains and valleys.</p><p>The Computer History Museum preserves this story and connects it to what Ada would later call &#8220;poetical science&#8221;: the combination of imagination and science.</p><div><hr></div><p>In this section, we will focus on biographies of computer pioneers, forgotten historical whitepapers that remain entirely relevant, and independent blog posts that question the status quo of our industry.</p><p><strong>Would you like to suggest some?</strong> I hear you! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have something for you!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have something for you!</span></a></p><h2>The Open Thread Club</h2><p>Folks, in this very first edition of The Open Thread Club, a reader shared this just past Tuesday:</p><blockquote><p>I work in a job environment where priorities are piled up. I mean, it&#8217;s not like priorities change, but all priorities are top priority. Any advice for handling this situation? Thanks.</p><p>&#8212; <em>Anonyous.</em></p></blockquote><p>First, thanks to our Anonymous reader for sharing this. I could not imagine a better way to kickstart this section.</p><p>Second, <strong>do you feel identified with this?</strong> I do. Would you have a take on this for our <em>Anonymous</em> reader? Share it in the comments!</p><p><strong>&#128214; My take</strong>: There is not such a thing as &#8220;everything is TOP priority&#8221;.</p><p>&#9757;&#127996; Keep this in mind: not even for the person who asked you that. The person who asked you to have 2 sprints with 3 different priorities at the same time is not really expecting it, even though she/he will never acknowledge it.</p><p>&#128073;&#127996; What you have to do: Figure out <strong>what the most important priority is</strong>, what is the most impactful one; the one that brings the most value over the rest. <strong>That&#8217;s the one that you will prioritize for real</strong>. The rest will go later. Actually, what I used to do is rank them so that when I finish the first one, I know what to do next.</p><p>Let me know how it goes.</p><div><hr></div><p>In this space, we will address real dilemmas about architecture, technical friction, or leadership situations you send anonymously.</p><p>Instead of giving theoretical or dogmatic answers, I will respond with honesty, sharing my own past mistakes in similar situations and the lessons I took away when trying to solve them.</p><p><strong>You can start participating RIGHT NOW!</strong> Click the button below and tell me your story so I can answer in the next issue &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have a tale to share!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have a tale to share!</span></a></p><h2>The Rendezvous</h2><p>For this section, I received many emails since last Tuesday, when I announced the change in the format for the newsletter. <strong>Thank you all for the support!</strong></p><ul><li><p>Never went to this, but looks interesting: The <a href="https://ndcoslo.com/">NDC Oslo 2026</a> is happening <strong>from 14-18 September 2026 in Oslo</strong> (Norway).</p></li><li><p>Also on <strong>September 17th</strong>, the <a href="https://cloudnativeday.ch/">Swiss Cloud Native Day 2026</a> will happen <strong>in Bern</strong> (Switzerland). It&#8217;s always a good time to bring some great ideas (and chocolates) from Swiss people.</p></li><li><p>The GDG Madrid comes back from summer vacations with a new event &#8220;<strong><a href="https://gdg.community.dev/events/details/google-gdg-madrid-presents-liderazgo-equipos-y-desarrollo-con-ia/">Liderazgo, equipos y desarrollo con IA</a></strong>&#8221;. Not sure if it will be in English too. Coming next <strong>September 22nd in Madrid</strong> (Spain).</p></li></ul><div><hr></div><p>The priority here is not to be exclusively massive conferences, but to give visibility to smaller, local encounters or emerging initiatives. If you are organizing a conference or know of an event worth sharing, the channel is open for you to send it to me and share it with the community.</p><p><strong>Do you own an event or summit?</strong> Drop me an email! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I know about an event!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!"><span>&#128231; I know about an event!</span></a></p><h2>The A-Side</h2><p><span>How many times have you been told that growing in tech is just a matter of &#8220;accumulating years of experience&#8221;?</span></p><p><span>In The A-Side today, I want to share with you </span><strong><span>the core strategies that truly drive promotions and professional success in our industry</span></strong><span>, based on my own trajectory from junior to Tech Lead.</span></p><p><strong>&#128678; Let&#8217;s take a break here</strong>, so say something super important: If, after reading this article, you feel that you are <em>not able to act like that</em>, <strong>no worries, that&#8217;s ok</strong>. And I mean it. Take the reading as an informative article and DO NOT STRESS YOURSELF trying to become a person that you are not. There are other ways to achieve the same. Drop me a message if you want to discuss this.</p><p>Engage! &#128406;&#127996;</p><h3>&#127919; Act Before You Get the Title</h3><p><span>Here is a hard truth about scaling your career: nobody is going to come to your desk, tap your shoulder, and say:</span></p><blockquote><p><span>Bob, it&#8217;s time to become a Senior.</span></p></blockquote><p><span>If you want the next level, </span><strong><span>you have to start acting like you are already in that role</span></strong><span>.</span></p><p><span>Take ownership of technical decisions, help your teammates, and solve problems beyond your immediate tickets.</span></p><p><span>I know: it&#8217;s not an easy task, and maybe it&#8217;s not fair, but from my experience, I can tell you this is </span><em><span>a must-have</span></em><span>.</span></p><p>Now, acting like a Tech Lead sounds great on paper, but what makes someone actually stand out when they are starting?</p><h3>&#128105;&#127997;&#8205;&#128187; Adaptability and Real-World Impact</h3><p><span>When hiring or evaluating junior engineers, nobody is checking if you can memorize textbook algorithms. What senior leaders look for is </span><strong><span>openness to change</span></strong><span>.</span></p><p><span>If the company needs you to move from Java to Rust or adopt a new AI tool tomorrow, your answer should be:</span></p><blockquote><p><span>I&#8217;m ready to learn.</span></p></blockquote><p>I know (again): It can sound like it&#8217;s not fair&#8230; and it&#8217;s not, but that&#8217;s the spirit that the majority of startups look for in Junior profiles.</p><p>You have the right mindset and the technical drive. But there is a silent career killer that holds back even the most talented engineers.</p><h3>&#128477;&#65039; Make Your Work Visible (Numbers Matter)</h3><p><span>In a growing tech company, your manager does not have time to track every single line of code you write.</span></p><p><strong><span>If you don&#8217;t communicate your impact, it simply didn&#8217;t happen</span></strong><span>.</span></p><p><span>&#129488; Bring data to your 1-on-1s:</span></p><ul><li><p><span>&#8220;I reduced infrastructure costs by 12% with this optimization&#8221;.</span></p></li><li><p><span>&#8220;We reduced production bugs dramatically after implementing automated testing in our pipeline&#8221;.</span></p></li></ul><p><span>Soft skills and clear communication will take you further than pure syntax.</span></p><p>You now have the exact mindset to take control of your career path. Let&#8217;s wrap up for today!</p><h3>&#10024; Takeaways</h3><ul><li><p><strong><span>Don&#8217;t wait for permission:</span></strong><span> Act as the role you want before you receive the title.</span></p></li><li><p><strong><span>Be adaptable:</span></strong><span> Mindset and willingness to learn beat stack loyalty every single time.</span></p></li><li><p><strong><span>Own your visibility:</span></strong><span> Measure your impact with numbers and present it to your manager.</span></p></li></ul><p><span>&#9757;&#127996; Remember: Software engineering is not just about writing code; it&#8217;s about solving real problems and driving value.</span></p><p>What is the biggest challenge holding you back from stepping into your next career level right now?</p><p><strong>Drop a message in the comments or reply to this email</strong>; I read and reply to all!</p><p>Be safe,<br>Marcos.</p>]]></content:encoded></item><item><title><![CDATA[The Optimist Engineer V2]]></title><description><![CDATA[Evolution from a blog-like approach to a printed newsletter from the eighties.]]></description><link>https://newsletter.optimistengineer.com/p/the-optimist-engineer-v2</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-optimist-engineer-v2</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Tue, 08 Sep 2026 16:29:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d14de6c7-b3b7-494d-ad2e-936b8f6a2755_1966x1248.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Dear reader,</p><p>As the saying goes:</p><blockquote><p>Everything changes.</p></blockquote><p>I think you will love this change.</p><p>For a long time, <strong>The Optimist Engineer has been a weekly conversation in the form of a single-topic essay.</strong> We have delved into design patterns, technical pragmatism, architecture debt, and the lights and shadows of leadership.</p><p>However, if building systems teaches us anything, it is that rigidity is the first symptom of obsolescence.</p><p>To provide more complete value and make this community more participatory, the newsletter is evolving into a renewed structure with four distinct blocks.</p><h2>The Read-Only Memory (ROM)</h2><p><strong>We will leave the usual suspects aside to explore readings with a different perspective</strong>.</p><p>In this section, we will focus on biographies of computer pioneers, forgotten historical whitepapers that remain entirely relevant, and independent blog posts that question the status quo of our industry.</p><p><strong>Would you like to suggest some?</strong> I hear you! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have something for you!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=The%20Read-Only%20Memory%20-%20new%20mention&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20mention%20for%20the%20%22The%20Read-Only%20Memory%22%20section%20of%20your%20newsletter%3A%0D%0A%0D%0A%5Bwrite%20here%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have something for you!</span></a></p><h2>The Open Thread Club</h2><p><strong>Software development does not happen in a sterile environment, and team dynamics rarely follow an algorithm</strong>.</p><p>In this space, we will address real dilemmas about architecture, technical friction, or leadership situations sent anonymously by you.</p><p>Instead of giving theoretical or dogmatic answers, I will respond with honesty: sharing my own past mistakes in similar situations and the lessons I took away when trying to solve them.</p><p><strong>You can start participating RIGHT NOW!</strong> Click the button below and tell me your story so I can answer in the next issue &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I have a tale to share!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=The%20Open%20Thread%20Club%20-%20new%20tale&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20share%20with%20you%20a%20new%20tale%20for%20the%20%22The%20Open%20Thread%20Club%22%3A%0D%0A%0D%0A%5Byour%20story%5D%0D%0A%0D%0AThank%20you!"><span>&#128231; I have a tale to share!</span></a></p><h2>The Rendezvous</h2><p><strong>A radar of events about software engineering and technical leadership</strong>.</p><p>The priority here will not be exclusively massive conferences, but giving visibility to smaller, local encounters or emerging initiatives. If you are organizing a conference or know an event worth sharing, the channel is open for you to send it to me and share it with the community.</p><p><strong>Do you own an event or summit?</strong> Drop me an email! &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!&quot;,&quot;text&quot;:&quot;&#128231; I know about an event!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=The%20Rendezvous%20-%20new%20event&amp;body=Hello%20Marcos%2C%0D%0A%0D%0AI%20woud%20like%20to%20share%20with%20you%20the%20event%20named...%0D%0A%0D%0AThank%20you!"><span>&#128231; I know about an event!</span></a></p><h2>The A-Side</h2><p><strong>The heart of the newsletter remains untouched</strong>.</p><p>It will continue to be the weekly thematic article where we keep diving into architecture, design principles, and technical culture with the usual analytical and pragmatic approach.</p><p><strong>So, what&#8217;s next?</strong></p><p><strong>Next Thursday, Sep 10th, you will receive the first issue with this new format</strong> together with a poll, which I would love for you to take part in so I can understand your feedback on the new format.</p><p>This change does not seek to add noise, but to build a richer, more transparent, and useful space for everyone.</p><p><strong>What do you think about this change?</strong> leave a comment or drop me an email!</p><p>Be safe,<br>Marcos.</p>]]></content:encoded></item><item><title><![CDATA[🌊 Summertime is here 2026 - get rest]]></title><description><![CDATA[August will be entirely for resting and recharging energy. You must do as well.]]></description><link>https://newsletter.optimistengineer.com/p/summertime-is-here-2026-get-rest</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/summertime-is-here-2026-get-rest</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 05 Aug 2026 16:50:28 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c5e5d199-d129-43a5-8a6a-21868cb0d881_2048x1542.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Dear reader,</p><p>As usual, I take the whole of August to rest and recharge my batteries.</p><p><strong>This means that you should not expect new issues during this month</strong>.</p><p>On this ocassion, I will not write here the list of the TOP issues at this point. Why?</p><p><strong>I really wish you could get some rest and disconnect for a while</strong>.</p><p>In recent years, I have seen more people getting into trouble with stress, cognitive load, and burnout.</p><p><strong>I don&#8217;t want that for you</strong>. I want you to be as healthy as possible, so I want to make my contribution.</p><p>In exchange, I'll tell you my trick when I get 2 weeks of PTO:</p><ol><li><p>Put the laptop in the backpack.</p></li><li><p>And put the backpack in the closet/wardrobe/locker.</p></li></ol><p>Do it and thank me later &#128521;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MzqU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MzqU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MzqU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MzqU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MzqU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MzqU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg" width="1456" height="1096" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1096,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:490207,&quot;alt&quot;:&quot;La Griega beach, Asturias (Spain) - Photo: Pedro Men&#233;ndez&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.optimistengineer.com/i/209809945?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="La Griega beach, Asturias (Spain) - Photo: Pedro Men&#233;ndez" title="La Griega beach, Asturias (Spain) - Photo: Pedro Men&#233;ndez" srcset="https://substackcdn.com/image/fetch/$s_!MzqU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MzqU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MzqU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MzqU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f125f2b-9b68-48bf-a775-92ca137aefa9_2048x1542.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">La Griega beach, Asturias (Spain) - Photo: Pedro Men&#233;ndez https://www.flickr.com/photos/40738592@N00/4599215469/</figcaption></figure></div><p>Enjoy.</p><p>Best,<br>Marcos.</p>]]></content:encoded></item><item><title><![CDATA[Building an Enterprise MCP Platform - Vol. III: Ironclad Access & Security]]></title><description><![CDATA[Tackling the critical challenges of authentication, authorization, and secure governance for internal AI protocol servers at scale.]]></description><link>https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform-594</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform-594</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Tue, 04 Aug 2026 16:16:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8d86016a-4c6f-4e01-965f-72d001464e62_1408x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>The world, the place you live in, is the sick place. Seahaven is the way the world should be.</p><p><em>&#8212; Cristof, The Truman Show</em></p></blockquote><p>A safe place is important in technology as well, and you cannot ask every single user to implement security on their own.</p><blockquote><p>Previously on Building an Enterprise MCP Platform...</p></blockquote><p>We&#8217;ve built the foundation. Before we tackle how to lock down and secure our platform today, let&#8217;s quickly review the core decisions we&#8217;ve made so far:</p><ul><li><p><strong><a href="https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform">Vol. I (Deployment) - The Where</a></strong>: We escaped the localhost trap by moving MCP servers to the cloud. We mapped out our compute options, choosing AWS Fargate for low-latency, persistent SSE connections, and AWS Lambda for sporadic, stateless utility tools.</p></li><li><p><strong><a href="https://open.substack.com/pub/optimistengineer/p/building-an-enterprise-mcp-platform-67e?r=nw9bj&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcomeOnShare=true">Vol. II (Delivery) - The How</a></strong>: We automated the journey. We chose Docker to guarantee execution consistency and used Crossplane (or CI/CD pipeline wrappers) to abstract away the cloud infrastructure, letting developers ship code through simple, reusable YAML interfaces.</p></li></ul><p>In today&#8217;s email, you will get the answer to the ultimate production question: <strong>How do we control who is actually allowed to talk to them?</strong></p><p>If you are a Software Engineer trying to understand the main challenges at the time of <strong>deploying MCP Servers in Production</strong>, <strong>this email is for you</strong>. Know someone who might be interested in this topic? Forward them the email &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform-594?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform-594?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>Let&#8217;s continue with the last topic: <strong>Security</strong></p><p><strong>You have to implement a single point where all the requests are authenticated through your Identity Provider</strong> (a.k.a. IDP).</p><p>You should not put that responsibility on the developers of the MCP Servers.</p><ul><li><p>Developers should take care of their MCP Server.</p></li><li><p>You take care of the platform where they deliver that value, including authentication.</p></li></ul><p>Please note that <strong>I say Authentication and not Authorization</strong>. In my approach, I decided to tackle Authentication only, leaving the possibility to the developers of the MCP Server to implement Authorization, if they want. Why do I do that?</p><ul><li><p>Simplicity. I wanted to keep the platform simple.</p></li><li><p>Ownership. Each developer/team could have different needs in terms of Authorization (they will get the JWT anyway).</p></li></ul><p>This is a decision you can make; Remember: tradeoffs.</p><p>Following the same pattern as before, <strong>you will have to implement an AWS Lambda function to act as an MCP Authentication</strong>, implementing the OAuth 2.1 protocol.</p><p>Below, you can see the architecture diagram, using AWS pieces.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W0Ws!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W0Ws!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png 424w, https://substackcdn.com/image/fetch/$s_!W0Ws!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png 848w, https://substackcdn.com/image/fetch/$s_!W0Ws!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png 1272w, https://substackcdn.com/image/fetch/$s_!W0Ws!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W0Ws!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png" width="1446" height="1996" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2279d366-99da-4684-a250-5b0665544930_1446x1996.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1996,&quot;width&quot;:1446,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:281669,&quot;alt&quot;:&quot;Authenticating access to MCP Servers in Production&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.optimistengineer.com/i/206190652?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Authenticating access to MCP Servers in Production" title="Authenticating access to MCP Servers in Production" srcset="https://substackcdn.com/image/fetch/$s_!W0Ws!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png 424w, https://substackcdn.com/image/fetch/$s_!W0Ws!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png 848w, https://substackcdn.com/image/fetch/$s_!W0Ws!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.png 1272w, https://substackcdn.com/image/fetch/$s_!W0Ws!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2279d366-99da-4684-a250-5b0665544930_1446x1996.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">Authenticating access to MCP Servers in Production</figcaption></figure></div><p>Even though I will not describe the OAuth 2.1 process, let me describe a bit the flow of that architecture diagram:</p><ul><li><p>The AI Client (Claude Code-alike) has an MCP Server configured, but not authenticated. So the authentication process needs to be executed and, for that, a concrete request.</p></li><li><p>That goes to your AWS CloudFront and from there to the Application Load Balancer. By the way, I picked an ALB, but it could be an AWS API Gateway; there is a small difference for our use case. If you want details about this decision, drop me an email or <strong><a href="https://bsky.app/profile/marcosflobo.bsky.social">reach out to me on Bluesky</a></strong>.</p></li><li><p>The request arrives at the MCP Authenticator, and from there the IDP that your company uses (such as OKTA, Keycloak, etc) will provide the information required by the AI Client to be able to authenticate against the IDP itself.</p></li><li><p>The AI Client authenticates against the IDP and then requests again to the MCP Authenticator, so this will provide, through the ID, a Token.</p></li><li><p>Once the AI Client has the token, the following requests will arrive at the MCP Server, with an authentication check in the middle.</p></li></ul><p>This way, <strong>you provide an authentication mechanism, transparent to the developers of the MCP Servers</strong>, so developers don&#8217;t need to implement by themself.</p><p><strong>The last part of this architecture</strong> is to have a way by which the users, a.k.a. the developers of the MCP Servers, can <strong>make their software available under this Authentication wall</strong>. For this, remember that your solution must satisfy the following:</p><ol><li><p><strong>Make your developers autonomous</strong>. This means that the owners of the MCP Servers must be autonomous in making their software available in your infrastructure.</p></li><li><p><strong>CI/CD</strong>. This means that the owners must work in CI/CD mode, so your solution should be designed for that from the heart. No dependencies with other repos or systems.</p></li><li><p><strong>Technology already known</strong>; don&#8217;t reinvent the wheel. This means that your solution should use a technology that is already familiar to your users, so they don&#8217;t have to make an extra effort to learn something else.</p></li></ol><p><strong>If you want to know the 2 options I implemented for this</strong>, drop me an email by clicking here &#128071;&#127995; and you will get it for free.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=Building%20an%20Enterprise%20MCP%20Platform%20-%20Vol.%20III%3A%20Ironclad%20Access%20%26%20Security&amp;body=Hey%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20know%20more%20about%20the%20options%20you%20implemented%20for%20making%20MCP%20Servers%20available%20in%20the%20infrastructure%20described%20in%20your%20newsletter%20issue%20entitled%20%22Building%20an%20Enterprise%20MCP%20Platform%20-%20Vol.%20III%3A%20Ironclad%20Access%20%26%20Security%22.%0D%0A%0D%0AThanks!&quot;,&quot;text&quot;:&quot;&#128231; I want to know more!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=Building%20an%20Enterprise%20MCP%20Platform%20-%20Vol.%20III%3A%20Ironclad%20Access%20%26%20Security&amp;body=Hey%20Marcos%2C%0D%0A%0D%0AI%20would%20like%20to%20know%20more%20about%20the%20options%20you%20implemented%20for%20making%20MCP%20Servers%20available%20in%20the%20infrastructure%20described%20in%20your%20newsletter%20issue%20entitled%20%22Building%20an%20Enterprise%20MCP%20Platform%20-%20Vol.%20III%3A%20Ironclad%20Access%20%26%20Security%22.%0D%0A%0D%0AThanks!"><span>&#128231; I want to know more!</span></a></p><p>Alright! Let&#8217;s close for today and the current series.</p><h2>&#10024; Takeaways</h2><p>Before you go, here is a quick summary of the core principles to keep in mind when securing your enterprise MCP platform:</p><ul><li><p><strong>Security belongs to the platform, not individual developers:</strong> Do not put the burden of authentication on MCP Server developers. Centralize it at the platform level to free up dev teams and ensure consistent security standards across the organization.</p></li><li><p><strong>Authentication <span>!=</span> Authorization:</strong> Decoupling authentication from authorization keeps the platform architecture simple. Handle authentication centrally via OAuth 2.1 and your Identity Provider (Okta, Keycloak, etc.), while leaving token-based authorization to individual server owners based on their specific business logic.</p></li><li><p><strong>Decoupled Architecture Pattern:</strong> Intercept and validate requests before they hit your MCP Servers by routing traffic through AWS CloudFront and ALB (or API Gateway) to a dedicated AWS Lambda function acting as your <em>MCP Authenticator</em>.</p></li><li><p><strong>Enable developer autonomy:</strong> Your platform solution must empower server owners to make their tools available through self-service CI/CD pipelines, relying on familiar tools and patterns so they don&#8217;t have to learn a new stack.</p></li></ul><p><strong>This is it; the end of this 3-issue series</strong> dedicated to explaining how to enable MCP Servers in the real world. Hope you like it. If yoy have any questions, feedback, or comments, you can reply to this email, drop a comment in <a href="https://newsletter.optimistengineer.com/">Substack</a>, or reach me in <a href="https://bsky.app/profile/marcosflobo.com">Bluesky</a>.</p><p>Best,<br>Marcos.</p>]]></content:encoded></item><item><title><![CDATA[Building an Enterprise MCP Platform - Vol. II: Zero-Friction Delivery]]></title><description><![CDATA[How to automate the lifecycle of your MCP servers and establish a seamless pipeline from a developer's repository straight to production.]]></description><link>https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform-67e</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform-67e</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Tue, 21 Jul 2026 16:28:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fc5fa81f-b6f5-4d47-be49-bb75082caf89_1408x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>We happy?&#8230; Vincent!&#8230; We happy?</p><p>We&#8217;re happy.</p><p><em>&#8212; Jules and Vincent, Pulp Fiction</em></p></blockquote><p>Your users don&#8217;t need to know how their MCP Server reaches Production, but they need to know that there is a way that satisfies their needs.</p><p><strong>In the first issue of this series</strong>, dedicated to enabling MCP Servers in the real world, you learnt <strong><a href="https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform">how to choose the right way to deploy MCP Servers</a></strong>.</p><p>Before we dive into today&#8217;s pipeline automation, let&#8217;s ground ourselves with the core lessons from <strong>Vol. I: Keep Deployment Simple</strong>:</p><ol><li><p><strong>Centralize to maintain:</strong> Cloud deployment is the only way to guarantee instant security patches and seamless updates for non-technical users.</p></li><li><p><strong>Choose compute wisely:</strong> We mapped out the decision tree, using <strong>Fargate</strong> for stateful, low-latency LLM interactions, and <strong>Lambda</strong> for sporadic, stateless utility tools.</p></li><li><p><strong>Avoid over-engineering:</strong> We prioritized starting simple based on current sporadic usage rather than future hypothetical scale.</p></li></ol><p><strong>In today&#8217;s email</strong>, we transition from <em>where</em> the infrastructure sits to <em><strong>how</strong></em><strong> we build a zero-friction path from a developer's repository to that infrastructure</strong>.</p><p><span>If you are a Software Engineer trying to understand the main challenges at the time of </span><strong><span>deploying MCP Servers in Production</span></strong><span>, </span><strong>this email is for you</strong><span>. Know someone who might be interested in this topic? Forward them the email &#128071;&#127995;</span></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform-67e?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform-67e?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>Let&#8217;s continue with the next topic: <strong>Delivery</strong></p><p>You need to define <strong>the workflow</strong> for developers to <strong>deploy</strong> their MCP servers from code to production.</p><p>If you read this newsletter for a while, <strong>you know that I&#8217;m a big fan of Kubernetes</strong> (when it makes sense), and the solution I give you to achieve a Cloud Native delivery of MCP Servers leverages Crossplane. If you want to know more about Crossplane, here I give <strong><a href="https://newsletter.optimistengineer.com/p/enabling-developers-to-take-ownership">an explanation about what Crossplane is and its main use cases</a></strong>.</p><p>Fundamentally, you have to build a pipeline to tackle Continuous Integration and Continuous Delivery (as usual).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JSpC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JSpC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png 424w, https://substackcdn.com/image/fetch/$s_!JSpC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png 848w, https://substackcdn.com/image/fetch/$s_!JSpC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png 1272w, https://substackcdn.com/image/fetch/$s_!JSpC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JSpC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png" width="1456" height="1527" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1527,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:275727,&quot;alt&quot;:&quot;Delivering MCP Servers into Production via Crossplane&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.optimistengineer.com/i/206190518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Delivering MCP Servers into Production via Crossplane" title="Delivering MCP Servers into Production via Crossplane" srcset="https://substackcdn.com/image/fetch/$s_!JSpC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png 424w, https://substackcdn.com/image/fetch/$s_!JSpC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png 848w, https://substackcdn.com/image/fetch/$s_!JSpC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.png 1272w, https://substackcdn.com/image/fetch/$s_!JSpC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9892024-6945-4a26-b9bf-fc8961152455_1531x1606.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">Delivering MCP Servers into Production via Crossplane</figcaption></figure></div><h2>1. CI - From code to Docker image</h2><p>Yes, Docker is the magic here. </p><p>&#128073;&#127996; You have to implement a CI pipeline to be used by the developers (a.k.a. the owners of the MCP Servers to be deployed).</p><p>This pipeline will build the code and <strong>create and push a Docker image</strong> for that build.</p><p>The outcome of the CI stage is the Docker image uploaded into a Docker Image Registry, like AWS ECR.</p><p><strong>&#128214; Why a Docker image?</strong> </p><p><strong>Consistency. </strong>It offers consistency of the execution environment. This is, in my opinion, the number one advantage.</p><p>With a ZIP file, you&#8217;re completely dependent on the runtime provided by AWS (or any other cloud provider).</p><p>With a Docker image: the operating system, system libraries OpenSSL, glibc, native binaries, Python/Java/Node versions, installed tools, travel with your application.</p><h2>2. CD - Deliver via Crossplane</h2><p>You have to implement a CD pipeline to be used by the developers to deliver their stuff; in this case, their MCP Servers, packaged as Docker images, into AWS Lambdas.</p><p>In this pipeline, <strong>developers will be able to ship a Crossplane Composition to deploy their MCP Servers to the cloud</strong>, in our case, via an AWS Lambda. The Composition must represent their use case (deploy an MCP Server encapsulated into a Docker image) and just that. Let me clarify what I mean by <em>just that</em>.</p><p>The developers must have nothing to do with IAM roles, authentication, Lambdas, or any other platform business. The Crossplane Composition will deploy all the corresponding pieces that the Platform Team, Security Team, and others agreed (on behalf of developers) to deploy MCP Servers in the cloud.</p><p><strong>&#128214; Why Crossplane?</strong></p><p><strong>Abstraction.</strong> <span>It</span> abstracts away the underlying complexity, allowing developers to focus on delivering software through a simple interface (even if it is YAML) that is centered on use cases, without having to bear the cognitive load of deploying to the cloud.</p><p><strong>&#9888;&#65039; Important note</strong>: If you are not in Kubernetes, just discard Crossplane (not worth having Kubernetes just for Crossplane) and implement the same abstraction using another abstraction layer, such as GitHub Workflows, Terraform, CDK Framework, or something homemade by your organization.</p><p>Let&#8217;s close for today with some takeaways.</p><h2>&#10024; Takeaways</h2><p>That&#8217;s it; does it look simple? Of course, it is not; You and I know that the heavy lifting comes in:</p><ol><li><p><strong>The implementation of the CI pipeline </strong>should be generic enough to support different languages and frameworks, but not so generic that it becomes difficult to use. If you want to dig more into this, <strong><a href="https://newsletter.optimistengineer.com/p/how-to-achieve-a-golden-cicd-pipeline">I wrote about how the MAKEFILE approach can help you strike this balance</a></strong>.</p></li><li><p><strong>The implementation of the Crossplane Composition</strong> should focus on the use case and expose an interface (YAML properties) that addresses it. Reaching agreement among developers on that interface will be a challenge, I can tell you that upfront.</p></li></ol><p>At the end of the day, you have to keep in mind the following:</p><ol><li><p><strong>Create reusable pipelines for developers</strong>.</p></li><li><p><strong>Abstract the complexity of the platform</strong>, so developers can focus on their business and deliver, and you have the flexibility to change the platform transparently in case it is needed (today Lambdas, maybe tomorrow Fargate).</p></li></ol><p><strong>Coming up in the next issue...</strong></p><p>Now that we have covered <em><strong>where</strong></em> our servers live (Deployment) and <em><strong>how</strong></em> to get them there automatically (Delivery), we are ready to face the final boss of production readiness: <strong>Security</strong>. In our next and final edition, we will tackle how authentication, authorization, and secure governance work for your internal AI protocol servers.</p><p>Best,<br>Marcos.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Building an Enterprise MCP Platform - Vol. I: Keep Deployment Simple]]></title><description><![CDATA[Moving past local terminal setups to build a centralized cloud infrastructure that scales across your entire organization without over-engineering.]]></description><link>https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Tue, 14 Jul 2026 16:32:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5e9ada99-d868-45ca-8ad9-9c1913168087_1408x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Welcome, to the real world.</p><p><em>&#8212; Morpheus, Matrix</em></p></blockquote><p>All the tutorials on YouTube tell you how to deploy an MCP server locally and, sometimes, even in the Cloud.</p><p>All of them have the same problem: They don&#8217;t solve a real-world problem. That&#8217;s what I bring you.</p><p><strong>This is the first of three newsletter issues</strong> dedicated to how to enable MCP Servers in the real world.</p><p>In today's email, I'll walk you through the main problems to solve and a practical approach to tackling them when you have to <strong>deploy MCP Servers in Production at scale</strong>.</p><p>If you are a Software Engineer trying to understand the main challenges at the time of deploying MCP Servers in Production, <strong>this email is for you</strong>. Know someone who might be interested in this topic? Forward them the email &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.optimistengineer.com/p/building-an-enterprise-mcp-platform?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>You most likely have the following use cases knocking on your door:</p><ol><li><p><strong>Development teams need to deploy MCP Servers</strong> so their users can use them across the organization through Claude Code, Cursor, etc, but they don&#8217;t know how to make it happen.</p></li><li><p><strong>Product organization and other teams create </strong><em><strong>quick-and-vibe</strong></em><strong> proof of concepts</strong> they need to validate, but they have the same issue than develoepers, or even worse, because they are not even technical enough to understand how to do it.</p></li></ol><p>With those use cases in mind, your challenges are the following:</p><ul><li><p><strong>Deployment</strong>. Where will the MCP Servers be running so the users can use them through their AI clients? </p></li><li><p><strong>Delivery</strong>. Alright, you know where the MCP Servers will live now; how do you make them arrive there?</p></li><li><p><strong>Security</strong>. How will authentication and authorization work for the MCPs?</p></li></ul><p>You need a platform that helps the teams to achieve their goals quickly.</p><p>Let&#8217;s start with the first topic: <strong>Deployment.</strong></p><p>&#128073;&#127996; Taking into account the use cases described at the beginning, you need to <strong>deploy to some kind of </strong><em><strong>cloud instance</strong></em>. Why?</p><ul><li><p>You can't expect MCP server owners to be responsible for distributing their software to users for local execution.</p></li><li><p>What about updates? You may want to distribute your MCP server through an AI Marketplace, but ensuring that updates are applied depends on the AI client's configuration.</p></li><li><p>At least some of your users aren't technical enough to deal with Claude Code or Cursor commands for installing and configuring MCP servers. In fact, they probably don't even know, or care, what an MCP server is.</p></li></ul><p>Those three reasons can be summarized as follows: Y<strong>ou cannot expect MCP server users to deal with the technical details of managing the setup</strong>.</p><p>&#128073;&#127996; <strong>The MCP Server should be available </strong><em><strong>wherever </strong></em><strong>it must be</strong>, so no technical users could tell Claude Code:</p><blockquote><p>Hey, I want to use the application available in http://my.company.com/mcp/my-company-custom-designer</p></blockquote><p><strong>Another important point is maintainability</strong>, which becomes much simpler when you deploy in the cloud, at the time of:</p><ul><li><p>Security patches released by the owners of the MCP Servers will arrive all at once to their users.</p></li><li><p>New features and maintainability will follow the same path, straight to the users.</p></li></ul><p>The last part is <strong>how to deploy the MCP Servers into the cloud</strong>. If we focus on a cloud provider like AWS, we can find multiple options, such as:</p><ul><li><p>Lambda Functions.</p></li><li><p>Fargate.</p></li><li><p>S3 bucket.</p></li><li><p>&#8230;</p></li></ul><p>&#128073;&#127996; My recommendation: based on your current use cases, perform an analysis and pick up the fewest options as possible, so your platform becomes simpler.</p><p><strong>&#128214; </strong>In my experience, <strong>a container technology like AWS Lambda or Fargate works pretty well</strong> for the use cases described above. But how can you decide?</p><p><strong>Choose AWS Fargate if</strong>:</p><ul><li><p><strong>Your MCP server is frequently used or in production</strong>: It needs minimal and consistent latency so that the LLM&#8217;s interaction with the tools doesn&#8217;t feel slow.</p></li><li><p><strong>You use HTTP transport with SSE</strong>: The standard for remote servers requires persistent connections, which Fargate handles natively and efficiently.</p></li><li><p><strong>Your agent maintains a long workflow</strong>: Complex data analysis or coding tasks that take more than 15 minutes or that benefit from keeping variables and state in memory.</p></li><li><p><strong>Cold start is a performance problem</strong>: Even though AWS Lambdas have improved a lot on this, maybe your case cannot afford the cold start of an AWS Lambda.</p></li></ul><p><strong>Choose AWS Lambda only if</strong>: </p><ul><li><p><strong>Usage is extremely sporadic</strong>: An MCP server that is only called a couple of times a day, where maintaining an active container on Fargate (even a small one) doesn&#8217;t justify the minimum monthly cost.</p></li><li><p><strong>You expose simple event-based tools</strong>: Tools that perform a quick &#8220;fire and forget&#8221; action (e.g., &#8220;send an alert to Slack&#8221;, &#8220;check the weather on an external API&#8221;) where cold-start latency is not critical and uses a different transport mechanism or an intermediate API Gateway that translates REST calls to Lambda calls.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cyQU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cyQU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!cyQU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!cyQU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!cyQU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cyQU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:790192,&quot;alt&quot;:&quot;AWS Deployment Decision Tree for MCP Servers: Lambda or Fargate&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.optimistengineer.com/i/206136039?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AWS Deployment Decision Tree for MCP Servers: Lambda or Fargate" title="AWS Deployment Decision Tree for MCP Servers: Lambda or Fargate" srcset="https://substackcdn.com/image/fetch/$s_!cyQU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!cyQU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!cyQU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!cyQU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805163df-12f7-4e0c-b35d-6628c5cfc0d3_1024x559.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">AWS Deployment Decision Tree for MCP Servers: Lambda or Fargate</figcaption></figure></div><p>&#9757;&#127996; There is no &#8220;<em>the best choice for deploying MCP Servers</em>&#8221;, just different options based on the nature of the MCP Server.</p><p><strong>&#128214; What did I do? </strong>I&#8217;ve started deploying MCP Servers via AWS Lambdas because the current usage of the MCP Servers is still sporadic.</p><p>A lot of things to process. Let&#8217;s wrap up for today.</p><h2>&#10024; Takeaways</h2><p>To make sure you don&#8217;t get lost in the infrastructure weeds, let&#8217;s look at the three or four key ideas that will shift your deployment approach from day one:</p><ul><li><p><strong>The Deployment Decision (Local vs. Cloud):</strong> Stop trying to distribute MCP servers locally. If your users are non-technical or you need instant security patching and feature delivery, <strong>your viable choice is the Cloud</strong>. Treat MCP servers as centralized web services, not local binaries.</p></li><li><p><strong>The Compute Decision (Fargate vs. Lambda):</strong> When deploying on AWS, do not guess. Choose your compute model based on these strict technical boundaries:</p><ul><li><p><strong>Choose AWS Fargate if:</strong> You are running production-grade servers requiring consistent, low-latency; you rely on standard HTTP transport with Server-Sent Events (SSE), which requires persistent connections; or your agents run long, stateful workflows that exceed Lambda&#8217;s 15-minute execution limit.</p></li><li><p><strong>Choose AWS Lambda only if:</strong> Your MCP usage is extremely sporadic (to avoid the idle costs of a persistent container) and your tools perform quick, stateless, &#8220;fire-and-forget&#8221; actions (like sending a Slack alert) where cold-start latency is acceptable.</p></li></ul></li><li><p><strong>The &#8220;Pragmatic First&#8221; Rule:</strong> Don&#8217;t build for hypothetical future scale. Start with the simplest, most cost-effective option that matches your <em>current</em> sporadic usage (even if it&#8217;s Lambda as a starting point) and evolve as usage data demands.</p></li></ul><p><strong>Coming up in the next issue...</strong></p><p>Now that you have a clear grasp of the <em><strong>where</strong></em> (Deployment), the next edition will dive straight into the <em><strong>how</strong></em>: the challenge of <strong>Delivery</strong>. We will explore how to seamlessly automate the delivery from the developer&#8217;s repository right into the cloud without friction.</p><p>Best,<br>Marcos.</p>]]></content:encoded></item><item><title><![CDATA[How to ship software with confidence - The Pillars]]></title><description><![CDATA[The pillars for making releases without feeling like you're gambling with a coin every Friday afternoon.]]></description><link>https://newsletter.optimistengineer.com/p/how-to-ship-software-with-confidence</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/how-to-ship-software-with-confidence</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 08 Jul 2026 19:24:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1af45436-5c02-4bb0-bf23-6f0c0b0d6d05_1608x1008.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the hardest parts of software engineering is not building software. <strong>It is shipping it with confidence</strong>.</p><p>Because releasing software should not feel like a coin toss, especially not on a Friday at 6 p.m., when everybody is already mentally halfway into the weekend, and the margin for dealing with surprises is much smaller than we would like to admit.</p><p>If every release feels risky, the problem is usually not the release itself. The problem is the system behind it.</p><p>In today&#8217;s email, you will learn the pillars that help you build software in a way that makes shipping safer, calmer, and more predictable.</p><p>And I do not mean only coding practices. I mean everything that shapes the Software Development Lifecycle, or SDLC.</p><p>At a high level, three things matter:</p><ul><li><p>Housekeeping principles</p></li><li><p>A system that speaks</p></li><li><p>Observability that helps you anticipate and react</p></li></ul><p>A good approach is not to attack them one by one from top to bottom. It is better to work across them gradually, improving a bit of each and iterating over time, because that is usually how real systems improve in the real world.</p><p><strong>This is where release confidence starts.</strong></p><h2>Housekeeping principles</h2><blockquote><p>Before your system can help others, it has to be able to help itself.</p></blockquote><p>If your systems are not stable, understandable, and maintainable, you will not create real value for your customers, because even if the product looks good from the outside, the internal machinery will keep creating friction, uncertainty, and avoidable risk.</p><p>This is where the basics matter more than people like to admit.</p><h3>1. Make roles clear</h3><p>If people do not understand their role, ownership disappears.</p><p>That is how you end up with a red monitor in production and nobody acting, not because people do not care, but because nobody feels clearly responsible enough to move first.</p><p>A team with unclear roles hesitates. It avoids decisions instead of solving problems, and that hesitation becomes part of the system as much as any technical debt.</p><h3>2. Use a common programming language</h3><p>If only one person understands a service, you do not have a system you can trust. You have a bottleneck.</p><p>Ownership drops, debugging slows down, and the whole service becomes riskier than it needs to be, because every meaningful change or incident ends up depending on the same small number of people.</p><p>Software is not only technical. It is social too, and the social side matters more than many teams realize until production starts asking uncomfortable questions.</p><h3>3. Decouple your applications</h3><p>The more isolated your system is, the safer it becomes to change, because failures are less likely to spread in unexpected ways, the responsibilities of each module stay clearer, and the whole system can tolerate change without collapsing under its own coupling.</p><p>That is why decoupling matters so much.</p><p>Inside the application, it means keeping modules properly separated and making sure a failure in one place does not cascade uncontrollably into others. Outside the application, it means avoiding hidden coupling through infrastructure, configuration, or assumptions that nobody wrote down but everybody has been quietly relying on.</p><h2>A system that speaks</h2><blockquote><p>If your system cannot explain what is happening, you are blind in production.</p></blockquote><p>Do you remember the sentence from the Clean Architecture book, &#8220;The architecture that speaks&#8220;? This is the same idea.</p><p>Your logs should make it clear whether a failure comes from </p><ul><li><p>Infrastructure.</p></li><li><p>External dependency.</p></li><li><p>Your own service.</p></li></ul><p>If you cannot tell where the problem started, you will waste time blaming the wrong layer, and in production, that kind of confusion is not a minor inconvenience; it is time your users feel directly.</p><p>A good system answers questions quickly, and it does so in a way that helps you move, not just stare at the screen:</p><ul><li><p>What failed?</p></li><li><p>Where did it fail?</p></li><li><p>Is it internal or external?</p></li><li><p>Is it isolated or systemic?</p></li></ul><p>If your logs cannot answer that, they are noise.</p><h2>Anticipate and react with observability</h2><blockquote><p>The best moment to detect a problem is before your users do.</p></blockquote><p>Observability is not about having dashboards for the sake of it. It is about designing signals that help you act while there is still room to do something useful.</p><h3>Early warning signals</h3><p>These alerts tell you something is drifting before it becomes visible to the customer:</p><ul><li><p>Latency increasing.</p></li><li><p>Error rates are growing.</p></li><li><p>Queues are building up.</p></li><li><p>Resources saturating.</p></li></ul><p>Their value is not panic, but time. They give you time to investigate, time to understand what is changing, and time to act before a small deviation turns into a production incident.</p><h3>Failure signals</h3><p>When something is already broken, you need clarity more than anything else.</p><p>At that point, the alert should make it obvious what is failing, how bad it is, and what to do next.</p><p>This is where runbooks matter, because a good alert without a clear action is incomplete, and a paged engineer without a clear first step is often forced to improvise under pressure, which is exactly what good observability is supposed to reduce.</p><p>A runbook should answer:</p><ul><li><p>What does this alert mean?</p></li><li><p>What likely caused it?</p></li><li><p>What to check first?</p></li><li><p>What to do next?</p></li></ul><p><strong>Short. Concrete. Actionable.</strong></p><p>In a future issue, I will go deep into something important: How to make releases actually safe.</p><p>So far, let&#8217;s wrap up for today.</p><h2>&#10024; Takeaways</h2><p>Shipping software at 6 p.m. on a Friday shouldn&#8217;t feel like an extreme sport. If you want to move from anxiety to total peace of mind every time you push to production, <strong>keep these three golden rules in mind</strong>:</p><ul><li><p><strong>Isolate the impact (Decoupling):</strong> Design your application so a failure in one module doesn&#8217;t bring down the entire system. When you contain errors locally, changing code becomes infinitely safer.</p></li><li><p><strong>Make your system speak (Clear logs):</strong> You are flying blind in production if your logs can&#8217;t answer three questions in seconds: what failed, where it failed, and whether the issue is yours or from an external API. Less noise, more context.</p></li><li><p><strong>Never improvise under pressure (Runbooks):</strong> An alert without a clear action plan is useless. Every critical page must include a short, direct document mapping out the first three steps to fix the issue. You defeat panic with clear instructions.</p></li></ul><p>From here, I would like to hear from you about your tales deploying in Production and what you do in order to get confident for each release.</p><p>Best,<br>Marcos.</p>]]></content:encoded></item><item><title><![CDATA[Flipping the hiring funnel from code generation to system architecture]]></title><description><![CDATA[How to restructure your technical evaluation to find engineers who think about dependencies rather than typing speed.]]></description><link>https://newsletter.optimistengineer.com/p/flipping-the-hiring-funnel-from-code</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/flipping-the-hiring-funnel-from-code</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Thu, 02 Jul 2026 17:45:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/56edb1f4-9821-4ead-a7ff-c396b30319c7_1408x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Summer arrived</strong>, and it was time for a dinner with former colleagues. We met up in Madrid and went to a Mexican restaurant, just to change things up from the typical &#8216;tapas and raciones&#8217; plan.</p><p>Of course, we talked about work. I am not saying it is a good idea to talk about work during a dinner with friends; I am just saying it is today&#8217;s reality, and that carries a lot of meaning, such as:</p><ul><li><p>What everyone is up to.</p></li><li><p>How we use AI in our jobs.</p></li><li><p>Uncertainty about where our profession is heading.</p></li></ul><p>Clearly, the uncertainty point took up quite a bit of time.</p><p>Throughout the conversation, one of my friends asked:</p><blockquote><p>Guys, with all this AI stuff, how do you interview people applying for a Software Engineer position?</p></blockquote><p>In today&#8217;s email, <strong>I will tell you what my current approach is for interviewing candidates in the early AI Native era</strong>. Specifically:</p><ul><li><p>Live coding test: yes or no?</p></li><li><p>Using AI for the technical test.</p></li><li><p>What gives me the most value in identifying a good candidate in the era of AI.</p></li></ul><p><strong>If you are a Software Engineer or Tech Lead</strong> involved in designing and running job interviews to hire Software Engineers, <strong>this email is for you</strong>.</p><p>Know someone who might be interested in this topic? Forward them the email &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.optimistengineer.com/p/flipping-the-hiring-funnel-from-code?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.optimistengineer.com/p/flipping-the-hiring-funnel-from-code?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>Now, let&#8217;s get down to business.</p><h2>Live coding test: yes or no?</h2><p>This was the first thing that came up in the conversation, and I personally have a strong opinion on it.</p><p>In my opinion, <strong>live coding tests are dead</strong>. In fact, they were already dead before the arrival of AI, at least for senior profiles. </p><p>Why?</p><p>Nowadays, coding tests do not bring enough value to invest the time of two Software Engineers during a live interview with another person, since we have machines (Claude Code, Cursor) to generate code.</p><p><strong>&#128073;&#127996; In 2027, code is going to be much less important than it is today.</strong> Things like design patterns, software architecture (MVC, hexagonal, etc.) will take a back seat, overtaken by other aspects such as:</p><ul><li><p><strong>Code efficiency</strong>. AI code works, but is it optimal in terms of performance?</p></li><li><p><strong>AI-optimized code</strong>. A lot of code means a lot of tokens and a lot of money spent; this is something you know perfectly well today. Therefore, the code generated by AI in 2027 must be optimal from the start, so that <strong>the cost</strong> of creating it is optimal and its subsequent modification by the AI is cost-optimal as well.</p></li></ul><p><strong>For junior profiles</strong>, I still see some value in it, but not so much to know if they understand the language syntax, but rather to understand how their mind works when programming, whether they use patterns, and what tradeoffs they evaluate.</p><p>At this point, you might be wondering:</p><blockquote><p>So, do I ask the candidates to use AI live?</p></blockquote><h2>Using AI for the technical test</h2><p>There could be an alternative to the live coding session, but one that is more AI Native: <strong>live code creation but using AI</strong>.</p><p>&#9757;&#127996; However, this variant has certain challenges that I consider a blocker today:</p><ul><li><p>To program with AI, you need a paid account. Obviously, a company cannot expect candidates to pay out of pocket to spend tokens programming with AI for a live interview. In that case, how is AI usage managed?</p></li><li><p>Waiting times for the machine to do its job. From the moment the developer asks the AI for something until the result appears, time passes; dead time that can lead to awkward silences and, worse, a waste of time for both interviewers and the interviewee.</p></li></ul><p>As I said at the beginning, I think these are barriers that can make an interview even more difficult.</p><p><strong>&#128073;&#127996; Instead, I think you can ask the interviewee about how they use AI today</strong>, and their opinion on using AI for code generation. </p><p>Why?</p><p>Because it will give you clues as to:</p><ul><li><p>Do they have the experience your company needs regarding AI usage?</p></li><li><p>Do they fit your company&#8217;s stance on those aspects?</p></li></ul><blockquote><p>So, what can give me value in a face-to-face interview?</p></blockquote><h2>What gives me the most value to identify a good candidate in the era of AI</h2><p>Two key aspects.</p><p><strong>1. Cultural fit</strong></p><p>You need to make sure the candidate is a cultural fit for your company. If the person is not aligned on:</p><ul><li><p>Values</p></li><li><p>Goals</p></li><li><p>Growth expectations</p></li><li><p>...</p></li></ul><p>You are going to waste your time, you will fail at your goals, and the company&#8217;s reputation will suffer.</p><p>I won&#8217;t expand much more on this topic, as you can find interesting articles about it in this same newsletter.</p><ul><li><p><a href="https://newsletter.optimistengineer.com/p/ensuring-to-hire-the-right-person">Ensuring to hire the right person</a></p></li><li><p><a href="https://newsletter.optimistengineer.com/p/the-dilemma-of-the-person-with-willingness">The dilemma of the person with willingness but lack of experience</a></p></li></ul><p><strong>2. System design</strong></p><p>&#9757;&#127996; This seems key to me today.</p><p>More than ever, you need candidates to have the ability to think about:</p><ul><li><p>The system.</p></li><li><p>Dependencies.</p></li><li><p>Global architecture.</p></li><li><p>Making decisions based on trade-offs.</p></li><li><p>The product to be built.</p></li></ul><p>The largest part of your interview should revolve around system design. </p><p>If you are interested in learning System Design, I don&#8217;t have much about it in my newsletter, but I can recommend:</p><ul><li><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Neo Kim&quot;,&quot;id&quot;:135589200,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c103940f-0d8b-47e7-9a33-013202e17bb8_389x389.jpeg&quot;,&quot;uuid&quot;:&quot;cf7b7e81-effe-4949-9086-f06967e7dc52&quot;}" data-component-name="MentionToDOM"></span> </p></li><li><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Raul Junco&quot;,&quot;id&quot;:98661477,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45a92f5e-1e2e-4dfa-9ff3-45fc5ad0c57e_612x612.png&quot;,&quot;uuid&quot;:&quot;ec6a7fab-eb68-4be6-ac0f-2236ba36ef93&quot;}" data-component-name="MentionToDOM"></span> </p></li></ul><h2>&#10024; Takeaways</h2><p>So, what to keep in mind:</p><ul><li><p><strong>Live coding is obsolete for seniors:</strong> Spending the engineering hours of two interviewers to watch a candidate write lines of code is a poor use of resources. In the era of Claude Code and Cursor, standard code generation is a <em>solved problem </em>(kind of).</p></li><li><p><strong>The problem with live AI testing:</strong> Running live coding sessions with AI introduces friction, such as managing paid tool licenses for candidates and dealing with awkward, time-wasting lag while waiting for AI outputs.</p></li><li><p><strong>The interview sweet spot (System Design &amp; Culture):</strong> The true signal of a great candidate in an AI-native world lies in their architectural thinking and cultural alignment. Shift your interview focus toward global architecture, dependency management, making trade-offs, and ensuring core values match your team&#8217;s vision.</p></li></ul><p><strong>Now it&#8217;s my favourite part</strong>. What are you doing in terms of hiring? What are your approaches in this early AI Native era? Looking forward to your comments!</p>]]></content:encoded></item><item><title><![CDATA[Stop Building Distributed Monoliths: How to Find Real Business Boundaries]]></title><description><![CDATA[How to avoid technical coupling and design independent software that match your organization.]]></description><link>https://newsletter.optimistengineer.com/p/stop-building-distributed-monoliths</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/stop-building-distributed-monoliths</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 24 Jun 2026 16:47:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Gbhj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve seen teams spend (waste?) time in multiple meetings debating Kafka, Kubernetes, REST, GraphQL, PostgreSQL, DynamoDB, and every other technology under the sun.</p><p>And then fail because they didn&#8217;t understand the business they were building.</p><p>In today&#8217;s issue, I want to share <strong>why understanding the domain is one of the most important skills in software architecture</strong>, especially when building distributed systems, and even in the era of AI code generation.</p><p>Most architectural problems don&#8217;t start with technology but with a misunderstanding of the business.</p><p>Have you ever felt like everyone on your team speaks a different language when designing a system?</p><p>In today&#8217;s issue, I want to share a small conceptual correction that will save us major headaches when designing distributed systems, because we often mix apples and oranges when talking about architecture.</p><h2>What a Domain is NOT</h2><p>When a team starts building software, it&#8217;s common to find purely technical divisions like a user service, a database service, or an email service.</p><p>But the domain has nothing to do with Java, Python, PostgreSQL, or Kafka. <strong>All of those are simply technological decisions</strong>.</p><p>&#9757;&#127996; <strong>The domain exists even if there is no software;</strong> if we turned off all of an airline&#8217;s servers tomorrow, the concepts of &#8216;Booking&#8217;, &#8216;Flight&#8217;, and &#8216;Overbooking&#8217; would still exist in their business.</p><h2>So, What Exactly Is a Domain?</h2><p>According to Eric Evans in Domain-Driven Design (DDD)</p><blockquote><p>The domain is the sphere of knowledge or activity&#8212;specifically, the problem area that the user is trying to solve with the program.</p></blockquote><p>&#128073;&#127996; <strong>The domain is the problem we are trying to model, not the technical solution or the database</strong>.</p><p>A large domain (like E-commerce) is divided into specialized areas with their own rules, which DDD calls <strong>Subdomains</strong>:</p><ul><li><p>Catalog and Inventory</p></li><li><p>Ordering and Billing</p></li><li><p>Logistics and Customer Service</p></li></ul><h2>Bounded Context: The Boundary of Your Model</h2><p>If you ask around your company what a &#8220;Customer&#8221; is, for billing, it will be a legal entity that pays, and for support, it will be a user opening tickets. Both are right.</p><p>That&#8217;s why we need a <strong>Bounded Context</strong>, which is the explicit boundary within which a business model has a precise and consistent meaning.</p><p>Mixing these boundaries without clear borders is the reason why software in large systems becomes fragile, error-prone, and extremely difficult to understand.</p><p>At this point, you may ask:</p><blockquote><p><strong>Why this matters in Distributed Systems?</strong></p></blockquote><p>In distributed projects, you don&#8217;t just divide code; you also divide responsibility, data, and communication between autonomous teams (Conway&#8217;s Law).</p><p>The classic mistake is creating services based on database tables (`UserService`, `ProductService`), which leads to cascading calls and a distributed monolith.</p><p>&#128073;&#127996; <strong>DDD proposes looking for business boundaries instead of arbitrary technical frontiers</strong>; therefore, a microservice should naturally map to a Bounded Context.</p><h2>Protecting the Domain: Hexagonal, Clean, and SOLID</h2><p>Once you identify your business boundaries, you need tools to protect that core from external contamination:</p><ul><li><p><strong>Hexagonal and Clean Architecture</strong>: They ensure that the core business rules remain independent of the UI, frameworks, and databases using adapters. The domain doesn&#8217;t know what REST or AWS is.</p></li><li><p><strong>SOLID Principles</strong>: They don&#8217;t define the domain, but they provide discipline at the module and class level so that the business logic doesn&#8217;t get contaminated with technical details of SQL or protocols.</p></li></ul><p>You have explanations about what a Domain is. Let's wrap up for today.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KdvH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KdvH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png 424w, https://substackcdn.com/image/fetch/$s_!KdvH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png 848w, https://substackcdn.com/image/fetch/$s_!KdvH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png 1272w, https://substackcdn.com/image/fetch/$s_!KdvH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KdvH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png" width="1456" height="1161" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1161,&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_!KdvH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png 424w, https://substackcdn.com/image/fetch/$s_!KdvH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png 848w, https://substackcdn.com/image/fetch/$s_!KdvH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.png 1272w, https://substackcdn.com/image/fetch/$s_!KdvH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb99e91-8277-4495-87ff-29a652de83c6_2016x1608.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>&#10024; Takeaways</h2><p>Keep this in mind:</p><ul><li><p><strong>The domain is the business</strong>: The software structure must reflect the business problem, not the chosen technology.</p></li><li><p><strong>Poorly defined boundaries = Chaos</strong>: The main consequence of not understanding the domain is drawing the wrong borders, causing coupling and architectural debt.</p></li><li><p><strong>Isolation tools</strong>: DDD is used to model complex domains; Clean, Hexagonal, and SOLID are the shields that prevent technology from muddying that model.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gbhj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gbhj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png 424w, https://substackcdn.com/image/fetch/$s_!Gbhj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png 848w, https://substackcdn.com/image/fetch/$s_!Gbhj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png 1272w, https://substackcdn.com/image/fetch/$s_!Gbhj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gbhj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png" width="1456" height="1072" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1072,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Gbhj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png 424w, https://substackcdn.com/image/fetch/$s_!Gbhj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png 848w, https://substackcdn.com/image/fetch/$s_!Gbhj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.png 1272w, https://substackcdn.com/image/fetch/$s_!Gbhj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5627815-97ee-4e11-ad51-1dc1b8adbeec_1744x1284.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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>If I had to summarize everything in a single sentence, it would be this:</p><blockquote><p>The structure of your software should reflect the structure of your business, not the structure of your technology.</p></blockquote><p>Understand the domain first. The technology decisions become much easier afterward.</p><p>Write it in the comments, I read and reply to all!</p>]]></content:encoded></item><item><title><![CDATA[Shifting left your effort when working with AI]]></title><description><![CDATA[When you start working with AI, more code is generated, and many more pull requests need to be reviewed. That's your bottleneck today, right? Let me tell you how to solve that problem.]]></description><link>https://newsletter.optimistengineer.com/p/shifting-left-your-effort-when-working</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/shifting-left-your-effort-when-working</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 17 Jun 2026 11:23:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qqDD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my teams, we are in continuous evolution. Since we started using AI for all our development, we've gained a lot of insights. More to come, for sure, since we cannot consider ourselves experts.</p><p>If you're a software developer overwhelmed by the increasing number of pull requests to review as AI agents accelerate development, this email is for you.</p><h2>The problem you have</h2><p>Let me tell you where you are:</p><ul><li><p>You and your team adopted AI for development, using Claude Code, Cursor, or GitHub Copilot.</p></li><li><p>You clearly see a positive impact; you and your team are able to <em>do more</em> work in <em>less time</em>. You don&#8217;t visit Stack Overflow anymore.</p></li><li><p>And you want to keep &#8220;human in the loop&#8221;, meaning, you review all the pull requests opened. Yes, you <em>caught AI in the act</em> for some bugs already! So you have still to pay attention to what goes to production.</p></li></ul><p>What&#8217;s your problem? <strong>You have many more pull requests to review</strong>.</p><p>And not only that.</p><p><strong>Those pull requests are quite big</strong>. Maybe the same size as when your peers coded without AI, but now it&#8217;s different.</p><p>Before, you had:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;2 PR/day * 20 files = &#128517;&quot;,&quot;id&quot;:&quot;UFICXZXTCA&quot;}" data-component-name="LatexBlockToDOM"></div><p>And now you have:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;10 PRs/day * 20 files = &#128561;&quot;,&quot;id&quot;:&quot;BEMMFQGCDD&quot;}" data-component-name="LatexBlockToDOM"></div><p>&#128073;&#127996; In summary, <strong>you have more pull requests than ever, and they&#8217;re too large</strong> to review efficiently.</p><p>Does this ring a bell to you? <strong>I would love to hear about your experiences</strong> with this. Send me an email or drop a comment in Substack.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=Shifting%20left%20your%20effort%20when%20working%20with%20AI&amp;body=Hey%20Marcos%2C%0D%0A%0D%0AThis%20is%20my%20tale%20about%20using%20AI%3A%20...%0D%0A%0D%0ABest!&quot;,&quot;text&quot;:&quot;&#128231; Let me tell you a story&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=Shifting%20left%20your%20effort%20when%20working%20with%20AI&amp;body=Hey%20Marcos%2C%0D%0A%0D%0AThis%20is%20my%20tale%20about%20using%20AI%3A%20...%0D%0A%0D%0ABest!"><span>&#128231; Let me tell you a story</span></a></p><p>You are not alone, though. This is becoming a <em>pattern</em> in tech companies during the transition to <a href="https://ainativenewsletter.com/">AI Native</a>.</p><p>Many people shared with me on social media how much they're struggling with this challenge. The growing volume of code reviews is consuming more and more of their time. Some sentences that I can write here are:</p><blockquote><p>AI is a code-vomiting machine.</p></blockquote><p>Another sentence:</p><blockquote><p>The <em>machine&#8217;s</em> goal is to spend tokens and tokens, so you get code and more code.</p></blockquote><p><strong>&#128073;&#127996; The code review phase has become the bottleneck</strong>, when before it was the implementation or Product Management.</p><p>&#9757;&#127996; Is this true? In my opinion, <strong>yes, it is true</strong>.</p><p>You may ask:</p><blockquote><p>Marcos, are we doomed to only do code reviews?</p></blockquote><p>I don&#8217;t think so, at least, so far. It took me a while, but I found a way to:</p><ol><li><p>Keep the human in the loop for code reviews,</p></li><li><p>And keep the increasing speed of development thanks to AI.</p></li></ol><h2>The solution</h2><p>In a nutshell:</p><ol><li><p>Use SKILLs so the <strong>agent works with SOLID principles</strong>, eventhough your previous code does not follow those.</p></li><li><p>Demand to your agent <strong>keep small pull requests</strong>, even though they are many. Ensure the agent saves that in its memory.</p></li><li><p>Demand to your agent to <strong>write an ADR/code-change-report</strong> for the pull request.</p></li></ol><p>Now, let me elaborate on each item.</p><p><strong>&#9757;&#127996; About the SKILL</strong>. You can rather try some from the Internet, like skills.sh, either create your own, or just add that requirement in your prompt.</p><p>Why I found this important? Because with that in its memory, the agent tends to create more organized and encapsulated code (which is a benefit of SOLID) and so it will make your code review easier to follow up.</p><p>&#128214; <strong>A pro-tip on this</strong>: Always start the the <em>plan mode</em> of your favourite AI agent. That helps you to understand what the AI agent <em>will do</em> and what <em>will not do</em>. Always iterate, do not <em>go</em> with the first plan provided; ask questions, so you can understand if the requirements are satisfied, and ensure you understand what will happen in the change.</p><p><strong>&#9996;&#127996;About the small pull requests</strong>. The AI tends to generate many code but, you have to rememeber this: the AI agent is there to do what you ask. Yeah, I know, sometime it <em>does not listen</em> properly, and you have to insist. You can ask to split a task in multiple pull requests and, my recommendation is that you explain to the agent why you want it that way: to make the code reviews of the humans more easy.</p><p>Why I found this important? As I mentioned before: small pull requests can be reviewed with more love and faster; the process becomes more efficient and effective.</p><p>&#128214; <strong>A pro-tip on this</strong>: Use the same human to review all the pull requests. Avoid the context switching for your peers, by rotating the responsibility of reviewing the code of your 5 pull requests, so only one person <em>gets into it</em>, making her/his review easier.</p><p>&#128406;&#127996; <strong>About the ADR/code-change-report</strong>. The idea is quite simple:</p><ul><li><p>Humans read natural language better than code, no matter how expert you are in a concrete language.</p></li><li><p>So, having a meaningful text that can help us to understand what has been done, will help us to achieve a better code review.</p></li></ul><p>Maybe the word ADR is too much for a pull request, but I hope you get the point.</p><p>If you can ask your peers to keep small pull request, to can for sure demand that to your AI agent.</p><p>If you want to go deeper on this, I suggest you to read <a href="https://ainativecompass.substack.com/p/code-reviews-in-the-ai-native-era">this post here entitled </a><strong><a href="https://ainativecompass.substack.com/p/code-reviews-in-the-ai-native-era">Code Reviews in the AI &#8203;&#8203;Native era</a>.</strong></p><p>&#128214; <strong>A pro-tip on this</strong>: To achieve this, Wether on the pull request description or in a separated file (HTML, Markdown), you must ask the AI agent to create a:</p><blockquote><p><code>Summary of the work so the developer to perform the code review can easly understand the changes in the pull request, highligting the important parts to pay extra attention.</code></p></blockquote><p><strong>Those three points helped me, and so I hope they will help you</strong>, to have more efficient and effective code reviews, keeping the pace of more pull requests and ensuring the right quality for the human-in-the-loop code reviews.</p><p>Beyond those three points, <strong>another practice that helped me</strong> was following the I.N.V.E.S.T. principle and taking the time to write clear and small Jira tickets (or whatever tool you use to organize your work).</p><p></p><h2>&#10024; Takeaways</h2><p>We started this email saying:</p><blockquote><p><strong>The code review phase has become the bottleneck.</strong></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_!qqDD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qqDD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png 424w, https://substackcdn.com/image/fetch/$s_!qqDD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png 848w, https://substackcdn.com/image/fetch/$s_!qqDD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png 1272w, https://substackcdn.com/image/fetch/$s_!qqDD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qqDD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png" width="1456" height="1167" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1167,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:294517,&quot;alt&quot;:&quot;code review phase has become the bottleneck&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.optimistengineer.com/i/202324467?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="code review phase has become the bottleneck" title="code review phase has become the bottleneck" srcset="https://substackcdn.com/image/fetch/$s_!qqDD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png 424w, https://substackcdn.com/image/fetch/$s_!qqDD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png 848w, https://substackcdn.com/image/fetch/$s_!qqDD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.png 1272w, https://substackcdn.com/image/fetch/$s_!qqDD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c574977-777e-48d4-9797-e2049e6f8a7a_3016x2418.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">code review phase has become the bottleneck</figcaption></figure></div><p>With the solution I brought to you, we are making (yet another) <em>shift left</em>: </p><blockquote><p><strong>We are putting more effort on the previous work with the AI</strong>, during the plan of the work to do, before open the pull request.</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_!J1El!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J1El!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png 424w, https://substackcdn.com/image/fetch/$s_!J1El!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png 848w, https://substackcdn.com/image/fetch/$s_!J1El!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png 1272w, https://substackcdn.com/image/fetch/$s_!J1El!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J1El!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png" width="1456" height="1166" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1166,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:296580,&quot;alt&quot;:&quot;Shift left the effort to proper scale&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.optimistengineer.com/i/202324467?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Shift left the effort to proper scale" title="Shift left the effort to proper scale" srcset="https://substackcdn.com/image/fetch/$s_!J1El!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png 424w, https://substackcdn.com/image/fetch/$s_!J1El!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png 848w, https://substackcdn.com/image/fetch/$s_!J1El!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.png 1272w, https://substackcdn.com/image/fetch/$s_!J1El!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F857fec55-95cf-42fe-b141-3336525ac8fe_3017x2416.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">Shift left the effort to proper scale</figcaption></figure></div><p>&#128073;&#127996; Because the effort now goes more on the plan phase, <strong>you are making the whole process more scalable</strong>.</p><p>At this point in time, <strong>I believe this the way to work with AI agents</strong>.</p><p><strong>I would love to hear the tips and tricks you use</strong> so far to tame the AI agents. Send me an email to write a comment; I read them all!</p><p>Best,<br>Marcos</p>]]></content:encoded></item><item><title><![CDATA[The importance of adapting the message to the listener]]></title><description><![CDATA[Have you ever struggled in a meeting because the conversation deviated from the original purpose? Maybe your message was not meant for your target person in that meeting]]></description><link>https://newsletter.optimistengineer.com/p/the-importance-of-adapting-the-message</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-importance-of-adapting-the-message</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Thu, 11 Jun 2026 16:33:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e5ae903f-86fb-4eca-a641-840d403422a7_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The way you talk, the visual artifacts you use, and your body language should be adapted to your target audience. Otherwise, one of the many issues you might face is that the conversation will lose focus on meaningful conversations.</p><p>In today&#8217;s issue, <strong>I want to share with you one of my failures in communication</strong> and how I overcame it. </p><p>If you&#8217;ve been <strong>following me for a while</strong>, you&#8217;ve already heard a lot about this. I&#8217;m not <strong>just</strong> repeating myself; I&#8217;m providing more resources to help you improve the <strong>key</strong> skill (communication) every Software Engineer needs, <strong>especially</strong> in the age of Agentic AI.</p><p>Three mistakes:</p><ul><li><p>Reuse the same diagram.</p></li><li><p>Focusing on feelings instead of data.</p></li><li><p>What to do when the conversation is about bananas?</p></li></ul><p>&#9757;&#127996; By the way, this is a concrete example from real life. </p><h2>Reuse the same diagram</h2><p>I think this was my main mistake by far. </p><p>I had a meeting with the Product team to explain our approach to the roadmap&#8217;s requirements and use cases. <strong>To support the discussion, I used the same system diagram I use with my fellow engineers</strong>, people who have deep technical knowledge and don&#8217;t get lost in the moving pieces.</p><p>Consequently, <strong>the Product team felt the need to clarify every single component</strong> in the diagram. This was a natural reaction; they wanted to contribute to the solution and needed to understand what they were looking at. <strong>However, we ended up getting bogged down in the details and missed the main objective of the meeting.</strong></p><p>&#128073;&#127996; To pivot from my mistake, <strong>it would be better to use visuals tailored to your audience and keep only what is relevant to the discussion</strong>. Otherwise, we risk creating noise, like debating AWS SNS data formats, instead of staying focused on the meeting&#8217;s goal.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oMsR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oMsR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png 424w, https://substackcdn.com/image/fetch/$s_!oMsR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png 848w, https://substackcdn.com/image/fetch/$s_!oMsR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png 1272w, https://substackcdn.com/image/fetch/$s_!oMsR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oMsR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png" width="1456" height="1110" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1110,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:385451,&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_!oMsR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png 424w, https://substackcdn.com/image/fetch/$s_!oMsR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png 848w, https://substackcdn.com/image/fetch/$s_!oMsR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.png 1272w, https://substackcdn.com/image/fetch/$s_!oMsR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19134f34-4520-4ed6-82b0-e8e75d1a2993_2841x2166.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Do not use technical visuals for a non-technical audience</figcaption></figure></div><h2>Focusing on feelings instead of data</h2><p><strong>Another mistake I used to make was the usage of feelings and memories</strong> during the meeting, instead of numbers. This happened to me as well in the example I&#8217;m using today.</p><p>I went to the meeting with the right preparation. Because of that, I had to start using my brain to <em>make it speak</em> in a way that my audience could understand what I wanted to transmit; This is the basis of communication indeed, and it&#8217;s good, but not enough, because you can commit mistakes or forget things properly, and your audience can find a <em>flaw</em> in your speech.</p><p>Forget about what you remember in the past. <strong>Show data, show numbers!  Prepare your meeting to showcase numeric information</strong>, with dates, rates, or whatever applies to your use case.</p><p><strong>&#128073;&#127996; It&#8217;s better when you use information that your audience can read and understand by themselves.</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_!u-dR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u-dR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png 424w, https://substackcdn.com/image/fetch/$s_!u-dR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png 848w, https://substackcdn.com/image/fetch/$s_!u-dR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png 1272w, https://substackcdn.com/image/fetch/$s_!u-dR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u-dR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png" width="1422" height="826" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:826,&quot;width&quot;:1422,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:293633,&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_!u-dR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png 424w, https://substackcdn.com/image/fetch/$s_!u-dR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png 848w, https://substackcdn.com/image/fetch/$s_!u-dR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.png 1272w, https://substackcdn.com/image/fetch/$s_!u-dR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b7a9b9-ad65-44e9-9874-f0bd4d77718e_1422x826.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What to do when the conversation is about <em>bananas</em>?</h2><p>This could happen, and it happened.</p><p>I found myself having to explain to the Product team why we were using a specific data format for the messages passing through AWS SNS. I can tell you that&#8217;s not what I wanted to talk about. At that point in the meeting, it felt like it was <em>too late</em> to try to steer the conversation back to the original topic.</p><p>&#128073;&#127996; My recommendation at this point is to try to end the meeting, <strong>wrap up, and call for another meeting</strong> (yeah, I know).</p><p>You have to make your audience understand that you need to go through all the points discussed to adapt your solution.</p><p>For that, you will invest the time until the new meeting to <strong>adapt your visuals and your speech</strong>, based on the points discussed above, and <strong>remove from the table parts that match with</strong>:</p><ol><li><p>Bring noise to the conversations.</p></li><li><p>Make the system complex to understand.</p></li><li><p>Not useful for the goal of the meeting.</p></li></ol><p>In order to know if something matches those 3 points, I ask myself: Will my audience ask for &#8220;<em>this&#8221;</em> that is not relevant to my goal? If yes, drop it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oFmB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oFmB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png 424w, https://substackcdn.com/image/fetch/$s_!oFmB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png 848w, https://substackcdn.com/image/fetch/$s_!oFmB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png 1272w, https://substackcdn.com/image/fetch/$s_!oFmB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oFmB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png" width="1397" height="1815" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1815,&quot;width&quot;:1397,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:267523,&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_!oFmB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png 424w, https://substackcdn.com/image/fetch/$s_!oFmB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png 848w, https://substackcdn.com/image/fetch/$s_!oFmB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.png 1272w, https://substackcdn.com/image/fetch/$s_!oFmB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1eb18222-640d-441e-b810-58fe71f536f1_1397x1815.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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>From here, you will <strong>create layered diagrams and speeches</strong>, each of which is focused on a different audience you will meet to achieve your goal.</p><p>At this stage, you ask the following:</p><blockquote><p>Marcos, what do I mean by layered resources?</p></blockquote><p>I mean that, from the raw and complete information about the topic to discuss, <strong>create visuals and speeches for each of the personas/audiences you are targeting</strong>.</p><p>&#128214; For example</p><ul><li><p><strong>For your dev teammates</strong>, create visuals and text descriptions that make it pretty clear how your system works, so they do not get surprised when they find &#8220;<em>that missing Lambda function there</em>&#8221;.</p></li><li><p><strong>In the case of your Engineer Manager</strong>, maybe you have to scale up +1 level of abstraction. Maybe she/he does not need to know all the possible Kafka topics or microservices in place, but a diagram where is displayed the technologies used, the changes to be done, and the risks.</p></li><li><p>Thinking about your Product Manager, definitely, she/he does not need to know if we are using AWS Lambdas or SNS or whatever. Use plain boxes without naming technologies and arrows to join the pieces and showcase the flow.</p></li></ul><p>Keep in mind the visual I gave you in the section &#8220;<em>Reuse the same diagram</em>&#8220;. </p><p>&#128073;&#127996; <strong>You should go from super-low level to higher layers of abstraction</strong>, each of them meant for every kind of persona.</p><p>Let&#8217;s finish for today.</p><h2>&#10024; Takeaways</h2><p><strong>Always take the time to prepare for your meetings by tailoring them to the specific audience.</strong></p><p>It&#8217;s easy to <strong>let this slip through the cracks</strong>, especially when you&#8217;re caught up in a high-speed environment and focused on your daily routine. If it happens to you, don&#8217;t sweat it. <strong>Just schedule another sync</strong> to buy yourself some time, go over the main points again, and <strong>pivot your presentation to match their level.</strong></p><p>In concrete terms, keep this in mind:</p><ul><li><p><strong>Do not use the same visuals</strong> or the same speech to explain a concept to different roles.</p></li><li><p><strong>Use layered resource</strong>s for the different kinds of audiences.</p></li></ul><p>Hope you enjoyed today's email. I would love to hear from you about what are your experiences communicating. <strong>Drop me a message,</strong> I read them all!</p>]]></content:encoded></item><item><title><![CDATA[Scale Up your Start Up]]></title><description><![CDATA[Compilation of lessons for scaling up your Start Up]]></description><link>https://newsletter.optimistengineer.com/p/scale-up-your-start-up</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/scale-up-your-start-up</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 03 Jun 2026 06:17:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8b2d5e66-5354-4953-badc-686074bd4280_1408x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A person reached out to me 1 month ago:</p><blockquote><p>Marcos, we are a 5-person startup, and it&#8217;s time to scale up our organization&#8230; because the money came in!</p></blockquote><p>First, I said:</p><blockquote><p>Congratulations!</p></blockquote><p>Second, it was about working together on a proposal to scale up their organization.</p><p>We worked together in a couple of sessions, and she ended up with a growing plan that makes sense, based on their roadmap.</p><p>At some point, she told me:</p><blockquote><p>Marcos, this is gold&#8230; this can help many people.</p></blockquote><p>So, a <em>tic</em> happened: Why not provide the very same resources, already organized, to my readers?</p><p>In today&#8217;s email, I&#8217;m sharing <strong>a list of resources to help you create a growth plan for your engineering organization</strong>, whether you are a 5-person start-up or beyond.</p><p>In this email, I will add the links. If you are interested in this topic, I could write a detailed series for it. <strong>You tell me</strong> &#128071;&#127995;</p><div class="poll-embed" data-attrs="{&quot;id&quot;:523237}" data-component-name="PollToDOM"></div><p>I have 2 major categories for you to go through: </p><ul><li><p><strong>Reading Content</strong>: Content you can read in this newsletter, organized by order</p></li><li><p><strong>Video Content</strong>: The talks I&#8217;ve performed about company growth, which include lessons learned.</p></li></ul><h2>Reading Content</h2><ul><li><p><a href="https://newsletter.optimistengineer.com/p/ensuring-to-hire-the-right-person">Ensuring to hire the right person</a></p></li><li><p><a href="https://newsletter.optimistengineer.com/p/do-you-need-a-rockstar-developer">Do you need a Rockstar developer?</a></p></li><li><p><a href="https://newsletter.optimistengineer.com/p/the-dilemma-of-the-person-with-willingness">The dilemma of the person with willingness but lack of experience</a></p></li><li><p><a href="https://newsletter.optimistengineer.com/p/hiring-for-an-hypergrowth-company">Hiring for an Hypergrowth company</a></p></li><li><p><a href="https://newsletter.optimistengineer.com/p/hiring-going-into-hyper-growth-hr">Hiring going into Hyper Growth - HR</a></p></li><li><p><a href="https://newsletter.optimistengineer.com/p/hiring-going-into-hyper-growth-engineering">Hiring going into Hyper Growth - Engineering</a></p></li><li><p><a href="https://newsletter.optimistengineer.com/p/onboarding-junior-profiles-in-hyper">Onboarding Junior profiles in Hyper-growth</a></p></li></ul><h2>Video Content</h2><ul><li><p>[English] <a href="https://www.youtube.com/watch?v=khCowp6w4zg&amp;t=1s&amp;pp=ygUSbWFyY29zIGZlcm1pbiBsb2Jv">Lessons learned hiring as a teamwork - Marcos Ferm&#237;n Lobo e Inma Jimenez Garcia - DevOpsDays Madrid</a></p></li><li><p>[English] <a href="https://www.youtube.com/watch?v=2-jxSB9aIKY&amp;t=6s">From Cloud Native to AI Native</a> or [Spanish] <a href="https://youtu.be/2yrRelQ5WSw">De Cloud Native a AI Native</a></p></li><li><p>[Spanish] <a href="https://www.youtube.com/watch?v=P-iuHy5H890&amp;t=405s&amp;pp=ygU4bGVjY2lvbmVzIGFwcmVuZGlkYXMgdHJhYmFqYW5kbyBlbiB1bmEgZW1wcmVzYSB1bmljb3JuaW8%3D">Lecciones aprendidas trabajando en una empresa Unicornio en modo hyper-crecimiento</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[First Graduates: How Tech Companies Promote Software Engineers]]></title><description><![CDATA[This is what I told to first graduates in the University of Oviedo]]></description><link>https://newsletter.optimistengineer.com/p/first-graduates-how-tech-companies</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/first-graduates-how-tech-companies</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 20 May 2026 16:51:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OsuA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today&#8217;s issue is coming from <strong>my last talk at the University of Oviedo</strong>. In March 2026, I had the opportunity to give a talk to students at the <strong>Escuela de Inform&#225;tica de Oviedo, part of the University of Oviedo</strong>. In that session, I talked about many aspects of moving <strong>From Cloud Native to AI Native</strong>, and you can watch it for free at the following links: <a href="https://youtu.be/2-jxSB9aIKY?si=9EVFISXxODK6V0uM">[English]</a> or <a href="https://youtu.be/2yrRelQ5WSw?si=wDG5BPe2fY1gLQhY">[Spanish]</a>.</p><p>I want to <strong>specially thanks to <a href="https://labra.weso.es/">Jose Emilio Labra</a></strong>, who gave me this amazing opportunity to share my experiences with the students.</p><p>Now, let&#8217;s jump into it.</p><p>When I started my career, I believed that professional growth was a simple matter of time. I thought that after about five years of cranking out code, someone in the company would magically come to pat me on the back and say:</p><blockquote><p>Marcos, we&#8217;re going to promote you; it&#8217;s your time to lead.</p></blockquote><p>Fortunately, I realized that the real world doesn&#8217;t work like that at all.</p><p>In today&#8217;s issue, I want to share my most sincere experience on how you actually grow and build a career in a tech product company. We will cover:</p><ul><li><p>The myth of automatic promotion and the two main career paths.</p></li><li><p>The radical importance of openness to change.</p></li><li><p>Why you must act like the role you want before you get it.</p></li><li><p>The vital need to make your work visible to management.</p></li></ul><p>If you&#8217;re aiming for a promotion and want to understand how things really work behind the scenes, this edition is for you.</p><h2>The Myth of Automatic Promotion and the Two Paths</h2><p>As I was saying, <strong>growth in the tech industry has nothing to do with the time you spend warming a chair</strong>. In the past, it seemed like the only natural destination for an experienced developer was to become a manager, whether you liked leading people or not.</p><p>Luckily, that has changed. Today, you have two main paths to scale:</p><ul><li><p><strong>The Technical Track (Individual Contributor):</strong> This is your path if your passion is to stay close to the code and architecture. You evolve into high-impact roles like Tech Lead, Staff Engineer, or higher, where your focus is on solving strategic architectural challenges without involving yourself in the hierarchical management of people.</p></li><li><p><strong>The Management Track (Engineering Manager):</strong> Your responsibility shifts. Your core focus is no longer coding, but genuinely caring about the career development of your engineers, aligning product goals, and ensuring your team has what it needs to perform at its best. It&#8217;s a different mindset.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OsuA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OsuA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png 424w, https://substackcdn.com/image/fetch/$s_!OsuA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png 848w, https://substackcdn.com/image/fetch/$s_!OsuA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png 1272w, https://substackcdn.com/image/fetch/$s_!OsuA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OsuA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png" width="1456" height="1747" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1747,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1142783,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.optimistengineer.com/i/198458850?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.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_!OsuA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png 424w, https://substackcdn.com/image/fetch/$s_!OsuA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png 848w, https://substackcdn.com/image/fetch/$s_!OsuA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.png 1272w, https://substackcdn.com/image/fetch/$s_!OsuA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6778c355-ed73-454c-ac69-0c6c1037afff_2525x3030.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">Career Ladders in the Tech Industry</figcaption></figure></div><p></p><h2>Attitude is Everything: Openness to Change</h2><p>If you just graduated or even if you are already a Senior, there is something fundamental you must internalize: <strong>openness to change.</strong></p><p>In job interviews, it is assumed that you have a solid programming foundation. What truly sets you apart is your reaction when asked: </p><blockquote><p>I know you master Java, but if the project requires it, would you be willing to code in Rust?</p></blockquote><p>People who show open-mindedness:</p><blockquote><p>yes, I will learn whatever is necessary.</p></blockquote><p>These are precisely those who end up making huge leaps in their careers.</p><h2>Act Like the Role You Aspire To</h2><p>I&#8217;m going to be direct: </p><p>&#128073;&#127996; No one is going to come out of nowhere to say:</p><blockquote><p>we&#8217;re promoting you,</p></blockquote><p>So <em>then</em> you start acquiring responsibilities. </p><p>Especially from Senior roles onwards, you must <strong>act like the role you want to obtain</strong> before it is officially granted to you.</p><p>&#9757;&#127996; You must proactively demonstrate that you are capable of making design decisions, arguing at a technical level, and leading de facto. It is the only way to make it clear that the position already belongs to you morally.</p><h2>Make Your Work Visible</h2><p>This is, by far, the point where we technical profiles fail the most. I know, for those reading this newsletter, this already sounds familiar to you.</p><p>Still.</p><p>In an early-stage startup, it&#8217;s easy for your manager to see the quality of your work directly. But when the organization scales, your Engineering Manager will be swamped with obligations; they will no longer have eyes to see the daily grind of the whole team.</p><p>&#128073;&#127996; <strong>You have to make it noticeable. It depends exclusively on you.</strong></p><p>Strategically leverage your 1-on-1s or your evaluations. Don&#8217;t improvise; bring data. Show charts: Look at how the number of bugs in production has dropped since I implemented my initiative,&#8221; or &#8220;I&#8217;ve managed to reduce our infrastructure cost by 12%.&#8221; If you don&#8217;t value your own effort, no one else is going to come to tell management how great you&#8217;ve done.</p><h2>&#10024; Takeaways</h2><p>Let&#8217;s wrap up. Load these concepts into your backpack:</p><ul><li><p><strong>Growth is measured by impact, not years:</strong> Seniority does not guarantee promotions.</p></li><li><p><strong>Choose your path:</strong> Decide if you provide more value solving technical challenges (Individual Contributor track) or empowering other people (Engineering Manager track).</p></li><li><p><strong>Embrace flexibility:</strong> Your adaptability to new ecosystems is your main competitive advantage.</p></li><li><p><strong>Act in the role before you have the title:</strong> Lead at the level of the position you want to prove you are ready.</p></li><li><p><strong>Visibility is vital:</strong> Document, quantify your successes, and proactively present them to your manager in your 1-on-1s.</p></li></ul><p>I hope this edition has given you the focus you need to boost your next professional step with energy. Do you have something to share about it? drop me a message!</p>]]></content:encoded></item><item><title><![CDATA[Your CI Pipeline Doesn’t Speak Spanish. Let’s Fix That]]></title><description><![CDATA[Internationalization as a platform capability &#8212; and what it looks like when it&#8217;s baked into your pipeline]]></description><link>https://newsletter.optimistengineer.com/p/your-ci-pipeline-doesnt-speak-spanish</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/your-ci-pipeline-doesnt-speak-spanish</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 13 May 2026 07:22:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4SyE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello folks! Marcos here.</p><p>Long time since I brought you <em>fresh ideas</em> from other experts from real life, and I come once again with a special guest <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Julia | Taking you global&quot;,&quot;id&quot;:20941539,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb57f141-94ec-4781-8f4f-5463ce77d5f2_1024x1024.png&quot;,&quot;uuid&quot;:&quot;4849338d-fe2c-449c-895c-d98de3c9b60a&quot;}" data-component-name="MentionToDOM"></span>. I let Julia introduce herself.</p><blockquote><p>Julia is a Senior Localization Engineer at McAfee and the founder of Black Ice (<a href="http://black-ice.ai/">black-ice.ai</a>), a semantic governance platform built for multilingual AI pipelines. With a background in Siri localization at Apple and certification as a sworn translator, she brings a rare mix of linguistic depth and engineering to the question of how meaning travels across languages at scale. She writes The AI-Ready Localizer on Substack for localization professionals, engineers, and product teams navigating the shift to AI-assisted workflows.</p></blockquote><p>Julia gave me an account to give a try at <strong>her <a href="https://black-ice.ai/">Black-Ice.ai</a> product, and I can tell it&#8217;s really cool, really good user experience</strong>, and it&#8217;s already <em>cracking</em>!</p><p><strong>I want to recommend Julia&#8217;s newsletter</strong> to all those Engineers, Product Managers, and UI Platform leads who are working on localization challenges.</p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:4549958,&quot;embedding_publication_id&quot;:null,&quot;name&quot;:&quot;The AI-Ready Localizer&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Mutt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d599ac1-bfb4-43ee-93dc-5d239bedb8a4_600x600.png&quot;,&quot;base_url&quot;:&quot;https://juliadiez.substack.com&quot;,&quot;hero_text&quot;:&quot;The AI-Ready Localizer explores how multilingual ontologies, market intelligence, and data governance transform localization from translation into AI-powered, intent-driven global growth.&quot;,&quot;author_name&quot;:&quot;Julia | Taking you global&quot;,&quot;show_subscribe&quot;:true,&quot;logo_bg_color&quot;:&quot;#ffffff&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPublicationToDOMWithSubscribe"><div class="embedded-publication show-subscribe"><a class="embedded-publication-link-part" native="true" href="https://juliadiez.substack.com?utm_source=substack&amp;utm_campaign=publication_embed&amp;utm_medium=web"><img class="embedded-publication-logo" src="https://substackcdn.com/image/fetch/$s_!Mutt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d599ac1-bfb4-43ee-93dc-5d239bedb8a4_600x600.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">The AI-Ready Localizer</span><div class="embedded-publication-hero-text">The AI-Ready Localizer explores how multilingual ontologies, market intelligence, and data governance transform localization from translation into AI-powered, intent-driven global growth.</div><div class="embedded-publication-author-name">By Julia | Taking you global</div></a><form class="embedded-publication-subscribe" method="GET" action="https://juliadiez.substack.com/subscribe?"><input type="hidden" name="source" value="publication-embed"><input type="hidden" name="autoSubmit" value="true"><input type="email" class="email-input" name="email" placeholder="Type your email..."><input type="submit" class="button primary" value="Subscribe"></form></div></div><p>I must confess that I&#8217;m really excited about what Julia brings to you. I already read it in advance and found it super useful, to the point that I want to apply it in my Engineering Organization.</p><p><strong>If you&#8217;re building a SaaS product</strong>, you likely have multi-language support. <strong>This post is for you</strong>, so you don't <em>f*ck up</em> and show '<em>Hola</em>' to Japanese readers.</p><p>Without taking any more time, I hand over to Julia.</p><div><hr></div><p>Somewhere in your codebase right now, there is a hardcoded string.</p><p>Maybe it&#8217;s an error message added at 6pm on a Thursday. Maybe it&#8217;s a toast notification someone copy-pasted and forgot to wrap. Maybe it&#8217;s a button label that&#8217;s been there since the MVP and nobody has touched it because it works.</p><p>It will ship to your French users as English. And nobody will catch it, because your CI pipeline has no idea it exists.</p><p>This is the problem. Let&#8217;s talk about how to fix it structurally, not by asking developers to be more careful, but by making the pipeline do the work.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4SyE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4SyE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png 424w, https://substackcdn.com/image/fetch/$s_!4SyE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png 848w, https://substackcdn.com/image/fetch/$s_!4SyE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png 1272w, https://substackcdn.com/image/fetch/$s_!4SyE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4SyE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png" width="745" height="368" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/637497bf-2655-48aa-b54b-337c52b38505_745x368.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:368,&quot;width&quot;:745,&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_!4SyE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png 424w, https://substackcdn.com/image/fetch/$s_!4SyE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png 848w, https://substackcdn.com/image/fetch/$s_!4SyE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.png 1272w, https://substackcdn.com/image/fetch/$s_!4SyE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637497bf-2655-48aa-b54b-337c52b38505_745x368.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">Relative cost to fix one i18N String bug</figcaption></figure></div><h2>What i18n scanning actually is</h2><p>i18n scanning is static analysis for your translatable content. The same way a linter catches an undeclared variable or a type checker catches a mismatched return type, an i18n scanner catches:</p><ul><li><p>Strings rendered directly to the UI without going through a translation function</p></li><li><p>Translation keys referenced in code that don&#8217;t exist in any locale file</p></li><li><p>Translation keys present in locale files that are never referenced in code (dead strings)</p></li><li><p>Locale files missing keys that exist in the source language (incomplete translations)</p></li><li><p>Strings built by concatenation that are structurally untranslatable</p></li><li><p>Plural forms handled incorrectly &#8212; or not handled at all</p></li></ul><p>None of these require running the application. They are all detectable from static analysis of your source files and your translation resources. Which means they all belong in CI.</p><h2>The four failure categories you will actually encounter</h2><p>Before talking about tools, it helps to be precise about what you&#8217;re scanning for. These are the categories that cause real production issues.</p><p><strong>1. The hardcoded string</strong></p><pre><code><code>// This will never be translated.
// Your German users will see "No results found" regardless of their locale.
function EmptyState() {
  return &lt;p&gt;No results found&lt;/p&gt;
}

// This will be translated, because it goes through the i18n function.
function EmptyState() {
  return &lt;p&gt;{t('search.empty_state')}&lt;/p&gt;
}
</code></code></pre><p>This is the most common failure and the easiest to catch. A scanner walks your JSX/TSX, finds string literals being rendered directly as text content or passed as props like <code>label=</code> or <code>placeholder=</code>, and flags them.</p><p>The tricky cases are strings that aren&#8217;t visually obvious: error messages thrown in catch blocks, strings constructed in utility functions far from any component, aria-label attributes, document titles set imperatively with <code>document.title</code>.</p><p><strong>2. The untranslatable concatenation</strong></p><pre><code><code>// Looks fine. Completely untranslatable.
const label = "Hello, " + user.name + ". You have " + count + " messages.";

// The problem: word order is not universal.
// Japanese puts the subject last. Arabic has six plural forms.
// Hungarian uses postpositions, not prepositions.
// You cannot translate the fragments independently.

// Correct approach: ICU MessageFormat
const label = t('greeting', { name: user.name, count: count });
// en.json: "greeting": "Hello, {name}. You have {count, plural, one {# message} other {# messages}}."
// ja.json: "greeting": "{name}&#12373;&#12435;&#12289;{count}&#20214;&#12398;&#12513;&#12483;&#12475;&#12540;&#12472;&#12364;&#12354;&#12426;&#12414;&#12377;&#12290;"
</code></code></pre><p>This is harder to catch automatically because you need to identify strings being concatenated <em>and</em> then rendered, not just any string operation. But AST-based tools can detect the pattern. The signal you&#8217;re looking for is: a template literal or string concatenation appearing inside JSX render output or passed to a translation function as a dynamic argument.</p><p><strong>3. Key drift</strong></p><pre><code><code>// Code references this key:
t('user.profile.save_button')

// But your en.json has:
{
  "user": {
    "profile": {
      "saveButton": "Save changes"   // camelCase, not snake_case
    }
  }
}

// Result: silent fallback to the key string itself.
// Your button now reads "user.profile.save_button" in production.
// This has happened to everyone. Usually noticed by a user, not a developer.
</code></code></pre><p>Key drift happens when code and locale files evolve independently. A rename in one place without the other. A key added during development but never put into the JSON. This should be a hard CI failure &#8212; a missing key is a broken string in production.</p><p><strong>4. Incomplete locale files</strong></p><pre><code><code>// en.json &#8212; your source of truth
{
  "onboarding.step1.title": "Let's get started",
  "onboarding.step1.body": "Tell us about yourself",
  "onboarding.step2.title": "Set up your workspace"   // &#8592; new key, added last sprint
}

// fr.json &#8212; what went to translators two sprints ago
{
  "onboarding.step1.title": "Commen&#231;ons",
  "onboarding.step1.body": "Parlez-nous de vous"
  // onboarding.step2.title is missing
  // Your French users see English here. Or nothing, depending on your fallback config.
}
</code></code></pre><p>This is the most common failure in fast-moving products. New strings ship to production in the source language while translations are in progress. Whether this is acceptable depends on your release strategy, but it should always be visible &#8212; a metric, a check, a warning. Not a silent gap.</p><h2>The tools</h2><p>There are two broad categories: <strong>linters</strong> that analyse your source code, and <strong>validators</strong> that analyse your translation resource files. You need both.</p><p><strong>For source code analysis (catching hardcoded strings and bad patterns)</strong></p><ul><li><p><strong>eslint-plugin-i18n-json</strong> and <strong>eslint-plugin-i18next</strong> are the most widely used for i18next-based projects. They flag untranslated string literals in JSX, missing translation function wrappers, and some concatenation patterns.</p></li><li><p><strong>@formatjs/eslint-plugin-formatjs</strong> does the same for react-intl/formatjs, with additional checks specific to ICU MessageFormat syntax.</p></li><li><p>Custom ESLint rules via AST are often necessary for project-specific patterns &#8212; for example, strings passed to third-party component props that your off-the-shelf plugin doesn&#8217;t know about.</p></li></ul><p>The thing to accept early: no scanner catches everything. They catch the patterns they were written to recognise. Your job is to configure them to match your actual codebase patterns, not to expect full coverage out of the box.</p><p><strong>For translation resource validation (catching key drift and incomplete locales)</strong></p><ul><li><p><strong>i18next-scanner</strong> extracts keys referenced in your source and compares them against your locale files. It can output a report of missing keys, unused keys, and coverage per locale.</p></li><li><p><strong>@formatjs/cli</strong> does key extraction and can enforce that all extracted keys are present in your message files.</p></li><li><p>A simple custom script &#8212; walk the locale files, compare key sets, output diff &#8212; is often worth writing for your specific structure, because your project&#8217;s locale file layout is probably not exactly what any off-the-shelf tool expects.</p></li></ul><h2>What the pipeline actually looks like</h2><p>Here is a practical CI pipeline structure. Not every team needs all of this on day one, but this is the shape of a mature setup.</p><pre><code><code>PR opened / push to branch
         &#9474;
         &#9660;
&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;  Stage 1: Lint (fast, &lt; 30s) &#9474;
&#9474;                             &#9474;
&#9474;  eslint i18n rules          &#9474;
&#9474;  &#8594; fail on hardcoded strings&#9474;
&#9474;  &#8594; fail on bad concat       &#9474;
&#9474;  &#8594; fail on invalid ICU      &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;
               &#9474; pass
               &#9660;
&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;  Stage 2: Key validation    &#9474;
&#9474;                             &#9474;
&#9474;  Extract keys from source   &#9474;
&#9474;  Compare against en.json    &#9474;
&#9474;  &#8594; fail on missing keys     &#9474;
&#9474;  &#8594; warn on unused keys      &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;
               &#9474; pass
               &#9660;
&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;  Stage 3: Coverage report   &#9474;
&#9474;                             &#9474;
&#9474;  Compare en.json vs         &#9474;
&#9474;  all other locale files     &#9474;
&#9474;  &#8594; fail if coverage &lt; N%    &#9474;
&#9474;  &#8594; post coverage table      &#9474;
&#9474;    as PR comment            &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;
               &#9474; pass
               &#9660;
&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;  Stage 4: Sync to TMS       &#9474;
&#9474;  (on merge to main only)    &#9474;
&#9474;                             &#9474;
&#9474;  Push new/changed source    &#9474;
&#9474;  strings to translation     &#9474;
&#9474;  management system via API  &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;
</code></code></pre><p><strong>A few things worth highlighting in this structure:</strong></p><p>Stage 1 and Stage 2 should be hard failures. A hardcoded string is a broken feature for non-English users. A missing key renders as the key name in production. These are bugs, not warnings.</p><p>Stage 3 should be configurable by locale. You might tolerate 80% coverage for a language you recently launched and 100% for your primary markets. The important thing is that the gap is visible and tracked, not silent.</p><p>Stage 4 is where the pipeline connects to your translation workflow. Most mature TMS platforms have APIs and CI integrations. The pattern is: on merge to main, push new source strings to the TMS; the TMS notifies translators; translated strings are pulled back on a schedule or via webhook before the next release. The pipeline doesn&#8217;t block on this &#8212; it triggers it.</p><h2>The pre-commit layer (before CI even runs)</h2><p>CI catches things before they merge. Pre-commit hooks catch things before they&#8217;re even pushed, which is faster feedback and less noise in PR reviews.</p><p>Using <strong>lint-staged</strong> with your i18n ESLint rules, you can run string checks only on files changed in the current commit &#8212; keeping it fast enough that developers don&#8217;t disable it.</p><pre><code><code>// .lintstagedrc
{
  "*.{js,jsx,ts,tsx}": [
    "eslint --rule 'i18next/no-literal-string: error' --no-eslintrc"
  ]
}
</code></code></pre><p>The rule of thumb: everything that can be caught locally should be caught locally. CI is the safety net, not the primary feedback loop.</p><h2>The one failure nobody talks about: the source string itself</h2><p>All of the above assumes your English source strings are well-formed and translatable. Often, they aren&#8217;t.</p><pre><code><code>// This string will reach your translators exactly like this.
t('save_confirmation', { defaultValue: "Changes saved! &#127881;" })

// Problems:
// 1. The emoji may render incorrectly or be culturally inappropriate in some locales.
// 2. "Changes saved" is ambiguous &#8212; saved where? As in rescued, or persisted?
// 3. No context about where this appears, what triggered it, or what "changes" means.
</code></code></pre><p>A scanner cannot catch these problems. But a <strong>string linting step on the source values themselves</strong> can catch some of them:</p><ul><li><p>Emoji in UI strings (flag for review)</p></li><li><p>Strings over a length threshold that will break UI in text-expansion languages (German expands ~30%, Finnish can expand ~60%)</p></li><li><p>Strings with no translation context/comment attached</p></li><li><p>Strings that appear to be sentences but end without punctuation (or vice versa &#8212; inconsistent punctuation is a translation signal that something is wrong)</p></li></ul><p>This is the layer most teams never build. It&#8217;s also the layer that most directly improves translation quality &#8212; because it improves the source before anyone translates it.</p><h2>Where things break down even with a good pipeline</h2><p>Having the tooling is not the same as the tooling working. A few failure modes that survive even well-structured pipelines:</p><p><strong>The coverage threshold that never moves</strong></p><p>Teams set a coverage gate at 80%, ship, and never revisit it. The threshold stops being a quality signal and starts being a number the pipeline checks so everyone can feel fine. Review your thresholds per locale, per quarter.</p><p><strong>The scanner that never covers your whole codebase</strong></p><p>ESLint i18n rules are easy to configure for your main app code. They are less often configured for your component library, your internal tooling, your admin panel, your email templates. Each of these is a separate surface with its own untranslated strings. Map your surfaces before you assume you&#8217;re covered.</p><p><strong>The TMS sync that runs but nobody checks</strong></p><p>Strings push to the TMS, but the translation workflow on the other side is not set up to handle them promptly. New strings sit untranslated for weeks. By the time translations come back, the feature has been live in English-only for two release cycles.</p><p>The pipeline does not fix a broken translation workflow. It just makes the handoff cleaner. The workflow itself needs ownership.</p><p><strong>Key naming that carries no meaning</strong></p><pre><code><code>// This is the key you'll be debugging in eighteen months:
t('label_47')

// This is the key that communicates intent to translators and future engineers:
t('checkout.order_summary.total_price_label')
</code></code></pre><p>No scanner enforces key naming conventions, but your CI can. A custom ESLint rule that validates key format against a regex is ten lines of code and saves significant cognitive overhead over time.</p><h2>Final thoughts: language is a build artifact</h2><p>Here is the mental model shift that makes all of this click.</p><p>Your translation files are build artifacts. Like your compiled code, your test coverage report, your bundle size analysis &#8212; they have a correct state, and that state can be verified automatically.</p><p>A missing translation key is a build error. An untranslated string rendered to a French user is a broken feature. A locale file that hasn&#8217;t been synced to the TMS is stale code.</p><p>Once you treat it this way, the pipeline work becomes obvious. You already have automated checks for code correctness, test coverage, and bundle size. i18n coverage belongs in the same category, enforced the same way.</p><p>The teams that get this right are not the teams that care more about localization. They are the teams that stopped treating localization as someone else&#8217;s problem and put it in the pipeline where it belongs.</p><p><em>Before you go, a small meta-note. The i18n pipeline I described above is one I&#8217;m actively building with AI. I use Claude and a multi-agent setup to handle different stages of the workflow: scanning for hardcoded strings, extracting keys, flagging concatenation patterns. Then a semantic layer via <a href="http://black-ice.ai/">Black Ice</a> checks terminology consistency, style, and market availability &#8212; so a term that works in en-US gets validated before it assumes it works in de-DE or ja-JP. Writing about i18n infrastructure while building it with the same tools is, I&#8217;ll admit, a very specific kind of fun.</em></p><div><hr></div><h2>&#129730; Thanks Julia!</h2><p>Marcos back!</p><p>I want to send a deep <strong>Thank You to </strong><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Julia | Taking you global&quot;,&quot;id&quot;:20941539,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb57f141-94ec-4781-8f4f-5463ce77d5f2_1024x1024.png&quot;,&quot;uuid&quot;:&quot;78f43cba-56dc-4b49-ae2f-adddccff3bd2&quot;}" data-component-name="MentionToDOM"></span> for sharing her experience on the Product Platform area and localization. To learn more from Julia, <strong>subscribe NOW to her newsletter</strong> &#128071;</p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:4549958,&quot;embedding_publication_id&quot;:null,&quot;name&quot;:&quot;The AI-Ready Localizer&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Mutt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d599ac1-bfb4-43ee-93dc-5d239bedb8a4_600x600.png&quot;,&quot;base_url&quot;:&quot;https://juliadiez.substack.com&quot;,&quot;hero_text&quot;:&quot;The AI-Ready Localizer explores how multilingual ontologies, market intelligence, and data governance transform localization from translation into AI-powered, intent-driven global growth.&quot;,&quot;author_name&quot;:&quot;Julia | Taking you global&quot;,&quot;show_subscribe&quot;:true,&quot;logo_bg_color&quot;:&quot;#ffffff&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPublicationToDOMWithSubscribe"><div class="embedded-publication show-subscribe"><a class="embedded-publication-link-part" native="true" href="https://juliadiez.substack.com?utm_source=substack&amp;utm_campaign=publication_embed&amp;utm_medium=web"><img class="embedded-publication-logo" src="https://substackcdn.com/image/fetch/$s_!Mutt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d599ac1-bfb4-43ee-93dc-5d239bedb8a4_600x600.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">The AI-Ready Localizer</span><div class="embedded-publication-hero-text">The AI-Ready Localizer explores how multilingual ontologies, market intelligence, and data governance transform localization from translation into AI-powered, intent-driven global growth.</div><div class="embedded-publication-author-name">By Julia | Taking you global</div></a><form class="embedded-publication-subscribe" method="GET" action="https://juliadiez.substack.com/subscribe?"><input type="hidden" name="source" value="publication-embed"><input type="hidden" name="autoSubmit" value="true"><input type="email" class="email-input" name="email" placeholder="Type your email..."><input type="submit" class="button primary" value="Subscribe"></form></div></div><h2>&#128278; Follow-up readings</h2><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:166470863,&quot;url&quot;:&quot;https://juliadiez.substack.com/p/building-globally-a-practical-i18n&quot;,&quot;publication_id&quot;:4549958,&quot;embedding_publication_id&quot;:null,&quot;publication_name&quot;:&quot;The AI-Ready Localizer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Mutt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d599ac1-bfb4-43ee-93dc-5d239bedb8a4_600x600.png&quot;,&quot;title&quot;:&quot;Building Globally: A Practical i18n Guide&quot;,&quot;truncated_body_text&quot;:&quot;Internationalization (i18n) isn&#8217;t just a language feature. It&#8217;s a design constraint, a code architecture choice, and a product strategy.&quot;,&quot;date&quot;:&quot;2025-07-17T12:04:12.986Z&quot;,&quot;like_count&quot;:22,&quot;comment_count&quot;:1,&quot;bylines&quot;:[{&quot;id&quot;:20941539,&quot;name&quot;:&quot;Julia | Taking you global&quot;,&quot;handle&quot;:&quot;juliadiez&quot;,&quot;previous_name&quot;:&quot;Julia Diez&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb57f141-94ec-4781-8f4f-5463ce77d5f2_1024x1024.png&quot;,&quot;bio&quot;:&quot;Helping global teams survive (and lead) the AI takeover.&quot;,&quot;profile_set_up_at&quot;:&quot;2024-11-24T15:11:40.202Z&quot;,&quot;reader_installed_at&quot;:&quot;2024-11-24T15:11:35.565Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:4641295,&quot;user_id&quot;:20941539,&quot;publication_id&quot;:4549958,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:4549958,&quot;name&quot;:&quot;The AI-Ready Localizer&quot;,&quot;subdomain&quot;:&quot;juliadiez&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;The AI-Ready Localizer explores how multilingual ontologies, market intelligence, and data governance transform localization from translation into AI-powered, intent-driven global growth.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d599ac1-bfb4-43ee-93dc-5d239bedb8a4_600x600.png&quot;,&quot;author_id&quot;:20941539,&quot;primary_user_id&quot;:20941539,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2025-03-30T14:41:09.712Z&quot;,&quot;email_from_name&quot;:&quot;Julia D&#237;ez from The AI-Ready Localizer&quot;,&quot;copyright&quot;:&quot;Julia Diez&quot;,&quot;founding_plan_name&quot;:&quot;Founding Member&quot;,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;enabled&quot;,&quot;language&quot;:&quot;en&quot;,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false,&quot;logo_url_wide&quot;:null}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;status&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:null,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:null,&quot;paidPublicationIds&quot;:[],&quot;subscriber&quot;:null}}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;,&quot;source&quot;:null}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://juliadiez.substack.com/p/building-globally-a-practical-i18n?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!Mutt!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d599ac1-bfb4-43ee-93dc-5d239bedb8a4_600x600.png" loading="lazy"><span class="embedded-post-publication-name">The AI-Ready Localizer</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Building Globally: A Practical i18n Guide</div></div><div class="embedded-post-body">Internationalization (i18n) isn&#8217;t just a language feature. It&#8217;s a design constraint, a code architecture choice, and a product strategy&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">a year ago &#183; 22 likes &#183; 1 comment &#183; Julia | Taking you global</div></a></div>]]></content:encoded></item><item><title><![CDATA[Symptoms of Bad Software Design]]></title><description><![CDATA[4 signals that your software is badly designed and how to solve them]]></description><link>https://newsletter.optimistengineer.com/p/symptoms-of-bad-software-design</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/symptoms-of-bad-software-design</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 06 May 2026 07:20:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cRcJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been working in software <em>for a while</em>. In all these years, I&#8217;ve created bad software&#8230; sometimes.</p><p>When you create the software, sometimes it&#8217;s difficult to find your blind spots. But time puts things in perspective, and so you can learn from your mistakes.</p><p>In today&#8217;s email, I want to share with you the <strong>4 signals that your software is badly designed</strong>.</p><h2>Rigidity</h2><p>&#128073;&#127996; <strong>Rigidity is the tendency of software to be difficult to change, even in simple ways.</strong></p><p>A system is rigid when a change in one module triggers a cascade of changes in other dependent modules.</p><p><strong>The symptom</strong>: If you request a change estimated to take two days and it ends up taking two weeks because &#8220;one thing led to another,&#8221; you have a rigid system.</p><p><strong>The cause</strong>: It&#8217;s usually excessive coupling. Everything is so tightly coupled that you can&#8217;t move one piece without it affecting the entire board.</p><p>&#129488; Let&#8217;s see an example, and how you would solve it.</p><p><strong>The Scenario</strong>: You have an OrderProcessor class with a massive switch statement for calculating shipping costs. If it&#8217;s &#8220;UPS,&#8221; it does one thing; if it&#8217;s &#8220;FedEx,&#8221; it does another. When you want to add &#8220;DHL,&#8221; you have to modify that class, forcing you to recompile and retest the entire order module.</p><p><strong>The Solution</strong>: Strategy Pattern (or the Open/Closed Principle). Instead of an internal switch statement, you create a ShippingStrategy interface. Each carrier (UPS, FedEx, DHL) implements this interface. The OrderProcessor now only receives one strategy and calls calculate().</p><p><strong>Result</strong>: To add a new carrier, you simply create a new class. You don&#8217;t touch the existing code.</p><h2>Fragility</h2><p>&#128073;&#127996; <strong>Fragility is the tendency of software to break in many places every time a change is made.</strong></p><p>Unlike rigidity, the problem here isn&#8217;t the effort of the change itself, but the lack of control over the side effects.</p><p><strong>The symptom</strong>: You fix a bug in the payments module, and mysteriously, the inventory report generator stops working.</p><p><strong>The cause</strong>: This usually occurs when there are hidden dependencies or highly intertwined logic where modules know too much about each other&#8217;s inner workings.</p><p>&#129488; Let&#8217;s see an example, and how you would solve it.</p><p><strong>The Scenario:</strong> You have a global variable or a Singleton that stores the &#8220;System Configuration.&#8221; A developer changes the date format in that configuration for a specific report, and suddenly, the &#8220;Payroll&#8221; module stops processing payments because it expected the old format. The system broke in a place unrelated to the original change.</p><p><strong>The Solution</strong>: Encapsulation and Interface Segregation.</p><p>Don&#8217;t allow everyone to access a global object. Divide the configuration into smaller interfaces (e.g., PayrollConfig, ReportConfig). Each module only sees what it needs.</p><p><strong>Result</strong>: A change in the reports only affects the reporting interface, keeping payroll safe.</p><h2>Immobility</h2><p>&#128073;&#127996; <strong>Immobility is the inability to reuse software in other projects or even in other parts of the same project.</strong></p><p>It occurs when the design is so entangled with its environment that extracting a feature is more costly than rewriting it.</p><p><strong>The symptom</strong>: You need a validation function that you already implemented in another module, but when you try to copy it, you realize that it also includes the database, the user interface, and three external libraries.</p><p><strong>The cause</strong>: A design that doesn&#8217;t separate business rules from implementation details (such as the database or the framework).</p><p>&#129488; Yeah, let&#8217;s see an example, and how you would solve it.</p><p><strong>The Scenario</strong>: You created a brilliant algorithm to validate ID numbers (national ID/tax ID). However, the algorithm is written within a UserRegistrationForm class that inherits from a UI library (like React or the Android SDK) and also directly calls the database to check for duplicates.</p><p><strong>The Solution</strong>: Layered Architecture (Clean Architecture).</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;999b68f0-a448-4ed7-b641-cd5cb8a435e5&quot;,&quot;caption&quot;:&quot;Yes, reading books is also an important responsibility of the Software Engineers and Tech Leads. Lately, I prefer to read them on paper.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Book review: Clean Architecture&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:40136239,&quot;name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&quot;,&quot;bio&quot;:&quot;Senior Software Engineer and Tech Lead with 20+ years of experience. Currently building a SaaS product on a cloud-based microservices architecture. Previously worked at CERN managing OpenStack services in the IT CLOUD group.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!7roK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9211d7-f06d-4d11-b17c-4f1af3d2df5a_3264x1836.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-05-08T06:28:49.266Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!5MZB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44852dab-f060-4c39-b0d7-11142335ec4b_767x1000.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/book-review-clean-architecture&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:140977315,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:5,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1659382,&quot;publication_name&quot;:&quot;The Optimist Engineer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Rspq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c8c36d-e4b0-4695-b613-313d621c2839_392x392.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Extract the algorithm into a Pure Object Component (POJO) or Use Case. This code should not know anything about buttons or databases. The database is passed to it as an interface (Dependency Inversion).</p><p><strong>Result</strong>: Now you can copy that validation file and paste it into any other project without carrying over the &#8220;garbage&#8221; from the interface or the database.</p><h2>Viscosity</h2><p>&#128073;&#127996; <strong>Viscosity refers to the resistance the system offers to doing things &#8220;right.&#8221;</strong></p><p>It is divided into two types:</p><ul><li><p>Software viscosity: When it is much easier to add a &#8220;hack&#8221; or a dirty patch that follows the original design and keeps the architecture clean.</p></li><li><p>Environment Viscosity: This occurs when the development environment is slow or inefficient (endless compilation times, tests that take hours). This tempts developers to resort to shortcuts to avoid the formal process.</p></li></ul><p>&#129488; Let&#8217;s see an example, and how you would solve it.</p><p><strong>The Scenario</strong>: You need to add a field to a form. The &#8220;clean&#8221; design requires creating a database migration, updating the entity, updating the DTO, and updating the mapper. That takes 1 hour. But you can simply save that extra &#8220;hidden&#8221; data in a generic text field called &#8220;observations&#8221; in 5 minutes. If the system takes a long time to compile or testing is slow, you&#8217;ll choose the dirty way.</p><p><strong>The Solution:</strong> Automation and Infrastructure Refactoring.</p><p>If the problem is with the environment (slow compilation), you need better machines or to modularize the project. If it&#8217;s with the software, you need tools like Lombok or automatic mappers (AutoMapper/MapStruct) that reduce repetitive code (boilerplate).</p><p><strong>Result</strong>: Doing it right should be almost as fast as doing it wrong. If the right way is easy to follow, developers will follow it.</p><p>Alright! Let&#8217;s wrap up for today. These four signals (Rigidity, Fragility, Immobility, and Viscosity) are not just theoretical concepts; they are the &#8220;smells&#8221; that indicate your system is asking for help.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cRcJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cRcJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png 424w, https://substackcdn.com/image/fetch/$s_!cRcJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png 848w, https://substackcdn.com/image/fetch/$s_!cRcJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png 1272w, https://substackcdn.com/image/fetch/$s_!cRcJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cRcJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png" width="1456" height="958" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.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;: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_!cRcJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png 424w, https://substackcdn.com/image/fetch/$s_!cRcJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png 848w, https://substackcdn.com/image/fetch/$s_!cRcJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.png 1272w, https://substackcdn.com/image/fetch/$s_!cRcJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ddcbbb-8d9d-49cf-be11-69faea61fac6_1987x1308.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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">Symptoms of bad software design</figcaption></figure></div><h2>&#10024; Takeaways</h2><p>Today&#8217;s email has been really software engineering-oriented. Long time since I dedicated one email to this, hope you like it from time to time.</p><ul><li><p><strong>Design for change:</strong> A rigid system is a slow system. Use patterns like Strategy to decouple logic from execution.</p></li><li><p><strong>Protect your boundaries:</strong> Avoid global states and hidden dependencies to keep fragility under control.</p></li><li><p><strong>Decouple from the framework:</strong> Your business logic should be able to live anywhere. If it&#8217;s stuck in a UI component, it&#8217;s immobile.</p></li><li><p><strong>Make the &#8220;right way&#8221; the &#8220;easy way&#8221;:</strong> If doing it right takes too much effort, the system will eventually fill with hacks. Invest in your environment.</p></li></ul><p>&#9757;&#127996; <strong>Remember</strong>: Bad design is not a life sentence. Identifying these signals is the first step toward refactoring and moving toward a more <strong>Incremental Architecture</strong>.</p><p>I&#8217;d love to hear from you. Have you identified any of these signals in your current project? Which one do you find the most difficult to fix?</p><p>Drop a message in the comments or reply to this email. I read and reply to all!</p><p>Best,<br>Marcos.</p>]]></content:encoded></item><item><title><![CDATA[Why your releases feel harder than they should]]></title><description><![CDATA[And why is the problem almost never at the time of deployment?]]></description><link>https://newsletter.optimistengineer.com/p/why-your-releases-feel-harder-than</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/why-your-releases-feel-harder-than</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 29 Apr 2026 12:32:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-DgZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the hardest parts of software engineering is not building software.</p><p>&#128073;&#127996; It is shipping it with confidence.</p><p>Because releasing software should not feel like a coin toss, especially not on a <em>Friday at 6 p.m.</em>, when everybody is already mentally halfway into the weekend, and the margin for dealing with surprises is much smaller than we would like to admit.</p><p><strong>If every release feels risky, the problem is usually not the release itself</strong>. The problem is the system behind it.</p><p>In today&#8217;s issue, I <strong>want to share a different way of looking at that feeling of uncertainty that appears right before going to production</strong>, and why, in most cases, it is not something you fix at release time, but something you design away much earlier in the process.</p><p>Let&#8217;s begin with the elephant in the room.</p><h2>The invisible weight behind every release</h2><p>&#128073;&#127996; <strong>Releases do not become stressful in isolation.</strong></p><p>They accumulate friction over time, through a combination of small issues that individually seem manageable, but collectively create a system that is harder to reason about and, therefore, harder to trust.</p><p>Some of those signals usually look like this:</p><ul><li><p>Ownership is not completely clear, so when something goes wrong, there is a small but real hesitation about who should act first.</p></li><li><p>Parts of the system are only fully understood by one or two people, which silently increases the perceived risk of touching them.</p></li><li><p>Logs exist, but they do not really explain what is happening, forcing you to reconstruct the story under pressure.</p></li><li><p>Alerts either come too late or too often, which makes them easy to ignore when they actually matter.</p></li><li><p>Environments behave slightly differently, in ways that are not always obvious until something breaks.</p></li></ul><p>None of these things breaks a release on their own.</p><p>But together, they create a system where every change feels heavier than it should, and that weight tends to show up exactly when you least want it to: right before going to production.</p><h2>Confidence is not a feeling, it is a property</h2><p>&#128073;&#127996; <strong>Many teams treat confidence as something emotional</strong>, something that needs to be discussed or agreed upon before releasing.</p><blockquote><p>Do we feel safe releasing this?</p></blockquote><p>But confidence is not something you convince yourself of in a meeting.</p><p>It is something your system gives you, almost by default, when the right properties are in place.</p><p>A system that behaves well tends to share a few characteristics:</p><ul><li><p>It is easy to understand, which means that most engineers can reason about what a change will do before it happens.</p></li><li><p>Responsibilities are clear, so when something goes wrong, there is no ambiguity about who owns the next step.</p></li><li><p>It explains itself through logs and signals that help you understand what is happening without guesswork.</p></li><li><p>It behaves consistently across environments, reducing the number of surprises when moving to production.</p></li></ul><p>When those pieces are in place, confidence stops being a discussion and becomes an outcome.</p><h2>Where most teams get it wrong</h2><p>&#128073;&#127996; <strong>The common mistake is trying to &#8220;fix the release&#8221;</strong> instead of fixing the system that produces that release.</p><p>That usually leads to adding more layers around the moment of deployment:</p><ul><li><p>More checks.</p></li><li><p>More approvals.</p></li><li><p>More manual verification.</p></li><li><p>More last-minute coordination.</p></li></ul><p>All of these can help in the short term, and sometimes they are necessary.</p><p><strong>But they rarely address the root of the problem</strong>.</p><p>Because the release is just the moment where all the properties of your system are tested at once, under real conditions and real pressure.</p><ul><li><p>If the system is hard to understand, the release will feel risky.</p></li><li><p>If the system is inconsistent, the release will feel unpredictable.</p></li><li><p>If the system is fragile, the release will feel stressful.</p></li></ul><p>Trying to fix the release without fixing the system is like trying to move faster on a road full of potholes; you might get away with it a few times, but the underlying problem is still there.</p><h2>A simpler way to think about it</h2><p>Instead of asking:</p><blockquote><p>Is this release safe?</p></blockquote><p>It is often more useful to ask:</p><blockquote><p>Does our system make safe releases the default?</p></blockquote><p>That shift may seem subtle, but it changes where you put your effort.</p><p>It moves your attention:</p><ul><li><p>From the moment of deployment &#128073;&#127996; to the way the system is built.</p></li><li><p>From last-minute checks &#128073;&#127996; to everyday engineering practices.</p></li><li><p>From reacting to problems &#128073;&#127996; to designing systems that are easier to trust.</p></li></ul><p>And that is where most of the leverage actually is.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-DgZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-DgZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png 424w, https://substackcdn.com/image/fetch/$s_!-DgZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png 848w, https://substackcdn.com/image/fetch/$s_!-DgZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png 1272w, https://substackcdn.com/image/fetch/$s_!-DgZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-DgZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1057,&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_!-DgZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png 424w, https://substackcdn.com/image/fetch/$s_!-DgZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png 848w, https://substackcdn.com/image/fetch/$s_!-DgZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.png 1272w, https://substackcdn.com/image/fetch/$s_!-DgZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0ebce2-da52-4434-ada1-cf3b98d8e6c1_1823x1323.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Why your releases feel harder than they should</figcaption></figure></div><p>Now, some homework for you.</p><h2>A small exercise</h2><p>Think about your last release, not just in terms of code, but in terms of experience.</p><p>Try to recall the moments where you slowed down, hesitated, or double-checked something &#8220;just in case&#8221;, even if everything looked correct on the surface.</p><p><strong>Ask yourself:</strong></p><ul><li><p>Where did I hesitate, even slightly?</p></li><li><p>What did I feel the need to double-check before moving forward?</p></li><li><p>Which part of the system made me feel uncertain or uncomfortable?</p></li></ul><p><strong>Those moments are not random but signals.</strong></p><p>They are pointing to parts of your system that are asking for more clarity, more consistency, or better feedback.</p><p>&#128073;&#127996; If you start paying attention to those signals, release after release, you are not just making the next deployment safer. <strong>You are gradually building a system that is easier to understand, easier to operate, and ultimately easier to trust.</strong></p><p>Shipping software will never be completely risk-free, but it should not feel like guesswork either.</p><p>And when it does, it is usually telling you exactly where to look.</p>]]></content:encoded></item></channel></rss>