<?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>Thu, 09 Apr 2026 08:05:48 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[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;}" 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;}" 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;}" 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;}" 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">a month 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><item><title><![CDATA[The Hidden Force Slowing Your Deploys]]></title><description><![CDATA[Uncover the silent dependency trap that keeps your applications from reaching production effortlessly]]></description><link>https://newsletter.optimistengineer.com/p/the-hidden-force-slowing-your-deploys</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-hidden-force-slowing-your-deploys</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 10 Dec 2025 13:36:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3b109cf2-de9c-4e9c-b9bf-a1cc77057349_2088x1332.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Do you feel that testing your application is difficult?</strong></p><p>For running your tests, you have:</p><ol><li><p>A Docker Compose file</p></li><li><p>Which has the 2 different services that your application talks to</p></li><li><p>Plus the corresponding infrastructure that those 2 services require (database, etc)</p></li><li><p>Plus Kafka, because your service produces/consumes in Kafka.</p></li></ol><p>And sometimes the Docker Compose fails; some service did not start because of some random problem, and you have to restart.</p><p><strong>&#128073;&#127996; This has a problem</strong>: It slows you down for reaching production for every single change you implement.</p><p>In today&#8217;s email, you&#8217;ll learn <strong>one key step that will help you deliver your applications to production more quickly</strong>.</p><h2>&#127919; The Problem</h2><p><strong>Dependencies</strong>. That&#8217;s the underlying problem.</p><p>In this context: </p><blockquote><p>A dependency is any other service, application, or system that your application interacts too.</p></blockquote><p>&#128073;&#127996; <strong>Testing your application is costly because your service has too many dependencies.</strong> </p><p>I&#8217;ll share with you <strong>6 problems caused by having multiple dependencies</strong>.</p><ol><li><p><strong>Coupling and coordinating changes:</strong> If your service depends on many others, any change to an API/contract can force coordinated changes across multiple teams or your deployment. The result: blocked deployments, delays, and coordination meetings.</p></li><li><p><strong>Unpredictable latency and performance. </strong>Chained calls to external services increase latency and variability (p99 spikes). This impacts user experience and SLOs.</p></li><li><p><strong>Testing complexity: </strong>This was my main point at the beginning of the email. Unit tests are more representative; integration tests become more expensive and slower. This makes it difficult to ensure quality in CI.</p></li><li><p><strong>Operations and observability become more difficult.</strong> You need metrics/traces/alerts for each dependency. Identifying the root cause of a problem becomes more complicated.</p></li><li><p><strong>Versioning and compatibility:</strong> If you depend on APIs without stable contracts or without semver, managing versions becomes a pain (breaking changes, coordinated migrations).</p></li><li><p><strong>Loss of team autonomy. </strong>Small teams lose the ability to iterate quickly if they must coordinate with many external stakeholders.</p></li></ol><p>So, <strong>the fewer dependencies your application has, the faster it can be deployed in Production</strong>.</p><div class="poll-embed" data-attrs="{&quot;id&quot;:413794}" data-component-name="PollToDOM"></div><p></p><h2>&#129502;&#8205;&#9794;&#65039; The Solution</h2><p><strong>Reduce dependencies to one</strong>, or the most as you can. That&#8217;s my recommendation.</p><p><strong>I know it sounds tough,</strong> but in my experience, it&#8217;s the essential step if you want your application to reach production as quickly as possible.</p><blockquote><p>But, Marcos, the business logic of my application needs all those dependencies, how can I reduce my dependencies then?</p></blockquote><p><strong>Decoupling</strong>. Decoupling your application from your dependencies. Take advantage of refactoring time to do this. </p><p>I wrote a dedicated email explaining <a href="https://newsletter.optimistengineer.com/p/decoupling-your-monolithic-application">how to decouple a monolith here</a>, but I can give a couple of concrete hints now.</p><p><strong>1. Implement asynchronous communication with your dependencies</strong>. </p><p>Example: </p><ul><li><p>Instead of calling 2 REST APIs and communicating with Kafka.</p></li><li><p>Use only Kafka (or another one) for communicating with those 2 APIs.</p></li></ul><p>Coming back to the problem of testing your application, now you don&#8217;t need to spin up 2 different services (with the linked infra) plus Kafka; You just need Kafka for your tests.</p><p><strong>2. Consume one single dependency and extract logic to new applications/services</strong>. </p><p>Example: </p><ul><li><p>Your application reads from AWS S3, applies some business logic, and produces to Kafka. </p></li><li><p>Create a new Platform Service, configurable, that is in charge of only reading from AWS S3 and producing into Kafka.</p></li><li><p>Then, update your application to read from Kafka (where the other service puts the data), apply the business logic, and produce to Kafka.</p></li></ul><p>With just those two strategies, <strong>you&#8217;ll turn a &#8216;hard-to-ship&#8217; application into an independent one that can be deployed to production multiple times a day</strong>.</p><h2>&#10024; Takeaway</h2><p>I want you to retain this from today&#8217;s email: </p><p>&#128073;&#127996; <strong>Reduce the number of dependencies in your applications</strong>. As much as you can.</p><p>That&#8217;s THE takeaway today. Only that.</p><p>If you need more strategies for achieving this, <strong>reply to this email,</strong> comment if you are in Substack, or ping me in <strong><a href="https://bsky.app/profile/marcosflobo.bsky.social">Bluesky</a></strong> or <strong><a href="https://hachyderm.io/@marcosflobo">Mastodon</a></strong>. Happy to help!</p><div><hr></div><p>We are more than &#10024;<strong>1080 Optimist Engineers&#10024;</strong>!! &#128640;</p><p>Thanks for your support and feedback, 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[How to Keep Your Hard-Earned Engineering Lessons Forever]]></title><description><![CDATA[Knowledge drives you, why lose it when you change job?]]></description><link>https://newsletter.optimistengineer.com/p/how-to-keep-your-hard-earned-engineering</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/how-to-keep-your-hard-earned-engineering</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 03 Dec 2025 13:36:28 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/16d0d03a-2f6d-4dba-8644-99e6107ef38e_1024x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Why would you want to lose knowledge, patterns, and strategies that worked in the past?</strong></p><p>You don&#8217;t.</p><p>But this is exactly what happens when you move from one company to another.</p><p>In today&#8217;s email, I&#8217;ll share <strong>a strategy you can use to implement successful solutions elsewhere</strong>.</p><p>Let me describe a scenario for you:</p><ol><li><p>You and your team worked for months on a challenging engineering project.</p></li><li><p>You faced many obstacles, refactors, and performance issues.</p></li><li><p>And you finally succeeded.</p></li></ol><p>During that experience you learned and collected multiple:</p><ul><li><p>Patterns.</p></li><li><p>Strategies.</p></li><li><p>Processes.</p></li><li><p>Best practices.</p></li></ul><p>After some time, it&#8217;s time for you to move on to new opportunities. <strong>What happens with all that knowledge?</strong></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;2a04c3b3-964e-43cf-8cf2-b1f816169c54&quot;,&quot;caption&quot;:&quot;I&#8217;m done working in this company; I will quit.&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 can you tell your work at a company is basically DONE?&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:40136239,&quot;name&quot;:&quot;Marcos F. Lobo &#128507;&#129517;&quot;,&quot;bio&quot;:&quot;Senior Software Engineer and Tech Lead with 20+ years of experience. Currently building a SaaS product on a cloud-based microservices architecture. Previously worked at CERN managing OpenStack services in the IT CLOUD group.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!7roK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9211d7-f06d-4d11-b17c-4f1af3d2df5a_3264x1836.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-06-25T02:00:32.258Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/321ab45e-7f54-4e35-acfa-4788bb64850f_1024x1536.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/how-can-you-tell-your-work-at-a-company&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:165805660,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:10,&quot;comment_count&quot;:8,&quot;publication_id&quot;:1659382,&quot;publication_name&quot;:&quot;The Optimist Engineer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!Rspq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35c8c36d-e4b0-4695-b613-313d621c2839_392x392.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Even if you have a great memory, you won&#8217;t remember everything.</p><p><strong>And that is the problem</strong>: how to remember things that worked for you in the past.</p><p>You already put in the effort, so why lose it just because you changed companies?</p><p>This happened to me many times, and I struggled to remember what I did in &#8220;X company&#8221; years ago that I could apply again today.</p><p>And yeah, <strong>you cannot copy/paste code from your former company</strong> into a private repo/cloud-storage; That&#8217;s ilegal, unless the code is open sourced.</p><p><strong>But you can copy/paste</strong>:</p><ul><li><p>Patterns.</p></li><li><p>Strategies.</p></li><li><p>Processes.</p></li><li><p>Best practices.</p></li></ul><p>Which is exactly what you learnt, and <strong>which is exactly the important part</strong>.</p><p>Do you like what you read? Share it with your friends via &#128071;&#127995;</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>Now the magic question:</p><blockquote><p>Marcos, I want to save that knowledge too!</p></blockquote><p><strong>Here&#8217;s what I do.</strong> I use visual tools to store the knowledge. I&#8217;ve used a couple:</p><ul><li><p>draw.io. This was my first choice before Excalidraw.</p></li><li><p>Excalidraw. I like it very much because I&#8217;m very fast at creating something. Also, it works really well offline or with low bandwidth (me working on the train).</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_!NSTu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NSTu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png 424w, https://substackcdn.com/image/fetch/$s_!NSTu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png 848w, https://substackcdn.com/image/fetch/$s_!NSTu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png 1272w, https://substackcdn.com/image/fetch/$s_!NSTu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NSTu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png" width="1456" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140189,&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/178255745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.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_!NSTu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png 424w, https://substackcdn.com/image/fetch/$s_!NSTu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png 848w, https://substackcdn.com/image/fetch/$s_!NSTu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.png 1272w, https://substackcdn.com/image/fetch/$s_!NSTu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a3f834-c5c1-4152-ba16-bb8f6f182001_1951x1261.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">Example of pattern draw in my Excalidraw</figcaption></figure></div><p><strong>You draw your knowledge</strong>. The knowledge is not copyrighted by companies (unless patents or similar).</p><p>So next time you need to remember or browse whether a previous solution might fit your current problem, you just access that visual memory, with t<strong>he following advantages</strong>:</p><ol><li><p><strong>It was drawn by you in the past,</strong> so you&#8217;ll understand it now too.</p></li><li><p><strong>It contains the general idea</strong> at a level that&#8217;s enough for you to understand what was done. Implementation details are not needed.</p></li></ol><p>Hope this little trick can help you from now on.</p><p>Do you have other tips that could be useful for people when switching companies? <strong>Write them in a comment!</strong></p><div><hr></div><p>We are more than &#10024;<strong>1070 Optimist Engineers&#10024;</strong>!! &#128640;</p><p>Thanks for your support and feedback, 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[Do you need an Interface?]]></title><description><![CDATA[Most likely no, and I tell you why]]></description><link>https://newsletter.optimistengineer.com/p/do-you-need-an-interface</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/do-you-need-an-interface</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 26 Nov 2025 13:28:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/551db8e0-e9d1-43f6-a877-3c8450e2bec0_1248x1390.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Does this ring a bell to you?</strong></p><ol><li><p>You create a controller for your REST API.</p></li><li><p>That controller calls your use case to respond to the request.</p></li><li><p>You create an Interface for that use case, with one method, which receives the DTO, and returns a Domain object (for example).</p></li><li><p>Finally, you create a new class that implements the Interface you just created; implements the use case.</p></li></ol><p>By the book, <strong>this appears to be correct. Why?</strong></p><ul><li><p>You are <strong>decoupling</strong> your implementation thanks to the Interface.</p></li><li><p>Tomorrow, <strong>when a new implementation is needed</strong>, you just need to create a new class that implements the Interface, and your Controller will not change.</p></li><li><p><strong>At the time of testing,</strong> you use that Interface and create a Mock implementation for your tests.</p></li></ul><p><strong>But, is this a good idea?</strong></p><p>In today&#8217;s email, I will share with you <strong>when and why you should use and avoid Interfaces</strong>.</p><p>&#9757;&#127996; Before starting, I just wanted to let you know that <strong>I have a dedicated newsletter to the AI Native world,</strong> where you can learn how to become an AI Native developer and move your engineering organization <strong>from Cloud Native to AI Native</strong>. Folks are loving it.</p><p><strong>Subscribe now</strong> &#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 back to the topic of today.</p><h2>&#9989; Do you really have multiple implementations upfront?</h2><p>If the answer is yes, you definitely have to add an Interface.</p><p>For example, if you are using different services to send data to the outside world (Azure Log Analytics API and AWS Firehose), the Interface allows you to define that abstraction, simplifying the API for the user.</p><p>If you just have one single implementation, you are just duplicating code between the Interface and the actual implementation. No point in doing this.</p><h2>&#9989; Do you have <em>many things</em> behind a boundary?</h2><p>Interfaces are an excellent way to define a contract when establishing a boundary.</p><p>When there are <em>many things</em> behind a specific boundary, the interface defines a &#8220;joint&#8221; that is specific to a use case that other components or systems must consume.</p><p>In these scenarios, the contract that defines the Interface is fundamental, so that other developers or systems can interact with that complex behavior in a controlled and defined way.</p><div class="poll-embed" data-attrs="{&quot;id&quot;:410588}" data-component-name="PollToDOM"></div><h2>&#129300; Do you have one single implementation?</h2><p>If there is only one concrete implementation, like sending data to AWS Firehose only (from the previous example), the interface is simply a reflection or a &#8220;mimicry&#8221; of that concrete implementation. </p><p>The abstraction is defined purely by the behaviors of the concrete implementation, creating a <strong>one-to-one relationship</strong>. <strong>In these situations, creating an interface changes nothing</strong> in terms of coupling, system fragility, or extensibility.</p><p>You say:</p><blockquote><p>Well, it&#8217;s cheap to create an Interface for the <em>just in case</em>.</p></blockquote><p>I would answer that saying:</p><blockquote><p>What happened last time you did that? did another implementation came up later?</p></blockquote><h2>&#129300; Do you want to change the behavior for testing?</h2><p>That&#8217;s fair. You plan to implement a class, for testing purposes, that implements that Interface, and you inject it.</p><p>But for that, I have for you the <a href="https://en.wikipedia.org/wiki/Delegation_pattern">Delegation Pattern</a>. With that, you can do exactly the same, and you don&#8217;t require an Interface.</p><h2>&#129300; Are you writing code for your internal use?</h2><p>If you are implementing code for being used by <em>yourself</em>, like an internal component that another internal component will use, and you are creating Interfaces, then you are creating <em>contracts</em> for yourself.</p><p>No need to have a contract with no one.</p><h2>&#10024; Summary</h2><p>I don&#8217;t want to be the <em>party pooper,</em> or maybe yes, but in today&#8217;s email, I just wanted to share with you my conclusions from many years of writing Interfaces all over the place.</p><p>I&#8217;ve been there, I feel you, you think that <em>an Interface is the way to go</em>; My 2 cents here:</p><blockquote><p>Think twice&#8230; most likely you don&#8217;t need it.</p></blockquote><p>I have much code written over there that, if I read it today, I would refactor it removing Interfaces.</p><p><strong>I would love to hear your tales</strong> about coding with or without Interfaces. Reply to this email or comment if you are on 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><p></p>]]></content:encoded></item><item><title><![CDATA[Start Small, Scale Smart: The Real Value of Incremental Architecture]]></title><description><![CDATA[A practical guide to designing software that can evolve as fast as you do]]></description><link>https://newsletter.optimistengineer.com/p/incremental-architecture-what-you</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/incremental-architecture-what-you</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 19 Nov 2025 13:37:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1qSF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This issue is part of the <strong>series on Incremental Architectures</strong> for SaaS products.</p><p>You can read the previous one here &#128071;&#127995;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;6dd49721-2523-4197-81f9-2658c5402b6e&quot;,&quot;caption&quot;:&quot;This is the first issue of a series dedicated to Incremental Architectures for a SaaS product.&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;Incremental Platforms: Monolithic Modular 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;2025-02-05T03:01:04.509Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!MLd7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7dc7d9-c606-4ab1-8a65-b27aeff3c4a8_844x580.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/incremental-platforms-monolithic&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:156395819,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:17,&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;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>As you grow as a Software Engineer or Tech Lead, you need to grow in people skills, of course, but also in technical depth. That&#8217;s why this series exists. I hope you find this one useful.</p><p><strong>Today, you will read about incremental architectures.</strong> Let&#8217;s put a bit of common ground first.</p><p>An incremental architecture is an architecture designed to grow.</p><p>&#9757;&#127996; And why should you want that?</p><p>Two simple reasons.</p><ol><li><p>You care about code.</p></li><li><p>Your code will evolve. Your system will evolve. That is natural. The question is whether it can evolve easily or not.</p></li></ol><p>If your architecture makes change painful, you are in trouble. If it is easy to modify, you can iterate fast without rewriting everything every few months.</p><p>&#128073;&#127996; There is a set of ideas, patterns, and organizational moves that enable this. Below are the core ones you should know.</p><h2>1. Mission of the architect</h2><p>The job of an architect is not to impose diagrams.</p><p>The job of an architect is to <strong>teach</strong> and <strong>keep coherence</strong> across the system. Guide decisions, set constraints, and help teams move forward without blocking them.</p><p>From my personal perspective, <strong>this can be achieved by implementing code and solutions, and not just advising people from an Architecture role</strong>. In some special cases, when an engineering organization is in a concrete <em>momentum</em>, a dedicated and non-coding architect could be ok.</p><h2>2. Organization before technology</h2><p>Cross-functional teams deliver faster than layered organizations because each team owns a domain end-to-end. No waiting for &#8220;the backend team&#8221; or &#8220;the frontend team&#8221; to free up a sprint. </p><p><strong>&#128073;&#127996; One team, one domain, full ownership</strong>.</p><p>Keep this in mind:</p><ul><li><p>If you want microservices, you need cross-functional teams first.</p></li><li><p>If you want incremental architecture, you need independent teams first.</p></li></ul><p>This is why <a href="https://en.wikipedia.org/wiki/John_Gall_(author)#Gall's_law">Gall&#8217;s Law</a> matters, and with it, one of the takeaways for you today &#128071;&#127995;</p><blockquote><p>If you start with a complex system, you will end with a complex system that does not work. Start small, grow intentionally.</p></blockquote><h2>3. Change the conversation</h2><p>Instead of asking:</p><blockquote><p>&#8220;how long will this take?&#8221;</p></blockquote><p>ask:</p><blockquote><p>&#8220;Can we make this smaller?&#8221;</p></blockquote><p>&#128073;&#127996; <strong>You shift from deadlines to value. You move from guessing time to defining learning</strong>.</p><p>The real loop of incremental architectures is very simple and very effective:</p><ol><li><p>Build something small.</p></li><li><p>Ship it.</p></li><li><p>Get feedback.</p></li><li><p>Adjust.</p></li><li><p>Repeat.</p></li></ol><p><strong>This loop is architecture. Not diagrams.</strong></p><h2>4. When the team lacks skills</h2><p>A common blocker is &#8220;we cannot move fast because not everyone knows this part.&#8221;</p><p>Try mob programming. It spreads knowledge incredibly fast and aligns the whole team around real code, not documentation that nobody reads.</p><p>Other techniques that I practice and get great success with are:</p><ul><li><p><a href="https://newsletter.optimistengineer.com/p/four-weeks-working-in-pair-programming">Pair Programming</a>.</p></li><li><p><a href="https://newsletter.optimistengineer.com/p/my-experience-implementing-software">Pair Review</a>.</p></li></ul><h2>5. Patterns, but at the right time</h2><p>Patterns are solutions to problems.</p><p>&#128073;&#127996; <strong>Use them when you have a problem, not before.</strong></p><p>Some helpful patterns for incremental growth:</p><ul><li><p><strong>Layered architecture</strong>: good separation of concerns, but people skip layers, so be careful.</p></li><li><p><strong>Hexagonal or microkernel</strong>: other ways to separate responsibilities, more explicit.</p></li><li><p><strong>Distributed architectures</strong>: enable incremental deployment and elasticity, but recovery can be hard. Know the distributed systems <em>fallacies</em> before you embrace distribution.</p></li></ul><p>&#128073;&#127996; Remember: patterns are tools, not the goal.</p><h2>6. The Strangler Pattern</h2><p><strong>This one is for when you have a big ball of mud</strong> and you want something cleaner.</p><p>I have a dedicated email for you on this here &#128071;&#127995;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;49a7af7a-47b2-46c6-a6cd-c19d3a2a281c&quot;,&quot;caption&quot;:&quot;This is the first issue of a series dedicated to Incremental Architectures for a SaaS product.&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;Incremental Platforms: Monolithic Modular 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;2025-02-05T03:01:04.509Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!MLd7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7dc7d9-c606-4ab1-8a65-b27aeff3c4a8_844x580.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/incremental-platforms-monolithic&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:156395819,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:17,&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>And here in a nutshell:</p><ol><li><p>Build a new module inside the existing system.</p></li><li><p>Give it clean, explicit interfaces.</p></li><li><p>Extract it from the system.</p></li><li><p>Redirect the rest to use the new module.</p></li></ol><p><strong>It is not easy</strong>, but it is a safe migration strategy without big-bang rewrites.</p><h2>7. Component Architecture: your growth engine</h2><p>A good component has a few strict qualities:</p><ul><li><p>Small classes and single responsibility.</p></li><li><p>High cohesion and a focused interface.</p></li><li><p>Hard boundaries, a single entry point. No spaghetti.</p></li><li><p>Replaceable implementation, so clients do not depend on internals (Liskov matters here).</p></li></ul><p><strong>&#128073;&#127996; A component is not a microservice. It is smaller</strong>.</p><p>The trick is this: if you build components well, you can extract them into microservices whenever you need to. Zero drama.</p><p>This is how incremental architecture feels in real life.</p><h2>8. Event-Driven Architecture</h2><p>Strong coupling is bad. </p><p><strong>&#128073;&#127996; You cannot eliminate it completely, but you can reduce it.</strong></p><p>Event-driven approaches help. Instead of orchestrating a whole flow from a central component that calls payment, billing, shipping, and so on, <strong>the core component simply emits an event</strong>, for example, &#8220;OrderPlaced&#8221;.</p><p>Other parts react if they need to.</p><p><strong>Everyone listens, no one knows each other</strong>, and events go through a broker, not direct calls.</p><p>This reduces coupling dramatically.</p><h2>9. Domain Driven Design</h2><p><strong>DDD is a technique, not just a pattern</strong>, and it fits beautifully with incremental architectures.</p><p>&#128073;&#127996; And pay attention to this: <strong>Ubiquitous language is not a luxury</strong>. It reduces confusion and accelerates change.</p><p>When you map events and work, try this mental model:</p><ul><li><p>Orange stickers: events, written in the past tense.</p></li><li><p>Blue stickers: consequences, the actual work to do.</p></li><li><p>Yellow stickers: who performs the work, your services.</p></li><li><p>Red stickers: questions, gaps in your knowledge.</p></li></ul><div class="poll-embed" data-attrs="{&quot;id&quot;:407175}" data-component-name="PollToDOM"></div><p></p><p>If you see many red stickers, do not code yet. Answer the questions first.</p><h2>&#10024; Takeaways</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1qSF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1qSF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png 424w, https://substackcdn.com/image/fetch/$s_!1qSF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png 848w, https://substackcdn.com/image/fetch/$s_!1qSF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png 1272w, https://substackcdn.com/image/fetch/$s_!1qSF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1qSF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png" width="1456" height="1242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1242,&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_!1qSF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png 424w, https://substackcdn.com/image/fetch/$s_!1qSF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png 848w, https://substackcdn.com/image/fetch/$s_!1qSF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.png 1272w, https://substackcdn.com/image/fetch/$s_!1qSF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdadb7ee4-a20a-44d0-91fc-f2fa8a646dc7_1632x1392.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>Today has been <strong>a very focused email about incremental architectures</strong>, but with many important things to take into consideration.</p><p>Take this list with you:</p><ul><li><p>Can you make the work smaller?</p></li><li><p>Do teams own domains end-to-end? </p></li><li><p>Do you apply patterns when they solve real problems, not by default?</p></li><li><p>Do components have hard boundaries and respect Liskov?</p></li></ul><p><strong>Incremental architecture is a discipline, not magic.</strong> It pairs organizational change with pragmatic technical choices so you can grow without breaking everything.</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[Enabling developers to take ownership of the Platform Infrastructure]]></title><description><![CDATA[Enter Crossplane]]></description><link>https://newsletter.optimistengineer.com/p/enabling-developers-to-take-ownership</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/enabling-developers-to-take-ownership</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 12 Nov 2025 14:53:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DzIw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is your need:</p><blockquote><p>I need an S3 bucket so my application can send data to it.</p></blockquote><p>Simple, right? But here is the problem you are facing. Either you:</p><ul><li><p>Have to open a ticket to another team&#8217;s Jira board, wait until the S3 is in place, and iterate because something was missing.</p></li><li><p>Have to open a Pull Request in a repo from another team, typically, the &#8220;Infrastructure team&#8221;.</p></li><li><p>You name it&#8230;</p></li></ul><p>&#128073;&#127996; <strong>You don&#8217;t have ownership of the infrastructure you need for the applications you own</strong>.</p><p><strong>And this is a huge problem</strong>, because:</p><ol><li><p>One, you depend on another team.</p></li><li><p>Two, that makes you slow when shipping your code to Production.</p></li></ol><p>In today&#8217;s email, <strong>I</strong> <strong>bring you a Cloud Native technology that would return power to developers</strong> by allowing them to own their own infrastructure.</p><div class="poll-embed" data-attrs="{&quot;id&quot;:403728}" data-component-name="PollToDOM"></div><h2>Enter Crossplane</h2><p>This is my definition:</p><div class="pullquote"><p>Crossplane is a Cloud Native technology that allows you to deploy Platform Infrastructure by leveraging the Kubernetes Custom Resource API.</p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DzIw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DzIw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png 424w, https://substackcdn.com/image/fetch/$s_!DzIw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png 848w, https://substackcdn.com/image/fetch/$s_!DzIw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png 1272w, https://substackcdn.com/image/fetch/$s_!DzIw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DzIw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png" width="1456" height="721" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:721,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:585187,&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/178614013?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.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_!DzIw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png 424w, https://substackcdn.com/image/fetch/$s_!DzIw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png 848w, https://substackcdn.com/image/fetch/$s_!DzIw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.png 1272w, https://substackcdn.com/image/fetch/$s_!DzIw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cdbac7-c918-401c-ad54-d6e3ac1f816f_3798x1881.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">Workflow of working with Crossplane</figcaption></figure></div><p><strong>In short</strong>:</p><ul><li><p>You deploy a Custom Resource, a YAML file, in Kubernetes,</p></li><li><p>And that will be translated into a piece of infrastructure, like an S3 bucket.</p></li></ul><p>More in detail:</p><ul><li><p>Crossplane works on top of the Custom Resource API from Kubernetes. It&#8217;s an application living in Kubernetes.</p></li><li><p>Crossplane defines a set of Custom Resource Definitions.</p></li><li><p>You, as a developer, can deploy new Custom Resources, a new Crossplane <strong>Composition</strong>, to tell &#8220;hey, I want an S3 bucket with the name &#8216;ACME&#8217;&#8221;.</p></li><li><p>And Crossplane will connect to the corresponding API (AWS S3 API in this example) to create the infrastructure indicated in the Custom Resource you deployed.</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_!l9e7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l9e7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png 424w, https://substackcdn.com/image/fetch/$s_!l9e7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png 848w, https://substackcdn.com/image/fetch/$s_!l9e7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png 1272w, https://substackcdn.com/image/fetch/$s_!l9e7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l9e7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png" width="1456" height="924" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:924,&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_!l9e7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png 424w, https://substackcdn.com/image/fetch/$s_!l9e7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png 848w, https://substackcdn.com/image/fetch/$s_!l9e7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.png 1272w, https://substackcdn.com/image/fetch/$s_!l9e7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1997aa4c-9dac-45ef-a5a3-dd47e13480fc_1512x960.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">Developer-Driven with Platform Ownerhip</figcaption></figure></div><p>Now that you have an idea about what Crossplane is, let&#8217;s get back to the problems it solves.</p><h2>1. Lack of autonomy for developers</h2><p>&#128073; <strong>Problem:</strong></p><blockquote><p>Every time you need a database or a bucket, you must open a ticket with the platform team.</p></blockquote><p>&#128073; <strong>With Crossplane:</strong></p><ol><li><p>The Platform Team publishes internal declarative APIs (for example, <code>kind: PostgreSQLInstance</code>, <code>kind: CacheCluster</code>, or <code>kind: MessageQueue</code>) with secure defaults.</p></li><li><p>You, as a developer, just create a YAML manifest with their parameters, in the same way as you would deploy a Deployment or a Service.</p></li></ol><p>Crossplane translates that into an RDS in AWS, a CloudSQL in GCP, or whatever is defined in the Composition.</p><h2>2. Inconsistency and risk in infrastructure</h2><p>&#128073; <strong>Problem:</strong></p><blockquote><p>You and your peers define your own infrastructure differently, sometimes with insecure configurations.</p></blockquote><p>&#128073; <strong>With Crossplane:</strong></p><ol><li><p>The Platform Team defines <strong>Compositions</strong> that enforce corporate standards, such as instance types, policies, regions, tags, etc.</p></li><li><p>You, as a developer, can only choose allowed parameters.</p></li></ol><p>You can guarantee that you deploy a secure and standardized (within your company) infrastructure without sacrificing autonomy.</p><h2>3. Artificial separation between &#8220;infrastructure&#8221; and &#8220;application&#8221;</h2><p>&#128073; <strong>Problem:</strong></p><blockquote><p>The code (application) lives in Kubernetes, but the infrastructure (DBs, queues, etc.) is defined in Terraform or another external tool. This breaks the declarative model and complicates GitOps deployments.</p></blockquote><p>&#128073; <strong>With Crossplane:</strong></p><ol><li><p>Everything lives in the same Kubernetes control plane.</p></li><li><p>Your application manifest can include both the Deployment and the PostgreSQL instance or Bucket it needs.</p></li></ol><p>This results in you having <strong>infra and app versioned and deployed together</strong> under a unified declarative model.</p><h2>&#10024; Summary</h2><p>In today&#8217;s email, <strong>I just wanted to make a heads-up about Crossplan</strong>e, a technology that solves a real and important problem that the majority of us suffer from every day: Not owning our infrastructure.</p><p>In the last months, I<strong>&#8217;ve been implementing Crossplane to solve the problem described</strong>.</p><p><strong>I&#8217;ve already learned a few things</strong>, and I&#8217;ll be sharing them with you here in the next few weeks.</p><p><strong>If you know some friends who might be interested in this email, forward it!</strong></p><p>Stay tuned!</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[The hidden reason your manager gets mad at you]]></title><description><![CDATA[It&#8217;s not about the incident report. It&#8217;s about trust.]]></description><link>https://newsletter.optimistengineer.com/p/the-hidden-reason-your-manager-gets</link><guid isPermaLink="false">https://newsletter.optimistengineer.com/p/the-hidden-reason-your-manager-gets</guid><dc:creator><![CDATA[Marcos F. Lobo 🗻🧭]]></dc:creator><pubDate>Wed, 05 Nov 2025 17:22:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/64226d13-765d-46c8-933a-bee2ae0d5d71_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before jumping into today&#8217;s email, <strong>I need something from you</strong>.</p><p><strong>&#128227; If you want to keep receiving this newsletter,</strong> I need you to click on the button below &#128071;&#127995;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.optimistengineer.com/&quot;,&quot;text&quot;:&quot;&#9989; I want keep receiving your emails!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.optimistengineer.com/"><span>&#9989; I want keep receiving your emails!</span></a></p><p><strong>It just gets you to the main page of The Optimist Engineer newsletter</strong>. By clicking on that button, I will know that you are still interested in receiving my emails.</p><p><strong>If you are no longer interested</strong>, I will kindly remove you from the list in 1 week's time, so you will no longer receive future newsletter issues from me. I also take this opportunity to <strong>thank you for the time you&#8217;ve been part of this newsletter</strong>.</p><div><hr></div><p>Now, let&#8217;s go to today&#8217;s topic: <strong>Surprises are your enemy</strong>.</p><p>Let me ask you:</p><blockquote><p>How many times have you gone to an operational meeting with your Engineering Manager or Engineering Director and ended up punished?</p></blockquote><p>This is the picture:</p><ul><li><p>Your weekly operational meeting with your Engineering Director to report on the highlights that she/he needs to be aware of and understand the progress.</p></li><li><p>But the meeting doesn't start as usual; the Engineering Director kicks off the conversation with an <em>angry</em> face.</p></li><li><p>Yeah, she/he is <em>pished off</em> because has been told that your service lost data 2 days ago, and the Incident Report has not been filed yet.</p></li><li><p>Your brain is telling you: Why is she/he so upset about a problem that we solved out in 10 minutes?</p></li><li><p>You try to explain the situation, but it&#8217;s too late.</p></li></ul><p>Summarizing: Because something you knew that happened and, in your vision, had low impact, you got <em>a hit</em> from your Engineering Director.</p><p>Spoiler: the problem isn&#8217;t that you didn&#8217;t fill out an Incident Report form.</p><h2>Why is that? It was a surprise.</h2><p><strong>Upper management doesn&#8217;t want surprises.</strong></p><p><strong>Upper management doesn&#8217;t need surprises.</strong></p><p>Let me tell you what happened <em>under the hood</em>.</p><ul><li><p>There was another meeting where your Engineering Director was invited with other upper management (CPO, CTO, other Engineering Directors, or similar).</p></li><li><p>There, your Engineering Director was asked: <em>Hey, one of your teams owns a service that had an incident by which we lost a significant piece of data, which was critical for our group. What happened?</em></p></li><li><p>And your Engineering Director had no idea&#8230; at all.</p></li></ul><p>So, she/he could just say: </p><blockquote><p>I&#8217;ll check with the team in order to understand the problem and I will come back to you.</p></blockquote><p>Meaning:</p><blockquote><p>I don&#8217;t have f*ck*ng idea what are you talking about, you got me, I should know, and I will find it out ASAP.</p></blockquote><p><strong>&#128073;&#127996; Surprises put upper management in difficult situations</strong>. Without an explanation, the only thing they can do is <em>put the shield on</em> and wait for the hit to end.</p><p>I can tell you, I&#8217;ve been there a few times. Lucky me, I managed to understand the problem, so I could work on the solution, and now <strong>I&#8217;m sharing it with you to help you avoid the same struggle</strong>.</p><h2>&#127919; So, what&#8217;s the problem here?</h2><p>Here we are talking about a <strong>misalignment about what is important</strong>:</p><ul><li><p>You thought the problem was neither important nor urgent. Or you just forgot to report it!</p></li><li><p>Somebody in upper management considered the opposite.</p></li></ul><p><strong>Your upper management should be able to trust you</strong> to get notified when something she/he should know. Once that, your Engineering Director will know exactly what to do in the next meeting with the rest of upper management.</p><p>&#128073;&#127996; <strong>Trust is built through clear and straightforward communication, no matter the issue.</strong></p><h2>&#128161; What&#8217;s the solution for this?</h2><p>It goes through two points.</p><p><strong>1&#65039;&#8419; First, you have to clearly understand what is important and urgent in your ownership</strong>. </p><p>&#128073;&#127996; Everything urgent or important must be reported.</p><p>When it&#8217;s related to the input &amp; outputs of your team or services, it will most likely impact others, hence it&#8217;s important or urgent. For example:</p><ul><li><p>A commitment in the roadmap during a meeting with the other team, sure, this is important.</p></li><li><p>A production incident, for sure, it&#8217;s urgent.</p></li></ul><p><strong>In the scenario I&#8217;ve described</strong>, the missing data was actually a problem for more people than just your team, which means it was important or even urgent, and your managers needed to know about it.</p><p>I can recommend that you use the <strong>Eisenhower Matrix</strong> to help you organize by importance. I wrote a template for you to copy/paste and use. You can freely download it here &#128071;&#127995;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;dc6c8f5a-fe9c-4434-a662-4b52f4031c40&quot;,&quot;caption&quot;:&quot;In today&#8217;s issue, I want to share with you a tool that I recently met and it&#8217;s helping me a lot with my technical responsibilities. Also, I want to share with you a template I&#8217;ve made for you, so you can print it and use it or just use it virtually.&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;Template Eisenhower Matrix&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-03-13T07:28:12.169Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!iM9H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19b96cea-f1d5-4bb5-919a-e0411fa09212_1045x617.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.optimistengineer.com/p/template-eisenhower-matrix&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:140179210,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:9,&quot;comment_count&quot;:5,&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><strong>2&#65039;&#8419; Second, you have to communicate as soon as something important or urgent happens</strong>.</p><p>How to do this? <strong>I recommend a chat</strong>, but this depends on how your company works with the communication channel.</p><p>If we are talking about an incident in production, my template for you is:</p><ol><li><p>Open a chat with your Engineering Manager + Engineering Director, indicating:</p><ol><li><p>The problem.</p></li><li><p>The impact. Are customers affected?</p></li><li><p>Current status.</p></li><li><p>Next steps.</p></li></ol></li><li><p>Keep the chat up to date, with 1-hour recurrence (less, if the impact is high), until the problem is solved.</p></li></ol><p><strong>Many times, we are not sure what we have to communicate</strong>. If this happens to you, my advice to you: <strong>Overcommunicate</strong>.</p><p>&#128073;&#127996; It&#8217;s better to overcommunicate than have information not reach the people.</p><p>Hope you find this email useful. If you have similar <em>tales</em> like this one, I would love to hear from you. Drop me a message or leave a comment.</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>