<?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>Sun, 24 May 2026 12:52:20 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[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">10 months 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;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;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;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;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">3 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><item><title><![CDATA[Playbook - How to become (and be seen as) a Staff Engineer]]></title><description><![CDATA[A practical one-page playbook to stop waiting for promotion and start building evidence]]></description><link>https://newsletter.optimistengineer.com/p/playbook-how-to-become-and-be-seen</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/playbook-how-to-become-and-be-seen</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 04 Feb 2026 13:32:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/cd2a5a9a-82e0-4b17-9b72-d50b10a2f6d2_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you want to get promoted, doing a good job is not enough.</p><p>&#128073;&#127996; <strong>You need to be </strong><em><strong>seen</strong></em><strong> doing the work of the role you want.</strong></p><p>Over the last few months, I&#8217;ve written several articles about Staff Engineer, technical leadership, ownership, and breaking out of silos. </p><p>I&#8217;ve now condensed all that practical advice into a <strong>one-page playbook</strong> you can actually use.</p><p>&#9757;&#127996; It&#8217;s a set of behaviors, habits, and templates you can start applying <strong>this week</strong>.</p><h2>What&#8217;s inside the playbook?</h2><ul><li><p>The core mindset behind Staff roles: scope and consistency.</p></li><li><p><strong>8 practical habits</strong> Staff Engineers repeat over time (delivery, cross-team impact, metrics, mentoring).</p></li><li><p>Ready-to-use templates: weekly stakeholder update, experiment write-up, meeting ritual.</p></li><li><p>What to bring to your 1:1s: a simple evidence-based dossier for promotion conversations.</p></li><li><p>A weekly checklist to stay focused and avoid &#8220;invisible work&#8221;.</p></li></ul><h2>Why I built it</h2><p><strong>Because Staff Engineer is not a title you wait for</strong>: It&#8217;s a pattern of visible behavior you build over time.</p><p>And most engineers don&#8217;t fail because they lack skill; they fail because their impact is scattered, siloed, or invisible.</p><h3>&#128073; Download the playbook</h3><p>You can download the <strong>one-page Staff Engineer Playbook</strong> here:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://docs.google.com/document/d/1bOc3d5Zt4NPaniKwgLSNxJ2FXge-hUH27YCPpFFis-Q/edit?usp=sharing&quot;,&quot;text&quot;:&quot;&#128230; Download the playbook for free&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://docs.google.com/document/d/1bOc3d5Zt4NPaniKwgLSNxJ2FXge-hUH27YCPpFFis-Q/edit?usp=sharing"><span>&#128230; Download the playbook for free</span></a></p><h3>Let&#8217;s make it practical</h3><p>Once you&#8217;ve read it, reply to this email with:</p><blockquote><p><strong>&#8220;#X &#8594; my hardest habit&#8221;</strong></p></blockquote><p>(where <em>X</em> is the habit you struggle with the most)</p><p>I&#8217;ll reply with <strong>3 concrete actions</strong> you can take next week to start building Staff-level evidence.</p><p>Stop waiting to be &#8220;ready&#8221;.</p><p>Start behaving like the role you want.</p><p>Hope you enjoy this playbook!</p><p>Be safe,<br>Marcos</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[3 Steps To Demonstrate You Are Up For Staff Engineer Role]]></title><description><![CDATA[Act as the role you pursuit, and then the promotion will come]]></description><link>https://newsletter.optimistengineer.com/p/3-steps-to-demonstrate-you-are-up</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/3-steps-to-demonstrate-you-are-up</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 28 Jan 2026 13:37:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jK8J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the biggest and most complex questions we all have is:</p><blockquote><p>What can I do for getting promoted for the role I want?</p></blockquote><p>If you are working in a tech product company, with around 800 or 1K employees, you have to know that you will not get a promotion just because &#8220;the time came&#8221;.</p><p>&#128073;&#127996; Instead, <strong>you have to demonstrate you can do the job before getting promoted</strong>.</p><p>I will not discuss here whether this is a good practice or not. It&#8217;s just the reality.</p><p>In today&#8217;s email, I will focus on <strong>the journey to the Staff Engineer role</strong>, and I will share with you <strong>3 actions that are a </strong><em><strong>must</strong></em><strong> for you to get promoted to Staff Engineer</strong>.</p><p>The prerequisite here is to catch the opportunity to lead a project. In my experience, this can happen in two ways:</p><p>This opportunity can come to you from upper management. For example:</p><blockquote><p>Silvia (you), there is a project for reducing costs in our obserbability system, and I want you to lead it.</p></blockquote><p>Or you build the opportunity. For example:</p><blockquote><p>Hey Barbara (your manager), I&#8217;ve validated a POC for feature teams own and deliver their own infrastructure, which will make them 2x faster to production with the same quality than today.</p></blockquote><p>In the real world, this last one takes more time than just a sentence like that, but I hope you see the point.</p><p>Once the opportunity is on you, <strong>these are the 3 actions</strong> I found successful in many cases for the person get promoted to Staff Engineer.</p><h2>Ownership end-to-end</h2><p><strong>You are THE person for a project</strong>, from the beginning to the end.</p><p>As simple as it sounds. You will be the person whom managers will ask in case they have questions or require information.</p><p>You clearly understand the problem and the expectations of the stakeholders.</p><p>You are responsible for everything on the project. If you have dependencies, you will have to manage them and coordinate the priorities across all of them.</p><p>To be able to get the full level of ownership, I start asking this 3 questions as many times as I need to really feel <em>I have control</em> of the project.</p><p><strong>1&#65039;&#8419; What is the problem we want to solve?</strong></p><ul><li><p>What are the use cases?</p></li><li><p>What is the pain?</p></li></ul><p><strong>2&#65039;&#8419; What&#8217;s the benefit for the company?</strong></p><p>Is it cost saving, efficiency, reducing incidents in production&#8230;?</p><p>You have to know the priorities at the company level, so you can align the solution in that direction.</p><p><strong>3&#65039;&#8419; Who is the customer and what are the dependencies?</strong></p><p>This could be either the customers of the company or internal customers, like developers, marketing, etc.</p><p>If you are praying for not having dependencies, sorry. If the project is meant to be done by a Staff Engineer role, for sure, you will have dependencies&#8230; and most likely outside of your organization. But <em>this is good</em> in the sense that, once you succeed (because you will &#128521;), you demonstrate you can coordinate with external people and coordinate successfully.</p><h2>Communication</h2><p>Oh dear, <strong>this is the most important part of this framework</strong>; Bring visibility to your stakeholders and managers.</p><p>You can communicate at any time:</p><ul><li><p>When progress</p></li><li><p>When blockers</p></li><li><p>&#8230;</p></li></ul><p>&#9757;&#127996; <strong>Overcommunicating is better than a lack of communication.</strong></p><p>Ensure you understand how your stakeholders like to get communication, such as:</p><ul><li><p>When (daily, weekly, &#8230;). I would recommend you start weekly and, if your sta</p></li><li><p>The format. I usually like to be precise, using the framework:</p><ul><li><p>TL;TR</p></li><li><p>Context</p></li><li><p>Current status</p></li><li><p>Next steps</p></li></ul></li><li><p>Via email, Slack, meeting, Confluence page, &#8230;</p></li></ul><p>&#127873; At the end of this email, I give you a Pro Tip about communication. But, for the moment, let&#8217;s continue to the last point of this framework.</p><h2>Plan</h2><p>You most likely prepared a plan to deliver work for your team before reaching this big project. The idea here is the same, but on a wider scale, including your external dependencies.</p><p>1&#65039;&#8419; <strong>Brainstorming / Kickoff</strong></p><p>Join your team and your dependencies (if possible), and explain the project. Also, prepare a brainstorming session for the key problems of the project. This will bring ownership from all.</p><p>This part could sound easy, but it could become tricky because you may face some people that generates <em>noise</em> or <em>hijack</em> the session (most likely with no intent to). Polish your human skills to sail the brainstorming session to your north star and so achieve your goal: </p><ol><li><p>Communicate.</p></li><li><p>And get feedback.</p></li></ol><p>2&#65039;&#8419; <strong>Technical Story Mapping</strong></p><p>This is something that you will find very useful. I have pending an email for a deep dive into Technical Story Mapping. Until then, I can tell you this is an exercise on which:</p><ul><li><p>Identify the categories of work.</p></li><li><p>The work to do on each category.</p></li><li><p>Prioritize the work.</p></li><li><p>Coordinate with your dependencies.</p></li></ul><p>The previous brainstorming is really useful for this.</p><p>I like the tool Miro for Story Mapping, but you can use any other tool that allows you to print &#8220;boxes, stickers, and text&#8221;.</p><p><strong>3&#65039;&#8419; Continuous sync</strong></p><p>For this, return to the part I wrote about communication, because it&#8217;s the same, but&nbsp;<strong>with a difference: here, you don&#8217;t need (or&nbsp;want) the stakeholders</strong>.</p><p>This is more for the <em>Workforce</em> or <em>Virtual Team</em> (however you call it) that will work on the project you lead.</p><p>The format <strong>I like the most is a Weekly Ops meeting</strong> for the project, where you:</p><ul><li><p>Explain where we are.</p></li><li><p>Check the status of your dependencies.</p></li><li><p>Identify blockers, and the owner who can solve them.</p></li><li><p>Next steps</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_!jK8J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jK8J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png 424w, https://substackcdn.com/image/fetch/$s_!jK8J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png 848w, https://substackcdn.com/image/fetch/$s_!jK8J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png 1272w, https://substackcdn.com/image/fetch/$s_!jK8J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jK8J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png" width="1456" height="747" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:747,&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_!jK8J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png 424w, https://substackcdn.com/image/fetch/$s_!jK8J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png 848w, https://substackcdn.com/image/fetch/$s_!jK8J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.png 1272w, https://substackcdn.com/image/fetch/$s_!jK8J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fcd2236-ee3e-43b7-9cf1-0e8eea796fac_1824x936.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; Summary</h2><p>Let&#8217;s wrap up for today.</p><ul><li><p>Promotions to Staff Engineer are not about tenure, they are about demonstrating you can already do the job.</p></li><li><p>The journey starts by leading a meaningful project, either assigned by leadership or proactively created by you.</p></li><li><p>Success at this level requires three core actions.</p></li><li><p>Take full end-to-end ownership, from problem definition to delivery and dependency management.</p></li><li><p>Communicate early and often, giving visibility into progress, risks, and next steps.</p></li><li><p>Create and execute a clear plan that aligns teams, dependencies, and priorities.</p></li></ul><p>The key idea is simple: act like a Staff Engineer before you get the title.</p><p><strong>Don&#8217;t forget about the Pro Tip!</strong> &#128071;&#127995;</p><h2>&#127873; Pro Tip</h2><p>For every single meeting you have during the development of the project, you should:</p><ol><li><p>Prepare an agenda with the goal, context, and expected outcomes.</p></li><li><p>Once the meeting ends, reply with the meeting notes and action items (a meeting without action items is a waste of time, meaning that an email could solve it).</p></li><li><p>Record the meeting notes and action items in a place where you can get back to them in the future, in case you have to remember a decision.</p></li></ol><p>This saved me a couple of times already, mainly when someone comes to <em>challenge your plan</em> when you are in the middle of its implementation.</p><h2>&#128278; Follow-up readings</h2><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e6ab21c8-cf44-42f2-94a7-f44f8aa6a26c&quot;,&quot;caption&quot;:&quot;Last summer, I was hanging out with a couple of friends, and we were sharing our experiences about growing in a tech company. None of us works at a big US tech company, but our companies are still fairly large, around a thousand employees worldwide, with engineering headquarters in Spain. Our roles ranged from Tech Lead to Principal Engineer.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How to Become a Staff Engineer: 5 Signals That Matter&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:40136239,&quot;name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&quot;,&quot;bio&quot;:&quot;Senior Software Engineer and Tech Lead with 20+ years of experience. Currently building a SaaS product on a cloud-based microservices architecture. Previously worked at CERN managing OpenStack services in the IT CLOUD group.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!7roK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9211d7-f06d-4d11-b17c-4f1af3d2df5a_3264x1836.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-10-22T02:45:14.103Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Owfm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc0919b-b54d-48fc-961d-711d06e4fd5a_2184x1200.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/how-to-become-a-staff-engineer-5&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:176338390,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:11,&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 class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;9926b985-f4fc-4923-86a5-a11f93b6a0a7&quot;,&quot;caption&quot;:&quot;One of the first things you have to do on your path to the Staff Engineer role is to build strong cross-department relationships.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Break Out of Your Silo: The Path to Staff Engineer&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:40136239,&quot;name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&quot;,&quot;bio&quot;:&quot;Senior Software Engineer and Tech Lead with 20+ years of experience. Currently building a SaaS product on a cloud-based microservices architecture. Previously worked at CERN managing OpenStack services in the IT CLOUD group.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!7roK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9211d7-f06d-4d11-b17c-4f1af3d2df5a_3264x1836.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-01-15T03:00:53.928Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51bc969f-f9f4-48ce-99df-761e17ef0284_1280x925.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/break-out-of-your-silo-the-path-to&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:152928735,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:14,&quot;comment_count&quot;:10,&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;91ff6b97-8790-4a28-bcbc-a7b5e621600a&quot;,&quot;caption&quot;:&quot;When we&#8217;re aiming for a new role, one of the first things we usually do is search for that role on our favorite search engine. At some point, you come across writings from people who either currently hold the role or have previously held it. This is where we find the most insightful information about our most common questions:&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Journey to Staff Engineer role - Resources&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:40136239,&quot;name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&quot;,&quot;bio&quot;:&quot;Senior Software Engineer and Tech Lead with 20+ years of experience. Currently building a SaaS product on a cloud-based microservices architecture. Previously worked at CERN managing OpenStack services in the IT CLOUD group.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!7roK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9211d7-f06d-4d11-b17c-4f1af3d2df5a_3264x1836.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-06-12T06:28:44.250Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9ed5619-16e6-4736-96b9-34fa7e4fb42f_1024x1024.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/journey-to-staff-engineer-role-resources&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:144236679,&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;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><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[Software Architecture for ETLs]]></title><description><![CDATA[Hexagonal, MVC, Layers, custom, ... I tend to keep it simple]]></description><link>https://newsletter.optimistengineer.com/p/software-architecture-for-etls</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/software-architecture-for-etls</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 21 Jan 2026 13:32:36 GMT</pubDate><enclosure url="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" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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).</p><p>Based on that, and taking into account our use case, we decided to implement an AWS Serverless approach, more concretely, using an AWS Step Function.</p><p>In today&#8217;s email, <strong>I want to share with you what the Software Architecture I tend to use in this kind of application is</strong>, so that you can apply it as well.</p><p>Before continuing, <strong>if you like my work</strong> and you want to support it, I would appreciate it if you could share this newsletter with your peers via:</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><p><strong>Or just forward this email</strong>. Thanks in advance!</p><p>Getting back to our business&#8230;</p><p>If you read me for a while, you know that I like to reduce complexity as much as possible.</p><p>&#128073;&#127996; <strong>Making things simple is complex.</strong></p><h2>Input, Output, and Use Case</h2><p>As simple as it sounds.</p><p>For each of the lambda functions within a Step Function, the Software Architecture that works well for me is:</p><ul><li><p><strong>input</strong>. In this package, you will implement the code for reading from the outside world. For example, if your app has to download a configuration file from an S3 bucket, call a REST API endpoint, etc., you will implement it here. Within this <code>input</code> package, I would advise having a sub-package per technology from which your app will read, so you encapsulate each.</p></li><li><p><strong>output</strong>. In this package, you will implement the code for pushing data outside of your app. For example, if your app needs, after your business logic, to write a file into an S3 bucket, this is the right place. Same as for <code>input</code>, I would advise having a sub-package per technology from which your app will write, so you encapsulate each.</p></li><li><p><strong>Use Case</strong>. Assuming you have a single use case (since this is an ETL), you can resolve your &#8220;orchestration&#8221; from one single use case, which uses the different inputs, executes the business logic, and uses the outputs.</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_!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" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C4se!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7907c9fc-e36c-4b8b-a2bc-9dbbb8593e8a_1242x1555.png 424w, https://substackcdn.com/image/fetch/$s_!C4se!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7907c9fc-e36c-4b8b-a2bc-9dbbb8593e8a_1242x1555.png 848w, https://substackcdn.com/image/fetch/$s_!C4se!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7907c9fc-e36c-4b8b-a2bc-9dbbb8593e8a_1242x1555.png 1272w, https://substackcdn.com/image/fetch/$s_!C4se!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7907c9fc-e36c-4b8b-a2bc-9dbbb8593e8a_1242x1555.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C4se!,w_1456,c_limit,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" width="1242" height="1555" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7907c9fc-e36c-4b8b-a2bc-9dbbb8593e8a_1242x1555.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1555,&quot;width&quot;:1242,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133866,&quot;alt&quot;:&quot;Software Architecture for ETLs&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/185199565?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7907c9fc-e36c-4b8b-a2bc-9dbbb8593e8a_1242x1555.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Software Architecture for ETLs" title="Software Architecture for ETLs" srcset="https://substackcdn.com/image/fetch/$s_!C4se!,w_424,c_limit,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 424w, https://substackcdn.com/image/fetch/$s_!C4se!,w_848,c_limit,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 848w, https://substackcdn.com/image/fetch/$s_!C4se!,w_1272,c_limit,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 1272w, https://substackcdn.com/image/fetch/$s_!C4se!,w_1456,c_limit,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 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">Software Architecture for ETLs</figcaption></figure></div><p></p><p>A question that I recently got about this Software Architecture was the following:</p><blockquote><p>What happens if, from one of the APIs I use in the <code>input</code> package, I need another dataset? Could I just implement a new function in the <code>input</code> package for that and leverage the existing code?</p></blockquote><p>&#9757;&#127996; <strong>That means a new domain</strong>. It does not matter if you read data from one or many APIs, but the domain matters.</p><p>For example:</p><ul><li><p>If you are gathering information about <strong>Observability</strong>, it does not matter if you gather that from Datadog or New Relic; what matters is the concept of <strong>Observability</strong> (the domain) for you.</p></li><li><p>If you are gathering information about <strong>Applications</strong>, it does not matter if you gather that information from Datadog as well; what matters is the concept of <strong>Applications</strong> (the domain) for you.</p></li></ul><p>Another example:</p><ul><li><p>If you are gathering information about <strong>Bugs</strong>, it does not matter if you gather that information from Jira or others; what matters is the concept of <strong>Bugs</strong> (the domain) for you.</p></li><li><p>If you are gathering information about <strong>Tests executions</strong>, it does not matter if you gather that information from Jira as well; what matters is the concept of <strong>Tests executions</strong> (the domain) for you.</p></li></ul><p>Then, you need to <strong>implement a new Lambda Function</strong> (in the context of the Step Function) that resolves the ETL <strong>for each of the domains</strong>.</p><p>If you still want to reuse code (which I would recommend), when using Step Functions, you can leverage <strong>AWS Lambda layers</strong>. They allow you to share common code across multiple Lambda functions within the same workflow.</p><p>As you can see, this is not exactly a hexagonal architecture, but an adaptation from it.</p><p>I <strong>would love to hear from you and about Software Architecture in general, and for ETLs in particular. Write down a comment, I'll read you</strong>.</p><p>Cheers!</p>]]></content:encoded></item><item><title><![CDATA[Writing about Software Development]]></title><description><![CDATA[How I organize my time for writing]]></description><link>https://newsletter.optimistengineer.com/p/writing-about-software-development</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/writing-about-software-development</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 14 Jan 2026 13:36:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0c47eeff-f177-403e-8c3c-a5d399ffeb82_1200x1600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>If you follow this newsletter</strong>, you know that I take a break at the end of the year. This year was not an exception. During my Christmas break, I went for some soft drinks 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;e4048363-b373-48ca-a826-1d97a09f54d7&quot;}" data-component-name="MentionToDOM"></span>, and we caught up because we will collaborate on a project related to <a href="https://www.xplorable.es/">this app called Xplorable</a> (I will tell you more in the future about this), and about <em>life</em>. At some point, &#193;ngel asked me:</p><blockquote><p>Marcos, where do you find the time writing, besides working as Tech Lead for a company and have an <em>actual life</em> outside of the keyboard?</p></blockquote><p>I explained how I organize myself for finding time for writing, even though I&#8217;m not a writer per se. To that, he told me:</p><blockquote><p>Marcos, you should write about that. I&#8217;m pretty sure it can help more people.</p></blockquote><p>And I took his advice, and so here we go today.</p><p>In today&#8217;s email, <strong>I will explain to you why I write about software development and how I find time for writing about it</strong>.</p><p>Before continuing, <strong>if you like my work</strong> and you want to support it, I would appreciate it if you could share this newsletter with your peers via:</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><p><strong>Or just forward this email</strong>. Thanks in advance!</p><p>Now, let&#8217;s start with the Why.</p><h2>Why do I write about Software Development?</h2><p><strong>It helps me to settle down my experiences</strong>.</p><p>Writing about Software Development helps me by:</p><ol><li><p>Put in perspective my experiences and learnings.</p></li><li><p>Learn from my own experiences.</p></li></ol><p>And, as far as the feedback I get from you, <strong>it helps others who will walk through my same track at some point</strong>.</p><p>Another question that &#193;ngel raised:</p><blockquote><p>But, Marcos, how do you find to topics to write about?</p></blockquote><p><strong>I write about what happens in my real work life</strong>, or about close friends I trust, which makes it very easy to find topics. Fortunately (?), in my daily work, many things happen, many learnings, every single day.</p><p>Because of that, the topics flow very smoothly.</p><h2>How do I organize my time for writing?</h2><p><strong>In the train, I have 4 hours of commuting home</strong>.</p><p>I know, it&#8217;s a lot. Let me give you context.</p><p>Almost three years ago, because of personal decisions, I started commuting longer than before: by train, two days a week (I have a hybrid position), two hours from home to work, and two hours back.</p><p>I saw an opportunity in this new situation of my life, and so <strong>I started writing this newsletter, The Optimist Engineer</strong>.</p><p>Yeah, I know, I could use those four hours for something more <em>human</em>, like sleeping, or getting a dopamine boost from the infinite scroll of any social media app.<br>And I&#8217;ll confess that I do that sometimes, just not during the four hours of commuting.</p><p><strong>I use my train rides back home to write. </strong>I invest two hours, twice a week, in writing a new newsletter. As I write these lines, I&#8217;m traveling at 298 km/h by train, in the middle of nowhere on the map of Spain.</p><p>I can tell you this aspect of my life has made me become consistent during these 3 years; <strong>since 2024, I have been writing a new issue of this newsletter per week</strong>. That&#8217;s a lot for me, I can tell you. In the past, I started this blog, which I gave up because I was not able to find a regular moment for writing.</p><p><strong>The </strong><em><strong>pain</strong></em><strong> of having to commute 4 hours, twice a week, helped me to become constant</strong>.</p><p>If you want to start writing, my advice is:</p><ol><li><p><strong>Write about something that comes naturally to your mind</strong>. For me, it&#8217;s very easy to write about things that happen on a daily basis.</p></li><li><p><strong>Find your slot</strong>. Same as for going to the gym, find a slot where you can write. I write for 2 hours, twice a week, only, that&#8217;s why my newsletter issues are no longer than 4 or 5 minutes of reading!</p></li></ol><p>Hope this helps others, as my friend &#193;ngel expected. If yes, I <strong>would love to hear from you and about your struggles. Write down a comment, I'll read you</strong>.</p><p>Happy New Year to everyone!</p><p></p>]]></content:encoded></item><item><title><![CDATA[Building a Product Platform Engineering Team]]></title><description><![CDATA[You must help yourself before helping others]]></description><link>https://newsletter.optimistengineer.com/p/building-a-product-platform-engineering</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/building-a-product-platform-engineering</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 17 Dec 2025 13:18:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FaqS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>This is the last email for 2025</strong>.</p><p>I usually <a href="https://newsletter.optimistengineer.com/about#&#167;publishing-schedule">take the last two weeks of the year to get rest</a>, and I want to take this moment to thank you for this exciting year 2025 and your support along the ride.</p><p><strong>Seriously, thank you.</strong> I wish you the best for the coming year.</p><p>You will receive my next email in the first week of January 2026.</p><div><hr></div><p>If you have read my newsletter for a while, you know that I&#8217;ve been deeply immersed in the Product Platform Engineering world for the last 8 years. In case you want to go deep into what a Product Platform Engineering Team is, I recommend the following reading &#128071;&#127995;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;6181e913-f17d-4b27-9c1e-fb96dcea3453&quot;,&quot;caption&quot;:&quot;You may have heard about Platform Engineering. That is the new buzzword, since a while, after the hit of DevOps.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;What is Product Platform 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;2024-11-20T07:28:41.952Z&quot;,&quot;cover_image&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%2F22ada031-2b17-4c3a-8261-40d8d09804fe_2998x1769.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/what-is-product-platform-engineering&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:151565751,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:13,&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><strong>In today&#8217;s email</strong>, I go one step beyond, and <strong>you will learn the technical principles on which a Product Platform Engineering Team should be based</strong>.</p><p>The main idea of today&#8217;s email is this:</p><blockquote><p>You need to define a way of working so your team can release their applications, libraries, and frameworks quickly.</p></blockquote><p>Otherwise, the DEV teams will find a way to achieve the same on their own.</p><p>To achieve this, you must focus on the following steps, in order:</p><h2><strong>1. Programming language and framework to use</strong></h2><p>This is extremely important to me; it can be the difference between taking half a day or a full week to deliver a new feature to teams using the framework.</p><p><strong>You have to pick up a language and framework/libraries that enable your team to deliver fast</strong>.</p><p>A Product Platform team must be pragmatic from day one. The language should let you achieve high performance with minimal code. Likewise, the framework must offer transparent support for observability: logging, metrics, and tracing should be first-class citizens.</p><p>How to choose it? I recommend that you make the decision based on:</p><ol><li><p>What is the most common language/framework used in the Engineering organization?</p></li><li><p>Are there enough people in the market knowledgeable about that language/framework?</p></li><li><p>Is the language/framework mature enough to provide an easy way to have things like observability out of the box?</p></li></ol><p>&#9757;&#127996; Crucial: <strong>the team must be proficient in the chosen language and framework</strong>. Don&#8217;t pick a language that only one person in the company understands.</p><h2><strong>2. Avoid pointless debates that don&#8217;t help the development teams</strong></h2><p>Some people will argue tabs vs spaces, others will push Google&#8217;s linter, and others want a custom rule set. Some prefer squash merges, others don&#8217;t.</p><p>These are details that add no value to your real customers: the development teams. Why waste time opening debates about it?</p><p>&#9757;&#127996; <strong>Let&#8217;s focus on the business value and the priorities</strong>.</p><p>Development teams want new features or ways to deliver those features, the same goal as your end users.</p><h2><strong>3. Use the same CI/CD as the development teams</strong></h2><p>Be close to the development teams&#8217; pain. </p><p>&#9757;&#127996; <strong>Their pain must be your pain</strong>.</p><p>If they struggle with the CI/CD system, you should experience the same constraints because that alignment will make your platform more useful and realistic.</p><ul><li><p>If you implement CI/CD functionalities for development teams, your team should use them as well.</p></li><li><p>If your team uses something else, you have to use it too.</p></li></ul><p>You have to understand their struggle so you can propose solutions for them.</p><h2><strong>4. Hold yourselves to the same standards as the development teams</strong></h2><p>You might not be running business traffic, but that&#8217;s not an excuse to lower standards.</p><p>Best practices, such as:</p><ul><li><p>Pair Review / Programming</p></li><li><p>TDD</p></li><li><p>Software Architecture that speaks (Screaming Architecture mentioned in the <a href="https://newsletter.optimistengineer.com/p/book-review-clean-architecture?utm_source=publication-search">Clean Architecture book</a>)</p></li><li><p>Security updates</p></li><li><p>Among others that are demanded for development teams, so they can deliver high-quality products.</p></li></ul><p><strong>&#9757;&#127996; Apply the same level of scrutiny</strong> for support, monitoring, and reliability to the Product Platform team as you do to the development teams. That closeness helps you understand their perspective and provide better support.</p><p>Some examples of this are:</p><ul><li><p>Monitoring: development teams have monitors and alerts when services fail, then your QA Enablement team should too.</p></li><li><p>Support: development teams rely on a support network to help each other, then build the same for your team.</p></li></ul><p>Those are the minimal commitments to reach in any Product Platform team.</p><p>&#9757;&#127996; <strong>E</strong>nsure you put in place a way of working as a team before implementing solutions for the DEV teams.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FaqS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FaqS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png 424w, https://substackcdn.com/image/fetch/$s_!FaqS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png 848w, https://substackcdn.com/image/fetch/$s_!FaqS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!FaqS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FaqS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png" width="1296" height="1032" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1032,&quot;width&quot;:1296,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Building a Product Platform Engineering Team&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="Building a Product Platform Engineering Team" title="Building a Product Platform Engineering Team" srcset="https://substackcdn.com/image/fetch/$s_!FaqS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png 424w, https://substackcdn.com/image/fetch/$s_!FaqS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png 848w, https://substackcdn.com/image/fetch/$s_!FaqS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!FaqS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa32158-0667-4917-8a92-d65eb4c354f6_1296x1032.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">Building a Product Platform Engineering Team</figcaption></figure></div><p>Hope you find this email useful, and <strong>I would like to hear your vision about how to build Platform Engineering teams</strong>. I read you in the comments.</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>