<?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>Wed, 08 Jul 2026 16:15:39 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[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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>&#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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Do 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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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;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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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;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;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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Why 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><item><title><![CDATA[Why "Why Not?" is a Critical Engineering Skill]]></title><description><![CDATA[A personal story about losing stability, taking a risk, and learning to operate without a clear roadmap]]></description><link>https://newsletter.optimistengineer.com/p/why-why-not-is-a-critical-engineering</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/why-why-not-is-a-critical-engineering</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 22 Apr 2026 16:14:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0bfd62b5-b734-40a2-8a8b-03142c248ab0_1201x1310.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Prolog</strong>: I&#8217;m still thinking about a way to give more value for those who want to go further and get more learning, from the real world on Software Engineering and Technical Leadership. So far, I've got messages like this:</p><blockquote><p>Having this relationship forged through the years following you, if the price were acceptable, I would pay for it.</p><p style="text-align: right;"><em>&#8212; Senior Software Engineer</em></p></blockquote><p>I&#8217;m still open for feedback. <strong>Please, pass by</strong> &#128071;&#127995;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;950b7dce-3713-460e-bf68-b0f0b03057a8&quot;,&quot;caption&quot;:&quot;Hi, The Optimist Engineer has always been about helping engineers grow through better judgment, stronger technical thinking, and clearer decisions in real situations.&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;For those who want to go deeper&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;2026-04-15T12:25:37.925Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4264d977-bce5-467c-8ba8-7573a76de58e_800x533.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/for-those-who-want-to-go-deeper&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:193481602,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:9,&quot;comment_count&quot;:2,&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;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Now, let&#8217;s get back to today&#8217;s issue.</p><div><hr></div><p>Everything started with a message from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Angel Suarez&quot;,&quot;id&quot;:17476532,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39bdf2a6-faa2-4e96-be86-1d6f21a3377c_288x288.png&quot;,&quot;uuid&quot;:&quot;7256cb1d-365e-4f68-aa2d-580f3c24dac6&quot;}" data-component-name="MentionToDOM"></span> when we were finishing our Master's degree:</p><blockquote><p>Marcos, what if we apply to this open possition at CERN together?</p></blockquote><p>And I said</p><blockquote><p>Yeah, don&#8217;t know&#8230; my english is really poor, you know?&#8230; don&#8217;t know if it&#8217;s worth it anyway&#8230; mmm&#8230; <em>okeysh</em>, let&#8217;s do it (what can I loose).</p></blockquote><p>That was my <em>Flashpoint</em>, when everything started.</p><p>But let&#8217;s put a bit of context here.</p><p>&#8220;<em>Stepping out of your comfort zone</em>&#8221; is a phrase that has been worn out by overuse. It often sounds as if you aren&#8217;t constantly jumping into the void, you aren&#8217;t progressing.</p><p>But that&#8217;s not true in my experience<strong>,</strong> and I don&#8217;t believe in universal rules either.</p><p><strong>Context matters, and a lot.</strong> What is a bold move for one person might be an irresponsible decision for another, depending on their current life stage.</p><p>However, <strong>there are moments when staying where you are is simply limiting your own growth</strong>. That&#8217;s where uncertainty comes in.</p><p>I know that could sound tough, but I always tell you I bring you <em>real-life</em> experiences, and real life is like that.</p><h2>The context: From stability to chaos</h2><p>About 13 years ago, my plan was linear: finish my degree in Oviedo, keep working there, and have a predictable life. It was a comfortable bubble.</p><p>But in 2013, the crisis hit hard in Spain. The company I was working with decided to let me go, and suddenly, that &#8220;stability&#8221; vanished. My first reaction was to look for the closest thing to what I already had: another job in Asturias, close to home, without overcomplicating my life.</p><p>That&#8217;s when &#193;ngel, a good friend, sent me a link: <strong>a job opening at CERN.</strong></p><h2>&#8220;What am I even doing here?&#8221;</h2><p>My tech stack at the time was PHP and MySQL. When I read &#8220;CERN,&#8221; my imposter syndrome kicked in immediately: <em>&#8220;What am I going to do there? I build websites, not particle physics.&#8221;</em></p><p>Does it ring a bell to you?</p><p>But I asked myself a question that changed my perspective: </p><blockquote><p><strong>Why not?</strong></p></blockquote><p>Sometimes, that&#8217;s the only technical validation you need to apply for a role.</p><p>I passed the interviews and, three months later, I was landing in Geneva with two suitcases and a paper map in my hand. I was out of my comfort zone, and the feeling wasn&#8217;t one of &#8220;empowerment&#8221;; it was pure fear.</p><h2>Reality at CERN: No instruction manual</h2><p>I joined as a <em>DevOps Software Engineer</em> to work on the OpenStack infrastructure (the data center&#8217;s private cloud). But the real shock wasn&#8217;t technological; it was <strong>methodological</strong>.</p><p>In high-level environments, nobody sits next to you to tell you what to do step-by-step.</p><ul><li><p><strong>The mission:</strong> &#8220;Improve the UI of this system.&#8221;</p></li><li><p><strong>The roadmap:</strong> It didn&#8217;t exist. You had to build it yourself.</p></li></ul><p>That level of autonomy forces you to operate in a space where you can&#8217;t rely on routine. You either learn to navigate ambiguity, or you sink.</p><p>I&#8217;m not ashamed to admit that I didn&#8217;t know how to do that. Damn, I was thinking</p><blockquote><p>Shit!, I want to come back home tomorrow!</p></blockquote><p>But something <em>changed</em> inside of me. I managed to evolve. I managed to really understand why I was there, and the out-of-control situation helped my brain to figure it out.</p><h2>What you gain when you let go of control</h2><p>If you decide to take the leap (when your context allows it), two fundamental things happen for an engineer:</p><ol><li><p><strong>Your learning capacity multiplies out of necessity.</strong> You don&#8217;t learn because you want to add a checkmark to your CV; you learn because you have no other choice to get the job done and, of course, because that&#8217;s your goal!. You learn how to &#8220;learn fast,&#8221; which is the ultimate skill.</p></li><li><p><strong>You ask for forgiveness instead of permission.</strong> When there&#8217;s no set path, waiting for 100% of the information is death by analysis paralysis. You start making decisions, failing fast, and correcting on the fly.</p></li></ol><p><strong>&#9757;&#127996; A necessary clarification</strong></p><p>I don&#8217;t want to <em>romanticize</em> this. You don&#8217;t have to move abroad or work at CERN to &#8220;grow.&#8221;</p><p>These decisions only make sense if <strong>the timing is right</strong>. In my case, being laid off and having few strings attached created the perfect scenario. If I had different responsibilities or a different family situation, the risk might not have outweighed the benefit.</p><p><strong>Stepping out of your comfort zone doesn&#8217;t have to be a radical change.</strong> It can be:</p><ul><li><p>Leading a technical initiative for the first time.</p></li><li><p>Switching to a team where you don&#8217;t master the stack.</p></li><li><p>Giving a talk in front of people who know more than you do.</p></li></ul><h3>&#10024; Final thought</h3><p>Real growth happens when you operate slightly above your level of certainty. Not in absolute chaos (which is just noise), and not in total comfort (which is stagnation).</p><p>The useful space is right in the middle, where you can still think clearly, but you can no longer rely solely on what you already know.</p><p>The next time an opportunity comes your way that gives you a bit of vertigo, before dismissing it, ask yourself:</p><blockquote><p><strong>Why not?</strong></p></blockquote><p>I&#8217;m pretty sure you have a similar case. <strong>I would love to hear from you</strong>. Reply to this email or drop a comment in Substack, I read them all!</p><div><hr></div><p>Thanks for your support and feedback, I really appreciate it!</p><p>You&#8217;re the best! &#128406;&#127996;</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120358;&#120367;&#120363;&#120368;&#120378;&#120358;&#120357; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;, &#120373;&#120361;&#120358;&#120367; &#120356;&#120365;&#120362;&#120356;&#120364; &#120373;&#120361;&#120358; &#128156;. &#120336;&#120373; &#120361;&#120358;&#120365;&#120369;&#120372;!</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120364;&#120367;&#120368;&#120376; &#120372;&#120368;&#120366;&#120358;&#120368;&#120367;&#120358; &#120358;&#120365;&#120372;&#120358; &#120376;&#120362;&#120365;&#120365; &#120355;&#120358;&#120367;&#120358;&#120359;&#120362;&#120373; &#120359;&#120371;&#120368;&#120366; &#120373;&#120361;&#120362;&#120372;, &#9851;&#65039; &#120372;&#120361;&#120354;&#120371;&#120358; &#120373;&#120361;&#120362;&#120372;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#128154; On WhatsApp&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#128154; On WhatsApp</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/&quot;,&quot;text&quot;:&quot;&#128153; On LinkedIn&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/"><span>&#128153; On LinkedIn</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#129653; Bluesky&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#129653; Bluesky</span></a></p>]]></content:encoded></item><item><title><![CDATA[For those who want to go deeper]]></title><description><![CDATA[A more practical and in-depth version of The Optimist Engineer]]></description><link>https://newsletter.optimistengineer.com/p/for-those-who-want-to-go-deeper</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/for-those-who-want-to-go-deeper</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 15 Apr 2026 12:25:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4264d977-bce5-467c-8ba8-7573a76de58e_800x533.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi,</p><p><strong>The Optimist Engineer has always been about helping engineers grow</strong> through better judgment, stronger technical thinking, and clearer decisions in real situations.</p><p>Over time, I realized that some topics deserve more depth than a weekly newsletter can give.</p><p>That is why <strong>I am preparing a paid version of The Optimist Engineer</strong>.</p><p>The free newsletter will continue as it is: useful ideas, lessons, and reflections on software engineering, technical leadership, and career growth.</p><p><strong>The paid version will go further</strong> for readers who want to:</p><ul><li><p>go deeper into real engineering and career decisions,</p></li><li><p>see more concrete examples and practical frameworks,</p></li><li><p>understand not only what I think, but why I think it,</p></li><li><p>and get a closer look at the lessons I learn while working.</p></li></ul><p>This is not about publishing more for the sake of publishing more.</p><p>It is about creating a space for readers who want to move from reading ideas to applying them with more confidence.</p><p>There will be <strong>two main premium elements</strong>:</p><ul><li><p><strong>First</strong>, a <strong>monthly deep-dive with a free section and a premium section</strong>. The public part will give you the core idea. The premium part will go deeper, with more detail, examples, visuals, and practical material. And note that I say &#8220;deep&#8221;, which does not necessarily mean &#8220;longer&#8221;.</p></li><li><p><strong>Second</strong>, a series of short audio notes called <em><strong>Thinking Out Loud</strong></em>. These will be small, frequent reflections from my day-to-day work: compact lessons, observations, and micro-learnings that are too immediate for a full article, but still worth sharing.</p></li></ul><blockquote><p>&#8220;Insightful, well-structured content that blends technical expertise with real-world experience.&#8221; &#8212; <em>Angel Suarez, PhD, Product Development Manager</em></p></blockquote><p>If you have found value in <em><strong>The Optimist Engineer</strong></em> so far, this new version is for readers who want to go deeper into the kind of thinking that can help them make better decisions in their own work.</p><p>So here is the simple question:</p><p>&#128073;&#127996; <strong>Would you be interested in paying for a premium version of The Optimist Engineer?</strong></p><p>And if so, what kind of premium content would be most valuable to you?</p><p>Just hit reply, I read every response.</p><p>Thanks for being here and for reading The Optimist Engineer.</p><p><strong>Marcos</strong><br>The Optimist Engineer</p>]]></content:encoded></item><item><title><![CDATA[Lately, I’ve been thinking about this]]></title><description><![CDATA[Some honest thoughts about the future of The Optimist Engineer]]></description><link>https://newsletter.optimistengineer.com/p/lately-ive-been-thinking-about-this</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/lately-ive-been-thinking-about-this</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 08 Apr 2026 12:33:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8f252645-0ea2-4898-8bc2-975636597afc_960x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi,</p><p>I want to share something a bit different today.</p><p>Over the past months, <strong>I&#8217;ve been spending a lot of time thinking about The Optimist Engineer</strong>. What it is, what it&#8217;s becoming, and what I want it to be in the future.</p><p>When I started writing, the goal was simple: </p><p>&#128073;&#127996; Share useful ideas and real-world lessons that could help other engineers grow.</p><p>And honestly, I didn&#8217;t expect it to resonate the way it has.</p><p>Some of your replies, messages, and conversations have made me realize that this is not just a newsletter anymore. It&#8217;s something people actually find useful in their day-to-day work.</p><p>And that&#8217;s where this thought started.</p><p>Lately, <strong>I&#8217;ve been wondering what it would look like to take this one step further</strong>.</p><p>I&#8217;ve also shared these thoughts with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Angel Suarez&quot;,&quot;id&quot;:17476532,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39bdf2a6-faa2-4e96-be86-1d6f21a3377c_288x288.png&quot;,&quot;uuid&quot;:&quot;9f874a05-2dbe-4bf2-a74a-eb73cb47c2ce&quot;}" data-component-name="MentionToDOM"></span>, a friend of mine. Talking them through with someone I trust has helped me reflect more honestly on what this could become.</p><p>Not in terms of writing more.</p><p>But in terms of going deeper. Being more intentional. Sharing more of the thinking, the trade-offs, and the real decisions behind the work.</p><p>And with that idea, a question naturally appeared:</p><blockquote><p>Would it make sense at some point to create a paid version of The Optimist Engineer?</p></blockquote><p>To be honest, <strong>this is not an easy thought for me</strong>.</p><p>Part of it is practical.</p><p>I&#8217;ve never set up something like this before, and things like taxes, fiscal setup, and all the &#8220;non-writing&#8221; parts feel&#8230; unfamiliar and a bit intimidating.</p><p>And part of it is more personal.</p><p>There&#8217;s always that question in the back of my mind:</p><blockquote><p>what if I build it&#8230; and no one is actually interested in paying for it?</p></blockquote><p>I don&#8217;t have a clear answer to that yet.</p><p>What I do know is that I care a lot about keeping this space useful, honest, and worth your time.</p><p>So for now, I&#8217;m just exploring the idea. Thinking about what it could look like, and whether it would make sense at all.</p><p>I&#8217;ll share more thoughts on this soon.</p><p>Thanks for being here, and for reading The Optimist Engineer.</p><p><strong>Marcos</strong><br>The Optimist Engineer</p>]]></content:encoded></item><item><title><![CDATA[The Tech Lead’s Toolbox: Managing Debt and Architecture]]></title><description><![CDATA[Practical tasks to transition from solving bugs to solving system-wide problems.]]></description><link>https://newsletter.optimistengineer.com/p/the-tech-leads-toolbox-managing-debt</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-tech-leads-toolbox-managing-debt</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 01 Apr 2026 12:43:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VMi1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Lately, I&#8217;ve talked a lot about the &#8220;Lead mindset.&#8221; But let&#8217;s get practical:</p><blockquote><p>What does a Tech Lead actually <em>do</em> during the week that a Senior Engineer doesn&#8217;t?</p></blockquote><p>It&#8217;s easy to get lost in meetings, but true technical leadership is exercised through <strong>high-leverage technical tasks</strong>.</p><p>Today, I want to focus on the two &#8220;power moves&#8221; that will make you stand out: <strong>Architecture Reviews</strong> and <strong>Strategic Tech Debt Management.</strong></p><h2>1. Architecture Reviews: From Gatekeeper to Facilitator &#127963;&#65039;</h2><p>Many engineers think an Architecture Review is about being the &#8220;smartest person in the room&#8221; who says &#8220;yes&#8221; or &#8220;no&#8221; to a design. <strong>Wrong.</strong></p><p>A Lead uses reviews to:</p><ul><li><p><strong>Identify cross-team impacts:</strong> Does this change in the Monolith affect the new modular services we are building?</p></li><li><p><strong>Teach trade-off analysis:</strong> Don&#8217;t just point out a flaw; ask the team, <em>&#8220;If we choose this database now, how hard will it be to migrate in 6 months?&#8221;</em></p></li></ul><p>&#128073;&#127996; Leadership here is about <strong>Architecture Incrementalism</strong>.</p><p>You aren&#8217;t looking for the &#8220;Final Perfect Version&#8221;; you are ensuring the team takes a step forward without creating a legacy nightmare tomorrow.</p><h2>2. Tech Debt: Stop Complaining, Start Managing &#9878;&#65039;</h2><p>We all have technical debt. Let&#8217;s not complain about it but<strong> manage it.</strong></p><p>&#128073;&#127996; Growing into leadership means moving away from &#8220;we should rewrite this&#8221; toward &#8220;we will improve this incrementally.&#8221;</p><p>Here is how you lead through debt:</p><ul><li><p><strong>The Debt Radar:</strong> Don&#8217;t just fix bugs. Identify which parts of the code are &#8220;high-interest debt&#8221;, the ones that slow down every single sprint.</p></li><li><p><strong>Negotiation:</strong> Your job is to translate &#8220;clean code&#8221; into &#8220;business value&#8221; for product managers. <em>&#8220;If we spend two days refactoring this module, we will deliver the next three features 20% faster.&#8221;</em></p></li></ul><h2>Knowledge Pills &#128138;</h2><p>If you want to start acting like a Tech Lead today, pick one of these tasks:</p><ul><li><p><strong>Shadow a Review:</strong> Ask a Lead if you can join their next architecture sync. Don&#8217;t just watch the tech; watch how they ask questions to guide the team.</p></li><li><p><strong>The &#8220;Boy Scout&#8221; Rule at Scale:</strong> Don&#8217;t just leave the code cleaner; leave the <em>architecture</em> clearer. Document one undocumented decision this week.</p></li><li><p><strong>Categorize your Debt:</strong> Next time you see a mess, don&#8217;t just fix it. Tag it. Is it &#8220;Deliberate Debt&#8221; (we rushed for a deadline) or &#8220;Outdated Debt&#8221; (the system evolved)?</p></li></ul><h3>Wrap up &#10024;</h3><p>&#128073;&#127996; Technical leadership is about <strong>reducing friction for your team.</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_!VMi1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VMi1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png 424w, https://substackcdn.com/image/fetch/$s_!VMi1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png 848w, https://substackcdn.com/image/fetch/$s_!VMi1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png 1272w, https://substackcdn.com/image/fetch/$s_!VMi1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VMi1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png" width="1456" height="1246" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83e25492-745e-4630-89f6-1906b081686a_1584x1356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1246,&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_!VMi1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png 424w, https://substackcdn.com/image/fetch/$s_!VMi1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png 848w, https://substackcdn.com/image/fetch/$s_!VMi1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png 1272w, https://substackcdn.com/image/fetch/$s_!VMi1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e25492-745e-4630-89f6-1906b081686a_1584x1356.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you master architecture reviews and debt management, you aren&#8217;t just &#8220;coding&#8221;; you are building an environment where everyone else can code better.</p><p><strong>I&#8217;d love to hear your thoughts!</strong></p><p>Which of these two tasks do you find more challenging: defending &#8220;Refactoring Time&#8221; to your manager, or giving feedback on a peer&#8217;s architecture without sounding like a &#8220;hater&#8221;?</p><p><strong>Drop a comment below. Let&#8217;s build a better engineering culture together!</strong></p><p>Stay optimistic and keep building.</p><div><hr></div><p>Thanks for your support and feedback, I really appreciate it!</p><p>You&#8217;re the best! &#128406;&#127996;</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120358;&#120367;&#120363;&#120368;&#120378;&#120358;&#120357; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;, &#120373;&#120361;&#120358;&#120367; &#120356;&#120365;&#120362;&#120356;&#120364; &#120373;&#120361;&#120358; &#128156;. &#120336;&#120373; &#120361;&#120358;&#120365;&#120369;&#120372;!</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120364;&#120367;&#120368;&#120376; &#120372;&#120368;&#120366;&#120358;&#120368;&#120367;&#120358; &#120358;&#120365;&#120372;&#120358; &#120376;&#120362;&#120365;&#120365; &#120355;&#120358;&#120367;&#120358;&#120359;&#120362;&#120373; &#120359;&#120371;&#120368;&#120366; &#120373;&#120361;&#120362;&#120372;, &#9851;&#65039; &#120372;&#120361;&#120354;&#120371;&#120358; &#120373;&#120361;&#120362;&#120372;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#128154; On WhatsApp&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#128154; On WhatsApp</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/&quot;,&quot;text&quot;:&quot;&#128153; On LinkedIn&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/"><span>&#128153; On LinkedIn</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#129653; Bluesky&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#129653; Bluesky</span></a></p>]]></content:encoded></item><item><title><![CDATA[Stop Coding Tasks, Start Designing Systems]]></title><description><![CDATA[How to shift your mindset from "how it works" to "why it matters" to grow your career]]></description><link>https://newsletter.optimistengineer.com/p/stop-coding-tasks-start-designing</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/stop-coding-tasks-start-designing</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 25 Mar 2026 12:52:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bDqs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hi Optimisters! &#128105;&#127995;&#8205;&#128187;</strong></p><p>One of the most common questions I get from Senior Engineers is: </p><blockquote><p>How do I actually prove I&#8217;m ready for a Lead role?</p></blockquote><p>Most people think it&#8217;s about writing more code or being the fastest at closing JIRA tickets. But here is the truth: </p><p>&#128073;&#127996; <strong>Leadership isn&#8217;t about the code you write; it&#8217;s about the decisions you enable.</strong></p><p>The transition from Senior to Lead requires a fundamental mindset shift. You need to stop thinking in terms of &#8220;tasks&#8221; and start thinking in terms of &#8220;systems&#8221; and &#8220;impact.&#8221;</p><p>In today&#8217;s email, I share with you 3 pills of knowledge for you to thrive in this <em>ride</em>.</p><h2>The Mindset Shift: From &#8220;How&#8221; to &#8220;Why&#8221; &#128640;</h2><p>When you are a Senior Dev, you focus on the <em><strong>how</strong></em>: </p><ul><li><p>How do I implement this function?</p></li><li><p>How do I fix this bug?</p></li></ul><p>When you step into Tech Leadership, you must pivot to the <em><strong>why</strong></em> and the <em><strong>what</strong></em>:</p><ul><li><p><strong>The Individual Contributor</strong> (IC) builds the bridge.</p></li><li><p><strong>The Tech Lead</strong> decides where the bridge should go and ensures the whole team knows how to maintain it.</p></li></ul><p>This shift is where most engineers struggle, but there&#8217;s a perfect &#8220;training ground&#8221; to practice this: <strong>System Design.</strong></p><p>By the way, if you are looking for good System Design learnings, subscribe for free right now to the work done by <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;ded2f33e-4fe0-4ddc-9e5c-502657240b02&quot;}" data-component-name="MentionToDOM"></span> &#128071;&#127995;</p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:1511845,&quot;name&quot;:&quot;The System Design Newsletter&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!W5r-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c8067a-95bb-416b-9114-e0b9fb8821d4_256x256.png&quot;,&quot;base_url&quot;:&quot;https://newsletter.systemdesign.one&quot;,&quot;hero_text&quot;:&quot;Download my system design playbook on newsletter signup for FREE&quot;,&quot;author_name&quot;:&quot;Neo Kim&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://newsletter.systemdesign.one?utm_source=substack&amp;utm_campaign=publication_embed&amp;utm_medium=web"><img class="embedded-publication-logo" src="https://substackcdn.com/image/fetch/$s_!W5r-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c8067a-95bb-416b-9114-e0b9fb8821d4_256x256.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">The System Design Newsletter</span><div class="embedded-publication-hero-text">Download my system design playbook on newsletter signup for FREE</div><div class="embedded-publication-author-name">By Neo Kim</div></a><form class="embedded-publication-subscribe" method="GET" action="https://newsletter.systemdesign.one/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>Leadership in Action: The ETL Example &#128736;&#65039;</h2><p>Let&#8217;s look at a practical example we&#8217;ve discussed in <strong><a href="https://newsletter.optimistengineer.com/p/software-architecture-for-etls">this other email</a></strong>: <strong>Designing an ETL (Extract, Transform, Load) architecture.</strong></p><p>A Senior Developer might jump straight into the code, picking the trendiest library to move data from point A to point B. But a <strong>Tech Lead</strong> approaches it differently. They don&#8217;t just build an ETL; they make leadership decisions through design:</p><ol><li><p><strong>Contract over Code:</strong> They define the &#8220;Contract&#8221; between systems. They think about how this data pipeline affects the Data Science team or the Frontend.</p></li><li><p><strong>Trade-offs as Strategy:</strong> They don&#8217;t look for the &#8220;perfect&#8221; tool. They weigh cost vs. scalability. <em>&#8220;Do we need real-time streaming, or is a simple batch process enough for our current business stage?&#8221;</em></p></li><li><p><strong>Mentorship through Architecture:</strong> They design the system so it&#8217;s easy for <em>other</em> developers to contribute without breaking things.</p></li></ol><p>When you document these decisions, explaining the <em><strong>why</strong></em> behind your architecture, you are already performing the role of a Tech Lead. You are providing clarity, reducing risk, and empowering the team.</p><h2>Knowledge Pills for Your Growth &#128138;</h2><p>If you want to accelerate your path to leadership this month, try these three things:</p><ul><li><p><strong>Own the &#8220;Non-Happy&#8221; Path:</strong> Don&#8217;t just design for when things work. Lead by defining how the system fails (observability, retries, alerts).</p></li><li><p><strong>Write for Others:</strong> Start writing RFCs (Request for Comments). If you can convince your peers that your architecture is the right one, you are leading.</p></li><li><p><strong>Stop Being the Hero:</strong> If you are the only one who can fix a specific system, you aren&#8217;t leading; you are a bottleneck. True leaders build systems that don&#8217;t need them to survive.</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_!bDqs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bDqs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png 424w, https://substackcdn.com/image/fetch/$s_!bDqs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png 848w, https://substackcdn.com/image/fetch/$s_!bDqs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png 1272w, https://substackcdn.com/image/fetch/$s_!bDqs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bDqs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png" width="1456" height="1265" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1265,&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_!bDqs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png 424w, https://substackcdn.com/image/fetch/$s_!bDqs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png 848w, https://substackcdn.com/image/fetch/$s_!bDqs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png 1272w, https://substackcdn.com/image/fetch/$s_!bDqs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f9ea4b1-0ffc-428b-8dfb-490cf3ff0265_1754x1524.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Wrap up! &#10024;</h2><p>&#128073;&#127996; <strong>Technical leadership is a muscle</strong>. </p><p>You build it every time you take a step back from the IDE to look at the bigger picture. Whether you are refactoring a monolith or designing a new data pipeline, ask yourself: <strong>&#8220;How does this decision make my team better?&#8221;</strong></p><p><strong>Now, I want to hear from you!</strong></p><p>What is the biggest challenge you&#8217;ve faced when trying to move from &#8220;doing&#8221; to &#8220;leading&#8221;? Is it the lack of time, or perhaps not knowing how to start the conversation with your manager?</p><p><strong>Leave a comment below, I read and reply to every single one!</strong></p><p>Stay optimistic and keep building.</p><div><hr></div><p>Thanks for your support and feedback, I really appreciate it!</p><p>You&#8217;re the best! &#128406;&#127996;</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120358;&#120367;&#120363;&#120368;&#120378;&#120358;&#120357; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;, &#120373;&#120361;&#120358;&#120367; &#120356;&#120365;&#120362;&#120356;&#120364; &#120373;&#120361;&#120358; &#128156;. &#120336;&#120373; &#120361;&#120358;&#120365;&#120369;&#120372;!</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120364;&#120367;&#120368;&#120376; &#120372;&#120368;&#120366;&#120358;&#120368;&#120367;&#120358; &#120358;&#120365;&#120372;&#120358; &#120376;&#120362;&#120365;&#120365; &#120355;&#120358;&#120367;&#120358;&#120359;&#120362;&#120373; &#120359;&#120371;&#120368;&#120366; &#120373;&#120361;&#120362;&#120372;, &#9851;&#65039; &#120372;&#120361;&#120354;&#120371;&#120358; &#120373;&#120361;&#120362;&#120372;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#128154; On WhatsApp&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#128154; On WhatsApp</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/&quot;,&quot;text&quot;:&quot;&#128153; On LinkedIn&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/"><span>&#128153; On LinkedIn</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#129653; Bluesky&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#129653; Bluesky</span></a></p><div><hr></div><h2>Follow-up readings &#128278;</h2><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;a75ec8d5-d62b-4212-9060-fc615f21d348&quot;,&quot;caption&quot;:&quot;I&#8217;ve recently started to work with a team on which we will refactor a big script into a scalable and maintainable application. The current script fits very well in the category Extract, Transform, and Load (ETL from now on).&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;Software Architecture for ETLs&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;2026-01-21T13:32:36.314Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!C4se!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7907c9fc-e36c-4b8b-a2bc-9dbbb8593e8a_1242x1555.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/software-architecture-for-etls&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:185199565,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:6,&quot;comment_count&quot;:1,&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 class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;7388655e-6593-45fe-99ec-858cf1bb7640&quot;,&quot;caption&quot;:&quot;How much time do we waste re-explaining decisions we already made?&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;RFCs: The Most Underrated Skill in Software Engineering&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;2026-03-04T13:33:59.100Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!lqsg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/rfcs-the-most-underrated-skill-in&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:189783963,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:14,&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>]]></content:encoded></item><item><title><![CDATA[Ensuring Data Compatibility and Consistency in Microservices with Schema Registries]]></title><description><![CDATA[Put a Schema Registry in your life and ensure nobody hurts you]]></description><link>https://newsletter.optimistengineer.com/p/ensuring-data-compatibility-and-consistency</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/ensuring-data-compatibility-and-consistency</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 18 Mar 2026 13:29:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yidA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In modern microservices environments, ensuring that all services agree on the format and structure of shared data is crucial. </p><p>&#9757;&#127996;<strong>A Schema Registry acts as the central source of truth for data schemas</strong>, helping teams manage schema evolution, enforce compatibility rules, and facilitate seamless communication between distributed services.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.optimistengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Did someone forward this email to you? Subscribe for free to get more tips on growing in the technical ladder!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In today&#8217;s issue, I will address:</p><ul><li><p>What a Schema Registry is.</p></li><li><p>Benefits of Using a Schema Registry.</p></li><li><p>Use Cases Where Schema Registries Are Essential.</p></li><li><p>When Schema Registries Are Not Worth It</p></li><li><p>Major Schema Registry Solutions Comparison.</p></li></ul><p>Let&#8217;s start.</p><h2>&#129488; What a Schema Registry is</h2><p>&#9757;&#127996;<strong>A Schema Registry is a centralized repository for storing and retrieving data schemas.</strong></p><p>&#128073;&#127996; It is designed to <strong>handle version control</strong>, ensuring that any evolution in the data structures is tracked and managed. </p><p>By maintaining a clear contract between producers and consumers, the registry enables reliable serialization and deserialization of data formats such as Avro, Protobuf, and JSON Schema, among others.</p><p>In a microservices architecture, during the sync and async communication, you have to ensure that the data you will write and read is compatible with your services.</p><p>&#128073;&#127996; Basically, the <em>producer</em> of the data could use a version of the data, version 1.2.0, and the <em>consumers</em> could use the same or an older version, like 1.1.0, without breaking either side. That&#8217;s the <em>magic</em> that a Schema Registry does for you.</p><p><strong>&#9757;&#127996; Thinking about your code</strong>. The different Schema Registries offer SDKs for many languages, so you can serialize and deserialize data using the API offered by the SDK.</p><p>For example, when using an asynchronous API through Apache Kafka, you will have to configure your consumer with the deserializer class offered by the SDK from the Schema Registry you have chosen.</p><p>I already anticipated one of the major benefits of using a Schema Registry, but let&#8217;s explore more.</p><h2>&#128161; Benefits of Using a Schema Registry</h2><p>I could enumerate some, like:</p><ul><li><p><strong>Centralized Management:</strong> It provides a single <strong>source of truth</strong> for all data contracts, simplifying maintenance across microservices. And having a single source of truth in a distributed system means a lot!</p></li><li><p><strong>Schema Evolution:</strong> The registry supports <strong>versioning and controlled evolution</strong>, which allows for <strong>backward, forward, or full compatibility</strong> as business requirements change.</p></li><li><p><strong>Data Quality and Consistency:</strong> Enforcing compatibility rules helps prevent errors that might occur due to mismatches in data structure between services.</p></li><li><p><strong>Reduced risk of breaking change:</strong> With clear contracts defined, teams can build services independently while ensuring they communicate correctly using standardized data formats.</p></li><li><p><strong>Enhanced Monitoring and Governance:</strong> It provides audit trails and version histories, enabling teams to track changes and troubleshoot issues more efficiently.</p></li></ul><p>How does it sound to you?</p><p>But still, is a Schema Registry something you really need? Let&#8217;s explore the use cases.</p><h2>&#127919; Use Cases Where Schema Registries Are Essential</h2><h3>1. Schema evolution without breaking producers or consumers</h3><p>In event-driven systems, data models evolve over time. Fields are added, renamed, deprecated, or reorganized. In a distributed architecture where producers and consumers evolve independently, these changes can introduce incompatibilities if they are not managed properly.</p><p>&#128073;&#127996; <strong>A schema registry allows schemas to be versioned and compatibility rules to be enforced</strong> so that changes can be introduced without breaking existing services.</p><p><strong>Without a registry:</strong></p><ul><li><p>Each team manages its own data model in code.</p></li><li><p>Schema changes can break existing consumers, and problems are often discovered only at runtime.</p></li><li><p>Teams need to coordinate deployments to avoid incompatibilities.</p></li></ul><p><strong>With Schema Registry:</strong></p><ul><li><p>Schemas are stored in a centralized and versioned location.</p></li><li><p>Compatibility rules, such as backward or forward compatibility, can be enforced.</p></li><li><p>Incompatible changes are detected before the producer can publish messages.</p></li></ul><h3>2. Explicit contracts between teams</h3><p>In microservices architectures or streaming systems, events act as interfaces between different services or teams. For these interactions to be reliable, the structure of the messages must be clearly defined and accessible to all participants. </p><p>&#128073;&#127996; <strong>A schema registry allows the data model to become a formal, versioned contract</strong> that producers and consumers can rely on.</p><p><strong>Without a registry:</strong></p><ul><li><p>The schema usually lives in code or informal documentation.</p></li><li><p>Consumers need to infer the message structure themselves.</p></li><li><p>It is common to see mismatches between documentation and the actual messages being produced.</p></li></ul><p><strong>With Schema Registry:</strong></p><ul><li><p>The schema becomes a central source of truth.</p></li><li><p>Producers and consumers rely on the same contract definition.</p></li><li><p>Versioning allows the contract to evolve in a controlled way.</p></li></ul><h3>3. Automatic validation of messages</h3><p>A common issue in data platforms or event-driven systems is the presence of messages with incorrect structures or missing fields. These problems can cause failures in consumers or even break entire data pipelines. </p><p>&#128073;&#127996; A schema registry enables automatic validation to ensure that messages comply with the registered schema before they are published or processed.</p><p><strong>Without a registry:</strong></p><ul><li><p>Producers can send messages with inconsistent structures.</p></li><li><p>Consumers must implement manual validation logic.</p></li><li><p>Errors are often detected late, after the message has already entered the system.</p></li></ul><p><strong>With Schema Registry:</strong></p><ul><li><p>Messages are validated against the registered schema.</p></li><li><p>Producers cannot publish invalid data.</p></li><li><p>Data quality and consistency across the system are improved.</p></li></ul><p>At this point, you may think:</p><blockquote><p>Damn! I need to put a Schema Registry right now!</p></blockquote><p>Wait, and let&#8217;s see when it does not make sense.</p><h2>&#10060; When Schema Registries Are Not Worth It</h2><h3>1. Only one producer and one consumer that are tightly coupled</h3><p>When the producer and the consumer belong to the same system, the same repository, or the same team, schema evolution can be managed directly in the code and through coordinated deployments.</p><p>&#128073;&#127996; <strong>In this situation, introducing a registry adds an additional operational dependency</strong> without solving any real decoupling problem.</p><p><strong>Without a registry:</strong></p><ul><li><p>The schema lives in the same repository as the producer and the consumer.</p></li><li><p>Changes to the data model are deployed in a coordinated way.</p></li><li><p>Integration tests validate that both sides remain compatible.</p></li></ul><p><strong>With Schema Registry:</strong></p><ul><li><p>An additional service must be operated and maintained.</p></li><li><p>Serialization configuration and schema management introduce extra complexity.</p></li><li><p>There is little practical benefit because the system is already coordinated.</p></li></ul><h3>2. The system is still in a prototype or exploration phase</h3><p>During the early stages of a project, data models tend to change quickly while ideas and architectural decisions are being validated. At that stage, the priority is iteration speed rather than strict governance of data contracts. </p><p>&#128073;&#127996; <strong>Introducing a registry too early adds friction to development</strong> and slows down the evolution of the system.</p><p><strong>Without a registry:</strong></p><ul><li><p>Schemas can evolve rapidly together with the code.</p></li><li><p>Changes can be made without formal compatibility processes.</p></li><li><p>The team can iterate and refactor freely.</p></li></ul><p><strong>With Schema Registry:</strong></p><ul><li><p>Schema changes require version registration and compatibility validation.</p></li><li><p>Additional steps are added to the development workflow.</p></li><li><p>Development speed decreases in a phase where experimentation is important.</p></li></ul><h3>3. Messages do not represent structured data</h3><p>A Schema Registry is designed to manage and validate structured data with clearly defined fields. If messages contain opaque payloads such as binary blobs, compressed files, or encrypted content, there is no meaningful structure to register or validate.</p><p>&#128073;&#127996; <strong>In this situation, introducing a registry does not provide any technical benefit</strong>.</p><p><strong>Without a registry:</strong></p><ul><li><p>Messages are treated as opaque payloads.</p></li><li><p>Consumers handle the interpretation logic.</p></li><li><p>Only basic metadata may be validated if needed.</p></li></ul><p><strong>With Schema Registry:</strong></p><ul><li><p>There is no real structure to register or validate.</p></li><li><p>Compatibility rules cannot provide meaningful guarantees.</p></li><li><p>Infrastructure is added without delivering functional value.</p></li></ul><p>Before finishing for today, let me give you a comparison table for the Schema Registries I&#8217;ve analyzed recently.</p><h2>&#128202; Major Schema Registry Solutions Comparison</h2><p>This table provides an overview of key features and capabilities of each Schema Registry solution, making it easier to compare and select the best fit for specific needs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NnZS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NnZS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png 424w, https://substackcdn.com/image/fetch/$s_!NnZS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png 848w, https://substackcdn.com/image/fetch/$s_!NnZS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png 1272w, https://substackcdn.com/image/fetch/$s_!NnZS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NnZS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png" width="1456" height="1516" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1516,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:357059,&quot;alt&quot;:&quot;Major Schema Registry Solutions Comparison&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/160358949?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Major Schema Registry Solutions Comparison" title="Major Schema Registry Solutions Comparison" srcset="https://substackcdn.com/image/fetch/$s_!NnZS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png 424w, https://substackcdn.com/image/fetch/$s_!NnZS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png 848w, https://substackcdn.com/image/fetch/$s_!NnZS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png 1272w, https://substackcdn.com/image/fetch/$s_!NnZS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc11119dc-23dc-49ff-8886-39d55271f15f_1556x1620.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Major Schema Registry Solutions Comparison</figcaption></figure></div><h2>&#10024; Takeaways</h2><p>Let&#8217;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_!yidA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yidA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yidA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yidA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yidA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yidA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1097248,&quot;alt&quot;:&quot;Ensuring Data Compatibility and Consistency in Microservices with Schema Registries&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/160358949?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Ensuring Data Compatibility and Consistency in Microservices with Schema Registries" title="Ensuring Data Compatibility and Consistency in Microservices with Schema Registries" srcset="https://substackcdn.com/image/fetch/$s_!yidA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yidA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yidA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yidA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ae885e-82c0-4286-a82b-62b542736384_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Ensuring Data Compatibility and Consistency in Microservices with Schema Registries</figcaption></figure></div><p>A <strong>Schema Registry</strong> acts as a <strong>central source of truth for data contracts</strong> in distributed systems. In microservices or event-driven architectures, where multiple producers and consumers evolve independently, maintaining a centralized repository of schemas allows all services to share <strong>a clear and versioned definition of the message structure</strong>.</p><p>One of its most important benefits is enabling <strong>schema evolution without breaking producers or consumers</strong>. Through versioning and compatibility rules such as backward or forward compatibility, teams can introduce changes to data models while ensuring that existing services continue to function correctly.</p><p>In addition, a Schema Registry significantly improves <strong>data quality and consistency</strong>. By automatically validating messages against the registered schema before they are published or consumed, it prevents malformed or incomplete data from entering the system and causing failures that are often difficult to detect at runtime.</p><p>However, <strong>it does not always provide value</strong>. When there is <strong>only one tightly coupled producer and consumer</strong>, or when a system is still in a <strong>prototype phase where data models change frequently</strong>, introducing a Schema Registry can add operational complexity without solving a real problem.</p><p>That&#8217;s it for today!</p><p>If you are building event-driven systems or microservices, sooner or later you will face the challenge of <strong>keeping data contracts consistent across services</strong>.</p><p>A Schema Registry can solve that problem, but as we saw, <strong>it only makes sense in the right context</strong>.</p><p>Have you used a Schema Registry in your architecture? What worked well, and what challenges did you face?</p><p><strong>Leave a comment below, I read and reply to every single one!</strong></p><p>Stay optimistic and keep building,</p><div><hr></div><p>Thanks for your support and feedback, I really appreciate it!</p><p>You&#8217;re the best! &#128406;&#127996;</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120358;&#120367;&#120363;&#120368;&#120378;&#120358;&#120357; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;, &#120373;&#120361;&#120358;&#120367; &#120356;&#120365;&#120362;&#120356;&#120364; &#120373;&#120361;&#120358; &#128156;. &#120336;&#120373; &#120361;&#120358;&#120365;&#120369;&#120372;!</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120364;&#120367;&#120368;&#120376; &#120372;&#120368;&#120366;&#120358;&#120368;&#120367;&#120358; &#120358;&#120365;&#120372;&#120358; &#120376;&#120362;&#120365;&#120365; &#120355;&#120358;&#120367;&#120358;&#120359;&#120362;&#120373; &#120359;&#120371;&#120368;&#120366; &#120373;&#120361;&#120362;&#120372;, &#9851;&#65039; &#120372;&#120361;&#120354;&#120371;&#120358; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.optimistengineer.com/p/ensuring-data-compatibility-and-consistency?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/ensuring-data-compatibility-and-consistency?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h2>&#128278; Related readings</h2><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:147534456,&quot;url&quot;:&quot;https://newsletter.systemdesignclassroom.com/p/event-driven-architecture-eda-is&quot;,&quot;publication_id&quot;:2391457,&quot;publication_name&quot;:&quot;System Design Classroom&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdb90e4a-4569-433d-93c4-a4863e3d54ef_69x69.png&quot;,&quot;title&quot;:&quot;Event-Driven Architecture (EDA) is exciting until you deal with event versioning.&quot;,&quot;truncated_body_text&quot;:&quot;Or you can use an Adapter but with a twist. Yes, like in 90% of the problems in Software Development, there is a Pattern that will help you find a smart solution.&quot;,&quot;date&quot;:&quot;2024-08-14T10:00:51.923Z&quot;,&quot;like_count&quot;:62,&quot;comment_count&quot;:9,&quot;bylines&quot;:[{&quot;id&quot;:98661477,&quot;name&quot;:&quot;Raul Junco&quot;,&quot;handle&quot;:&quot;rauljuncov&quot;,&quot;previous_name&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;bio&quot;:&quot;I simplify software engineering.  \n\nSharing lessons to help early-career developers grow as Software Engineers. \n\nI write about Systems Design, Algorithms, Good Practices, and Machine Learning.&quot;,&quot;profile_set_up_at&quot;:&quot;2023-04-14T01:34:26.026Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:2415625,&quot;user_id&quot;:98661477,&quot;publication_id&quot;:2391457,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:2391457,&quot;name&quot;:&quot;System Design Classroom&quot;,&quot;subdomain&quot;:&quot;systemdesignclassroom&quot;,&quot;custom_domain&quot;:&quot;newsletter.systemdesignclassroom.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;A System Design Newsletter to help you build better software. &quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cdb90e4a-4569-433d-93c4-a4863e3d54ef_69x69.png&quot;,&quot;author_id&quot;:98661477,&quot;theme_var_background_pop&quot;:&quot;#786CFF&quot;,&quot;created_at&quot;:&quot;2024-03-01T15:52:36.559Z&quot;,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Raul Junco&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;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&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.systemdesignclassroom.com/p/event-driven-architecture-eda-is?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_!Mtgs!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdb90e4a-4569-433d-93c4-a4863e3d54ef_69x69.png" loading="lazy"><span class="embedded-post-publication-name">System Design Classroom</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Event-Driven Architecture (EDA) is exciting until you deal with event versioning.</div></div><div class="embedded-post-body">Or you can use an Adapter but with a twist. Yes, like in 90% of the problems in Software Development, there is a Pattern that will help you find a smart solution&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">2 years ago &#183; 62 likes &#183; 9 comments &#183; Raul Junco</div></a></div><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:145441690,&quot;url&quot;:&quot;https://javarevisited.substack.com/p/24-microservices-patterns-for-experienced&quot;,&quot;publication_id&quot;:1444904,&quot;publication_name&quot;:&quot;Javarevisited Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9abffb-bd2d-4fe4-a166-4f88de0a3cba_512x512.png&quot;,&quot;title&quot;:&quot;24 Microservices Patterns for Experienced Developers&quot;,&quot;truncated_body_text&quot;:&quot;Hello guys, if you are working in Microservice projects then it make sense to learn different Microservices design pattern and principles, not just to make your architecture more robust but also to understand existing projects.&quot;,&quot;date&quot;:&quot;2024-06-08T12:45:38.744Z&quot;,&quot;like_count&quot;:36,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:16859097,&quot;name&quot;:&quot;javinpaul&quot;,&quot;handle&quot;:&quot;javinpaul&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5663d1cb-2e66-4a0d-8f76-8a3aad3f2382_48x48.png&quot;,&quot;bio&quot;:&quot;I write a weekly newsletter to help you learn Java, coding, and system design.&quot;,&quot;profile_set_up_at&quot;:&quot;2023-02-16T14:56:47.646Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:1408967,&quot;user_id&quot;:16859097,&quot;publication_id&quot;:1444904,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:1444904,&quot;name&quot;:&quot;Javarevisited Newsletter&quot;,&quot;subdomain&quot;:&quot;javarevisited&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Java, Programming, and System Design interview questions and articles delivered twice a week to 41,000+ smart people.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb9abffb-bd2d-4fe4-a166-4f88de0a3cba_512x512.png&quot;,&quot;author_id&quot;:16859097,&quot;theme_var_background_pop&quot;:&quot;#BAA049&quot;,&quot;created_at&quot;:&quot;2023-02-24T02:21:08.796Z&quot;,&quot;email_from_name&quot;:&quot;Javarevisited Newsletter&quot;,&quot;copyright&quot;:&quot;javinpaul&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;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false}},{&quot;id&quot;:477611,&quot;user_id&quot;:16859097,&quot;publication_id&quot;:547756,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:547756,&quot;name&quot;:&quot;javinpaul&#8217;s Newsletter&quot;,&quot;subdomain&quot;:&quot;javinpaul&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Java, Spring Boot, DevOps, Programming and technlogy&quot;,&quot;logo_url&quot;:null,&quot;author_id&quot;:16859097,&quot;theme_var_background_pop&quot;:&quot;#B599F1&quot;,&quot;created_at&quot;:&quot;2021-10-30T11:05:45.362Z&quot;,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;javinpaul&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;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:null,&quot;is_personal_mode&quot;:false}}],&quot;twitter_screen_name&quot;:&quot;javinpaul&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:100},{&quot;id&quot;:123095996,&quot;name&quot;:&quot;Soma&quot;,&quot;handle&quot;:&quot;reactjava&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da5f0aa-fdd2-429c-b87f-8ac6ddf5bc60_144x144.png&quot;,&quot;bio&quot;:&quot;Java and React Developer&quot;,&quot;profile_set_up_at&quot;:&quot;2023-02-28T04:12:28.597Z&quot;,&quot;is_guest&quot;:true,&quot;bestseller_tier&quot;:null,&quot;primaryPublicationId&quot;:1455043,&quot;primaryPublicationName&quot;:&quot;React Java&quot;,&quot;primaryPublicationUrl&quot;:&quot;https://reactjava.substack.com&quot;,&quot;primaryPublicationSubscribeUrl&quot;:&quot;https://reactjava.substack.com/subscribe?&quot;}],&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://javarevisited.substack.com/p/24-microservices-patterns-for-experienced?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_!WbL3!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9abffb-bd2d-4fe4-a166-4f88de0a3cba_512x512.png" loading="lazy"><span class="embedded-post-publication-name">Javarevisited Newsletter</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">24 Microservices Patterns for Experienced Developers</div></div><div class="embedded-post-body">Hello guys, if you are working in Microservice projects then it make sense to learn different Microservices design pattern and principles, not just to make your architecture more robust but also to understand existing projects&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">2 years ago &#183; 36 likes &#183; javinpaul and Soma</div></a></div><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:157479895,&quot;url&quot;:&quot;https://softwarefrontier.substack.com/p/system-design-simplified-a-beginners-d09&quot;,&quot;publication_id&quot;:3575776,&quot;publication_name&quot;:&quot;The Software Frontier&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771430cc-95df-49c8-b177-67c9c4fc83e2_1280x1280.png&quot;,&quot;title&quot;:&quot;System Design Simplified: A Beginner's Guide to Everything You Need to Know (Part 9.1)&quot;,&quot;truncated_body_text&quot;:&quot;Hello everyone, Lorenzo here! (As always, running a bit behind schedule&#8212;but I promise, this one will be worth the wait!)&quot;,&quot;date&quot;:&quot;2025-02-20T08:01:06.933Z&quot;,&quot;like_count&quot;:4,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:201922174,&quot;name&quot;:&quot;Lorenzo Bradanini&quot;,&quot;handle&quot;:&quot;lorenzobradanini&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18342bf1-31cb-404a-b9e1-998a38d299bf_1200x1200.jpeg&quot;,&quot;bio&quot;:&quot;Self-taught software engineer skilled in data science, software engineering, ML, and cryptography, focused on developing innovative solutions to complex challenges.&quot;,&quot;profile_set_up_at&quot;:&quot;2024-12-19T14:58:47.419Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:3645717,&quot;user_id&quot;:201922174,&quot;publication_id&quot;:3575776,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:3575776,&quot;name&quot;:&quot;The Software Frontier&quot;,&quot;subdomain&quot;:&quot;softwarefrontier&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;A newsletter to help you master software engineering, DevOps, data science, and emerging tech, empowering developers with useful tools.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/771430cc-95df-49c8-b177-67c9c4fc83e2_1280x1280.png&quot;,&quot;author_id&quot;:201922174,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2024-12-24T00:36:27.112Z&quot;,&quot;email_from_name&quot;:&quot;The Software Frontier&quot;,&quot;copyright&quot;:&quot;Lorenzo Bradanini&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;magaziney&quot;,&quot;is_personal_mode&quot;:false}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&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://softwarefrontier.substack.com/p/system-design-simplified-a-beginners-d09?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_!GeAI!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771430cc-95df-49c8-b177-67c9c4fc83e2_1280x1280.png" loading="lazy"><span class="embedded-post-publication-name">The Software Frontier</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">System Design Simplified: A Beginner's Guide to Everything You Need to Know (Part 9.1)</div></div><div class="embedded-post-body">Hello everyone, Lorenzo here! (As always, running a bit behind schedule&#8212;but I promise, this one will be worth the wait&#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; 4 likes &#183; Lorenzo Bradanini</div></a></div>]]></content:encoded></item><item><title><![CDATA[You're already a senior dev - now what?]]></title><description><![CDATA[The three paths will guide you in the ride]]></description><link>https://newsletter.optimistengineer.com/p/youre-already-a-senior-dev-now-what</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/youre-already-a-senior-dev-now-what</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 11 Mar 2026 13:13:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ykZK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, my dear reader! Today is one of those days that I have the privilege to bring you <em>fresh air</em> from a guest writer.</p><p>Today&#8217;s issue features a special guest <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jorge Casta&#241;o&quot;,&quot;id&quot;:189406930,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!a6ev!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a1a40f-1344-4cf1-b084-6daa2679783f_762x762.jpeg&quot;,&quot;uuid&quot;:&quot;c7803fcc-8fad-4796-91cd-55fef1b34c49&quot;}" data-component-name="MentionToDOM"></span>. Here is Jorge&#8217;s introduction.</p><blockquote><p>Hi! I&#8217;m Jorge Casta&#241;o, a Tech Lead helping software engineers grow technically and step into leadership with confidence. I share lessons from leading engineering teams to help you avoid the common mistakes of your first leadership roles.</p></blockquote><p><strong>I want to recommend Jorge&#8217;s newsletter</strong> for all those Spanish-speaking Software Engineers seeking growth and Engineering Leaders looking for learning resources.</p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:3599556,&quot;name&quot;:&quot;Vivir del Software&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!uCFP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadbbabf7-bba9-4c4c-82fb-25d8be4d1a78_1000x1000.png&quot;,&quot;base_url&quot;:&quot;https://vivirdelsoftware.substack.com&quot;,&quot;hero_text&quot;:&quot;Manual de Supervivencia Developer | Consejos de carrera para destacar en el mundo del Software | &#191;PEC? Te suscribes | Gratis incluso si eres DevOps&quot;,&quot;author_name&quot;:&quot;Jorge Casta&#241;o&quot;,&quot;show_subscribe&quot;:true,&quot;logo_bg_color&quot;:&quot;#ffffff&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="EmbeddedPublicationToDOMWithSubscribe"><div class="embedded-publication show-subscribe"><a class="embedded-publication-link-part" native="true" href="https://vivirdelsoftware.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_!uCFP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadbbabf7-bba9-4c4c-82fb-25d8be4d1a78_1000x1000.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">Vivir del Software</span><div class="embedded-publication-hero-text">Manual de Supervivencia Developer | Consejos de carrera para destacar en el mundo del Software | &#191;PEC? Te suscribes | Gratis incluso si eres DevOps</div><div class="embedded-publication-author-name">Por Jorge Casta&#241;o</div></a><form class="embedded-publication-subscribe" method="GET" action="https://vivirdelsoftware.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="Escribe tu correo electr&#243;nico..."><input type="submit" class="button primary" value="Suscribirse"></form></div></div><p>Without taking any more time, I'll hand the word &#127908; over to Jorge.</p><div><hr></div><p>Congratulations, you made it. You finally have your senior developer position. It&#8217;s been a tough road.</p><p>But if you thought this was the end, I have bad news: you can&#8217;t retire yet. With any luck, you still have 30 years of daily meetings ahead.</p><p>Reaching the senior floor is not the last stage of your career, which is why today I want to talk to you about the 3 possible paths that open up in front of you.</p><h2>The mindset shift</h2><p>Sorry to keep bringing bad news, but the first thing you need to take the next step is to change the way you think. To reach senior, you learned in depth how programming works, which algorithms are most efficient, and which designs best fit each situation. You focused on the technical side.</p><p>Many of us have tried to progress using the same tools: more technology, more specialization, more technical depth. But now that&#8217;s no longer enough. <em><strong>#sad</strong></em></p><p>The next level is not about knowing more. It&#8217;s about learning that your impact no longer depends solely on what you produce with your own fingers. The next step means making decisions, guiding your team, and multiplying the work of others.</p><p>It&#8217;s an uncomfortable change that requires letting go of everything that defines us: being good programmers. The challenge is no longer measured by the tickets you close; it&#8217;s more diffuse. But it&#8217;s also bigger, since every decision you make has a greater impact.</p><h2>The three paths</h2><p>Ok, my next role involves a greater impact on my team, but how?</p><p>Well, there are 3 possible directions. None is better than the others; you&#8217;ll have to figure out which one you want to walk.</p><h3>The technical track (Individual contributor)</h3><p>You&#8217;re still an engineer, but your influence is no longer limited to your own code. At the early levels &#8212; Tech Lead &#8212; you still have a concrete team, clear deliverables, and you keep writing code. Enjoy it.</p><p>As you move toward Staff / Principal Engineer, the game changes: you define technical direction, reduce uncertainty in problems others don&#8217;t even know how to start, and influence without hierarchical authority.</p><p>Climbing the technical track may mean you code less and less, but you&#8217;ll be very close to the solutions being implemented. And that feels almost the same as building them yourself. Almost.</p><h3>Engineering Management</h3><p>This is the path that scares and attracts people the most at the same time. You leave code as your main tool &#8212; not necessarily forever, but as a priority &#8212; and people become your job. Your success is no longer measured by what you produce, but by what your team produces.</p><p>This role requires completely different skills: listening, communication, and difficult conversations. It can be daunting because we go from being programmers to being managers. But watching your team grow and being able to help them directly is also a rewarding job.</p><p>This track change requires training &#8212; don&#8217;t think you&#8217;ll suddenly be able to handle such a different role without help. The problem is when your company doesn&#8217;t support you through it, which is most of the time. <em><strong>#sadder</strong></em></p><h3>Product Manager</h3><p>Possibly the least obvious path for a developer, but an increasingly common leap in the AI era. If you find yourself asking why things get built, this is your move.</p><p>Moving into product means starting to operate in the space of what and why before how. The intersection of what the user needs, what the business wants, and what the team can build. You&#8217;ll need to prioritize, say no, and explain why.</p><p>Developers who move into product have an advantage that no non-technical PMs can replicate: they understand the real cost of decisions. But be careful: it&#8217;s dangerous to be stuck on the how when your job now is to define the what.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ykZK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ykZK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png 424w, https://substackcdn.com/image/fetch/$s_!ykZK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png 848w, https://substackcdn.com/image/fetch/$s_!ykZK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png 1272w, https://substackcdn.com/image/fetch/$s_!ykZK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ykZK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png" width="1296" height="1344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1344,&quot;width&quot;:1296,&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_!ykZK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png 424w, https://substackcdn.com/image/fetch/$s_!ykZK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png 848w, https://substackcdn.com/image/fetch/$s_!ykZK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png 1272w, https://substackcdn.com/image/fetch/$s_!ykZK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F540cd68f-91d2-4001-9940-b132875f9331_1296x1344.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>How to choose your path?</h2><p>There&#8217;s no right answer, but there are right questions. Take some time with this, because thinking is hard work.</p><p>The most common trap is choosing by elimination or by inertia: &#8220;I don&#8217;t see myself managing people, so technical track&#8221; or &#8220;I was offered a manager role and took it.&#8221; That&#8217;s not choosing, that&#8217;s going with the flow. <em><strong>#saddest</strong></em></p><p>Three questions to help clarify:</p><p><strong>What gives you the most energy today?</strong></p><p>Not what you&#8217;re good at, but what&#8217;s your fuel? Solving a complex technical problem, unblocking someone on your team, or understanding why a product isn&#8217;t working.</p><p><strong>What are you willing to leave behind?</strong></p><p>Every path involves a real trade-off. The technical track means letting go of direct control. Management means letting go of the code. Product means letting go of technical certainty. What loss can you live with?</p><p><strong>Where do you want to be in three years?</strong></p><p>Picture your day-to-day. What your meetings look like, what problems you&#8217;re solving, who you&#8217;re talking to. Choose carefully, but don&#8217;t delay the decision. Worst case, you can always go back to the technical track.</p><div><hr></div><p>That&#8217;s it! Think about those three questions calmly before you decide your next step.</p><p>Here&#8217;s a prompt to talk it through with your favorite AI:</p><blockquote><p><em>I&#8217;m a Senior developer thinking about my next career step. I want to explore three possible paths: the technical track (Tech Lead, Staff or Principal Engineer), Engineering Management or Product Manager.</em></p><p><em>Ask me questions one at a time to help me figure out which path fits me best. Don&#8217;t give me the answer upfront. First I want to explore what gives me energy, what I&#8217;m willing to leave behind, and where I see myself in three years.</em></p><p><em>At the end, give me your honest take on which path seems most aligned with what I&#8217;ve shared, and why.</em></p></blockquote><div><hr></div><p><strong>Thanks, Marcos,</strong> for allowing me to speak to your community.</p><p>If you want to talk more about this or anything else, feel free to reach out on <a href="https://www.linkedin.com/in/jorge-casta%C3%B1o/">Linkedin</a>.</p><h2><strong>&#129730; Thanks Jorge!</strong></h2><p>Marcos back!</p><p>I want to send a deep <strong>Thank You to Jorge Casta&#241;o</strong> for sharing his experience with all of us. To learn more from G&#225;bor, take a look at his newsletter &#128071;&#127995;</p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:3599556,&quot;name&quot;:&quot;Vivir del Software&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!uCFP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadbbabf7-bba9-4c4c-82fb-25d8be4d1a78_1000x1000.png&quot;,&quot;base_url&quot;:&quot;https://vivirdelsoftware.substack.com&quot;,&quot;hero_text&quot;:&quot;Manual de Supervivencia Developer | Consejos de carrera para destacar en el mundo del Software | &#191;PEC? Te suscribes | Gratis incluso si eres DevOps&quot;,&quot;author_name&quot;:&quot;Jorge Casta&#241;o&quot;,&quot;show_subscribe&quot;:true,&quot;logo_bg_color&quot;:&quot;#ffffff&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="EmbeddedPublicationToDOMWithSubscribe"><div class="embedded-publication show-subscribe"><a class="embedded-publication-link-part" native="true" href="https://vivirdelsoftware.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_!uCFP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadbbabf7-bba9-4c4c-82fb-25d8be4d1a78_1000x1000.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">Vivir del Software</span><div class="embedded-publication-hero-text">Manual de Supervivencia Developer | Consejos de carrera para destacar en el mundo del Software | &#191;PEC? Te suscribes | Gratis incluso si eres DevOps</div><div class="embedded-publication-author-name">Por Jorge Casta&#241;o</div></a><form class="embedded-publication-subscribe" method="GET" action="https://vivirdelsoftware.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="Escribe tu correo electr&#243;nico..."><input type="submit" class="button primary" value="Suscribirse"></form></div></div><div><hr></div><p>Thanks for your support of my work here, really appreciate it!</p><p><em>If you enjoyed this article, then click the &#128156;. It helps!<br>If you know someone else will benefit from this, &#9851;&#65039; share this post.</em></p>]]></content:encoded></item><item><title><![CDATA[RFCs: The Most Underrated Skill in Software Engineering]]></title><description><![CDATA[How writing down your decisions sharpens your thinking, improves your PRs, and grows your technical influence]]></description><link>https://newsletter.optimistengineer.com/p/rfcs-the-most-underrated-skill-in</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/rfcs-the-most-underrated-skill-in</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 04 Mar 2026 13:33:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lqsg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>How much time do we waste re-explaining decisions we already made?</p><p>How much easier would things be if those decisions were written down, clear, and useful for whoever joins later?</p><p>In today&#8217;s email, you will learn how to stop your technical decisions from disappearing into Slack threads and endless PRs.</p><h2>The real problem: technical decisions that disappear</h2><p>Most problems in software systems don&#8217;t come from syntax errors.</p><p>They come from forgotten reasoning:</p><ul><li><p>A decision is made on a call.</p></li><li><p>Someone summarizes it in Slack.</p></li><li><p>Three months later, nobody remembers why that path was chosen.</p></li></ul><p>Then someone proposes a &#8220;better&#8221; solution.</p><p>And the debate starts again.</p><p>Rework. Friction. Endless PR comments.</p><p><strong>&#128073;&#127996; RFCs are the antidote to collective technical amnesia</strong>.</p><p>They create memory.</p><h2>What an RFC actually is in your day-to-day work</h2><p>Forget Internet standards.</p><p>In your team, an RFC is simply a short, structured document that explains:</p><ul><li><p><strong>Why</strong> this change is needed</p></li><li><p><strong>What</strong> is being proposed</p></li><li><p><strong>What trade-offs exist</strong></p></li><li><p><strong>What could go wrong</strong></p></li></ul><p>That&#8217;s it.</p><p>&#128073;&#127996; <strong>It&#8217;s about raising the quality of technical thinking before code is written</strong>.</p><p>And that alone changes the level of conversation.</p><h2>Why writing RFCs builds authority and helps you persuade</h2><p>&#9757;&#127996; Let&#8217;s be honest: Authority in engineering does not come from <em>seniority</em> alone. It comes from clarity and transparency.</p><p>Writing RFCs builds both in public.</p><p><strong>&#128073;&#127996; You demonstrate structured thinking and invite participation</strong>.</p><p>Anyone can have an opinion in a meeting.</p><p>Very few people can:</p><ul><li><p>Clearly define the real problem.</p></li><li><p>Separate assumptions from facts.</p></li><li><p>Lay out alternatives.</p></li><li><p>Explain trade-offs.</p></li><li><p>Anticipate risks before someone else mentions them.</p></li></ul><p>An RFC forces you to do exactly that.</p><p>And there&#8217;s something even more important: Many technically sound proposals fail because they arrive fully baked. When developers are not involved early, they don&#8217;t feel ownership. And when people don&#8217;t feel ownership, they resist.</p><p>&#128073;&#127996; <strong>Sharing an RFC as a draft changes the dynamic</strong>. It becomes a conversation instead of a decision announcement.</p><h2>When you should write an RFC</h2><p>&#9757;&#127996; Not every change needs one.</p><p>But write an RFC when the decision:</p><ul><li><p>Changes the architecture.</p></li><li><p>Introduces a new or expensive dependency.</p></li><li><p>Modifies a public API.</p></li><li><p>Affects multiple teams.</p></li><li><p>Has long-term impact beyond a single ticket.</p></li></ul><p>&#128073;&#127996; <strong>Just to give you a real example</strong>: The last time I wrote an RFC was to propose how to implement the AGENTS.md framework in the repos of the Engineering Organization.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:189281794,&quot;url&quot;:&quot;https://ainativecompass.substack.com/p/from-agentesmd-to-sub-agents-structure&quot;,&quot;publication_id&quot;:5582181,&quot;publication_name&quot;:&quot;AI Native Compass&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!h9EE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F196c5772-b871-4137-8b12-484547890621_184x184.png&quot;,&quot;title&quot;:&quot;From AGENTS.md to sub-agents: structure and best practices&quot;,&quot;truncated_body_text&quot;:&quot;If you work in Platform Engineering or on a development team, you need to understand one thing: subagents &#8800; MCPs.&quot;,&quot;date&quot;:&quot;2026-03-01T14:11:16.240Z&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;previous_name&quot;:&quot;Marcos F. Lobo &#128507;&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.368Z&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;:null,&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;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/196c5772-b871-4137-8b12-484547890621_184x184.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.633Z&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;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/b06692c9-9512-4a82-a9d6-74b3a4fe273b_168x168.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;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;paidPublicationIds&quot;:[458709],&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://ainativecompass.substack.com/p/from-agentesmd-to-sub-agents-structure?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_!h9EE!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F196c5772-b871-4137-8b12-484547890621_184x184.png" loading="lazy"><span class="embedded-post-publication-name">AI Native Compass</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">From AGENTS.md to sub-agents: structure and best practices</div></div><div class="embedded-post-body">If you work in Platform Engineering or on a development team, you need to understand one thing: subagents &#8800; MCPs&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 months ago &#183; 4 likes &#183; Marcos F. Lobo &#128507;&#129517;</div></a></div><p>Now, an important part.</p><h2>How to handle feedback without turning it into an opinion war</h2><p>&#9757;&#127996; RFCs don&#8217;t eliminate disagreement but they structure it.</p><p>To deal with this situation, a few simple rules help:</p><ul><li><p>Separate facts from preferences.</p></li><li><p>Set a time window for feedback.</p></li><li><p>Escalate only when needed.</p></li><li><p>Document the final decision clearly.</p></li></ul><p>And one important principle: No silent vetoes.</p><p>&#128073;&#127996; <strong>If someone blocks the proposal</strong>, ask them to write a counter-proposal using the same structure.</p><h2>Where to write RFCs</h2><p>I like to use Git to publish my RFCs because I find it a good tool for:</p><ol><li><p>Reach my audience, a.k.a. developers.</p></li><li><p>A Pull Request permits comments and contributions.</p></li></ol><p>So, if you want to start writing RFCs, my suggestion for you is:</p><ul><li><p>Create a new repository.</p></li><li><p>Where the README.md file explains what the repo is and how to create RFCs.</p></li><li><p>Also, you will have an RFC template that the people can (must) use to contribute their RFCs.</p></li></ul><p>That&#8217;s it!</p><p>So far, you have some clarity about the RFCs. Now, let me give you the template I&#8217;m using nowadays. Click the button below to receive it for free &#128071;&#127995; </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;mailto:hello@optimistengineer.com?subject=I%20want%20the%20RFC%20template&amp;body=Hey%20Marcos%2C%0D%0A%0D%0AI've%20just%20read%20your%20article%20about%20%22RFCs%3A%20The%20Most%20Underrated%20Skill%20in%20Software%20Engineering%22%20and%20I%20would%20like%20to%20recieve%20your%20RFC%20template.%0D%0A%0D%0AThank%20you.&quot;,&quot;text&quot;:&quot;&#127873; Get RFC template for free&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="mailto:hello@optimistengineer.com?subject=I%20want%20the%20RFC%20template&amp;body=Hey%20Marcos%2C%0D%0A%0D%0AI've%20just%20read%20your%20article%20about%20%22RFCs%3A%20The%20Most%20Underrated%20Skill%20in%20Software%20Engineering%22%20and%20I%20would%20like%20to%20recieve%20your%20RFC%20template.%0D%0A%0D%0AThank%20you."><span>&#127873; Get RFC template for free</span></a></p><h2>&#10024; Summary</h2><p>RFCs are not ceremonies. They are not corporate theater. And they are definitely not paperwork for the sake of process.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lqsg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lqsg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png 424w, https://substackcdn.com/image/fetch/$s_!lqsg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png 848w, https://substackcdn.com/image/fetch/$s_!lqsg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png 1272w, https://substackcdn.com/image/fetch/$s_!lqsg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lqsg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png" width="1456" height="642" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:642,&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_!lqsg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png 424w, https://substackcdn.com/image/fetch/$s_!lqsg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png 848w, https://substackcdn.com/image/fetch/$s_!lqsg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png 1272w, https://substackcdn.com/image/fetch/$s_!lqsg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a39a319-90b4-4bd3-bd61-85dcd6a0dbfb_2096x924.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>They are thinking tools.</strong></p><p>They force you to slow down just enough to clarify the problem before jumping to the solution. They turn opinions into arguments. They transform isolated ideas into shared decisions. And over time, they build something most engineering teams lack: technical memory.</p><p>Writing RFCs will not make your code compile faster. But they will make your decisions stronger. They reduce friction. They create alignment. They make discussions sharper and shorter. And they make your reasoning visible.</p><p>And, look:</p><ul><li><p>If you want to grow as an engineer, keep writing code.</p></li><li><p>If you want to grow in influence and authority, start writing decisions down.</p></li></ul><p>Hope you enjoy today&#8217;s email. I know I made some bold arguments, and I hope you consider them when you plan your next proposal.</p><div><hr></div><p>Thanks for your support and feedback, I really appreciate it!</p><p>You&#8217;re the best! &#128406;&#127996;</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120358;&#120367;&#120363;&#120368;&#120378;&#120358;&#120357; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;, &#120373;&#120361;&#120358;&#120367; &#120356;&#120365;&#120362;&#120356;&#120364; &#120373;&#120361;&#120358; &#128156;. &#120336;&#120373; &#120361;&#120358;&#120365;&#120369;&#120372;!</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120364;&#120367;&#120368;&#120376; &#120372;&#120368;&#120366;&#120358;&#120368;&#120367;&#120358; &#120358;&#120365;&#120372;&#120358; &#120376;&#120362;&#120365;&#120365; &#120355;&#120358;&#120367;&#120358;&#120359;&#120362;&#120373; &#120359;&#120371;&#120368;&#120366; &#120373;&#120361;&#120362;&#120372;, &#9851;&#65039; &#120372;&#120361;&#120354;&#120371;&#120358; &#120373;&#120361;&#120362;&#120372;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#128154; On WhatsApp&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#128154; On WhatsApp</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/&quot;,&quot;text&quot;:&quot;&#128153; On LinkedIn&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/"><span>&#128153; On LinkedIn</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#129653; Bluesky&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#129653; Bluesky</span></a></p>]]></content:encoded></item><item><title><![CDATA[MCP Architecture Overview]]></title><description><![CDATA[An app that implements the Model Context Protocol, how does it look like at architecture level]]></description><link>https://newsletter.optimistengineer.com/p/mcp-architecture-overview</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/mcp-architecture-overview</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 25 Feb 2026 13:16:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YRS0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve decided to write this newsletter issue because I found out that some developers jump into the implementation of an MCP-based application without knowing the particularities and the <em>language</em> of its architecture.</p><p>In detail, today you will learn:</p><ul><li><p>The goal of an MCP.</p></li><li><p>Components and responsibilities.</p></li><li><p>Delivery options.</p></li></ul><p><strong>Before jumping into it</strong>, I just wanted to let you know that <strong>I am writing another newsletter</strong> on how to move <strong>from Cloud Native foundations to AI&#8209;powered platforms</strong>. There, you will find more details about how to work with AI in the enterprise world. You can subscribe here &#128071;&#127995;</p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:5582181,&quot;name&quot;:&quot;AI Native Compass&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!h9EE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F196c5772-b871-4137-8b12-484547890621_184x184.png&quot;,&quot;base_url&quot;:&quot;https://ainativecompass.substack.com&quot;,&quot;hero_text&quot;:&quot;From Cloud Native to AI Native&quot;,&quot;author_name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&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://ainativecompass.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_!h9EE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F196c5772-b871-4137-8b12-484547890621_184x184.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">AI Native Compass</span><div class="embedded-publication-hero-text">From Cloud Native to AI Native</div><div class="embedded-publication-author-name">By Marcos F. Lobo &#128507;&#129517;</div></a><form class="embedded-publication-subscribe" method="GET" action="https://ainativecompass.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>Let&#8217;s continue now.</p><h2>&#127919; Goal of an MCP</h2><p><strong>The MCP defines a standardized way for environments and tools</strong> (IDEs, CLIs, agents) to request context, such as files, metadata, secrets, telemetry points, policies, etc., from a Context Provider (an agent or service).</p><p><strong>This context is used to feed LLMs/Models</strong> that perform assistance tasks (autocompletion, test generation, security analysis, etc.) without exposing the entire repository or unnecessary secrets.</p><h2>&#129521; Components and Responsibilities</h2><ul><li><p>IDE Plugin / MCP Client</p><ul><li><p>User interface, event hooks (cursor, selection), UI for context approval.</p></li><li><p>Communicates with the Agent via local socket (Unix socket/named pipe) or localhost HTTP/gRPC.</p></li></ul></li><li><p>MCP Agent</p><ul><li><p>Orchestrates context gathering (files, git, build graph, dep).</p></li><li><p>Applies policies, redaction, and minification.</p></li><li><p>Caches results and maintains provenance history.</p></li><li><p>Interacts with secret/telemetry providers.</p></li><li><p>Calls models (local or remote) or forwards the response.</p></li></ul></li><li><p>Model Provider / LLM</p><ul><li><p>Can be a cloud endpoint (OpenAI, Anthropic, Azure) or a local model (Llama, Mistral).</p></li><li><p>The Agent must be able to redirect prompts and enforce size limits.</p></li></ul></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_!YRS0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YRS0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png 424w, https://substackcdn.com/image/fetch/$s_!YRS0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png 848w, https://substackcdn.com/image/fetch/$s_!YRS0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png 1272w, https://substackcdn.com/image/fetch/$s_!YRS0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YRS0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png" width="1152" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1152,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;MCP Components and responsibilities&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="MCP Components and responsibilities" title="MCP Components and responsibilities" srcset="https://substackcdn.com/image/fetch/$s_!YRS0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png 424w, https://substackcdn.com/image/fetch/$s_!YRS0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png 848w, https://substackcdn.com/image/fetch/$s_!YRS0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png 1272w, https://substackcdn.com/image/fetch/$s_!YRS0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37621e36-4344-40ef-9d1d-0b210c094f85_1152x960.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">MCP Components and Responsibilities</figcaption></figure></div><h2>&#128640; Delivery options for MCP servers</h2><p>At the time of delivering an MCP server, the deployment decision is not just technical. The aspects you have to consider are:</p><ul><li><p>Latency.</p></li><li><p>Security.</p></li><li><p>Developer experience.</p></li><li><p>Operating costs.</p></li><li><p>Governance.</p></li></ul><p>The main options are discussed in more detail below.</p><h3>Native Binary</h3><p>An executable that the developer installs locally and that runs as a system process.</p><p><strong>Advantages</strong>:</p><ul><li><p>Maximum performance and low resource consumption.</p></li><li><p>Direct access to the filesystem, Unix sockets, and OS resources.</p></li><li><p>Immediate startup (no cold start).</p></li><li><p>Better integration with IDEs and local tools.</p></li></ul><p><strong>Disadvantages</strong>:</p><ul><li><p>Need for cross-platform builds (Mac, Windows, Linux).</p></li><li><p>More complex version and upgrade management.</p></li><li><p>Distribution and binary signing require a robust pipeline.</p></li></ul><p><strong>When to choose it</strong>:</p><ul><li><p>Teams with a strong focus on Developer Experience.</p></li><li><p>Need for minimal latency.</p></li><li><p>Environments where local access to the repository is critical.</p></li></ul><h3>Docker Container</h3><p>The Agent runs as a Docker container locally.</p><p><strong>Advantages</strong>:</p><ul><li><p>Full consistency across operating systems.</p></li><li><p>Simplifies Agent dependencies and libraries.</p></li><li><p>Easy versioning (image tags).</p></li><li><p>Compatible with enterprise environments where Docker is already standard.</p></li></ul><p><strong>Disadvantages</strong>:</p><ul><li><p>Additional containerization overhead.</p></li><li><p>Volume permission management (can be tricky).</p></li><li><p>Slightly more complex UX (requires an active Docker container).</p></li></ul><p>I personally don&#8217;t find these advantages really <em>critical</em>, but I wanted to add them from an objective point of view.</p><p>When to choose it:</p><ul><li><p>If all developers already use Docker.</p></li><li><p>If you want to minimize &#8220;works on my machine&#8221; issues.</p></li></ul><h3>Cloud Service</h3><p>The Agent runs as a shared service (internal or external SaaS). Clients connect remotely.</p><p><strong>Advantages:</strong></p><ul><li><p>Centralized policies and drafting.</p></li><li><p>Unified observability.</p></li><li><p>Easy to implement RBAC and auditing.</p></li><li><p>No complex local installation required.</p></li></ul><p><strong>Disadvantages:</strong></p><ul><li><p>Higher latency (network round-trip times).</p></li><li><p>Privacy risks if the context contains sensitive code.</p></li><li><p>Greater security complexity (TLS, IAM, isolation).</p></li></ul><p>When to choose it:</p><ul><li><p>Large organizations with compliance needs.</p></li><li><p>Globally distributed teams.</p></li><li><p>When strict traceability is required.</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_!xOjf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xOjf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png 424w, https://substackcdn.com/image/fetch/$s_!xOjf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png 848w, https://substackcdn.com/image/fetch/$s_!xOjf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png 1272w, https://substackcdn.com/image/fetch/$s_!xOjf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xOjf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png" width="1456" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Delivery options for MCP servers&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="Delivery options for MCP servers" title="Delivery options for MCP servers" srcset="https://substackcdn.com/image/fetch/$s_!xOjf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png 424w, https://substackcdn.com/image/fetch/$s_!xOjf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png 848w, https://substackcdn.com/image/fetch/$s_!xOjf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png 1272w, https://substackcdn.com/image/fetch/$s_!xOjf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9c280f1-a5c5-491c-a814-125f841e7719_1776x960.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Delivery options for MCP servers</figcaption></figure></div><h2>&#10024; Summary</h2><p>In today&#8217;s email, you get an overview of the MCP server, its architecture, and the best approaches to deliver it to your customers.</p><p>Architecturally, a typical MCP-based application has three clear building blocks:</p><ul><li><p>The <strong>IDE plugin/client</strong> (UI hooks and event triggers).</p></li><li><p>The <strong>MCP Agent</strong> (context gathering, policy enforcement, redaction, caching, and orchestration).</p></li><li><p>The <strong>Model Provider</strong> (local or cloud-based models).</p></li></ul><p>Each component has distinct but complementary responsibilities.</p><p><strong>Choose wisely the way to deliver your MCP</strong>. Nowadays, delivering MCP servers via Docker is my preferred choice because it offers a good balance between performance and version management.</p><p>I would love to hear about your experiences implementing MCP servers. Reply to this email or put a comment in Substack.</p><div><hr></div><p>Thanks for your support and feedback, I really appreciate it!</p><p>You&#8217;re the best! &#128406;&#127996;</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120358;&#120367;&#120363;&#120368;&#120378;&#120358;&#120357; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;, &#120373;&#120361;&#120358;&#120367; &#120356;&#120365;&#120362;&#120356;&#120364; &#120373;&#120361;&#120358; &#128156;. &#120336;&#120373; &#120361;&#120358;&#120365;&#120369;&#120372;!</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120364;&#120367;&#120368;&#120376; &#120372;&#120368;&#120366;&#120358;&#120368;&#120367;&#120358; &#120358;&#120365;&#120372;&#120358; &#120376;&#120362;&#120365;&#120365; &#120355;&#120358;&#120367;&#120358;&#120359;&#120362;&#120373; &#120359;&#120371;&#120368;&#120366; &#120373;&#120361;&#120362;&#120372;, &#9851;&#65039; &#120372;&#120361;&#120354;&#120371;&#120358; &#120373;&#120361;&#120362;&#120372;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#128154; On WhatsApp&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#128154; On WhatsApp</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/&quot;,&quot;text&quot;:&quot;&#128153; On LinkedIn&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/"><span>&#128153; On LinkedIn</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#129653; Bluesky&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#129653; Bluesky</span></a></p>]]></content:encoded></item><item><title><![CDATA[Does your developers need another MCP?]]></title><description><![CDATA[Many Platform Engineering teams are creating MCP for their dev team but, when is it a good idea?]]></description><link>https://newsletter.optimistengineer.com/p/does-your-developers-need-another</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/does-your-developers-need-another</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 18 Feb 2026 13:25:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-ZJI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI, AI, AI, all over the place.</p><p><strong>Your CEO, CTO, and even your CPO are telling you</strong>:</p><blockquote><p>Use the AI as much as possible!</p></blockquote><p>Or this other (my favourite)</p><blockquote><p>So will be able to deliver faster than before!</p></blockquote><p><strong>I will not jump into this debate</strong> (today), but into another: <strong>the development of the in-house services that implement the Model Context Protocol</strong>, to be used by AI Agents in the IDE of the developers.</p><p>I&#8217;ve seen many folks in Platform Engineering teams start writing MCP-based services meant to be used by the dev teams, and I wondered:</p><blockquote><p>Hey, does this actually solve a problem for the dev teams?</p></blockquote><p>In today&#8217;s issue, I want to share with you my vision about when an in-house MCP-based service makes sense.</p><p><strong>Before jumping into it</strong>, I just wanted to let you know that <strong>I am writing another newsletter</strong> on how to move <strong>from Cloud Native foundations to AI&#8209;powered platforms</strong>. You can subscribe here &#128071;&#127995;</p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:5582181,&quot;name&quot;:&quot;AI Native Compass&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!h9EE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F196c5772-b871-4137-8b12-484547890621_184x184.png&quot;,&quot;base_url&quot;:&quot;https://ainativecompass.substack.com&quot;,&quot;hero_text&quot;:&quot;From Cloud Native to AI Native&quot;,&quot;author_name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&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://ainativecompass.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_!h9EE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F196c5772-b871-4137-8b12-484547890621_184x184.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">AI Native Compass</span><div class="embedded-publication-hero-text">From Cloud Native to AI Native</div><div class="embedded-publication-author-name">By Marcos F. Lobo &#128507;&#129517;</div></a><form class="embedded-publication-subscribe" method="GET" action="https://ainativecompass.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>Now, let&#8217;s get back to our business.</p><h2>First of all, is this an automation?</h2><p><strong>Platform Engineering teams are meant to provide frameworks, CI/CD workflows, libraries, processes, and best practices to the Software Engineering teams</strong> so they can ship value to customers fast.</p><p>Platform Engineering teams have a great responsibility: choose the right solution so that Software Engineering teams will embrace and onboard the solution smoothly.</p><p>Since Software Engineering teams work with IDEs, and thanks to the existing integration between IDEs (VS Code, IntelliJ) and AI Agents, or existing IDEs like Cursor or Windsurf, one of the steps that could make sense is:</p><blockquote><p>Let&#8217;s create an MCP-based service so developers can use it from their IDEs.</p></blockquote><p>This is a great approach.</p><p>However, I&#8217;ve seen many Platform Engineering teams failing on this. Why?</p><p>&#128073;&#127996; <strong>They implemented an MCP-based solution when the feature teams needed just an automation</strong>.</p><p>Do not mix AI with automation; they are different things.</p><p>So, next time you think the solution is an MCP-based service, ask yourself the following:</p><blockquote><p>Can the work be done by an automation?</p></blockquote><h2>Is an in-house MCP-based service needed?</h2><p>Look at <a href="https://github.com/modelcontextprotocol/servers">this huuuge list of MCP servers available</a>, many of them are official from their providers.</p><p>So, another question to ask yourself?</p><blockquote><p>Will my MCP-based service solve a problem that isn&#8217;t already solved by existing MCPs?</p></blockquote><p>I&#8217;ve intentionally made that question plural.</p><p>Connecting multiple MCP-based services to tools like Cursor or Windsurf already allows an AI Agent to solve problems that span multiple sources.</p><p>In fact, AI Agents can already orchestrate across the configured MCPs to resolve those problems.</p><p>So the real question is:</p><blockquote><p>Why add another MCP that acts as a wrapper?</p></blockquote><p>Maybe yes!, maybe no!</p><p>I&#8217;ve raised a couple of reflections that now your brain is trying to <em>plug and play</em> with the rest of your ideas. In order to help you, <strong>I will now list when it makes sense to create an MCP and when it does not</strong>.</p><h2>When does an in-house MCP-based service not make sense?</h2><ul><li><p><strong>Small organizations</strong> (1&#8211;2 teams) where the operational overhead of the MCP outweighs the benefits.</p></li><li><p><strong>Top priority</strong>: developer speed and minimal friction (you prefer direct adapters in the IDE).</p></li><li><p><strong>High team autonomy:</strong> with very different rules and an aversion to centralization, the MCP will become a source of political friction.</p></li><li><p><strong>When the cost of maintaining</strong> adapters/compatibility outweighs the benefits, e.g., too many vendors with unstable APIs.</p></li></ul><h2>When does an in-house MCP-based service make sense?</h2><ul><li><p><strong>You have &gt;=10&#8211;20 teams</strong> with <strong>different policies</strong> and want global consistency (rulesets, RBAC, auditing).</p></li><li><p><strong>You need correlation/dedupe</strong> between findings from multiple scanners (SAST, SCA, linters, Sonar, etc.) to prevent one bug from appearing as three.</p></li><li><p><strong>Compliance/audit requirements</strong>: logging who automated what, blocking pull requests based on corporate policy, and evidence retention.</p></li><li><p><strong>You&#8217;ll want to enforce cross-functional policies</strong>, like legal or privacy rules affecting all repositories, and enforce controlled downgrades when providers fail.</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_!-ZJI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-ZJI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png 424w, https://substackcdn.com/image/fetch/$s_!-ZJI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png 848w, https://substackcdn.com/image/fetch/$s_!-ZJI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png 1272w, https://substackcdn.com/image/fetch/$s_!-ZJI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-ZJI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png" width="1248" height="1380" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1380,&quot;width&quot;:1248,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:182968,&quot;alt&quot;:&quot;Diagram that helps to decide whether you need to implement an in-house MCP service or not&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/186879732?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Diagram that helps to decide whether you need to implement an in-house MCP service or not" title="Diagram that helps to decide whether you need to implement an in-house MCP service or not" srcset="https://substackcdn.com/image/fetch/$s_!-ZJI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png 424w, https://substackcdn.com/image/fetch/$s_!-ZJI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png 848w, https://substackcdn.com/image/fetch/$s_!-ZJI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png 1272w, https://substackcdn.com/image/fetch/$s_!-ZJI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1cb1a1e-e2d3-40ff-98f2-cf7a37cd8bfe_1248x1380.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Is an in-house MCP-based service needed?</figcaption></figure></div><p>Let&#8217;s wrap up for today.</p><h2>&#10024; Summary</h2><p>Keep this in mind:</p><p>&#128073;&#127996; Just because you can implement an MCP-based service to solve a problem doesn&#8217;t mean you should.</p><p>From there:</p><ul><li><p>Make an assessment of the problem you need to solve.</p></li><li><p>Is it something you can solve with automation?</p></li><li><p>Be sure you have the right expertise in the team to implement these kinds of tools.</p></li></ul><div><hr></div><p>Thanks for your support and feedback, I really appreciate it!</p><p>You&#8217;re the best! &#128406;&#127996;</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120358;&#120367;&#120363;&#120368;&#120378;&#120358;&#120357; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;, &#120373;&#120361;&#120358;&#120367; &#120356;&#120365;&#120362;&#120356;&#120364; &#120373;&#120361;&#120358; &#128156;. &#120336;&#120373; &#120361;&#120358;&#120365;&#120369;&#120372;!</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120364;&#120367;&#120368;&#120376; &#120372;&#120368;&#120366;&#120358;&#120368;&#120367;&#120358; &#120358;&#120365;&#120372;&#120358; &#120376;&#120362;&#120365;&#120365; &#120355;&#120358;&#120367;&#120358;&#120359;&#120362;&#120373; &#120359;&#120371;&#120368;&#120366; &#120373;&#120361;&#120362;&#120372;, &#9851;&#65039; &#120372;&#120361;&#120354;&#120371;&#120358; &#120373;&#120361;&#120362;&#120372;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#128154; On WhatsApp&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#128154; On WhatsApp</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/&quot;,&quot;text&quot;:&quot;&#128153; On LinkedIn&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/"><span>&#128153; On LinkedIn</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#129653; Bluesky&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#129653; Bluesky</span></a></p>]]></content:encoded></item><item><title><![CDATA[OpenCost: what it is, what it fixes, and where it stands today]]></title><description><![CDATA[A practical rundown for platform engineers building cloud-native apps]]></description><link>https://newsletter.optimistengineer.com/p/opencost-what-it-is-what-it-fixes</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/opencost-what-it-is-what-it-fixes</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 11 Feb 2026 13:25:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5728203f-d16f-4e13-9d35-705afa78ec60_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If your team runs workloads on Kubernetes and you still treat cloud spend as a vague line item on an invoice, <strong>OpenCost</strong> is worth a quick, serious look.</p><p>Money is important, more and more every day, and when you are in the cloud, holding the money is a real challenge &#128184;.</p><p>That&#8217;s why, <strong>in today&#8217;s issue, I will give you an overview of OpenCost</strong>, a CNCF project.</p><p>But first things first, <strong>what OpenCost is?</strong></p><blockquote><p>It&#8217;s an open-source, vendor-neutral project that brings <strong>real-time cost visibility and allocation to Kubernetes and cloud infrastructure</strong> so engineering teams and platform teams can make data-driven decisions about efficiency and showback/chargeback.</p></blockquote><p><em>Nice</em> definition, right? For me, that kind of definition are okeysh, but I really need to understand what it does.</p><h2>&#129300; What OpenCost actually does</h2><ul><li><p><strong>Measures &amp; allocates</strong> cloud and Kubernetes costs in near real-time (CPU, memory, storage, network, GPU, etc.).</p></li><li><p><strong>Maps cloud billing to Kubernetes concepts</strong>, so you can answer &#8220;how much did team X spend last week?&#8221; or &#8220;which deployment is causing the spike?&#8221;</p></li><li><p><strong>Supports multi-cloud and on-prem</strong> via integrations with AWS/Azure/GCP billing APIs and customizable pricing models.</p></li></ul><p>Another thing I see super useful for real life is that <strong>OpenCost can give you the money you burn by namespace</strong>. Why is it important for me? Because, usually, the resources from the different dev teams are deployed in separate namespaces, hence, <strong>each dev team can see how much their stuff costs</strong>.</p><p>From there, the next step is obvious. Having namespace costs allows you to:</p><ul><li><p>Allocate expenses directly to teams or products (if each team uses its own namespace).</p></li><li><p>Quickly identify which namespace is consuming the most resources or money.</p></li><li><p>Integrate with showback/chargeback processes within your platform.</p></li></ul><p>Last but not least, I think it&#8217;s important to mention that <strong>OpenCost is Kubernetes-native</strong>: you typically deploy it into your cluster(s) (Helm charts available), and it relies on existing metrics sources (Prometheus) and cloud billing data for price lookups.</p><h2>&#127919; Problems it solves</h2><p>When you start deploying your SaaS product into a Kubernetes clusters you face many challenges. Some of the ones related to costs are:</p><ul><li><p><strong>Opaque Kubernetes spend.</strong> Kubernetes abstracts resources, but that abstraction hides who/what is actually driving costs. OpenCost restores accountability.</p></li><li><p><strong>Ownership breaks down in shared Kubernetes platforms</strong>. Kubernetes clusters are shared by design. Cloud providers bill at the account or subscription level, but teams think in terms of services and products. Without a clear ownership model, questions like <em>&#8220;which team is driving this cost?&#8221;</em> are hard to answer. Manual mappings and spreadsheets &#128561; appear as workarounds.</p></li><li><p><strong>Kubernetes hides the true cost of &#8220;idle&#8221;</strong>. Over-provisioning, shared nodes, and autoscaling make it hard to understand idle capacity and inefficiencies. OpenCost surfaces these hidden costs, allowing platform teams to reason about efficiency in concrete, measurable terms.</p></li></ul><h2>&#129488; State of the project</h2><p><strong>OpenCost is a CNCF project</strong> that progressed from Sandbox into <strong>Incubating</strong>. It was accepted into CNCF in mid-2022 and promoted to Incubating in October 2024, reflecting growing community adoption and governance maturity.</p><p>The project is actively maintained (GitHub repo, releases, and community contributors) and has continued to publish roadmaps and year-in-review notes describing frequent releases and expanding integrations. </p><p>Recent public updates indicate priorities around refining cost models, improving supply-chain security for cost data, and adding features to better track emerging workloads (for example: AI/ML usage costs).</p><h2>&#10024; Summary</h2><p>Many companies include the cost assessment before implementing the solution. Others (lucky you) just jump into implementation, and then the problem of understanding the cost comes.</p><p>In any case, whether you made an estimation, or you just don&#8217;t know, nowadays (always?), <strong>you must have visibility on the costs of the applications and resources deployed in your Kubernetes</strong>, and OpenCost is one of the options available.</p><p>That&#8217;s all for today!</p><p>I would love to hear about your experiences using OpenCost or any other tool for measuring the costs of cloud applications. Drop me a comment or reply to this email; I will read it and come back to you!</p><div><hr></div><p>Thanks for your support and feedback, I really appreciate it!</p><p>You&#8217;re the best! &#128406;&#127996;</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120358;&#120367;&#120363;&#120368;&#120378;&#120358;&#120357; &#120373;&#120361;&#120362;&#120372; &#120369;&#120368;&#120372;&#120373;, &#120373;&#120361;&#120358;&#120367; &#120356;&#120365;&#120362;&#120356;&#120364; &#120373;&#120361;&#120358; &#128156;. &#120336;&#120373; &#120361;&#120358;&#120365;&#120369;&#120372;!</p><p>&#120336;&#120359; &#120378;&#120368;&#120374; &#120364;&#120367;&#120368;&#120376; &#120372;&#120368;&#120366;&#120358;&#120368;&#120367;&#120358; &#120358;&#120365;&#120372;&#120358; &#120376;&#120362;&#120365;&#120365; &#120355;&#120358;&#120367;&#120358;&#120359;&#120362;&#120373; &#120359;&#120371;&#120368;&#120366; &#120373;&#120361;&#120362;&#120372;, &#9851;&#65039; &#120372;&#120361;&#120354;&#120371;&#120358; &#120373;&#120361;&#120362;&#120372;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#128154; On WhatsApp&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#128154; On WhatsApp</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/&quot;,&quot;text&quot;:&quot;&#128153; On LinkedIn&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://newsletter.optimistengineer.com/"><span>&#128153; On LinkedIn</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;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/&quot;,&quot;text&quot;:&quot;&#129653; Bluesky&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" 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/"><span>&#129653; Bluesky</span></a></p>]]></content:encoded></item></channel></rss>