<?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[Software Engineering Art - SEArt]]></title><description><![CDATA[Welcome to SEArt! Dive into the captivating world of Software Engineering through our articles. Join us as we navigate the art of problem-solving with software development, honing our skills daily.]]></description><link>https://blog.seart.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!jgBw!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5c268ce-18e0-449d-be5b-6f2a614b91bd_512x512.png</url><title>Software Engineering Art - SEArt</title><link>https://blog.seart.dev</link></image><generator>Substack</generator><lastBuildDate>Wed, 06 May 2026 12:05:15 GMT</lastBuildDate><atom:link href="https://blog.seart.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Carlos Gómez]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[SEArt@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[SEArt@substack.com]]></itunes:email><itunes:name><![CDATA[Carlos Gómez]]></itunes:name></itunes:owner><itunes:author><![CDATA[Carlos Gómez]]></itunes:author><googleplay:owner><![CDATA[SEArt@substack.com]]></googleplay:owner><googleplay:email><![CDATA[SEArt@substack.com]]></googleplay:email><googleplay:author><![CDATA[Carlos Gómez]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Thinking Differently in a World That Expects the Same]]></title><description><![CDATA[My journey as a neurodivergent software engineer and leader]]></description><link>https://blog.seart.dev/p/thinking-differently-in-a-world-that</link><guid isPermaLink="false">https://blog.seart.dev/p/thinking-differently-in-a-world-that</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Tue, 13 Jan 2026 16:19:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jgBw!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5c268ce-18e0-449d-be5b-6f2a614b91bd_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This post is written with my heart open.</p><p>I want to share, with honesty and transparency, my experiences, feelings, and challenges since the very beginning of my career as a Software Engineer.</p><p>Looking back, I have to admit something: when I started my career 17 years ago, I didn&#8217;t know I was neurodivergent.</p><p>Actually, I didn&#8217;t even know that word existed.</p><p>What I did know was that I had learned to adapt myself very well to different contexts and people. I used to mask a lot&#8212;sometimes consciously, but most of the time without realizing it. It was almost automatic.</p><p>I had this tendency to categorize people in my mind, to build a kind of profile for them. Then, without thinking too much about it, I would &#8220;put on&#8221; the mask that best fit that profile.</p><p>It sounds strange when I explain it like this, and honestly, back then I wasn&#8217;t even aware I was doing it.</p><p>The truth is that this strategy worked quite well for my career. It helped me adapt, grow, and eventually move into leadership roles. I achieved many things that I&#8217;m proud of.</p><p>Of course, this is just one neuroatypical trait among many others. Another one that has shaped my professional life is hyperfocus. When a topic truly interests me, I can dive deeply into it and understand it very quickly&#8212;sometimes in just days or even hours.</p><p>This can sound like a superpower, and in many ways, it is. But it also has a darker side. When motivation is missing, the opposite happens: a complete lack of interest. Learning or doing something that doesn&#8217;t resonate with me can become incredibly hard, even if it&#8217;s something I have to do.</p><p>The key to addressing this&#8212;and something I&#8217;m still working on today&#8212;is building the habit of doing things I don&#8217;t want to do.</p><p>Things that are uncomfortable by nature.</p><p>Simple examples: taking cold showers, meditating, exercising, or deliberately participating in social events.</p><p>Maybe the hardest challenge I&#8217;ve had to face was accepting that I think differently from neurotypical people. And, even more importantly, learning to consciously manage my masking&#8212;choosing when to apply it and when not to.</p><p>This is not easy at all. It&#8217;s a constant challenge.</p><p>But paradoxically, it&#8217;s also something I find deeply interesting. It genuinely fascinates me.</p><p>There&#8217;s another important thing I want to mention.</p><p>Looking back, I realize that this way of thinking has also pushed me to go after what I truly enjoy. Not because I had everything figured out, but because I felt it was the right direction for me.</p><p>I&#8217;ve always tried to take responsibility for my career. To make decisions consciously, even when they were uncomfortable. To stay honest with myself about what I want&#8212;and what I don&#8217;t.</p><p>That&#8217;s allowed me to work on things I actually like. And, trying to stay modest here, it has also helped me do my job well and sometimes even stand out.</p><p>One thing I&#8217;ve learned along the way is this: if you want to grow as a leader, you first have to lead your own life.<br>Not perfectly. Just consciously.</p><p>For me, that means not staying still out of fear. And when I do stop, making sure it&#8217;s a choice, not a reaction.</p><p>I&#8217;ve also had to learn to make space for emotions. Even the uncomfortable ones. Especially those. Instead of fighting them, I try to understand them and use them as signals to move forward.</p><p>And honestly, I&#8217;ve failed many times. But I keep trying. Because practice matters. And persistence matters even more.</p><p>Not long ago, I told a friend that I see myself as a dreamer. He paused for a second and then told me something that stuck with me: <em>that&#8217;s a good thing</em>.<br>He said it allows me to think big&#8212;and to build a life that&#8217;s aligned with who I am.</p><p></p>]]></content:encoded></item><item><title><![CDATA[The Decomposed Prompt Pattern]]></title><description><![CDATA[Part 3 &#8212; Architectural Patterns for Generative AI]]></description><link>https://blog.seart.dev/p/the-decomposed-prompt-pattern</link><guid isPermaLink="false">https://blog.seart.dev/p/the-decomposed-prompt-pattern</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Mon, 15 Dec 2025 00:04:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9Fm6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Fm6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Fm6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!9Fm6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!9Fm6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!9Fm6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Fm6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1796570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.seart.dev/i/181623713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.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_!9Fm6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!9Fm6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!9Fm6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!9Fm6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fda2157-5115-48f7-833d-2382139709a5_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Okay, so when you&#8217;re starting out with big language models(LLM), you might think that if you write one really long and smart prompt, it will give you a perfect answer. </p><p>Sometimes it works, but often, it doesn&#8217;t. </p><p>When prompts get complicated, the results can be hit or miss, cost more, and be tough to control. The model can start missing the point, make things up, or blur the lines between what it should and shouldn&#8217;t be doing. </p><p>But here&#8217;s another way to think about it: </p><p>Instead of trying to make prompts super smart, just make them smaller and simpler. </p><p>This is where the Decomposed Prompt Pattern comes in. It&#8217;s like breaking down a big prompt into smaller chunks, where each chunk has its own job and doesn&#8217;t need a ton of background info.</p><div><hr></div><h1>Context</h1><p>Today&#8217;s AI uses LLMs for a lot, like: </p><ul><li><p>Thinking through tricky problems </p></li><li><p>Making good content </p></li><li><p>Doing things step by step </p></li><li><p>Teaming up with other tools </p></li></ul><p>But, we also know some things about LLMs that aren&#8217;t so great: </p><ul><li><p>The longer a prompt, the more it costs. </p></li><li><p>Big prompts can lead to the model making stuff up. </p></li><li><p>If a prompt tries to do too much, it gets confused. </p></li><li><p>Trying to do everything in one go usually doesn&#8217;t work out.</p></li></ul><p>Think of it like this: If you ask one thing to do too much, it&#8217;s going to crack under the pressure.</p><div><hr></div><h1>Problem</h1><p>A prompt often has to:</p><ul><li><p>Get what you&#8217;re asking.</p></li><li><p>Figure out how to solve it. </p></li><li><p>Write something. </p></li><li><p>Check if it&#8217;s good. </p></li><li><p>Fix any mess ups. </p></li></ul><p>This can cause:</p><ul><li><p>Answers that aren&#8217;t consistent.</p></li><li><p>Trouble figuring out what went wrong. </p></li><li><p>It&#8217;s not clear where things failed.</p></li><li><p>Prompts that are hard to change. </p></li></ul><p>If something messes up, you won&#8217;t know what part caused the issue.</p><div><hr></div><h1>Forces</h1><p>When you&#8217;re making complex things with LLMs, you&#8217;ll notice these things:</p><ul><li><p>A single prompt can be easy to break. The longer they are, the harder they are to manage and test.</p></li><li><p>You need to check the quality more than once. Just checking the answer isn&#8217;t enough. It&#8217;s good to check the thinking process along the way.</p></li><li><p>One ask from a user can mean a lot of different tasks. It might need planning, writing, checking, and using other tools. Trying to do it all at once in one prompt can be a headache.</p></li><li><p>There&#8217;s only so much space in a prompt, and it costs money. Cramming everything in makes it expensive and can confuse the model. Smaller prompts tend to work better.</p></li><li><p>You need steps that you can expect and test. Splitting things up lets you check each part, try again if one fails, and see where things went wrong.</p></li></ul><p>All of this makes you want to move away from one huge prompt and toward a system where each part has one job and isn&#8217;t overwhelmed with context.</p><div><hr></div><h1>Solution &#8212; The Decomposed Prompt Pattern</h1><p>The Decomposed Prompt Pattern is all about taking one big ask and splitting it into smaller or specialized prompts that each has its own thing to focus on.</p><p>Sometimes, this looks like a pipeline, but the point isn&#8217;t just to make a pipeline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2uRR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2uRR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png 424w, https://substackcdn.com/image/fetch/$s_!2uRR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png 848w, https://substackcdn.com/image/fetch/$s_!2uRR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png 1272w, https://substackcdn.com/image/fetch/$s_!2uRR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2uRR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png" width="591" height="312" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:312,&quot;width&quot;:591,&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_!2uRR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png 424w, https://substackcdn.com/image/fetch/$s_!2uRR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png 848w, https://substackcdn.com/image/fetch/$s_!2uRR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png 1272w, https://substackcdn.com/image/fetch/$s_!2uRR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d10bd1c-ed39-42de-8e4c-408db2543b62_591x312.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The real win is that you&#8217;re cutting down a complex prompt into smaller, more focused prompts, where each one has:</p><ul><li><p>A small goal</p></li><li><p>Only needs a bit of context</p></li><li><p>Knows what it&#8217;s putting in and getting out</p></li></ul><p>How it&#8217;s put together (one after the other, at the same time, or a mix) doesn&#8217;t really matter.</p><blockquote><p><em>You&#8217;re changing how it thinks, not always the words of the prompt itself.</em></p></blockquote><p>Responsibility should be separated.</p><div><hr></div><h2>Dependent Prompts</h2><p>When following prompts, each step uses what came before it.</p><p>This is helpful when:</p><ul><li><p>What comes later needs the thinking from what came earlier.</p></li><li><p>Things get better each time around.</p></li><li><p>You want to fine tune as you go.</p></li></ul><h3>Example</h3><p>I&#8217;ve applied this pattern in a small experiment (available in my <a href="https://github.com/carlex05/poc-langchain/">GitHub repo</a>) where a service receives a prompt and processes it through three specialized components:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jmAQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jmAQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png 424w, https://substackcdn.com/image/fetch/$s_!jmAQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png 848w, https://substackcdn.com/image/fetch/$s_!jmAQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png 1272w, https://substackcdn.com/image/fetch/$s_!jmAQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jmAQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png" width="466" height="312" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:312,&quot;width&quot;:466,&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_!jmAQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png 424w, https://substackcdn.com/image/fetch/$s_!jmAQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png 848w, https://substackcdn.com/image/fetch/$s_!jmAQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.png 1272w, https://substackcdn.com/image/fetch/$s_!jmAQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5df7743e-2d4c-47b1-8e90-99adae05683e_466x312.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><ol><li><p>Planner:<strong> </strong>breaks the request into a sequence of steps.</p></li><li><p>Writer: Produces a first draft based on the plan.</p></li><li><p>Reviewer: Reviews the draft and improves clarity, structure, and quality.</p></li></ol><p>Each prompt is simpler, and more focused than a single &#8220;mega-prompt&#8221;.</p><p>The result is not just better output &#8212;<br>it&#8217;s a system that is easier to reason about, debug, and evolve.</p><div><hr></div><h2>Independent Prompts</h2><p>Sometimes, prompts don&#8217;t need to rely on each other.</p><p>Prompts that aren&#8217;t connected are good when:</p><ul><li><p>You want a few different points of view.</p></li><li><p>You can compare the results.</p></li><li><p>Steps can happen at the same time.</p></li></ul><p>Examples:</p><ul><li><p>Making a few drafts</p></li><li><p>Checking results against different things</p></li><li><p>Running safety or quality checks</p></li></ul><p>This means you can do things at the same time, get better speed, and try some parts again without having to start over.</p><div><hr></div><h2>Benefits</h2><p>Using the Decomposed Prompt Pattern gives you:</p><ul><li><p>Outcomes you can expect</p></li><li><p>Smaller prompts that cost less</p></li><li><p>Less chance of the model making stuff up</p></li><li><p>Responsibilities that are obvious</p></li><li><p>Easier way to fix things</p></li><li><p>Better success as the system grows</p></li></ul><p>It also goes well with things like Guardrails and RAG.</p><div><hr></div><h2>Trade-offs</h2><p>It&#8217;s not all easy.</p><p>You&#8217;ll have to deal with:</p><ul><li><p>More complicated steps</p></li><li><p>More things to keep track of</p></li><li><p>Figuring out how the prompts connect</p></li><li><p>Deciding what should rely on what</p></li></ul><p>But the alternative is a crazy big prompt that becomes a nightmare real quick.</p><p>From my experience, it&#8217;s a good deal to make once things get past the testing phase.</p><div><hr></div><h2>Closing Thoughts</h2><p>Large prompts feel powerful &#8212; until they don&#8217;t.</p><p>Breaking a problem into smaller prompts may feel slower at first, but it gives you something far more valuable: <strong>control</strong>.</p><p>The Decomposed Prompt Pattern treats prompting as architecture.</p><p>And once you see prompts as components, everything starts to click.</p><p>If you&#8217;ve tried similar approaches &#8212; or struggled with overly complex prompts &#8212; I&#8217;d love to hear about it.</p>]]></content:encoded></item><item><title><![CDATA[The Guardrails Pattern]]></title><description><![CDATA[Part 2 &#8212; Architectural Patterns for Generative AI]]></description><link>https://blog.seart.dev/p/the-guardrails-pattern</link><guid isPermaLink="false">https://blog.seart.dev/p/the-guardrails-pattern</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Mon, 01 Dec 2025 23:55:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8wUt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>From my personal perspective, as solutions architects working with generative AI eventually hits the same wall: LLMs are not reliable neither predictable. <br>They hallucinate.<br>They shift behavior with tiny changes in context. And sometimes they answer with absolute conviction&#8230; even when they&#8217;re dead wrong.</p><p>In demos, that could be funny. In production? It&#8217;s a risk technical, operational, and yes, even legal.</p><p>That&#8217;s why Guardrails should be treated as an <strong>architectural pattern</strong>. They deserve a seat next to the classic patterns we already know. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8wUt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8wUt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!8wUt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!8wUt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!8wUt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8wUt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1802202,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.seart.dev/i/180434836?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.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_!8wUt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!8wUt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!8wUt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!8wUt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a14e02-6b6d-466f-9848-e0e0636152e7_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><h1>Context</h1><p>Today&#8217;s AI systems mix:</p><ul><li><p>LLMs that &#8220;reason&#8221;</p></li><li><p>RAG pipelines retrieving domain knowledge</p></li><li><p>MCP tools for real actions</p></li><li><p>Agents orchestrating multi-step workflows</p></li></ul><p>And all of that sits in an environment where people expect:</p><ul><li><p>correctness</p></li><li><p>consistency</p></li><li><p>safety</p></li><li><p>traceability</p></li><li><p>reliability</p></li></ul><p>The problem?<br>LLMs are probabilistic. Our systems are not.</p><div><hr></div><h1>Problem</h1><p>The moment you plug an LLM into a real workflow, you inevitably face:</p><ul><li><p>unpredictable output</p></li><li><p>fabricated details</p></li><li><p>dangerous or unauthorized tool usage</p></li><li><p>schema inconsistencies</p></li><li><p>harmful or ambiguous user input</p></li><li><p>non-deterministic behavior across model versions</p></li></ul><p>These aren&#8217;t theoretical.<br>They break workflows. They cost money.<br>And sometimes, they spill into the real world.</p><div><hr></div><h2>A real case: Air Canada (2024)</h2><p>In early 2024, Air Canada lost a legal dispute after its chatbot gave a grieving customer incorrect refund guidance.<br>The model confidently described a policy that didn&#8217;t exist.<br>The customer relied on it, spent real money, and later discovered that the &#8220;bereavement refund&#8221; the chatbot promised was fiction.</p><p>The Canadian tribunal was clear:<br><strong>Air Canada was responsible for what its AI said, just as if it had published the statement on a static page.</strong></p><p>Result: compensation, public scrutiny, and a clear message for the rest of us.</p><p>Without guardrails, generative AI isn&#8217;t just unreliable &#8212;<br>it&#8217;s a liability.</p><div><hr></div><h1>Forces</h1><p>Building AI-enabled systems means navigating tensions between:</p><ul><li><p>LLM creativity vs safety</p></li><li><p>flexibility vs compliance</p></li><li><p>speed vs correctness</p></li><li><p>user expectations vs model unpredictability</p></li><li><p>cost vs latency (LLM calls aren&#8217;t cheap)</p></li></ul><p>Guardrails exist to stabilize these forces.</p><div><hr></div><h1>Solution &#8212; The Guardrails Pattern</h1><p>Guardrails aren&#8217;t a single technique.<br>Here I explain two kinds of strategies:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JKbM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JKbM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png 424w, https://substackcdn.com/image/fetch/$s_!JKbM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png 848w, https://substackcdn.com/image/fetch/$s_!JKbM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png 1272w, https://substackcdn.com/image/fetch/$s_!JKbM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JKbM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png" width="511" height="82" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/acb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:82,&quot;width&quot;:511,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:29468,&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://blog.seart.dev/i/180434836?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.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_!JKbM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png 424w, https://substackcdn.com/image/fetch/$s_!JKbM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png 848w, https://substackcdn.com/image/fetch/$s_!JKbM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png 1272w, https://substackcdn.com/image/fetch/$s_!JKbM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facb672d4-f87e-45a2-bab0-0a787f3a2865_511x82.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>Input Guardrails (before the LLM)</h2><p>From a security perspective, we need to be aware of,  and handle, two types of input risks:</p><ul><li><p>private or sensitive information </p></li><li><p>malicious or manipulative prompts that could compromise the LLMs or the system</p></li></ul><p>The first case can be addressed by identifying and masking private or sensitive data before sending anything to the LLM, RAG or any other API. </p><p>Imagine an employee using an internal HR AI assistant and sending a request like:</p><blockquote><p><strong>&#8220;Write an email to John Poh congratulating him on his recent salary increase to 120,000.&#8221;</strong></p></blockquote><p>Before this prompt reaches the LLM, a guardrails layer should mask sensitive information &#8212; in this case:</p><ul><li><p>the employee&#8217;s name</p></li><li><p>the specific salary amount</p></li></ul><p>So the model actually receives something like:</p><blockquote><p><strong>&#8220;Write an email to &lt;EMPLOYEE_NAME&gt; congratulating him on his recent salary increase to &lt;SALARY_AMOUNT&gt;.&#8221;</strong></p></blockquote><p>After the LLM generates the email template, the system can safely <em>unmask</em> the values and reinsert the real data before sending the final output to the user.</p><p>This keeps the model from storing or training on sensitive data, reduces compliance risk, and ensures private information never leaves safe boundaries.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F8AM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F8AM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png 424w, https://substackcdn.com/image/fetch/$s_!F8AM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png 848w, https://substackcdn.com/image/fetch/$s_!F8AM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png 1272w, https://substackcdn.com/image/fetch/$s_!F8AM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F8AM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png" width="701" height="221" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:221,&quot;width&quot;:701,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34657,&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://blog.seart.dev/i/180434836?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.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_!F8AM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png 424w, https://substackcdn.com/image/fetch/$s_!F8AM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png 848w, https://substackcdn.com/image/fetch/$s_!F8AM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png 1272w, https://substackcdn.com/image/fetch/$s_!F8AM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85ac7aa-b8c1-45e1-8028-e81593920a07_701x221.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>For the second case, we must actively defend against things like SQL injection, prompt-based attacks (&#8220;forget your policies&#8230;&#8221;, &#8220;ignore all previous instructions&#8221;), or attempts to push the LLM into tasks outside its scope or specialization.</p><h2>Output Guardrails (after the LLM)</h2><p>We find at least three types of output guardrails:</p><ul><li><p>unmasking private or personal information</p></li><li><p>qualifying and filtering the response</p></li><li><p>retrying or forwarding policies</p></li></ul><p>As we&#8217;ve seen before, if our input guardrails mask the prompt, the response must be unmasked to stay consistent with the original user request.</p><p>Using the HR example:</p><p>The LLM receives:</p><blockquote><p>&#8220;Write an email to &lt;EMPLOYEE_NAME&gt; congratulating him on his recent salary increase to &lt;SALARY_AMOUNT&gt;.&#8221;</p></blockquote><p>It might answer with:</p><blockquote><p>&#8220;Dear &lt;EMPLOYEE_NAME&gt;, <br>I wanted to personally congratulate you on your recent salary increase to &lt;SALARY_AMOUNT&gt;...&#8221;</p></blockquote><p>An output guardrail will:</p><ol><li><p><strong>Unmask</strong> the placeholders:</p><ul><li><p>&lt;EMPLOYEE_NAME&gt; &#8594; <em>John Poh</em></p></li><li><p>&lt;SALARY_AMOUNT&gt; &#8594; <em>120,000</em></p></li></ul></li><li><p><strong>Qualify and filter</strong> the response (tone, policy alignment, no extra sensitive data).</p></li><li><p><strong>Retry or forward</strong> to a human if something looks off (for example, if the model adds details it shouldn&#8217;t).</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RYpo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RYpo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png 424w, https://substackcdn.com/image/fetch/$s_!RYpo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png 848w, https://substackcdn.com/image/fetch/$s_!RYpo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png 1272w, https://substackcdn.com/image/fetch/$s_!RYpo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RYpo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png" width="701" height="202" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:202,&quot;width&quot;:701,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32058,&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://blog.seart.dev/i/180434836?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.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_!RYpo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png 424w, https://substackcdn.com/image/fetch/$s_!RYpo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png 848w, https://substackcdn.com/image/fetch/$s_!RYpo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png 1272w, https://substackcdn.com/image/fetch/$s_!RYpo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c49c724-bd22-42c1-ba60-b784cede2b1e_701x202.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This way, the LLM never sees the raw sensitive data, but the final email that the user receives is still correct and personalized.</p><div><hr></div><h2>Guardrails Through Embeddings</h2><p>Here&#8217;s where things get interesting.</p><p>Recently, I&#8217;ve been experimenting with a tool called <a href="https://github.com/aurelio-labs/semantic-router">Semantic Router</a>, and it surprised me.</p><p>In complex architectures, especially those using multiple MCP tools, cost and latency grow quickly.<br>Why?<br>Because the LLM is deciding which tool to call.</p><p>Every decision implies a new LLM inference then slower, more expensive, more unpredictable.</p><p>Semantic Router flips that idea.</p><p>Instead of asking the LLM to choose a tool,<br>you represent each tool with embeddings<br>and route the request <strong>without calling the LLM at all</strong>.</p><p>The impact is huge:</p><ul><li><p>millisecond routing</p></li><li><p>near-zero cost</p></li><li><p>more deterministic decisions</p></li><li><p>far safer tool selection</p></li></ul><p>This has cut tool-selection cost in my experiments by <strong>80&#8211;95%</strong>, depending on the workflow.</p><p>And yes: this fits inside the Guardrails Pattern.<br>Semantic routing becomes an <strong>input guardrail </strong>that prevents unsafe or expensive decisions before they ever reach the model.</p><div><hr></div><h1>Benefits</h1><p>Some of the benefits of applying this patterns are:</p><ul><li><p>fewer hallucinations</p></li><li><p>more predictable workflows</p></li><li><p>safer tool invocation</p></li><li><p>better user trust</p></li><li><p>stable behavior across model updates</p></li><li><p>easier auditing</p></li><li><p>with embeddings, reduced cost</p></li></ul><div><hr></div><h1>Trade-offs</h1><p>Guardrails add:</p><ul><li><p>engineering effort</p></li><li><p>some complexity</p></li><li><p>validation overhead</p></li><li><p>the risk of over-restricting creativity</p></li><li><p>higher cost-to-serve</p></li></ul><p>But the alternative, no guardrails, is how you end up in the news like Air Canada. </p><div><hr></div><h1>Closing Thoughts</h1><p>We&#8217;ve passed the stage where generative AI is just a novelty.<br>It&#8217;s becoming part of the core architecture of our systems.</p><p>Guardrails aren&#8217;t about limiting the model.<br>They&#8217;re about protecting users, organizations, and the system itself.</p><p>Tools like Semantic Router make those guardrails not only safer,<br>but faster and cheaper to implement.</p><p>This is just the beginning.<br>In the next posts, I&#8217;ll dig into how guardrails interact with agents, RAG pipelines, and MCP tooling to build safer, scalable AI architectures.</p><p>If you&#8217;ve implemented guardrails, or struggled without them, I&#8217;d love to hear your experience.</p>]]></content:encoded></item><item><title><![CDATA[The New AI Layer in Software Architecture: LLMs, RAG, Agents, and MCP Explained for Real-World Engineers]]></title><description><![CDATA[Part 1 &#8212; Architectural Patterns for Generative AI (SEArt Series)]]></description><link>https://blog.seart.dev/p/the-new-ai-layer-in-software-architecture</link><guid isPermaLink="false">https://blog.seart.dev/p/the-new-ai-layer-in-software-architecture</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Sat, 22 Nov 2025 23:49:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BpJD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BpJD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BpJD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BpJD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BpJD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BpJD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BpJD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1ed2375-5de1-4d1f-aa6a-753deecac518_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;:1973009,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.seart.dev/i/179645942?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.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_!BpJD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BpJD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BpJD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BpJD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1ed2375-5de1-4d1f-aa6a-753deecac518_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every few years, something arrives that forces us to rethink the way we design systems.</p><p>Microservices changed how we structure complexity.<br>Event-driven architecture changed how we communicate.<br>Cloud changed how we deliver and scale.</p><p>And now AI is disrupting&#8212;again&#8212;but with far more noise, confusion, and buzzwords than any shift we&#8217;ve seen before.</p><p>LLMs.<br>RAG.<br>Agents.<br>Guardrails.<br>MCP.<br>Vector DBs.<br>Tool-use.</p><p>Everyone talks about these things, but very few explain <strong>how they actually fit into a real software architecture</strong>&#8212;not a demo, not a toy notebook, but a true system with bounded contexts, SLAs, budgets, observability, failure modes, and users who will complain when something breaks at the worst possible time.</p><p>This post aims to do just that:<br><strong>Give you a mental map of the AI layer from the perspective of a software architect.</strong><br>No hype. No magic. No unicorn dust.</p><p>Just architecture.</p><p>Let&#8217;s dive in.</p><h1>LLMs: A New Probabilistic Component in Our Architecture</h1><p>A Large Language Model isn&#8217;t magic.<br>From an architectural perspective:</p><blockquote><p><strong>An LLM is a probabilistic function with expensive inference and unpredictable output.</strong></p></blockquote><p>It does reasoning.<br>But not like a rules engine.<br>Not like code.<br>And definitely not like a deterministic microservice.</p><p>This is why <strong>you don&#8217;t put an LLM inside your core workflows</strong>.<br>Instead, you isolate it behind:</p><ul><li><p>an <strong>LLM Gateway</strong> (OpenAI, Bedrock, Vertex AI, etc.)</p></li><li><p>a <strong>Prompt Library</strong></p></li><li><p>safety filters</p></li><li><p>rate limits</p></li><li><p>logging/observability</p></li></ul><p>The LLM layer becomes a boundary, not a dependency.</p><h1>RAG: The Pattern That Gives LLMs Real Knowledge</h1><p>LLMs know a lot&#8230; about the public internet.<br>But they don&#8217;t know your domain:</p><ul><li><p>your internal APIs</p></li><li><p>your codebase</p></li><li><p>your architecture</p></li><li><p>your business rules</p></li><li><p>your documentation</p></li><li><p>your support tickets</p></li><li><p>your catalog</p></li><li><p>your incidents</p></li></ul><p>That&#8217;s where <strong>Retrieval-Augmented Generation (RAG)</strong> comes in.</p><blockquote><p><strong>RAG enriches the model with context retrieved from your knowledge sources.</strong></p></blockquote><p>The architecture consists of:</p><ol><li><p><strong>Embedder</strong> &#8212; converts text into vectors</p></li><li><p><strong>Vector Database</strong> &#8212; stores embeddings (Pinecone, Weaviate, Qdrant)</p></li><li><p><strong>Retriever</strong> &#8212; finds the most relevant pieces at runtime</p></li><li><p><strong>LLM</strong> &#8212; uses retrieved knowledge to generate grounded answers</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rK7j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rK7j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png 424w, https://substackcdn.com/image/fetch/$s_!rK7j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png 848w, https://substackcdn.com/image/fetch/$s_!rK7j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png 1272w, https://substackcdn.com/image/fetch/$s_!rK7j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rK7j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png" width="501" height="191" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:191,&quot;width&quot;:501,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44014,&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://blog.seart.dev/i/179645942?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.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_!rK7j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png 424w, https://substackcdn.com/image/fetch/$s_!rK7j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png 848w, https://substackcdn.com/image/fetch/$s_!rK7j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png 1272w, https://substackcdn.com/image/fetch/$s_!rK7j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b083ed7-c074-4e11-aff3-8ed736747051_501x191.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>RAG is not &#8220;just&#8221; a technique&#8212;it&#8217;s a full <strong>architectural pattern of knowledge retrieval</strong>.</p><h1>Agentic Patterns: When the LLM Doesn&#8217;t Just Answer&#8230; It Acts</h1><p>RAG gives an LLM memory.<br><strong>Agents give an LLM capabilities.</strong></p><p>An agent is:</p><blockquote><p><strong>An LLM that can choose tools and perform actions autonomously within defined boundaries.</strong></p></blockquote><p>Tools can be:</p><ul><li><p>APIs</p></li><li><p>functions</p></li><li><p>calculations</p></li><li><p>database queries</p></li><li><p>workflow steps</p></li><li><p>MCP tools</p></li></ul><p>Agents can:</p><ul><li><p>take multiple steps</p></li><li><p>plan</p></li><li><p>decide</p></li><li><p>execute tasks</p></li><li><p>correct themselves</p></li></ul><p>This is powerful&#8212;and dangerous&#8212;if not constrained.</p><p>Good agents behave like smart assistants.<br>Bad agents behave like unsupervised interns with admin privileges.</p><p>Agents are a full architectural pattern: <strong>autonomous reasoning with tool execution</strong>.</p><h1>MCP: The Enabler That Makes Tool-Use and Agentic Workflows Actually Scalable</h1><p>There&#8217;s a piece of this whole story that isn&#8217;t an architectural pattern by itself, but has quickly become one of the most important <em>enablers</em> in modern AI systems:</p><p><strong>MCP &#8212; Model Context Protocol.</strong></p><p>If LLMs are the reasoning layer,<br>and RAG is the memory layer,<br>and agents are the autonomy layer,</p><p><strong>MCP is the interface layer &#8212; the part that allows models and agents to interact with real systems in a standardized, safe and introspectable way.</strong></p><p>Before MCP, integrating tools into an LLM or an agent was fragile and inconsistent:</p><ul><li><p>Each provider (OpenAI, Anthropic, local models) had its own API format.</p></li><li><p>Tool definitions lived inside prompts (yes, really).</p></li><li><p>Schema mismatches caused silent failures.</p></li><li><p>There was no discovery mechanism: you had to &#8220;tell&#8221; the model what it could do.</p></li><li><p>Tool-use was tightly coupled to specific model vendors.</p></li><li><p>Security controls were improvised and scattered.</p></li></ul><p>MCP changes this dynamic completely.</p><p>It introduces a <strong>unified contract</strong> describing:</p><ul><li><p>what tools exist</p></li><li><p>what actions they expose</p></li><li><p>what parameters they require</p></li><li><p>what schemas they follow</p></li><li><p>what capabilities are allowed</p></li></ul><p>With this, an LLM or an agent can <strong>discover</strong> tools, <strong>understand</strong> their structure, and <strong>use</strong> them safely &#8212; without relying on brittle prompt instructions.</p><p>In other words:</p><blockquote><p><strong>MCP is not an architecture pattern &#8212; it&#8217;s the enabler that makes agentic systems, tool-use, automation and safe AI orchestration actually viable.</strong></p></blockquote><p>It becomes a clean, vendor-independent bridge between:</p><ul><li><p>your microservices</p></li><li><p>your automations</p></li><li><p>your data sources</p></li><li><p>your business actions</p></li><li><p>and the AI layer</p></li></ul><h2>A Real Use Case Where I Applied MCP (High-Level View)</h2><p>To make this more tangible, here&#8217;s a simplified real scenario I implemented.</p><p>Imagine a user asks the system:</p><blockquote><p><strong>&#8220;Send the list of payments due today to Charles Sant.&#8221;</strong></p></blockquote><p>An LLM alone cannot perform this task &#8212; it needs real system capabilities.</p><p>Through MCP, the LLM can:</p><ol><li><p>discover which tools exist</p></li><li><p>inspect their schemas</p></li><li><p>call the right tool with structured data</p></li><li><p>use the result to perform a follow-up action</p></li></ol><p>The diagram below shows a <strong>high-level view</strong> of how this actually works end-to-end:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n-KV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n-KV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png 424w, https://substackcdn.com/image/fetch/$s_!n-KV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png 848w, https://substackcdn.com/image/fetch/$s_!n-KV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png 1272w, https://substackcdn.com/image/fetch/$s_!n-KV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n-KV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png" width="761" height="422" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:422,&quot;width&quot;:761,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:132729,&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://blog.seart.dev/i/179645942?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.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_!n-KV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png 424w, https://substackcdn.com/image/fetch/$s_!n-KV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png 848w, https://substackcdn.com/image/fetch/$s_!n-KV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.png 1272w, https://substackcdn.com/image/fetch/$s_!n-KV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83e42ac8-2655-4644-a1c8-99fac01a427a_761x422.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>This flow represents how an LLM, an MCP Client, and multiple MCP Tool Servers coordinate to fulfill a real user request:</p><h3>1. The LLM discovers available tools</h3><p>It doesn&#8217;t &#8220;guess&#8221; or rely on a prompt description.<br>It asks the MCP Client:</p><ul><li><p><em>&#8220;What tools do I have?&#8221;</em><br>The MCP Client replies:</p></li><li><p><code>payments-query</code></p></li><li><p><code>people-notifier</code></p></li></ul><p>These tools are introspectable because MCP provides structured schemas.</p><h3>2. The LLM chooses the right tool based on schema</h3><p>It selects <code>payments-query</code> first, sending structured data (JSON compliant with the tool&#8217;s schema).</p><p>The MCP Client calls the appropriate MCP Tool Server, which returns the required payments.</p><h3>3. The LLM composes a second action</h3><p>Now that it has the list of payments, it prepares a second structured request:</p><ul><li><p>a call to <code>people-notifier</code></p></li></ul><p>Again, the MCP Client relays the request, and the MCP Tool Server returns the execution status.</p><h3>4. The LLM returns the final result to the user</h3><p>All tool interactions are chained through the MCP Client, keeping:</p><ul><li><p>your microservices safe</p></li><li><p>your API surface clean</p></li><li><p>your tool definitions standardized</p></li><li><p>your agentic workflow predictable</p></li></ul><h1>Additional Tips for Real-World AI Architecture</h1><p>Before closing, here are a few high-impact recommendations that can help you design AI-enabled systems that remain safe, predictable and maintainable as they grow:</p><h3>1. Always validate input and output</h3><p>LLMs produce <em>probabilistic</em> output, not guaranteed structure.<br>Add lightweight validation to avoid malformed requests reaching your internal systems.</p><h3>2. Version everything</h3><p>Prompts, embeddings, RAG pipelines, tool schemas, agent behaviors.<br>Treat these assets like code &#8212; because they are.</p><h3>3. Keep agents narrow and supervised</h3><p>A &#8220;general-purpose agent&#8221; is a nice idea, but in practice, small task-specific agents with well-defined tools behave far better.</p><h3>4. Apply caching everywhere</h3><p>Embedding cache, retrieval cache, and generation cache reduce latency and cost dramatically.</p><h3>5. Don&#8217;t forget security</h3><p>AI introduces new attack surfaces.<br>Instead of going deep here, I&#8217;ll simply recommend this:<br><strong>study the <a href="https://genai.owasp.org/llm-top-10/">OWASP Top 10 for LLM Applications</a></strong><a href="https://genai.owasp.org/llm-top-10/"> </a>when designing any generative AI feature.<br>It provides practical guidance for avoiding prompt injection, unsafe tool execution, and other real-world risks.</p><p><em>(You don&#8217;t need to memorize every item&#8212;but awareness goes a long way.)</em></p><h3>6. Separate deterministic logic from AI logic</h3><p>Critical flows should not depend entirely on an LLM.<br>Build fallbacks, guardrails, and human-in-the-loop paths for sensitive operations.</p><h3>7. Measure what your AI layer is actually doing</h3><p>Logging tool calls, recording decisions, tracking latency and cost &#8212; this turns the AI layer from a &#8220;black box&#8221; into something observable.</p><p>These small practices compound over time and make a massive difference in production.</p><h1>Conclusion</h1><p>This was a high-level introduction to how LLMs, RAG, agents, and MCP fit together into a modern software architecture.<br>My goal wasn&#8217;t to go deep on every topic, but to give you a mental map that helps you reason about the AI layer with clarity &#8212; without hype, magic, or hand-waving.</p><p>If this topic interests you, stay tuned.<br>The next posts in this series will go deeper into individual patterns, starting with <strong>Guardrails</strong>, and I&#8217;d love for you to join the discussion, share your experiences, and challenge the ideas here.</p><p>Thanks for reading &#8212; and let&#8217;s keep building better systems together.</p>]]></content:encoded></item><item><title><![CDATA[Books Teach Patterns. Architects Teach Context]]></title><description><![CDATA[After years mentoring engineers and helping companies make architecture decisions, I&#8217;ve realized something simple but powerful:]]></description><link>https://blog.seart.dev/p/books-teach-patterns-architects-teach</link><guid isPermaLink="false">https://blog.seart.dev/p/books-teach-patterns-architects-teach</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Sat, 15 Nov 2025 13:31:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jgBw!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5c268ce-18e0-449d-be5b-6f2a614b91bd_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After years mentoring engineers and helping companies make architecture decisions, I&#8217;ve realized something simple but powerful:</p><p><strong>The &#8220;right&#8221; advice depends on who you are&#8230; and where you are.</strong></p><p>We love books.<br>We love patterns, best practices, principles, and models.<br>They make us better.</p><p>But every book was written from a specific place:<br>a certain team, a certain culture, a certain moment in time.</p><p>And that place is not yours.</p><p>That&#8217;s why two people&#8212;or two companies&#8212;can read the same chapter and walk away with completely different needs.</p><h1>When mentoring, I&#8217;ve learned that people don&#8217;t need the same advice</h1><p>I&#8217;ve mentored engineers who seem to face the same situation but need totally different guidance.</p><p>For example:</p><ul><li><p>One engineer over-engineers because they&#8217;re afraid of making mistakes.</p></li><li><p>Another cuts corners because they&#8217;re overwhelmed.</p></li><li><p>One applies best practices like if they were laws.</p></li><li><p>Another avoids patterns because they were burned before.</p></li><li><p>Some need more structure.</p></li><li><p>Others need more freedom.</p></li></ul><p>Same challenge on paper.<br>Different human on the other side.</p><p>So the advice changes.</p><p>And that&#8217;s normal.<br>That&#8217;s good.<br>That&#8217;s mentorship.</p><p>Books explain concepts.<br>Mentors understand people.</p><h1>The same thing happens when advising companies</h1><p>As architects, companies expect us to give them &#8220;the best solution.&#8221;</p><p>But the best solution is always contextual:</p><ul><li><p>team skills</p></li><li><p>deadlines</p></li><li><p>pressure</p></li><li><p>risks</p></li><li><p>legacy systems</p></li><li><p>culture</p></li><li><p>business priorities</p></li></ul><p>You can design the most elegant architecture&#8230;<br>but if the company can&#8217;t maintain it, it&#8217;s not a good architecture.</p><p>Sometimes the &#8220;ideal&#8221; design creates more pain than value.</p><p>So what do we do?</p><ul><li><p>We simplify when teams are stressed.</p></li><li><p>We make things more opinionated when alignment is weak.</p></li><li><p>We prefer incremental changes when risk is high.</p></li><li><p>And sometimes, we break the rules&#8212;on purpose&#8212;because the real world demands it.</p></li></ul><p>Books describe perfect worlds.<br>Architects work in real ones.</p><h1>The common thread: context changes everything</h1><p>Whether advising a junior developer or helping a business decide its next architecture step, the pattern is the same:</p><p><strong>Good decisions come from understanding context, not from memorizing best practices.</strong></p><p>Patterns are tools.<br>Principles are guides.<br>Books give us a starting point.</p><p>But judgment&#8230;<br>that&#8217;s where the real craft is.</p><p>Because the perfectionist may need to relax.<br>And the rushed team may need to slow down.<br>And the company obsessed with speed may need a more solid foundation.<br>And the company stuck in analysis may need to ship something now.</p><p>Same problem.<br>Different system.<br>Different answer.</p><h1>The human side of technical leadership</h1><p>At the end of the day:</p><p><strong>Books teach us what </strong><em><strong>can</strong></em><strong> work.<br>Architects and mentors help people find what will work for them.</strong></p><p>That&#8217;s why context matters.<br>And that&#8217;s why our role exists.</p><p>Because technology moves fast, but humans and companies grow through understanding.</p>]]></content:encoded></item><item><title><![CDATA[CLEAR Architecture]]></title><description><![CDATA[A Simple Framework for Practical Software Architects]]></description><link>https://blog.seart.dev/p/clear-architecture</link><guid isPermaLink="false">https://blog.seart.dev/p/clear-architecture</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Thu, 12 Jun 2025 17:19:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AtY1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s be honest&#8212;architecting software can feel overwhelming. Endless diagrams, a dozen opinions, constant pressure to &#8220;get it right.&#8221; I&#8217;ve been there. I used to think good architecture was about precision and control. But with experience, I&#8217;ve learned something simpler&#8212;and more powerful:</p><div class="pullquote"><p>Clarity beats complexity. Always.</p></div><p>That&#8217;s what inspired me to create the CLEAR Architecture framework. It&#8217;s not a rigid process or a silver bullet. It&#8217;s a simple mental model that helps me&#8212;and my team&#8212;stay grounded, collaborate better, and focus on what really matters.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AtY1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AtY1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!AtY1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!AtY1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!AtY1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AtY1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1686645,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.seart.dev/i/165799334?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.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_!AtY1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!AtY1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!AtY1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!AtY1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f7ba9-0c21-4fda-a3dd-0ee8ac7a0802_1024x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1>C &#8211; Context: Understand the real problem</h1><div class="pullquote"><p>&#8220;You&#8217;re not building software. You&#8217;re solving a problem. Start there.&#8221;</p></div><p>So many of my early mistakes as an architect had nothing to do with tech&#8212;and everything to do with assumptions. I once led a system redesign for a logistics flow&#8230; only to realize weeks later that we&#8217;d misunderstood the real bottleneck. No amount of clean code or fancy layers could fix that.</p><p>Albert Einstein captured it perfectly:</p><blockquote><p>&#8220;If I had an hour to solve a problem, I&#8217;d spend 55 minutes thinking about the problem and 5 minutes thinking about solutions.&#8221;</p></blockquote><p>These days, I slow down. I ask more questions. I dig into the context before writing a single line of code. It makes all the difference.</p><h1>L &#8211; Layout: Draw a simple, big&#8209;picture vision</h1><div class="pullquote"><p>&#8220;You don&#8217;t need every detail. Just enough to move forward together.&#8221;</p></div><p>Before diving into patterns, stacks, or services, I sketch. Literally&#8212;on a whiteboard, notebook, or digital board. I draw boxes and arrows, map flows, ask for feedback. It&#8217;s not meant to impress&#8212;it's meant to align.</p><p>Simon Sinek reminds us:</p><blockquote><p>&#8220;Those who are able to inspire give people a sense of purpose or belonging that has little to do with any external incentive or benefit to be gained. Those who truly lead are able to create a following of people who act not because they were swayed, but because they were inspired.&#8221;</p></blockquote><p>A clear, shared layout helps your team understand where things are going&#8212;and why. It turns confusion into direction.</p><h1>E &#8211; Execute: Pick a good-enough path and go</h1><div class="pullquote"><p>&#8220;Don&#8217;t wait for the perfect plan. Start with a decent one and learn fast.&#8221;</p></div><p>I used to overthink everything. &#8220;What if we need to scale later?&#8221; &#8220;What if this isn&#8217;t future-proof?&#8221; Guess what? Most of those fears never happened&#8212;and the delay cost us more than any wrong choice.</p><p>Now I ask: Is this approach viable? Can we deliver something useful soon? If the answer is yes, we go.</p><p>As General Patton said:</p><blockquote><p>&#8220;A good plan, violently executed now, is better than a perfect plan next week.&#8221;</p></blockquote><p>Software is built through action&#8212;not endless planning.</p><h1>A &#8211; Adapt: Change early, change often</h1><div class="pullquote"><p>&#8220;Architecture should evolve. So should you.&#8221;</p></div><p>Sometimes the thing you thought would scale&#8230; doesn&#8217;t. Or the way services interact becomes a mess. That&#8217;s okay. What matters is noticing it early&#8212;and being willing to change course.</p><p>In my experience, it&#8217;s often my teammates who help me see what I&#8217;ve missed. A backend dev notices a bottleneck. A product owner challenges a core assumption. Architecture improves when everyone feels safe to speak up&#8212;and I try to actively invite that input.</p><p>One of my favorite quotes from Kent Beck is:</p><blockquote><p>&#8220;Optimism is an occupational hazard of programming. Feedback is the treatment.&#8221;</p></blockquote><p>CLEAR isn&#8217;t about sticking to the initial plan. It&#8217;s about noticing what&#8217;s working&#8212;and what&#8217;s not&#8212;and adapting before the cost of change explodes.</p><h1>R &#8211; Reflect: Learn from every experience</h1><div class="pullquote"><p>&#8220;Your best tool as an architect is feedback.&#8221;</p></div><p>We all make calls that don&#8217;t go as expected. That doesn&#8217;t make us bad architects&#8212;it makes us human. What matters is pausing to ask: What did I learn? How can I do better next time?</p><p>John Dewey once said:</p><blockquote><p>&#8220;We do not learn from experience&#8230; we learn from reflecting on experience.&#8221;</p></blockquote><p>I try to write down my lessons&#8212;but I don&#8217;t do it alone. I actively ask my team: What would you have done differently? What looked weird to you?</p><p>Often, the most valuable architectural feedback comes from someone who wasn&#8217;t even &#8220;in the room&#8221; when the decision was made. That&#8217;s why I believe reflection is a team sport.</p><h1>Conclusion, be CLEAR, not Clever</h1><p>There&#8217;s no perfect architecture. No universal answer. But there is clarity. And when you build it together&#8212;with your team, not just for them&#8212;things tend to fall into place.</p><p>So next time you're facing a complex decision, try keeping it CLEAR:</p><p>Context &#8212; Understand the real problem</p><p>Layout &#8212; Share a simple, high-level vision</p><p>Execute &#8212; Choose a path and move</p><p>Adapt &#8212; Change fast when it makes sense</p><p>Reflect &#8212; Learn and grow from each decision</p><p>What helps you bring clarity to your work as an architect?</p>]]></content:encoded></item><item><title><![CDATA[From Individual Contributor to Leader]]></title><description><![CDATA[What means being a leader in software engineering?]]></description><link>https://blog.seart.dev/p/from-individual-contributor-to-leader</link><guid isPermaLink="false">https://blog.seart.dev/p/from-individual-contributor-to-leader</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Tue, 22 Apr 2025 09:01:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dGAI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dGAI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dGAI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!dGAI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!dGAI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!dGAI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dGAI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/feb35678-1ff6-4400-ba67-3745a8d890d0_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;:2360698,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.seart.dev/i/161699004?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.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_!dGAI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!dGAI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!dGAI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!dGAI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb35678-1ff6-4400-ba67-3745a8d890d0_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Being totally honest, even though I've held leadership roles for the past 10 years, I still sometimes feel a bit like an impostor. It's surprising&#8212;and even a little funny&#8212;to look back at how I've handled certain situations in the past.</p><p>Right now, for example, I'm remembering an incident from about a year ago when I totally failed at preventing my boss from seeing me as a threat or potential replacement. That sparked envy and insecurity from his side, pushing him to make my job way harder than necessary. Today, I'm sure that if I'd approached him in a humbler, less stubborn way, I would have achieved a much better outcome. But you know what? That experience taught me something valuable&#8212;as every situation always does.</p><h1><strong>Why Does Continuous Learning Matter?</strong></h1><p>Here's the bottom line: if you genuinely feel every decision you've ever made was perfect, you're probably doing something wrong. Think about it this way: if you're truly growing, your current knowledge and skills should be miles ahead of your past self. Every experience&#8212;whether it feels like success or failure&#8212;shapes you. As long as you're learning from each situation, you're winning.</p><p>One of the most important lessons I learned about 7 years ago was changing my mindset from an Individual Contributor to a Leader. This shift was essential for feeling true progress in my career. Even now, I still have so much to learn about this paradigm, and honestly, that's fantastic&#8212;I love that hunger for growth.</p><p>If you&#8217;re a Senior Software Engineer looking to advance your career, improving your leadership skills is crucial. So, let me share three fundamental aspects that can help you do exactly that:</p><h2>Your New Goal: Aligning Goals</h2><p>I used to be a highly competitive professional focused on delivering maximum value by shipping features&#8212;always pushing myself to be the absolute best. However, I&#8217;ve learned something important: becoming a true leader involves shifting your goal from personal performance towards <strong>aligning your team members' goals with the team's goals</strong>.</p><div class="pullquote"><p><em>&#8220;The greatest leader is not necessarily the one who does the greatest things. He is the one that gets the people to do the greatest things.&#8221;</em> &#8211; Ronald Reagan</p></div><p>What exactly does this mean? It means deeply understanding each of your teammates' individual goals, motivations, and expectations, and then finding ways to align these personal ambitions with your team&#8217;s overall objectives.</p><p>Here&#8217;s a quick example of what I mean: A team member once expressed frustration about always working with legacy banking systems rather than exploring new technologies. Recognizing his frustration, I proposed an idea to leverage our team's downtime (when blocked or workloads were lighter) into something valuable&#8212;I called it "InnoLab" (Innovation Laboratory). Each team would propose innovative ideas and test them as proof-of-concepts, validating real value for our business and customers. Fortunately, most leaders embraced the concept, creating opportunities for innovation and personal growth.</p><h2>Make Yourself &#8220;Dispensable&#8221;</h2><p>Learning this lesson was pretty tough for me. To really succeed as a leader, you need to trust your team. You have to empower each member so they can handle tasks&#8212;even when you're not around.</p><p>But how? Push your team members to take responsibility and let them shine. Treat people as superheroes, and that's exactly how they'll start to act.</p><div class="pullquote"><p><em>&#8220;A good leader inspires people to have confidence in the leader. A great leader inspires people to have confidence in themselves.&#8221;</em> &#8211; Eleanor Roosevelt</p></div><p>It&#8217;s common knowledge among colleagues who've worked with me that I often encourage my team members to present our results directly to leaders or customers. Why? Because it empowers them, makes their efforts visible across the company, and provides valuable experience handling pressure&#8212;all of which helps them grow.</p><p>Another effective way is to let your team propose their own ideas and guide conversations towards solutions. Depending on the situation, I usually allow my team to express their perspectives and lead discussions. Only if I notice they need a bit of guidance to stay on track or get unstuck, I step in to gently steer the conversation.</p><h2>Train Your Influence Skill</h2><p>A lot of books, blogs, and videos talk about influencing people. I'd like to share two of my all-time favorite books on leadership and influence: <em><a href="https://www.amazon.com/How-Win-Friends-Influence-People/dp/1439199191">How To Win Friends And Influence People</a></em> and <em><a href="https://www.amazon.es/Art-War-Hardcover-Sun-Tzu/dp/B09QNYN2VM/">The Art Of War</a></em>. I've learned&#8212;and honestly, I&#8217;m still learning&#8212;a lot from these classics.</p><p>Let me start by saying that I'm naturally altruistic and idealistic. By default, this shapes me into a helpful leader. I usually trust that people mean well and have good intentions, so I focus on supporting their personal goals while aligning them with the team's objectives.</p><p>However, sometimes decisions aren't optimal or context-appropriate, and you'll need to influence the outcome. The tricky part? Everyone usually believes they're right. Becoming influential combines several skills that reinforce one another: you listen to understand, identify motivations, map personalities, adapt your leadership style, and constantly practice.</p><ul><li><p><strong>Listen first.</strong> Truly listen and understand before responding. You might discover valuable insights and show your teammates their perspectives genuinely matter.</p></li><li><p><strong>Identify motivations.</strong> Understanding what motivates your team lets you align your proposals with their priorities, increasing acceptance.</p></li><li><p><strong>Understand personalities.</strong> Different personalities respond better to different communication styles. I recommend reading <em><a href="https://www.amazon.es/Surrounded-Idiots-Thomas-Erikson/dp/1785042181/">Surrounded By Idiots</a></em> to adapt effectively.</p></li><li><p><strong>Be a "chameleon".</strong> Sometimes leadership requires flexibility, even strategic toughness, to align goals and achieve objectives. As we say in Spanish: <em>"Al son que me toquen bailo."</em></p></li><li><p><strong>Practice.</strong> You&#8217;ll inevitably fail sometimes, but each failure is a lesson. Keep practicing your influence skills; mastery comes with experience.</p></li></ul><p>Remember, leadership isn't about having all the answers; it's about guiding your team toward finding the best solutions together. Keep practicing, stay humble, and never stop learning. You've got this!</p><h3></h3><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[How to Effectively Sell Yourself as a Software Engineer]]></title><description><![CDATA[How to increase your salary as a Software Engineer?]]></description><link>https://blog.seart.dev/p/selling-yourself-as-a-great-software</link><guid isPermaLink="false">https://blog.seart.dev/p/selling-yourself-as-a-great-software</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Tue, 18 Mar 2025 08:02:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ykT9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this post, I am sharing my experiences and insights about how a software engineer can effectively sell themselves, particularly to increase their salary and strategically guide their professional career.</p><p>I have been working as a software engineer for the past 15 years. Like many, I began my journey as a Practitioner Software Engineer (a level just below junior) and have spent the last 10 years working as a Software Architect. Before diving into my key lessons, I highly recommend reading "The Art of War," as its principles frequently appear throughout this post.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ykT9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ykT9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ykT9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ykT9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ykT9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ykT9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:386094,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.seart.dev/i/159186085?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ykT9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ykT9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ykT9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ykT9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F689bdea4-f8cd-4596-af1e-720268164c1f_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>First Lesson: The squeaky wheel gets the grease</h1><p>The first lesson I learned can be summarized by the Spanish saying: "El que no llora no mama." In other words, if you want something to happen, you have to actively pursue it and explicitly request it.</p><p>For instance, if you're interested in advancing your role&#8212;such as obtaining a promotion or receiving better compensation&#8212;you must clearly communicate this desire to your manager. Expressing your goals explicitly ensures that your efforts align with your aspirations, giving you greater control over your professional life.</p><div class="pullquote"><p>&#8220;If you never ask, the answer is always no.&#8221;</p></div><p>The first time I asked for a promotion, I was very nervous&#8212;and honestly, I still get nervous today. Initially, my request came purely from a position of need. When I asked for a salary increase, my manager surprised me by immediately asking for justification. I was unprepared for that question and ended up honestly saying I needed it to improve my quality of life. It may sound simplistic or even na&#239;ve, but that was my reality at that moment. Although my justification wasn't very strong professionally, my honesty created a genuine connection, and I learned the importance of clearly articulating my value.</p><h1>Second Lesson: Prepare the Field for Negotiations</h1><p>When you request a salary increase or a promotion, your manager needs to justify their decision&#8212;either to approve or deny your request. Essentially, they must assess whether your work provides sufficient value to justify your request. </p><div class="pullquote"><p>&#8220;Negotiation begins long before the conversation&#8212;come prepared with leverage.&#8221;</p></div><p>Given this reality, it&#8217;s crucial to prepare the ground for negotiations. How can you do this effectively? By consistently demonstrating your achievements and showcasing the tangible value you deliver to the company. This can be done in several ways, including:</p><ul><li><p>Successfully completing important tasks and projects.</p></li><li><p>Positioning yourself as a trusted reference within your team.</p></li><li><p>Actively building trust with your colleagues and supervisors.</p></li></ul><p>By proactively demonstrating your worth, you make it easier for your manager to justify your requests, significantly improving your chances of success.</p><p>It's important to understand that the ways you demonstrate your value and career progress depend greatly on your circumstances, particularly your seniority level. The expectations for a Junior developer differ significantly from those of a Senior developer. For instance, I expect Seniors on my team to mentor Juniors, serve as technical references, and lead by example. Conversely, Juniors should focus on completing smaller tasks effectively, displaying eagerness to learn, and consistently seeking opportunities to enhance their skills.</p><h1>Third Lesson: Know Yourself and Have a Life Plan</h1><p>I know this may sound clich&#233;, but it's genuinely impactful&#8212;so powerful, in fact, that it requires careful thought. Having at least a basic idea of your life plan gives you a compass to guide professional decisions effectively.</p><div class="pullquote"><p>&#8220;A clear life plan becomes your professional compass.&#8221;</p></div><p>I began my journey in software engineering at the age of 16. Back then, I wanted to be either a scientist or a math teacher. However, due to my circumstances at the time, that wasn't immediately feasible. Instead, I had the chance to study as a Systems Technician&#8212;a qualification considered slightly below an engineer&#8212;and I embraced the opportunity I had available.</p><p>By age 20, I was working as a Web Administrator and Cybersecurity Practitioner. After two years in this role, I paused to reflect on what I truly wanted to do. I realized I enjoyed networking and security, but my true passion was in creating and coding solutions. Recognizing this, I actively sought opportunities within the same company to transition into software development. After being evaluated as a Practitioner Software Engineer, I discovered not only that I was good at coding&#8212;I was great at it, something that remains true even today!</p><p>This experience taught me the value of periodically reflecting on who I am, what excites me, and where I want to go next. Doing this helped me identify the roles aligned with my passions and skills, enabling me to actively shape my career rather than merely following wherever the circumstances took me.</p><h1>Fourth Lesson: Win before negotiating</h1><p>This advice might seem controversial or even taboo to some people, but I genuinely believe it&#8217;s crucial if you want to achieve your professional goals.</p><div class="pullquote"><p>&#8220;Always negotiate from strength&#8212;create opportunities first, negotiate second.&#8221;</p></div><p>When someone asks me for advice on what to do when their salary or working conditions don't align with their expectations, my recommendation is straightforward: first, communicate your desires openly and directly with your manager.</p><p>However, it's also wise to have a backup plan&#8212;explore alternative opportunities or job offers. This doesn't mean you're determined to leave immediately, but securing other options can give you stronger leverage and confidence when negotiating.</p><p>Importantly, being ambitious is not negative; in fact, ambition is highly beneficial and can significantly enhance your life and career, provided your ambitions align with your values and life goals. Clearly expressing your professional aspirations helps your manager understand your motivations. Always request conditions that genuinely fulfill your needs and values, ensuring alignment between your ambition and personal well-being. This alignment helps avoid negative feelings and supports your long-term satisfaction and growth.</p><h1>Fifth Lesson: Don&#8217;t let a position defines you</h1><div class="pullquote"><p>"Leadership is not about a title or a designation. It's about impact, influence, and inspiration."</p><p>&#8212; Robin Sharma</p></div><p>Finally, and equally as important as the previous four lessons, don&#8217;t let your job title define or limit you.</p><p>Remember, your position or title does set expectations, but it shouldn't restrict your growth or identity. You don&#8217;t become valuable or skilled because of your job title&#8212;you bring value through who you are, what you do, and how you contribute. Your worth is determined by your capabilities, your attitude, your leadership, and the quality of your relationships with teammates&#8212;not by your official position alone.</p><p>I understand this might sound idealistic or even altruistic. However, adopting this mindset has allowed me to grow tremendously, both professionally and personally. Today, I'm genuinely happy with my progress and believe strongly that not allowing myself to be limited by titles was essential in achieving that satisfaction.</p><p>Remember, when you refuse to be defined solely by your position, you open yourself to greater opportunities, flexibility, and growth. Ambition aligned with your values and authenticity creates a path to recognition beyond titles and traditional boundaries.</p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Agile Software Architect Role - Part 5]]></title><description><![CDATA[Business value as an architectural driver]]></description><link>https://blog.seart.dev/p/agile-software-architect-role-part-d03</link><guid isPermaLink="false">https://blog.seart.dev/p/agile-software-architect-role-part-d03</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Mon, 27 Jan 2025 14:31:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RHmo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Imagine a team tasked with building a bridge on a remote island. They go all out&#8212;using the latest materials, designing for earthquakes, hurricanes, and even future expansions. It's an engineering masterpiece.</p><p>But there&#8217;s one critical issue: no one checked if the bridge was actually needed. There's no traffic, no demand, and no real purpose. Despite the team&#8217;s incredible technical work, the project fails to deliver any value. The client regrets the investment, and the team feels frustrated, wondering, <em>"Why did we even build this?"</em></p><p>The same thing happens in software engineering when we make architectural decisions without considering <strong>Business Value</strong>. We get caught up in buzzwords like microservices, complex patterns, or the latest tech trends, forgetting to ask the essential question: <em>"Does this actually solve a business problem?"</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RHmo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RHmo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!RHmo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!RHmo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!RHmo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RHmo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:494890,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RHmo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!RHmo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!RHmo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!RHmo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5740eee-82d8-4291-ba9c-7ebab50e1f7b_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>What is Business Value?</h1><p>In simple terms, business value is anything that brings measurable benefit to our stakeholders. It's not always about delivering a new feature or deploying a completed product. Sometimes, it&#8217;s about gathering insights or validating a hypothesis that enables the business to make informed, data-driven decisions. This, too, is business value.</p><p>According to <a href="https://www.scrum.org/resources/blog/five-types-value">scrum.org</a>, there are five types of value: <strong>commercial value</strong>, <strong>efficiency value</strong>, <strong>market value</strong>, <strong>customer value</strong> and <strong>future value</strong>. Each of these focuses on a different area that almost every business prioritizes. </p><p>For instance, optimizing a microservice to use fewer resources could reduce costs to serve customers without impacting their experience. This is an example of <strong>efficiency value</strong>.</p><h1>Why is Business Value important?</h1><div class="pullquote"><p><em>&#8220;It&#8217;s not the customer&#8217;s job to know what they want.&#8221;</em><br>&#8212; <strong>Steve Jobs</strong></p></div><p>You might be asking yourself, <em>&#8220;Is Business Value important for a Software Architect?&#8221;</em> The answer is simple: absolutely. As a Software Architect, the decisions you make should always be justified by the business value they bring.</p><p>For example, if you choose a microservices architecture for your system, it&#8217;s likely because you&#8217;re aiming to provide extensibility. This enables your team&#8212;and ultimately the business&#8212;to grow its capabilities over time, supported by the modularity and scalability of microservices. In this case, your decision is driven by <strong>future value</strong>, as it considers the long-term growth of both the system and the business.</p><p>Here&#8217;s my personal tip: as a Software Architect, especially in an agile environment, make <strong>business value</strong> an architectural driver. Let it guide and motivate every&#8212;or at least almost every&#8212;decision you make. This approach keeps your work aligned with what truly matters to the business.</p><h1>How can I address this driver?</h1><p>Great question! One of my go-to tools is <strong>Value Stream Mapping </strong>(VSM). Traditionally, VSM is used to analyze and optimize the flow of value in a process. In this case, I use it to trace the flow of value through software systems and their components, connecting actors, business capabilities, and technical systems. Here&#8217;s how you can create one, in summary:</p><ol><li><p><strong>Identify the actors or users</strong> of your system.</p></li><li><p><strong>Select the processes or business capabilities</strong> your system supports.</p></li><li><p><strong>Map the actors to the business capabilities</strong> they interact with.</p></li><li><p><strong>Trace the business capabilities to the systems</strong> that support them.</p></li><li><p><strong>Decompose your system into software components</strong>&#8212;for example, microservices or serverless cloud functions like AWS Lambdas.</p></li><li><p><em>(Optional)</em> Map to the <strong>object or data model</strong>.</p></li><li><p><em>(Optional)</em> Map to the <strong>infrastructure</strong>.</p></li></ol><p>This layered diagram makes it easy to identify the <strong>impact and value</strong> of modifying a specific software component. You&#8217;ll clearly see what business capabilities and users will be affected, allowing you to make informed, value-driven decisions.</p><h2>Balancing Cost and Value</h2><p>Another key approach that complements VSM is <strong>Cost-Driven Architecture</strong>. This method emphasizes balancing the cost of a decision with the value it delivers. For example:</p><p>Using a built-in cloud service might seem more expensive than developing your own solution. However, building custom code also brings hidden costs, such as ongoing maintenance, technical debt, and operational risks. Delegating these responsibilities to third-party services could align better with business goals in the long term.</p><p>As Software Architects, it&#8217;s our responsibility to identify these trade-offs and present them to the business. We must balance technical efficiency with strategic value, ensuring every decision aligns with the overarching objectives.</p><h2>Getting hidden requirements from the business</h2><p>I firmly believe that a Software Architect is not the smartest person in the room or team. Instead, we are the ones who empower others to shine by guiding the team toward the best decisions. Our primary role is to <strong>ask the right questions</strong>&#8212;questions that steer meetings and decisions in the right direction.</p><div class="pullquote"><p><em>&#8220;Your job is really to make other people a little bit smarter, to help them come to better decisions, to look at their problems through different lenses, and to understand impacts and tradeoffs. That is really your role as an architect. You're an IQ amplifier for everyone else.&#8221;</em></p><p>&#8212; <strong>Gregor Hohpe</strong></p></div><p>The people who hold the key to making decisions based on <strong>Business Value</strong> are usually on the business side. When I listen to my team asking questions to the Product Owner, I pay attention to what might be missing. If I notice important questions left unasked, I step in to ensure we gather all the necessary information to make well-informed decisions.</p><h3>Tools for Extracting Requirements</h3><p>Even tasks like resolving technical debt or deploying a new feature come with risks in production environments. These risks demand that our systems be resilient enough to meet business expectations. For example, understanding how resilient or fault-tolerant a system needs to be can be guided by defining two key metrics:</p><ul><li><p><strong>Recovery Time Objective (RTO):</strong> How quickly the system should recover from a failure.</p></li><li><p><strong>Recovery Point Objective (RPO):</strong> How much data loss is acceptable in the event of an outage.</p></li></ul><p>Both RTO and RPO are directly tied to the <strong>business&#8217;s non-functional requirements</strong>, which makes uncovering these requirements crucial.</p><p>Another tool I use to extract hidden requirements is the <strong>Quality Attribute Workshop</strong>. This workshop helps teams explore hypothetical scenarios, often edge cases, to uncover the information needed from the business. For example: Imagine you&#8217;re tasked with designing a URL shortening service. During the workshop, you could ask:<br><em>"If there&#8217;s a performance issue, is it equally critical to ensure the capability of registering a new URL as it is to forward requests using short URLs?"</em></p><p>The business&#8217;s answer to this question might lead you to implement a <strong>CQRS pattern</strong> or another architectural strategy. By using tools like this, we can ensure our technical decisions align with business priorities and deliver real value.</p><h1>Business Value Changes as Requirements Evolve</h1><p>In the first <a href="https://blog.seart.dev/p/agile-software-architect-role">post</a> of this series of Agile Software Architect, I mentioned the importance of being open to change&#8212;and this applies equally to <strong>Business Value</strong>, which evolves over time.</p><div class="pullquote"><p><em>&#8220;Responding to change over following a plan.&#8221;</em><br>&#8212; <strong>Agile Manifesto Value</strong></p></div><p>For example, I recently encountered a situation where the business decided to pause all production deployments for a specific period due to a critical and high-profile event. Their <strong>risk appetite</strong> was practically zero during that time. From IT, we had already developed a small change that could reduce resource costs, but deploying it carried risks that the business was unwilling to accept. In that moment, their <strong>non-functional requirements</strong> shifted to:<br><em>"We need system stability above all else; any improvements can wait."</em></p><p>After the event passed, their requirements shifted again, and we resumed delivering improvements. This experience reinforced a key lesson: <strong>Business Value is not static. It changes as priorities and circumstances evolve.</strong></p><p>As architects, we must understand that requirements will always change. To maximize value and meet expectations, we need to actively listen to the business and ensure we remain aligned with their needs. <strong>Strong communication and collaboration between IT and business</strong> are essential to achieving this alignment and ensuring success.</p><h1>Final Thoughts</h1><p>As Software Architects, our primary responsibility is to align technical decisions with the evolving needs of the business. This means being adaptable, asking the right questions, and ensuring that every decision we make delivers the maximum possible value. Whether it&#8217;s uncovering hidden requirements, balancing trade-offs, or responding to changing priorities, our role is to bridge the gap between IT and business, fostering collaboration and trust.</p><p>Business Value is not static&#8212;it&#8217;s a moving target influenced by circumstances, priorities, and risks. By maintaining open communication, leveraging tools like Value Stream Mapping and Quality Attribute Workshops, and understanding non-functional requirements, we can ensure that our architecture decisions are always grounded in what truly matters: delivering value to stakeholders.</p><p>Ultimately, being an Agile Software Architect isn&#8217;t about following a rigid blueprint&#8212;it&#8217;s about staying aligned with the business, embracing change, and helping the entire team succeed. Remember: the best architectures are not just technically sound&#8212;they&#8217;re designed to support and adapt to the ever-changing goals of the business.</p><p></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Common Mistake #4: Choosing the Wrong Place to Work]]></title><description><![CDATA[How the wrong workplace can stall your growth&#8212;and how to choose one that helps you thrive.]]></description><link>https://blog.seart.dev/p/common-mistake-4-choosing-the-wrong</link><guid isPermaLink="false">https://blog.seart.dev/p/common-mistake-4-choosing-the-wrong</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Wed, 25 Dec 2024 19:20:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DcJk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Imagine landing your dream job, only to feel stuck a few months later. It&#8217;s a scenario many of us have faced&#8212;great pay and perks that quickly lose their charm when the culture, strategy, or challenges don&#8217;t align with your goals. Finding the right workplace isn&#8217;t just about compensation or technology; it&#8217;s about ensuring the environment helps you grow and thrive. Let&#8217;s explore how to avoid this common mistake and make smarter career decisions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DcJk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DcJk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!DcJk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!DcJk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!DcJk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DcJk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:307470,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DcJk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!DcJk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!DcJk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!DcJk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a87eec1-1744-42cc-9898-02be945e0622_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1>What Is This Trap?</h1><p>Choosing the wrong workplace isn&#8217;t just about ending up in a job with poor management or culture. The real trap lies in overlooking the deeper drivers of long-term satisfaction and success: the company&#8217;s culture, strategy, and the problems they are tackling. While factors like salary and technology stack are important, they shouldn&#8217;t overshadow these foundational elements.</p><p>In one of my early roles, I worked on a challenging project with another junior engineer. Together, we overhauled a system, tackling both functional and non-functional issues. While this was a tremendous learning experience, the lack of mentorship made our growth slow and challenging. Later, I worked under a senior engineer who provided mentorship and explained the rationale behind decisions. This taught me how much a workplace&#8217;s culture of learning and collaboration impacts your development.</p><h1>Why It&#8217;s a Common Mistake?</h1><div class="pullquote"><p><em>"An investment in knowledge pays the best interest."</em></p><p>&#8212; Benjamin Franklin</p></div><p>This trap is particularly common in software engineering for several reasons:</p><h2>1. Emphasis on Immediate Rewards</h2><p>Early-career engineers often prioritize salary or perks without considering the long-term impact on their skills and career trajectory.</p><h2>2. Misjudging Culture</h2><p>During interviews, it&#8217;s easy to miss potential red flags about team dynamics and leadership. However, asking pointed questions can reveal much about a company&#8217;s culture. For example:</p><ul><li><p>How does the company handle disagreements between team members and leadership?</p></li><li><p>What steps are taken to balance business pressures with maintaining quality in deliverables?</p></li></ul><p>These responses can help identify whether the organization supports collaboration, respects differing viewpoints, and fosters a healthy working environment.</p><h2>3. Ignoring Problem Space and Strategy</h2><p>Joining a company whose mission and challenges don&#8217;t resonate with you can lead to disengagement, even if other factors like pay seem attractive.</p><h2>4. Absence of Mentorship</h2><p>Lack of senior engineers who can guide your growth deprives you of essential opportunities to learn and improve.</p><p>For example, I once observed a small company hire an external lead for an agile transformation despite having senior engineers with over a decade of experience. The management didn&#8217;t trust them to lead due to their lack of exposure to modern practices, stemming from a stagnant culture that resisted change. For years, the company had operated with processes that seemed sufficient, but several engineers suggested modernizing through agile practices, automation, and updated technology stacks. Unfortunately, the leadership ignored these suggestions, and the engineers themselves didn&#8217;t take the initiative to learn or upskill independently. They justified this by saying the company should provide training, but when the need for modernization became urgent, the leadership decided to bring in external leaders instead of investing in their internal staff. This resulted in the internal engineers feeling overlooked and stuck in their careers.</p><p>This scenario underscores a critical lesson: if you, as a software engineer, don&#8217;t prioritize your own growth, neither the company nor the market will. Continuous self-investment is essential for staying relevant and ready for opportunities.</p><h1>Spotting the Signs</h1><div class="pullquote"><p><em>"The culture of any organization is shaped by the worst behavior the leader is willing to tolerate."</em> </p><p>&#8212; Gruenter and Whitaker</p></div><p>How do you know if you&#8217;re in the wrong workplace? Pay attention to these warning signs:</p><ul><li><p><strong>Lack of Growth Opportunities:</strong> The company doesn&#8217;t offer clear paths for learning, mentorship, or development.</p></li><li><p><strong>Misaligned Work:</strong> Your tasks feel disconnected from your interests or fail to challenge you.</p></li><li><p><strong>Unclear Strategic Vision:</strong> The organization struggles with direction, hindering innovation and alignment.</p></li><li><p><strong>Toxic Culture:</strong> Micromanagement or a lack of trust makes collaboration frustrating and stifling.</p></li><li><p><strong>Outdated Tools or Practices:</strong> The company is resistant to adopting modern tools or methodologies, limiting your growth.</p></li><li><p><strong>Lack of Recognition:</strong> Your contributions and professional growth aren&#8217;t acknowledged through feedback or compensation.</p></li></ul><h1>How to Choose the Right Workplace</h1><h2>1. Clarify Your Objectives</h2><p>Define your professional goals clearly by evaluating at least three key aspects:</p><ul><li><p><strong>Salary:</strong> Determine the level of compensation you need to feel financially secure and motivated, keeping in mind your desired lifestyle and future savings goals.</p></li><li><p><strong>Culture:</strong> Reflect on the type of work environment you thrive in. Do you value collaboration, innovation, or a specific leadership style?</p></li><li><p><strong>Clear Path Progression:</strong> Assess whether the company offers structured opportunities for career advancement and skills development.</p></li></ul><p>By focusing on these elements, you can ensure your objectives align with a workplace that supports your growth and aspirations.</p><h2>2. Consider Adapting Your Role</h2><p>Changing companies isn&#8217;t always the only answer. Sometimes, the key is identifying what aspects of your current position need to change to align with your goals. Speak up and make suggestions for adjustments that could make your role more fulfilling. For instance:</p><ul><li><p>Propose taking on projects that align with your interests.</p></li><li><p>Suggest training or mentorship programs to develop your skills.</p></li></ul><p>As the saying goes, <em>&#8220;El que no llora no mama&#8221;</em>&#8212;or as it&#8217;s said in English, <em>&#8220;The squeaky wheel gets the grease&#8221;</em>&#8212;if you want something, you need to take action to achieve it. Don&#8217;t be afraid to communicate your needs and ideas.</p><h2>3. Research Problem Space and Strategy</h2><p>Evaluate the company&#8217;s mission and challenges. Do these align with your interests and aspirations?</p><p>Define your professional goals, whether they involve mastering specific technologies, advancing into leadership, or contributing to impactful projects.</p><h2>4. Conduct In-Depth Research</h2><p>Use platforms like Glassdoor or connect with current employees to understand the company&#8217;s culture, growth opportunities, and decision-making processes.</p><h2>5. Ask Insightful Questions During Interviews</h2><ul><li><p>What mentorship or training opportunities does the company offer?</p></li><li><p>How does the team approach technical decisions?</p></li><li><p>What career progression paths exist here?</p></li><li><p>What is the company&#8217;s long-term vision?</p></li></ul><h2>6. Prioritize Culture and Growth</h2><p>Choose companies that invest in employee development, foster collaboration, and encourage innovation.</p><h1>Takeways</h1><div class="pullquote"><p><em>"The best way to predict your future is to create it."</em> </p><p>&#8212; Abraham Lincoln</p></div><p>Your workplace isn&#8217;t just a job; it&#8217;s where you build your skills, grow your network, and define your future. Choosing the right environment sets the stage for a fulfilling and impactful career. Align your goals with a company&#8217;s culture, strategy, and challenges to ensure you&#8217;re not just working&#8212;you&#8217;re thriving.</p><p>What&#8217;s one piece of advice you&#8217;d share about choosing the right workplace? Let&#8217;s swap lessons and ideas in the comments! </p>]]></content:encoded></item><item><title><![CDATA[Agile Software Architect Role - Part 4]]></title><description><![CDATA[Driving Digital Transformation: Breaking Silos and Scaling Agility]]></description><link>https://blog.seart.dev/p/agile-software-architect-role-part-e6a</link><guid isPermaLink="false">https://blog.seart.dev/p/agile-software-architect-role-part-e6a</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Tue, 10 Dec 2024 00:08:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AmvS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a Software Architect, especially in an agile environment, you&#8217;ll find yourself working at different levels within the organization. Sometimes, you&#8217;ll be right there alongside the developers, guiding them toward success. Other times, you&#8217;ll be designing solutions that blend technology and processes. And on occasion, you&#8217;ll step back, take in the broader picture, and help shape the organization&#8217;s overall strategy.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AmvS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AmvS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!AmvS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!AmvS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!AmvS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AmvS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:477112,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AmvS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!AmvS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!AmvS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!AmvS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa43a532-fb6b-44bb-ba77-f7ff34425996_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Before diving into technology stacks or new frameworks, it&#8217;s crucial to recognize that digital transformation depends on more than just the tools at hand. It requires a cultural shift that empowers everyone to embrace change, align with a shared vision, and scale successes across the entire organization. From cultivating the right mindset to breaking down departmental silos and expanding successful pilots beyond a handful of teams&#8212;addressing these three areas can make the difference between a stalled initiative and a truly agile, future-ready digital enterprise.</p><h1>Expanding the Organizational Mindset</h1><div class="pullquote"><p>&#8220;Culture eats strategy for breakfast.&#8221;</p><p>&#8212; Peter Drucker</p></div><p>Digital transformation isn&#8217;t just about adopting new technologies or frameworks&#8212;it&#8217;s about embracing a culture and mindset that truly support agility. A <strong>Harvard Business Review</strong> report notes that 70% of digital transformation failures stem from cultural resistance and poor change management (<em>Decentralizing Strategic Portfolio Management by Empowering Project Teams to Execute Digital Transformation</em>). This aligns with my experience: without a shared understanding of Agile principles and a commitment to change at all levels, even the best-laid plans will falter.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;2b19278f-cdc3-46f4-b819-5c1d358d3783&quot;,&quot;caption&quot;:&quot;In a team or organization, wishing to adopt Agile for the wrong reasons becomes a problem. Born out of a mistaken idea, it is highly likely that those involved in the project do not truly understand what Agile is, and the advantages that would come from adopting it correctly. Furthermore, it's likely that the team or organization may not have a clear id&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The Problem with Being Agile, is Not Being Agile&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:116681412,&quot;name&quot;:&quot;Carlos G&#243;mez&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fea28d42-df95-4507-b49b-9bd9b9c0dbac_800x800.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-07-09T22:12:54.480Z&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%2Fb5c268ce-18e0-449d-be5b-6f2a614b91bd_512x512.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.seart.dev/p/the-problem-with-being-agile-is-not&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:134175336,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Software Engineering Art - SEArt&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%2Fb5c268ce-18e0-449d-be5b-6f2a614b91bd_512x512.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>In my previous article, <em>The Problem with Being Agile, is Not Being Agile</em>, I dive deeper into how adopting Agile for the wrong reasons, or without proper guidance, can derail the entire effort. It&#8217;s not enough to say you&#8217;re Agile; teams and leadership must internalize the principles that enable speed, flexibility, and continuous improvement. Only then can digital transformation thrive and deliver meaningful, sustainable results.</p><h1>Breaking Down Departmental Silos</h1><p>Another major challenge lies in departmental silos, where each team strives for its own objectives, often disconnected from the company&#8217;s broader vision. According to the <strong>Harvard Business Review</strong>, silos hinder collaboration and alignment, which are critical for successful digital transformation.</p><div class="pullquote"><p>&#8220;If everyone is moving forward together, then success takes care of itself&#8221;</p><p>&#8212; Henry Ford</p></div><p>Shifting this requires clarity about why change is needed, open communication about the goals, and a willingness to continuously learn. As <strong>Scott Wilder</strong> of Boston Consulting Group notes, early failures without proper change management can lead to skepticism and create a negative flywheel, undermining transformation efforts. When everyone understands the &#8220;why&#8221; behind the transformation, they can move forward together with purpose.</p><p>The solution? Make the overall strategy crystal clear. Tools like Objectives and Key Results (OKRs) can bring alignment across the board. After about a year of trial and error at one company I worked with, OKRs helped leaders and teams row in the same direction, fully committed to shared targets rather than isolated goals. This kind of alignment is essential to break down silos and foster a culture of collaboration across departments.</p><h1>Scaling Beyond Proofs of Concept</h1><p>Finally, it&#8217;s not enough to prove agility in small pockets of the organization. Many companies succeed with initial pilots or proofs of concept but struggle to scale these successes across the entire enterprise. The <strong>Harvard Business </strong>Review highlights that persistent, cross-functional teams focused on long-term value streams&#8212;rather than ad hoc project teams&#8212;are key to scaling transformation efforts effectively.</p><p>In my own experience, acquiring or forming small, independent teams dedicated to building and integrating digital solutions has been a powerful approach. For example, a retail company I worked with acquired several startups as part of its transformation strategy. These startups brought new capabilities that allowed the company to scale its digital initiatives and evolve beyond isolated experiments.</p><p>Persistent teams not only ensure that digital transformation projects succeed but also foster ongoing innovation, as they&#8217;re designed to adapt and grow alongside the organization&#8217;s needs.</p><h1><strong>Closing Thoughts</strong></h1><div class="pullquote"><p>&#8220;The only way to do great work is to love what you do.&#8221; </p><p>&#8212; Steve Jobs</p></div><p>As software architects, we have a responsibility not just to design systems but to ask the right questions and challenge the status quo when necessary. I&#8217;ve seen firsthand how organizations can struggle with these three key areas. One example that stands out is a traditional, multinational company I recently worked with. Despite their ambitious digital transformation goals, they faltered due to siloed departments, a lack of alignment in their vision, and the inability to scale their pilot projects effectively.</p><p>Reflecting on this experience, it became clear to me how critical our role as architects is in guiding the organization&#8217;s strategy. By asking the right questions, ensuring alignment across teams, and fostering collaboration, we can prevent ourselves from becoming part of the problem&#8212;especially when it comes to breaking down silos.</p><p>Transformation is never easy, but with the right mindset, clear communication, and persistent teams, it is possible to turn even the most traditional organizations into agile, future-ready enterprises. Let&#8217;s commit to being the change-makers who drive this forward.</p>]]></content:encoded></item><item><title><![CDATA[Common Mistake #3: Cargo Cult Programming]]></title><description><![CDATA[Are You Solving Problems or Following Rituals?]]></description><link>https://blog.seart.dev/p/common-mistake-3-cargo-cult-programming</link><guid isPermaLink="false">https://blog.seart.dev/p/common-mistake-3-cargo-cult-programming</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Fri, 29 Nov 2024 12:03:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Wojm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Have you ever used a design pattern just because it felt like the "right" thing to do&#8212;only to realize later that it didn&#8217;t actually solve the problem? Or copied a snippet of code without fully understanding how it works? Trust me, I&#8217;ve been there.</p><p>This common pitfall has a name: <strong>Cargo Cult Programming</strong>. It&#8217;s what happens when we follow practices, frameworks, or patterns without fully understanding the &#8220;why&#8221; behind them. And while it might seem harmless at first, it often leads to overly complicated, harder-to-maintain solutions.</p><p>In this post, I&#8217;ll share my own experience of falling into this trap, explain what Cargo Cult Programming is, and offer practical tips to help you avoid it.</p><h1><strong>What Is Cargo Cult Programming?</strong></h1><div class="pullquote"><p>"The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge." </p><p>&#8211; <em>Stephen Hawking</em></p></div><p>The term &#8220;Cargo Cult Programming&#8221; comes from a fascinating piece of history. During World War II, some island communities observed the military&#8217;s rituals&#8212;like building airstrips and using radios&#8212;and copied them in hopes of attracting the same &#8220;cargo&#8221; of supplies. But without understanding the systems behind those rituals, their efforts didn&#8217;t work.</p><p>In software engineering, it&#8217;s the same idea: following coding practices, applying design patterns, or adopting tools without really understanding their purpose. We mimic the surface behaviors but miss the underlying principles.</p><h2><strong>My Own Cargo Cult Moment</strong></h2><p>When I first learned about design and architecture patterns, I thought they were magic solutions. Singleton, Factory, MVC&#8212;I wanted to use them everywhere. But instead of looking at the problems I was solving, I focused on the patterns themselves, forcing them into places where they didn&#8217;t belong.</p><p>The result? My code was harder to maintain, full of unnecessary complexity, and confusing to my teammates. I learned the hard way that patterns are tools, not rules. A software engineer&#8217;s job is to understand the problem first, then decide if a pattern helps&#8212;or if it&#8217;s better avoided altogether.</p><p>Here&#8217;s what I realized: <strong>If you don&#8217;t understand the &#8220;why&#8221; behind a practice, you can&#8217;t adapt it&#8212;or recognize when to skip it entirely.</strong></p><h1><strong>Why It&#8217;s a Common Mistake</strong></h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wojm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wojm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Wojm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Wojm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Wojm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wojm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:333542,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Wojm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Wojm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Wojm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Wojm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15d3078b-54fa-4ef2-93d9-aa2c963315e3_1024x1024.webp 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>Cargo Cult Programming often happens because:</p><ul><li><p><strong>We Fear Doing It Wrong:</strong> Especially early in our careers, it&#8217;s easy to think following best practices blindly is safer than trying something different.</p></li><li><p><strong>Shiny New Syndrome:</strong> Tools and frameworks can feel like solutions in search of a problem.</p></li><li><p><strong>Time Pressure:</strong> When deadlines loom, copying what worked elsewhere can feel like a shortcut.</p></li><li><p><strong>Blind Trust in Authority:</strong> If an experienced dev used it, it must be the right choice&#8212;right?</p></li><li><p><strong>Working in Isolation:</strong> Without team input, it&#8217;s easy to miss alternative solutions or misunderstand the context.</p></li></ul><p>The truth is, without understanding the context, even the best practices can lead to poor results.</p><h1><strong>Spotting the Signs</strong></h1><p>Here are a few red flags to watch for:</p><ul><li><p>Using a Singleton or Factory where simpler code would suffice.</p></li><li><p>Reusing code without adapting it to your context.</p></li><li><p>Adding layers of complexity that don&#8217;t deliver value.</p></li><li><p>Following practices without questioning their relevance.</p></li></ul><h1><strong>Avoiding Cargo Cult Programming</strong></h1><div class="pullquote"><p>"The only true wisdom is in knowing you know nothing." </p><p>&#8211; <em>Socrates</em></p></div><p>Here&#8217;s how to escape this trap:</p><ol><li><p><strong>Start with &#8220;Why?&#8221;</strong> </p><p>Before reaching for a pattern or framework, ask:<br><em>What problem am I solving? How does this help?</em></p></li><li><p><strong>Be a Team Player</strong></p><ol><li><p>Debate decisions with your team. They can provide viewpoints you might have overlooked.</p></li><li><p>Collaboration fosters better solutions and prevents blind adherence to practices.</p></li><li><p>Remember, being a team player isn&#8217;t just about sharing work&#8212;it&#8217;s about sharing ideas.</p></li></ol></li><li><p><strong>Learn by Collaborating</strong></p><ol><li><p>Code reviews and pair programming are excellent ways to understand the reasoning behind choices.</p></li><li><p>Ask questions like:</p><ul><li><p>Why was this approach chosen?</p></li><li><p>What trade-offs were considered?</p></li></ul></li></ol></li><li><p><strong>Focus on the Problem, Not the Pattern</strong></p><p>Design your solution around the problem. If a pattern helps, great. If not, don&#8217;t force it.</p></li><li><p><strong>Simplify Where Possible</strong><br>Always ask: Can this be done more simply? Complexity is rarely a virtue.</p></li><li><p><strong>Reflect and Share</strong><br>Write about your decisions, review them with others, and don&#8217;t be afraid to admit when something didn&#8217;t work.</p></li></ol><p>Cargo Cult Programming is a stage we all go through, but the key is to grow beyond it. The more you understand the &#8220;why&#8221; behind your decisions, the better your solutions will be&#8212;not just for you, but for your team and the users who rely on your work.</p><p>What about you? Have you ever fallen into the trap of Cargo Cult Programming? How did you move past it? Let&#8217;s share our stories and learn together!</p>]]></content:encoded></item><item><title><![CDATA[Common Mistake #2 - The People-Pleasing Trap ]]></title><description><![CDATA[Learning to Say 'No' When It Counts]]></description><link>https://blog.seart.dev/p/common-mistake-2-the-people-pleasing</link><guid isPermaLink="false">https://blog.seart.dev/p/common-mistake-2-the-people-pleasing</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Fri, 22 Nov 2024 12:02:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DbEO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DbEO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DbEO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DbEO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DbEO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DbEO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DbEO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg" width="1456" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7153961,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DbEO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DbEO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DbEO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DbEO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8a18d0-8fe4-437b-9aa9-80736fd588f3_7360x4912.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@jluebke?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Justin Luebke</a> on <a href="https://unsplash.com/photos/person-in-yellow-coat-standing-on-top-of-hill-BkkVcWUgwEk?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Hey there! Have you ever found yourself buried under a pile of tasks because you just couldn't say "No" to that extra request? Trust me, I've been there too. As software engineers, we're often eager to help out, take on new challenges, and be team players. But sometimes, this eagerness can lead us straight into the <strong>People-Pleasing Trap</strong>, where we say "Yes" to everything&#8212;even when we shouldn't.</p><p>Let's talk about what this trap is, why it's so common in our field, how to spot it, and most importantly, <strong>how to navigate it by saying "No" effectively and proposing alternatives</strong>.</p><h1>What Is the "People-Pleasing Trap"?</h1><div class="pullquote"><p>"You have to decide what your highest priorities are and have the courage&#8212;pleasantly, smilingly, nonapologetically&#8212;to say 'no' to other things." </p><p>&#8211; <em>Stephen R. Covey</em></p></div><p>So, what's the People-Pleasing Trap all about? Simply put, it's when we feel compelled to agree to every request, task, or favor asked of us, often at the expense of our own time, well-being, or priorities. This usually stems from a desire to be liked, to avoid conflict, or to not disappoint others.</p><p>While wanting to help isn't a bad thing, constantly putting others' needs before our own can lead to stress, burnout, and a drop in the quality of our work.</p><p>Have you ever felt tempted to accept a proposed deadline from your manager, even when you know you're not going to meet it, just because you want to be agreeable or avoid a possible conflict? Well, I've fallen into that behavior myself. It resulted in stressful situations with extended workdays&#8212;not just for me, but also for my team. From these experiences, I learned that I wasn't being professional or a true team player.</p><p>I realized I had to be brave enough to say something like:</p><p><em>"I appreciate the urgency of this project. Given the current scope and our team's workload, meeting that deadline will be challenging. However, we could prioritize the most critical features to deliver maximum value by that date. Alternatively, if we can extend the deadline slightly, we can ensure all features are implemented with high quality."</em></p><p>By communicating this way, I'm being honest, professional, and solution-oriented. I'm protecting my team's workflow and allowing the business to make better decisions&#8212;in other words, truly being a team player.</p><h1>Why It's a Common Trap in Software Engineering</h1><p>In the world of software engineering, this trap is especially sneaky. Here's why:</p><ul><li><p><strong>Fast-Paced Environment:</strong> Tech moves quickly, and there's always something that needs to be done "ASAP."</p></li><li><p><strong>Collaborative Culture:</strong> We're often working in teams, and there's a strong emphasis on collaboration and support.</p></li><li><p><strong>Fear of Missing Out:</strong> With so many cool projects and technologies, we don't want to miss any opportunities.</p></li><li><p><strong>Performance Pressure:</strong> We might feel that saying "Yes" to everything will prove our dedication and value.</p></li></ul><p>But here's the catch: by overloading ourselves or avoiding tough conversations about project realities, we might actually hinder our performance and growth.</p><h1>Spotting the Signs</h1><p>Not sure if you're caught in the People-Pleasing Trap? Here are some signs to watch out for:</p><ul><li><p>You're juggling so many commitments that you're struggling to keep up.</p></li><li><p>Other people's requests always take precedence over your own work.</p></li><li><p>You hesitate to speak up about unrealistic deadlines or project issues.</p></li><li><p>You're exhausted, and there's no end in sight.</p></li><li><p>You say "Yes" to avoid letting others down, even when it's impractical.</p></li></ul><h1>Avoiding the People-Pleasing Trap</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Og_r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Og_r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png 424w, https://substackcdn.com/image/fetch/$s_!Og_r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png 848w, https://substackcdn.com/image/fetch/$s_!Og_r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png 1272w, https://substackcdn.com/image/fetch/$s_!Og_r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Og_r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png" width="471" height="461" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:461,&quot;width&quot;:471,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Og_r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png 424w, https://substackcdn.com/image/fetch/$s_!Og_r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png 848w, https://substackcdn.com/image/fetch/$s_!Og_r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.png 1272w, https://substackcdn.com/image/fetch/$s_!Og_r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87c162c0-077e-4b3e-bb99-c97139395d80_471x461.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>Alright, so how do we get out of this trap? Here are some friendly tips focusing on <strong>how</strong> to say "No" and proposing alternatives:</p><ol><li><p><strong>Practice Saying "No" Gently</strong></p><p>It's okay to decline a request! The way you say it can make all the difference.</p><ul><li><p>Express Appreciation First:</p><p>"<em>Thanks for considering me for this task!</em>"</p></li><li><p>Be Honest and Direct:</p><p>"<em>I'm currently at full capacity with other projects.</em>"</p></li></ul></li><li><p><strong>Propose Alternatives</strong></p><p>Offering solutions shows you're still committed to the team's success.</p><ul><li><p>Adjust the Scope:</p><p>"<em>Could we focus on the most critical features first?</em>"</p></li><li><p>Extended Timelines:</p><p>"<em>Would it be possible to extend the deadline by a week</em>?"</p></li><li><p>Suggesting Others:</p><p>"<em>Maybe Alex could assist; they have experience in this area.</em>"</p></li><li><p>Future Availability:</p><p>"<em>I can take this on next week when I have more bandwidth.</em>"</p></li></ul></li><li><p><strong>Be Honest About Your Professional Aspirations</strong></p><p>If a role or task doesn't align with your career goals, communicate it respectfully.</p><p>Let me share a personal story. I once worked at a company that hired me as a backend developer, which was exactly where I wanted to focus my career. After some time, they asked me to transition into a frontend developer role. While they offered a very high salary, frontend development wasn't aligned with my professional objectives.</p><p>I felt tempted to accept because of the benefits, but I realized that saying "Yes" would steer me away from my career path. So, I had an open conversation with my manager:</p><p><em>"I appreciate the opportunity and the trust you've placed in me. However, my passion and expertise are in backend development. I believe I can contribute more effectively in that area. Is there a possibility to continue focusing on backend projects?"</em></p><p>Unfortunately, the company needed someone in the frontend role, and we couldn't find a middle ground. So, I made the difficult decision to seek a position elsewhere that aligned with my goals.</p><p>This experience taught me that saying "No" is sometimes necessary to stay true to your professional path. It's not just about declining a task&#8212;it's about making choices that shape your career in the long run</p></li><li><p><strong>Set Clear Boundaries</strong></p><p>Let your team know your availability and workload limits. Being transparent helps manage expectations.</p></li><li><p><strong>Prioritize Your Tasks</strong></p><p>As I mentioned in my post about the Four Cardinal Points to progress as a senior software engineer, prioritizing what delivers more value is essential. You can check <a href="https://blog.seart.dev/i/147319063/prioritization-by-business-value">that post</a> to learn more about this.</p></li><li><p><strong>Reflect on Your Motivations</strong></p><p>Ask yourself why you're saying "Yes." Is it out of genuine interest, or are you trying to avoid disappointing someone? Understanding your reasons can help you make choices that align with your goals and well-being.</p></li><li><p><strong>Seek Support</strong></p><p>Asking for help is okay, and it demonstrates that you are strong enough to grow in your career! Talk to a mentor, manager, or trusted colleague about your workload. They can offer guidance and might help redistribute tasks.</p></li><li><p><strong>Build Assertiveness Skills</strong></p><p>Being assertive doesn't mean being aggressive. It's about expressing your needs respectfully. Consider reading books or attending workshops on assertiveness to strengthen this skill.</p></li><li><p><strong>Remember It's Okay Not to Please Everyone</strong></p><p>You can't make everyone happy all the time, and that's perfectly fine. Focus on delivering quality work and taking care of yourself; that's what truly benefits everyone.</p></li></ol><p>Breaking free from the People-Pleasing Trap isn't easy, but it's definitely doable&#8212;and worth it! By focusing not just on saying "No," but on <strong>how</strong> you say it and the value of proposing alternatives, you'll enhance your professionalism and contribute more effectively to your team.</p><p>Next time you're faced with a request that stretches you too thin, take a moment to assess. Communicate your limitations honestly, and offer solutions that could work for everyone involved. Remember, being a true team player means ensuring that you're contributing sustainably and effectively.</p>]]></content:encoded></item><item><title><![CDATA[Common Mistake #1 - Falling for the Dunning-Kruger Effect]]></title><description><![CDATA[Dunning-Kruger effect]]></description><link>https://blog.seart.dev/p/common-mistake-1-falling-for-the</link><guid isPermaLink="false">https://blog.seart.dev/p/common-mistake-1-falling-for-the</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Fri, 15 Nov 2024 16:33:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J1HS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every software engineer has been there: that moment when we think we've totally got it, only to discover (sometimes embarrassingly) that we&#8217;re out of our depth. Welcome to the Dunning-Kruger Effect! This cognitive bias tricks us into overestimating our skills when we&#8217;re just starting out, making us feel confident even when we still have a lot to learn. It&#8217;s not a flaw in character; it&#8217;s just a side effect of how we learn and grow. But in software development, it can lead to some tricky situations.</p><h1>What Is the Dunning-Kruger Effect?</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J1HS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J1HS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!J1HS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!J1HS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!J1HS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J1HS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:319786,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J1HS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!J1HS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!J1HS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!J1HS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05697b47-4c86-4b1e-8785-eb5df5876576_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Simply put, the Dunning-Kruger Effect happens when people with limited knowledge or skill in an area think they&#8217;re much more skilled than they really are. The less we know, the less we realize how much we don&#8217;t know. This can make us overly confident and prone to mistakes we wouldn&#8217;t make if we had a more realistic view of our abilities.</p><h1>Why It&#8217;s a Common Trap in Software Engineering</h1><p>In tech, it&#8217;s especially easy to fall into this trap. There&#8217;s always new technologies, frameworks, and languages popping up, and it&#8217;s tempting to jump in and assume we know enough to be dangerous&#8212;in a good way. But that overconfidence can lead to writing unstable code, skipping over best practices, or misunderstanding the requirements of a task.</p><p>I once worked with an engineering manager who exemplified this effect. He made decisions unilaterally, without consulting the team, because he considered himself the ultimate authority on a specific topic. Despite the team's expertise and willingness to contribute, he disregarded our input. This overconfidence led to numerous mistakes in the project. Instead of acknowledging his role in these errors, he blamed the team for the failures, ignoring the fact that he hadn't taken our ideas into account.</p><p>This situation not only resulted in technical setbacks but also eroded team morale and collaboration. It highlights how the Dunning-Kruger Effect can manifest not just at the individual level but also impact entire teams and projects.</p><h1>Spotting the Signs</h1><p>How do you know if you&#8217;re slipping into the Dunning-Kruger Effect? Here are a few red flags:</p><ol><li><p><strong>You stop asking questions</strong> because you &#8220;know enough.&#8221;</p></li><li><p><strong>You avoid feedback</strong>&#8212;thinking it&#8217;s unnecessary or won&#8217;t offer anything new.</p></li><li><p><strong>Your code feels perfect</strong>, even if you haven&#8217;t tested it in every situation.</p></li><li><p><strong>Deadlines start slipping</strong> because you underestimated the task complexity.</p></li></ol><h1><strong>Avoiding the Trap Without Falling into Impostor Syndrome</strong></h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wzdF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wzdF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png 424w, https://substackcdn.com/image/fetch/$s_!wzdF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png 848w, https://substackcdn.com/image/fetch/$s_!wzdF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png 1272w, https://substackcdn.com/image/fetch/$s_!wzdF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wzdF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png" width="339" height="356" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:339,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:54298,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wzdF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png 424w, https://substackcdn.com/image/fetch/$s_!wzdF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png 848w, https://substackcdn.com/image/fetch/$s_!wzdF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.png 1272w, https://substackcdn.com/image/fetch/$s_!wzdF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde36c92e-b865-4320-b801-5b5623fb4cf4_339x356.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>While it's important to be aware of the Dunning-Kruger Effect, we also need to be cautious about swinging too far in the opposite direction. Overcompensating can lead to <strong>Impostor Syndrome</strong>, where competent individuals doubt their abilities and fear being exposed as frauds. This can be just as detrimental, causing unnecessary stress and hindering performance.</p><h1>Tips to Find a Healthy Balance</h1><ol><li><p><strong>Seek feedback often</strong>. Ask for code reviews, and don&#8217;t be afraid of constructive criticism. Your peers can see gaps you might miss.</p></li><li><p><strong>Stay curious</strong>. Make a habit of learning a little more each day. The more you know, the more you&#8217;ll see the gaps in your understanding.</p></li><li><p><strong>Be honest with yourself about what you don&#8217;t know</strong>. Instead of guessing, take time to research or ask someone more experienced. Admitting you&#8217;re still learning is a strength, not a weakness.</p></li><li><p><strong>Mentor others and ask for mentoring</strong>. Teaching and learning both expose the limits of what you know and push you to keep improving.</p></li></ol><p>So next time you&#8217;re feeling extra confident about something new, take a step back and check in with yourself. Are you really as knowledgeable as you feel? Recognizing the Dunning-Kruger Effect is the first step toward becoming a stronger, more aware software engineer.</p>]]></content:encoded></item><item><title><![CDATA[Agile Software Architect - Part 3]]></title><description><![CDATA[Embracing Simplicity and Flexibility in Architectural Decisions]]></description><link>https://blog.seart.dev/p/agile-software-architect-part-3</link><guid isPermaLink="false">https://blog.seart.dev/p/agile-software-architect-part-3</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Wed, 23 Oct 2024 14:02:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c1b2d386-d522-42e6-8778-6c0286cb5b07_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this previous <a href="https://blog.seart.dev/p/becoming-a-senior-software-engineer">post</a>, I shared what I called <em>The four cardinal points</em> every senior software engineer must follow to progress in their career. One of these is <em>Prioritization by Business Value</em>, which invite you to take decisions driven by their impact on the business, simplicity and flexible are key to do it.</p><h1>The More Flexible, the More Value</h1><div class="pullquote"><p>&#8220;A good architecture makes the system easy to change, in all the ways that it must change, by leaving options open.&#8221;</p><p>&#8212; Robert C. Martin, Clean Architecture</p></div><p>A flexible architecture allows you to deliver early and long-term business value more easily. One tip for your career as an Agile Software Architect is to prioritize decisions that enable you to delay defining specific architectural details. This includes delaying choices related to frameworks, protocols, databases, configurations, message brokers, and other external dependencies.</p><p>By delaying these decisions, you leave room for better choices when you have more information, avoiding premature commitments to technologies that could limit your solution&#8217;s adaptability in the future. <em>Clean architecture</em>, for example, helps you abstract these details and focus on core business logic without being tightly coupled to specific technologies early on.</p><h1>The Simpler, the More Value</h1><div class="pullquote"><p>&#8220;Everything should be made as simple as possible, but not simpler.&#8221;</p><p>&#8212; Albert Einstein</p></div><p>As Agile Software Architects, our goal is to deliver value in the simplest way possible. Design decisions should focus on reducing unnecessary complexity, especially early in a project. For instance, instead of diving straight into complex architectures like microservices, consider simpler solutions that meet current needs and allow for easy evolution over time.</p><p>In my experience, I&#8217;ve seen projects that started with microservices from the beginning and failed because this architecture introduced unnecessary complexity. Managing service coordination, network overhead, and data consistency added more challenges than benefits at that stage. A simpler approach, like a monolithic architecture, would have saved time and resources, allowing the team to focus on delivering value earlier.</p><p>While microservices are great for scaling when necessary, <strong>starting simple</strong> and evolving as your system grows keeps your architecture flexible and easier to manage. By avoiding premature decisions, you prevent technical debt and ensure smoother progress.</p><p>Let me know your thoughts about this.</p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Becoming a Great Leader as a Software Engineer]]></title><description><![CDATA[How to Lead, Inspire, and Make an Impact Beyond Your Technical Skills]]></description><link>https://blog.seart.dev/p/becoming-a-great-leader-as-a-software</link><guid isPermaLink="false">https://blog.seart.dev/p/becoming-a-great-leader-as-a-software</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Tue, 01 Oct 2024 14:03:28 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ade75b2c-174f-4e12-8a71-ef9462d22f2f_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p><em>&#8220;Leadership is not about a title or a designation. It's about impact, influence, and inspiration. Impact involves getting results, influence is about spreading the passion you have for your work, and you have to inspire teammates and customers.&#8221;</em></p><p>&#8212; Robin Sharma, <em>The Leader Who Had No Title</em></p></div><p>As software engineers, one of the most important skills we need to develop is leadership, even if our job title doesn't explicitly reflect it.</p><p>While our primary responsibility may be to provide solutions to real-world problems, this role involves working closely with others. From understanding the problem to implementing a solution, we inevitably influence those around us. The best way to make that influence positive and effective is by embracing leadership.</p><h1>Leadership Anti-Patterns </h1><p>In this section, I highlight some common mistakes made by bosses or people trying to be leaders. The goal is to raise awareness so we can avoid falling into these traps:</p><h2><strong>It is not about authority</strong></h2><p>One of the biggest leadership mistakes is believing that people will follow your decisions just because you hold a title. Being a boss doesn't automatically make you a leader. Leadership is about influence, not authority. This is why it's important to distinguish between being a boss and being a true leader, even though a boss can also be a leader. In modern companies like Amazon or Google, the person who is right is the one who can provide valid reasoning and evidence for their decisions, regardless of their title. And often, multiple people can be right at the same time.</p><h2>It is not about a fake interest or empathy</h2><p>I believe this is a serious issue that many people fall into&#8212;myself included. Demonstrating genuine interest or empathy is not about appearances; it&#8217;s about truly caring for others. This means putting yourself in their shoes and really feeling their concerns to understand them. Fake interest is easily detected, and when people realize it, your influence and credibility will diminish significantly.</p><h2>It is not about always being hard or certain</h2><div class="pullquote"><p><em>"Vulnerability is not winning or losing; it's having the courage to show up and be seen when we have no control over the outcome."</em> </p><p>&#8212; Bren&#233; Brown</p></div><p>When I first decided I wanted to become a leader, I fell into this trap. This mindset is toxic and can lead to unnecessary pressure. The good news is that you don&#8217;t need to be perfect. In fact, when you show humility, those around you feel more comfortable interacting with you. Demonstrating transparency and sincerity turns your perceived weaknesses into strengths, earning you influence and respect.</p><h1>How to become a leader</h1><p>First, we must understand that there are several leadership styles. Essentially, every leader must be capable of influencing others, creating impact, and continuously improving. </p><p>This influence, often referred to as positive influence, should be executed with a mindset of creating win-win situations, where everyone benefits. It's important to remember that you won&#8217;t always know whether a decision or action will have a positive outcome until after the fact. However, my tip for you is to be genuinely empathetic&#8212;this demonstrates your good intentions and builds trust in your leadership. </p><div class="pullquote"><p><em>"Leadership is not about being in charge. It is about taking care of those in your charge."</em> </p><p>&#8212; Simon Sinek</p></div><p>Leaders generate impact within their sphere of influence, whether that&#8217;s a team, a company, a market, or even a country. We must always keep this in mind and take responsibility for the influence we have. Furthermore, as leaders, we have to keep one eye on the future and the goal, ensuring the team stays on the right path.</p><p>Finally, a leader must be aware that everything changes over time: priorities shift, new requirements emerge, markets reinvent themselves, and so on. As software engineers, we must take advantage of these changes and adapt to new realities. Always remember that we can improve our abilities and skills&#8212;real leaders seek and receive feedback as a gift to grow in their careers. </p><h2>Choosing my leadership style</h2><p>My advice to you is: don&#8217;t limit yourself from trying new things. I was inspired by a boss who had the ability to orchestrate people, communicating effectively and assertively. He was a charismatic leader who knew how to identify the strengths and weaknesses of others and leverage them effectively. After several attempts, I realized that the leadership style I resonate with most is <strong>servant leadership</strong>, at least in general terms.</p><p>I&#8217;ve also learned that a leader must be flexible enough to adapt their leadership style to the situation&#8212;one style isn&#8217;t effective in every case. </p><div class="pullquote"><p><em>"The greatest leader is not necessarily the one who does the greatest things. He is the one that gets the people to do the greatest things."</em> </p><p>&#8212; Ronald Reagan</p></div><p>You can analyze and study the leadership styles of others. For example, <strong>Benjamin Franklin&#8217;s</strong> leadership was pragmatic and transformational. You can learn a lot from observing other leaders and practicing different styles.</p><p>Here&#8217;s a short list of common leadership styles to consider:</p><ul><li><p><strong>Servant Leadership</strong>: Leaders prioritize the needs of the team, empowering others to grow and succeed.</p></li><li><p><strong>Laissez-Faire Leadership</strong>: Leaders take a hands-off approach, giving team members autonomy to make decisions.</p></li><li><p><strong>Transformational Leadership</strong>: Leaders inspire and motivate others by setting a vision and driving change.</p></li><li><p><strong>Democratic Leadership</strong>: Leaders involve team members in decision-making, promoting collaboration and creativity.</p></li><li><p><strong>Autocratic Leadership</strong>: Leaders make decisions unilaterally, focusing on control and authority.</p></li></ul><h1>Conclusion</h1><p>Leadership is not defined by a title, but by the positive impact and influence we bring to others. As software engineers, we have the opportunity&#8212;and responsibility&#8212;to lead, adapt, and grow continuously. Whether through empathy, humility, or strategic vision, the key to becoming a great leader is recognizing that leadership is a journey of learning, not a fixed destination. Embrace change, empower those around you, and always seek to inspire through action and example.</p><p>I invite you to share your thoughts and experiences with leadership in the comments below. Whether you have insights, feedback, or a different perspective.</p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Becoming a Senior Software Engineer or Architect: Essential Traits and Tips]]></title><description><![CDATA[Essential Qualities to Develop for Advancing as a Senior Software Engineer and Architect]]></description><link>https://blog.seart.dev/p/becoming-a-senior-software-engineer</link><guid isPermaLink="false">https://blog.seart.dev/p/becoming-a-senior-software-engineer</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Sun, 04 Aug 2024 17:36:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b042fa0d-c916-46e4-88c0-ce87d8295331_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this post, you will learn about the traits required to be considered a Senior Software Engineer (also applicable to Senior Software/Solution/Security/Infrastructure/Other Architects). My aim is not to be exhaustive but to explain these traits in a general and easy-to-understand way.</p><p>There is ample literature on this topic. Recently, I read &#8220;The Software Engineer&#8217;s Guidebook&#8221;, which I highly recommend if you are interested in learning more about this topic.</p><p>From both literature and experience, I have learned that, as juniors, we often expect to work in isolation, and some might even prefer it. However, as we gain experience, we realize the necessity of working with others to build something greater. Teamwork is crucial for achieving significant goals.</p><p>Achieving great goals comes at a cost, and companies have limited resources. Therefore, we must prioritize and focus on the most valuable goals that have a greater impact on the business. Teams that build these solutions consist of individuals with the knowledge to make better decisions and trade-offs. These decisions are usually made by seniors with accountability and ownership.</p><p>These teams are not composed solely of seniors; it is common to find juniors within them. These less experienced professionals require mentorship from seniors to improve their skills and ensure tasks are executed correctly (please, do not confuse this with micromanagement).</p><h1>The Four Cardinal Points</h1><p>Overall, we can abstract from the previous paragraphs these qualities required by every Senior Software Engineer:</p><ul><li><p>Teamwork</p></li><li><p>Hard and Soft Skills</p></li><li><p>Leadership</p></li><li><p>Prioritization by business value</p></li></ul><p>These qualities can be thought of as "The Four Cardinal Points." Just as the cardinal points guide us in the right direction, these traits are essential for navigating and advancing in your career. I know these are broad viewpoints, as I mentioned in the first paragraph, but I think this abstraction makes them easier to understand. Let&#8217;s dive a little deeper into each.</p><h2>Teamwork</h2><p>One person usually sees only a few viewpoints. For instance, UX designers are primarily concerned with user interactions and the impact of every color and UI component on the user experience. They might not be as concerned with performance, data protection, or the effort required to implement a feature. This is why modern teams are interdisciplinary, composed of programmers (both frontend and backend), designers, architects, product owners, quality assurance professionals, and more. Each person adds value and perspective to the work, ensuring better deliveries by covering more viewpoints and scenarios that the solution must address.</p><p>Recently, I learned about a case where an Engineering Manager often made decisions without considering the ideas or comments of other team members. In one project, this Manager made a decision with the best intentions, but it introduced a security vulnerability. When the team discovered this, they researched and proposed a better alternative. After several attempts to convince the Manager to consider the new information, the Manager fortunately reconsidered and decided to adopt the improved solution.</p><p>This example illustrates the importance of teamwork and collaboration. By leveraging the diverse expertise of team members, we can identify potential issues early and develop more robust solutions.</p><p>One can acquire and improve this quality through practice. Exercises like pair/mob programming, code reviews, debating ideas, and requesting/giving feedback will help you to progress in your career to a senior level.</p><h2>Hard and Soft Skills</h2><p>Senior Software Engineers need to make decisions, propose solutions, and listen to other opinions. To achieve this, they must have knowledge and experience in various technologies, methodologies, collaborative work, and more.</p><p>For instance, a modern Software Engineer should be familiar with OAuth, JWT, Architecture Patterns, Design Patterns, Cloud, CI/CD, etc. However, the ability to determine which of these tools to use in a specific situation is a crucial skill that every Senior must possess.</p><p>Of course, it's not just about technical skills. Six years ago, I joined a new project as a Software Architect, in a hybrid role with Engineering Manager responsibilities. In my team, there was a Tech Lead with an excellent background whom I trusted for the project's success. However, I noticed that although his work was outstanding, he was aggressive towards me, especially when I proposed ideas to the team.</p><p>This was the first time I encountered such a situation, and I didn't know how to handle it. I sought advice from other Seniors on how to manage it effectively. I didn't want to exclude this person from the team because he was an expert and passionate about his work, which was beneficial for the project. However, his aggressive behavior began to negatively affect team dynamics. Fortunately, with the guidance I received, I was able to address the situation and improve the team's collaboration.</p><p>As we can see, being a great technical engineer is not enough. We must also know how to communicate and collaborate with others to excel in our roles. As Seniors, we must address these challenges and help others develop these essential skills.</p><h2>Leadership</h2><p>Everyone starts as a junior, and as we work and experience different situations, we grow in our careers. This evolution process is different for each person. As Seniors, we have the responsibility to train and mentor juniors to make them better for the company. This benefits not only the company but also the Seniors and Juniors involved.</p><p>Companies' products are built by their teams. If the engineers are skilled, they will build better solutions and deliver more value to the business. On the other hand, when a Senior teaches, their own abilities are enhanced, and they often gain new knowledge from the process. Additionally, the juniors who receive this mentorship can progress in their careers to become Seniors. It&#8217;s a win-win situation.</p><p>Leadership is about influencing people, not just holding a title. It involves influencing others for the benefit of the individuals affected and the company&#8217;s mission. There are many books on this subject, but my focus is on the ability of Seniors to positively influence others. Writing blogs, teaching and mentoring juniors, listening to people, receiving feedback, knowing your team, feeling genuine empathy, building real connections, and collaborating to create a great environment are ways to develop and demonstrate leadership.</p><p>One of my favorite books that taught me how to begin being a leader is &#8220;The Leader Who Had No Title.&#8221; I strongly recommend it if you are interested in improving this ability.</p><h2>Prioritization by business value</h2><p>As software engineers, especially as seniors, we must always keep in mind the business value we are delivering. This focus helps us prioritize tasks and make better decisions.</p><p>Great senior software engineers usually make decisions rationally and pragmatically. This approach sometimes involves assuming technical debt to take advantage of time-to-market opportunities or validate an idea. At times, it may also mean discarding features, reducing scope, or delivering something more critical for the company at that moment.</p><p>We need to be flexible enough to accept changes over time because contexts and situations evolve, requiring us to reprioritize and make new decisions swiftly.</p><p>The following steps are those I usually follow in my daily work that help me to prioritize:</p><ol><li><p><strong>List tasks:</strong> Write down everything you need to do.</p></li><li><p><strong>Identify value:</strong> Mark the tasks that will deliver the most value when completed. If unsure about the value, seek help.</p></li><li><p><strong>Prioritize:</strong> Ask yourself, "If I could only complete one task from this list, what would it be?"</p></li><li><p><strong>Focus:</strong> Start and concentrate on that most important task.</p></li></ol><p>These tools and practices have also helped me:</p><ul><li><p><strong>Request For Comments (RFC):</strong> This helps us get feedback from other team members, considering the pros and cons of a solution. It enables better decision-making based on data.</p></li><li><p><strong>Attribute-Driven Design (ADD):</strong> This methodology helps design solutions by making decisions based on the most critical factors.</p></li><li><p><strong>Quality Attribute Workshops (QAWs):</strong> These workshops help gather information about the quality attributes required for the solution or product.</p></li></ul><h1>Conclusion</h1><p>In summary, to be considered a Senior Software Engineer or Architect, one must develop and master four key qualities, referred to as "The Four Cardinal Points":</p><ol><li><p><strong>Teamwork</strong></p></li><li><p><strong>Hard and Soft Skills</strong></p></li><li><p><strong>Leadership</strong></p></li><li><p><strong>Prioritization by Business Value</strong></p></li></ol><p>These qualities guide and support a Senior Engineer in navigating their role and driving success for themselves and their teams. By focusing on these Four Cardinal Points, you can advance your career and make a significant impact in your projects.</p><p>Thank you for reading. I hope you found this post insightful and helpful in your professional development. I invite you to share your thoughts and experiences. What qualities do you think are essential for a Senior Software Engineer? Let&#8217;s discuss in the comments!</p>]]></content:encoded></item><item><title><![CDATA[The End of OOP? Exploring the Power of Data Oriented Programming]]></title><description><![CDATA[Introduction to Data Oriented Programming]]></description><link>https://blog.seart.dev/p/the-end-of-oop-exploring-the-power</link><guid isPermaLink="false">https://blog.seart.dev/p/the-end-of-oop-exploring-the-power</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Wed, 19 Jun 2024 18:54:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VLyi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Since I started learning about Software Engineering, Object Oriented Programming (OOP) has been the dominant paradigm. However, over the past few years, I have been exploring a different paradigm: Data Oriented Programming (DOP). In this post, I will introduce DOP and how it contrasts with OOP. This will be the first of a five-part series where we delve deeper into DOP concepts, principles, and practical applications.</p><p>DOP represents a significant mindset shift from OOP, bringing in a lot of new ideas and approaches. Given its depth, I am splitting this topic into five posts. This first post provides a general overview of DOP. In the subsequent posts, we will explore specific concepts with examples in Clojure and Java. Although examples will be in these languages, DOP principles are applicable across various programming languages.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.seart.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Engineering Art - SEArt! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In the following four posts, I will focus on explaining each of the four principles stated by Brian Goetz in his post &#8220;<a href="https://www.infoq.com/articles/data-oriented-programming-java/">Data Oriented Programming in Java</a>&#8221;:</p><ol><li><p><strong>Model the data, the whole data, and nothing but the data.</strong></p></li><li><p><strong>Data is immutable.</strong></p></li><li><p><strong>Validate at the boundary.</strong></p></li><li><p><strong>Make illegal states unrepresentable.</strong></p></li></ol><h1>Example: Banking System User Stories</h1><p>To understand DOP better, let&#8217;s first consider how we would design a banking system using OOP, focusing on these user stories. Please note that the following user stories and proposed solution are not intended to be the best or most critical analysis of OOP but are used here for illustrative purposes.</p><p><strong>User Story 1: Create Freemium Customers</strong></p><ul><li><p>As a bank, I want to create freemium customers so that they can open savings accounts only.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Freemium customers can only have savings accounts.</p></li><li><p>Freemium customers have a name, address, and unique ID.</p></li></ul></li></ul></li></ul><p><strong>User Story 2: Create Premium Customers</strong></p><ul><li><p>As a bank, I want to create premium customers so that they can open both savings and checking accounts.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Premium customers can have both savings accounts and checking accounts.</p></li><li><p>Premium customers have a name, address, and unique ID.</p></li></ul></li></ul></li></ul><p><strong>User Story 3: Deposit Money</strong></p><ul><li><p>As a customer, I want to deposit money into my account so that I can save or spend it later.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Customers can deposit money into their accounts.</p></li><li><p>The deposited amount is added to the account balance.</p></li></ul></li></ul></li></ul><p><strong>User Story 4: Withdraw Money</strong></p><ul><li><p>As a customer, I want to withdraw money from my account so that I can access my funds.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Customers can withdraw money from their accounts up to the available balance.</p></li><li><p>For checking accounts, withdrawals can exceed the balance up to the overdraft limit.</p></li></ul></li></ul></li></ul><p><strong>User Story 5: Freemium Customer Savings Account</strong></p><ul><li><p>As a freemium customer, I want to open a savings account so that I can earn interest on my deposits.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Freemium customers can create savings accounts with an interest rate.</p></li><li><p>Savings accounts can calculate and apply interest to the balance.</p></li></ul></li></ul></li></ul><p><strong>User Story 6: Premium Customer Checking Account</strong></p><ul><li><p>As a premium customer, I want to open a checking account so that I can have access to overdraft protection.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Premium customers can create checking accounts with an overdraft limit.</p></li><li><p>Checking accounts allow withdrawals up to the balance plus overdraft limit.</p></li></ul></li></ul></li></ul><p><strong>User Story 7: Premium Customer Savings Account</strong></p><ul><li><p>As a premium customer, I want to open a savings account so that I can earn interest on my deposits.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Premium customers can create savings accounts with an interest rate.</p></li><li><p>Savings accounts can calculate and apply interest to the balance.</p></li></ul></li></ul></li></ul><p><strong>User Story 8: Interest Application for Savings Account</strong></p><ul><li><p>As a savings account holder, I want my account to calculate and apply interest periodically so that my savings grow over time.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Savings accounts can calculate interest based on the current balance and interest rate.</p></li><li><p>Savings accounts can apply the calculated interest to the balance.</p></li></ul></li></ul></li></ul><p><strong>User Story 9: Enforce Account Restrictions</strong></p><ul><li><p>As a bank, I want to ensure that customers can only open accounts they are eligible for so that account restrictions are enforced.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>Freemium customers can only open savings accounts.</p></li><li><p>Premium customers can open both savings and checking accounts.</p></li></ul></li></ul></li></ul><p><strong>User Story 10: Search for Account Owners</strong></p><ul><li><p>As a bank manager, I want to find the names of all account owners so that I can have an overview of who holds accounts in the bank.</p><ul><li><p>Acceptance Criteria:</p><ul><li><p>The bank can search through all accounts.</p></li><li><p>The bank can return the names of all account owners.</p></li></ul></li></ul></li></ul><h2>OOP Proposed Solution</h2><p>These user stories can be addressed through an Object Oriented Design. Below is a proposed class diagram for this solution.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VLyi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VLyi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png 424w, https://substackcdn.com/image/fetch/$s_!VLyi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png 848w, https://substackcdn.com/image/fetch/$s_!VLyi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png 1272w, https://substackcdn.com/image/fetch/$s_!VLyi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VLyi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png" width="711" height="494" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:494,&quot;width&quot;:711,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35024,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VLyi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png 424w, https://substackcdn.com/image/fetch/$s_!VLyi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png 848w, https://substackcdn.com/image/fetch/$s_!VLyi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png 1272w, https://substackcdn.com/image/fetch/$s_!VLyi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa421580-c52a-4641-a956-b8fcdc935f9f_711x494.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Implementation</h3><p>The <code>Bank</code> class represents the data, behavior, and validations required to support the requirements listed above. The <code>Customer</code> class is abstract because we can have two types of customers: Freemium and Premium. These are implemented by the <code>FreemiumCustomer</code> and <code>PremiumCustomer</code> classes, which both implement the <code>canHaveAccount</code> method to determine if a new account can be created for that user. Remember, Freemium customers can only get Savings accounts, while Premium customers can get both Checking and Savings accounts.</p><p>The <code>Bank</code> class has two lists: one for storing all customers and the other for storing and managing bank accounts. The <code>Account</code> class is intended to represent all common attributes and behaviors of any account, such as the balance, owner, and methods for depositing money.</p><p>To keep the example simple and focused on illustrating the core concepts, we intentionally omit getters and setters (encapsulation) in the code. Here is the implementation in Java:</p><pre><code>import java.util.ArrayList;
import java.util.List;

public class Bank {

    String name;
    List&lt;Customer&gt; customers;
    List&lt;Account&gt; accounts;

    public Bank(String name) {
        this.name = name;
        this.customers = new ArrayList&lt;&gt;();
        this.accounts = new ArrayList&lt;&gt;();
    }

    public void addCustomer(Customer customer) {
        customers.add(customer);
    }

    public void createAccount(Customer customer, Account account) {
        if (customer.canHaveAccount(account)) {
            accounts.add(account);
            account.ownerId = customer.id;
            customer.addAccount(account.id);
        }
    }

    public List&lt;String&gt; findAllAccountOwners() {
        List&lt;String&gt; accountOwners = new ArrayList&lt;&gt;();
        for (Account account : accounts) {
            for (Customer customer : customers) {
                if (customer.id.equals(account.ownerId)) {
                    accountOwners.add(customer.name);
                }
            }
        }
        return accountOwners;
    }
}

abstract class Customer {

    String id;
    String name;
    String address;
    List&lt;String&gt; accountIds;

    public Customer(String id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
        this.accountIds = new ArrayList&lt;&gt;();
    }

    public abstract boolean canHaveAccount(Account account);

    public void addAccount(String accountId) {
        if (canHaveAccount(accountId)) {
            accountIds.add(accountId);
        }
    }
}

class FreemiumCustomer extends Customer {

    public FreemiumCustomer(String id, String name, String address) {
        super(id, name, address);
    }

    @Override
    public boolean canHaveAccount(Account account) {
        return account instanceof SavingsAccount;
    }
}

class PremiumCustomer extends Customer {

    public PremiumCustomer(String id, String name, String address) {
        super(id, name, address);
    }

    @Override
    public boolean canHaveAccount(Account account) {
        return account instanceof SavingsAccount || account instanceof CheckingAccount;
    }
}

abstract class Account {

    String id;
    double balance;
    String ownerId;

    public Account(String id) {
        this.id = id;
        this.balance = 0;
    }

    public void deposit(double amount) {
        if (amount &gt; 0) {
            this.balance += amount;
        }
    }

    public void withdraw(double amount) {
        if (amount &gt; 0 &amp;&amp; amount &lt;= this.balance) {
            this.balance -= amount;
        }
    }
}

class SavingsAccount extends Account {

    double interestRate;

    public SavingsAccount(String id, double interestRate) {
        super(id);
        this.interestRate = interestRate;
    }

    public void applyInterestRate() {
        this.deposit(interestRate * this.balance);
    }
}

class CheckingAccount extends Account {

    double overdraftLimit;

    public CheckingAccount(String id, double overdraftLimit) {
        super(id);
        this.overdraftLimit = overdraftLimit;
    }

    @Override
    public void withdraw(double amount) {
        double balanceAvailable = this.balance + this.overdraftLimit;
        if (amount &gt; 0 &amp;&amp; amount &lt;= balanceAvailable) {
            this.balance -= amount;
        }
    }
}
</code></pre><p>Although this approach with OOP works fine it is complex to maintain, this complexity is led by:</p><ul><li><p>Behaviors and data structures are mixed</p></li><li><p>Validations and behaviors are constraints by inheritance (which is the most coupled relationship)</p></li><li><p>Unpredictable behavior in concurrency environments, since its mutability</p></li><li><p>Since the behaviors are stateful the tests are harder </p></li></ul><h2>DOP Proposed Solution</h2><p>DOP emphasizes modeling data as data and separating it from behaviors, making behaviors stateless. The following class diagram illustrates the data model for this approach:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5uZi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5uZi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png 424w, https://substackcdn.com/image/fetch/$s_!5uZi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png 848w, https://substackcdn.com/image/fetch/$s_!5uZi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png 1272w, https://substackcdn.com/image/fetch/$s_!5uZi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5uZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png" width="641" height="309" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc2d639a-bf68-43c8-987c-2158847aac40_641x309.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:309,&quot;width&quot;:641,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:21870,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5uZi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png 424w, https://substackcdn.com/image/fetch/$s_!5uZi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png 848w, https://substackcdn.com/image/fetch/$s_!5uZi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.png 1272w, https://substackcdn.com/image/fetch/$s_!5uZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc2d639a-bf68-43c8-987c-2158847aac40_641x309.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>As you can see, <code>BankData</code> has four fields: <code>customersById</code>, <code>savingsAccountsById</code>, <code>checkingAccountsById</code>, and <code>name</code>. The first three fields are maps, which act as dictionaries or indexes, facilitating efficient searching. Essentially, <code>BankData</code> is also a map, but depending on the programming language chosen, we can construct our data model accordingly.</p><p>In Clojure, which is a functional programming language adhering to many DOP principles like immutability, we can implement our model as follows:</p><pre><code>(ns bank-data)

(def bank-data
  {:name ""
   :customersById {}
   :savingAccountsById {}
   :checkingAccountsById {}})

(defn create-customer
  [id name address isFreemium isPremium]
  {:id id
   :name name
   :address address
   :savingsAccountIds []
   :checkingAccountIds []
   :isFreemium isFreemium
   :isPremium isPremium})

(defn create-savings-account
  [id owner-id interest-rate]
  {:id id
   :balance 0.0
   :ownerId owner-id
   :interestRate interest-rate})

(defn create-checking-account
  [id owner-id overdraft-limit]
  {:id id
   :balance 0.0
   :ownerId owner-id
   :overdraftLimit overdraft-limit})</code></pre><p>In Java, although primarily an OOP language, we can also implement our DOP model. Java has introduced new features in recent years to support DOP in a type-safe manner, such as records, sealed classes, pattern matching, lambdas, etc. Here&#8217;s the Java implementation of our design:</p><pre><code>import java.util.Map;
import java.util.List;

record BankData(
    String name,
    Map&lt;String, CustomerData&gt; customersById,
    Map&lt;String, SavingsAccountData&gt; savingAccountsById,
    Map&lt;String, CheckingAccountData&gt; checkingAccountsById
) {}

record CustomerData(
    String id,
    String name,
    String address,
    List&lt;String&gt; savingsAccountIds,
    List&lt;String&gt; checkingAccountIds,
    boolean isFreemium,
    boolean isPremium
) {}

record SavingsAccountData(
    String id,
    double balance,
    String ownerId,
    double interestRate
) {}

record CheckingAccountData(
    String id,
    double balance,
    String ownerId,
    double overdraftLimit
) {}</code></pre><p>On the other hand, we can model our behavior as stateless functions, which improves the testability of our code. The following diagram shows a first version of this solution with DOP:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uheR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uheR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png 424w, https://substackcdn.com/image/fetch/$s_!uheR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png 848w, https://substackcdn.com/image/fetch/$s_!uheR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png 1272w, https://substackcdn.com/image/fetch/$s_!uheR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uheR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png" width="1051" height="354" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:354,&quot;width&quot;:1051,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37152,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uheR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png 424w, https://substackcdn.com/image/fetch/$s_!uheR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png 848w, https://substackcdn.com/image/fetch/$s_!uheR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.png 1272w, https://substackcdn.com/image/fetch/$s_!uheR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3c1955-cf42-452a-a5a1-4eb4cf482f23_1051x354.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>Keep in mind that in the methods' parameters, the first parameter is always the dataset required to execute the process, ensuring that every function is stateless. Let&#8217;s describe each class in more detail:</p><ul><li><p>BankLogic:</p><ul><li><p>Centralizes operations related to the <code>BankData</code>.</p></li><li><p>Includes methods for adding customers, creating accounts, finding account owners, and performing deposits and withdrawals.</p></li></ul></li><li><p>SavingsAccountLogic:</p><ul><li><p>Handles specific operations related to savings accounts.</p></li><li><p>Includes methods for applying interest rates, withdrawing, and depositing money into savings accounts.</p></li></ul></li><li><p>CheckingAccountLogic:</p><ul><li><p>Manages operations for checking accounts.</p></li><li><p>Contains methods for withdrawals and deposits specific to checking accounts.</p></li></ul></li><li><p>CustomerLogic:</p><ul><li><p>Provides methods to check if a customer can have a specific type of account.</p></li><li><p>Ensures that the correct business rules are applied when handling customer-related operations.</p></li></ul></li></ul><p>Notice that we no longer have inheritance relationships. We will discuss more about relationships in DOP approaches in future posts. This approach provides the following benefits:</p><ul><li><p>Separation of Concerns:</p><ul><li><p>Data and behavior are separated, making the system more modular and easier to maintain.</p></li><li><p>Changes in business logic do not affect the data structures and vice versa.</p></li></ul></li><li><p>Reusability:</p><ul><li><p>Logic classes can be reused across different parts of the application without duplication.</p></li><li><p>Common operations are centralized, reducing the risk of inconsistent behavior.</p></li></ul></li><li><p>Testability:</p><ul><li><p>Functions operating on plain data structures are easier to test in isolation.</p></li><li><p>Mocking data for unit tests is straightforward, and behavior can be verified independently of data structure changes.</p></li></ul></li></ul><p>I want to share a possible implementation of these behavior classes with you, but I believe it is a lot of information to digest at once. Therefore, we will go through it step by step in future posts to make it easier to understand.</p><h1>Conclusion</h1><p>This post has introduced a Data Oriented Programming (DOP) approach to implementing a banking system based on the given user stories. The separation of data and behavior enhances modularity, reusability, and testability. Immutability reduces errors in our system and improves concurrency capabilities. You might wonder how data can be immutable when we need to add data or deposit money into accounts, etc. It's similar to how git repositories work, and I will demonstrate this in the next posts.</p><p>In the upcoming posts, we will delve deeper into this example, exploring each aspect of Data Oriented Programming in more detail. We will examine the principles of DOP, how to implement them in Java, and how to handle complex scenarios within this paradigm. Stay tuned as we continue to unfold the power of Data Oriented Programming and its practical applications in software development. Please let me know if you have any questions or contributions to this discussion.</p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.seart.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Engineering Art - SEArt! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Leveraging Platform Engineering for Market Leadership]]></title><description><![CDATA[Imagine building a complex puzzle where each piece must perfectly align to create a cohesive picture.]]></description><link>https://blog.seart.dev/p/leveraging-platform-engineering-for</link><guid isPermaLink="false">https://blog.seart.dev/p/leveraging-platform-engineering-for</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Mon, 08 Jan 2024 20:39:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a855f652-13c7-4d26-99b3-63d21a17d97f_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Imagine building a complex puzzle where each piece must perfectly align to create a cohesive picture. That's akin to the art of platform engineering. At its core, platform engineering is about empowering teams to work with greater efficiency and agility. But it's not without its challenges. One key hurdle is ensuring that this process doesn't morph into a restrictive set of rules that hinders the creativity and independence of solution teams. Another is the delicate task of defining clear standards and domains, which avoids overburdening the entire solution with an exhaustive list of standards. In my experience, these are just the tip of the iceberg in terms of challenges faced in platform engineering. Let&#8217;s dive into some of these challenges and explore how overcoming them can position your business as a standout in the market.</p><h2>Improving Operational efficiency and Agility</h2><p>In the world of platform engineering, efficiency and agility aren't just theoretical benefits; they have real-world impacts. Take my experience in a governmental entity, for example. Every year, this entity faced the monumental task of sending numerous documents to citizens for tax and other purposes. The process was heavily manual, involving a significant operational investment due to the large volume of citizens and the complexity of the cases. Their existing system, not developed in-house, was restrictive and misaligned with the entity's processes, leading to a considerable waste of effort and money.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.seart.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Engineering Art - SEArt! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The turning point came when we developed an in-house solution to automate these processes. Once this new system was implemented, the difference was stark. Not only did it save considerable effort and reduce errors, but it also expedited the entire process. The impact on the entity's efficiency was profound &#8211; a whopping 30% reduction in the time and effort required to execute these processes. Moreover, this change led to a substantial increase in revenue, about 20% more than previous years. This experience is a testament to how platform engineering can transform an organization's operational dynamics, slashing costs and boosting effectiveness.&nbsp;</p><p>Furthermore, this success story is a shining example of digital transformation in action. By moving from a manual, cumbersome process to a digital, streamlined one, the governmental entity not only enhanced its operational efficiency but also significantly improved the experience for citizens. The ease of consulting and paying taxes online represented a leap forward in public service. This transformation wasn't just about internal benefits; it was also about making life easier for the citizens, demonstrating how platform engineering can have a far-reaching impact. It's not just about what happens inside an organization; it's also about how these changes are felt externally by the people you serve. In this case, the combination of platform engineering and digital transformation created a more responsive, efficient, and citizen-friendly public sector.</p><h2>Innovation as a Driver for Market Leadership</h2><blockquote><p>&#8220;Ironically, in a changing world, playing it safe is one of the riskiest things you can do&#8221; - Reid Hoffman</p></blockquote><p>In the fast-paced world of technology, innovation isn&#8217;t just a buzzword; it's the essence of market leadership. Amazon, a trailblazer in this arena, exemplifies how platform engineering and a relentless focus on innovation can drive a company to the pinnacle of its industry. Their approach, often dissected in studies like 'Think Like Amazon,' revolves around continuously experimenting and pushing the boundaries of what's possible. By building a robust, scalable platform, Amazon has not only streamlined its operations but also created a fertile ground for groundbreaking ideas to flourish &#8211; from cloud computing with AWS to revolutionizing retail and logistics.</p><p>Amazon&#8217;s journey underscores a crucial lesson: innovation through platform engineering extends far beyond mere product development; it's about reinventing customer experiences and operational models. Through their platform, Amazon offers a degree of customization and personalization in services that sets new industry standards. Utilizing data analytics and AI, they anticipate and adapt to customer needs, setting trends rather than following them. This commitment to innovation is what keeps Amazon at the forefront of its markets, continually evolving and redefining what's possible. It's a shining example for businesses aiming to not just compete but lead in their markets, proving that sustained innovation is key to long-term dominance and relevance in today's ever-changing business landscape.</p><p>Furthermore, the power of platform engineering extends to empowering individual teams within an organization. By providing a robust and flexible platform, companies like Amazon have demonstrated how teams can work with greater independence, free from the constraints of relying on other teams for resources or support. This autonomy is a catalyst for innovation. When teams can operate independently, they're more likely to experiment, take risks, and think outside the box. This environment is ideal for nurturing innovative ideas that can quickly evolve into practical, market-ready solutions.</p><p>This level of independence fundamentally changes the dynamics of how teams contribute to a company's innovation agenda. It allows for a more decentralized approach to innovation, where ideas and solutions can originate from various parts of the organization, not just the top. As a result, businesses can tap into a wider pool of creativity and expertise, accelerating the pace of innovation and staying ahead in competitive markets. In essence, platform engineering is not just a technical strategy; it's a business strategy that enables a culture of continuous innovation, driving a company towards market leadership.</p><h2>Navigating the Challenges: Antipatterns in Platform Engineering</h2><p>Building a successful platform engineering strategy is a journey fraught with challenges and learning experiences. Reflecting on my own journey, I've encountered several pitfalls that have reshaped my understanding of effective platform engineering.</p><h3>Avoiding the 'Know-It-All' Trap</h3><p>One critical mistake I've made was attempting to build a platform for every possible scenario, falling into the trap of thinking I had all the answers. This approach is fundamentally flawed. No one can fully anticipate the myriad of use cases across an entire company. A more effective strategy is to view platform development as an evolutionary process. It's essential to build the platform incrementally, focusing on specific domains or even subdomains. I've learned that creating boundaries based on business capabilities rather than attempting to cover every possibility is far more practical. This approach allows for a platform that evolves and adapts over time, aligning more closely with the company's changing needs.</p><h3>Empowering Teams, Not Restricting Them</h3><p>Another misstep was inadvertently turning the platform into a set of restrictions for teams. A platform should empower teams, not constrain them. It's about providing interfaces and standards that grant autonomy and enable teams to focus on strategy and delivering value. For instance, dictating a specific set of databases for every solution can stifle innovation and flexibility. Instead, offering standards for data communication protocols or guidelines for implementing patterns like event-driven architectures can foster a more decoupled and efficient system. These standards should facilitate creativity and efficiency, not hinder them.</p><h3>From Paper to Practice</h3><p>A significant hurdle I faced was the failure to effectively translate platform standards from paper to practice. Despite communicating new standards, teams struggled to follow them, often due to a lack of understanding of their application. This issue highlighted the importance of automation and tooling in platform engineering. Tools like Infrastructure as Code (IaC) can aid in implementing these standards by providing ready-to-use templates and self-service capabilities. Additionally, the rationale behind each standard &#8211; whether it's to mitigate risks, simplify processes, or cut costs &#8211; needs to be clearly communicated and understood. This understanding ensures that the standards are more than just rules; they are integral tools that contribute to the team's and the company's success.</p><h3>Broadening the Perspective</h3><p>Initially, I viewed platform engineering primarily as a technical endeavor &#8211; a collection of best practices, guidelines, and standards. However, this perspective is limiting. Platforms have a profound impact on solution teams and the business as a whole. They should be seen as a strategic asset that propels the business towards market leadership. Balancing the technical details with a broader business perspective is vital.</p><h3>Assessing the Need for a Custom Platform</h3><p>One of the greatest lessons I've learned is that not every company needs to build its own platform. Platform engineering demands significant investment and long-term commitment. It's essential for each company to assess its unique context to determine whether a custom platform is the right choice. This assessment can be aided by enterprise architecture, ensuring that the decision aligns with the company's long-term goals and capabilities. Testing and evaluating the platform in an agile manner can provide early feedback, helping to ascertain its effectiveness and fit within the business.</p><h2>Conclusion</h2><p>In conclusion, platform engineering is not just a technological journey but a strategic voyage towards market leadership. It represents the fusion of operational efficiency, innovative drive, and the wisdom gleaned from navigating complex challenges. This article has sought to illuminate the path by sharing real-world insights and experiences, highlighting the importance of an adaptive approach, team empowerment, and the integration of technical prowess with business strategy. Yet, the conversation around platform engineering is ever-evolving, and your perspectives and questions are invaluable. I invite you to enrich this discourse&#8212;share your experiences, raise questions, or offer your viewpoint. Together, let&#8217;s explore the vast possibilities of platform engineering and its impact on shaping agile, customer-focused, and forward-thinking businesses in our dynamic digital era.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.seart.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Engineering Art - SEArt! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Enterprise Architecture in a nutshell]]></title><description><![CDATA[From an Agile Perspective]]></description><link>https://blog.seart.dev/p/enterprise-architecture-in-a-nutshell</link><guid isPermaLink="false">https://blog.seart.dev/p/enterprise-architecture-in-a-nutshell</guid><dc:creator><![CDATA[Carlos Gómez]]></dc:creator><pubDate>Sat, 18 Nov 2023 05:57:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Vlax!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there! Today, let&#8217;s unpack something that sounds super formal but is actually pretty cool once you get the hang of it - Enterprise Architecture (EA). Jeanne Ross, Peter Weill, and David Robertson described it as aligning business goals with tech strategy to make sure everything fits nicely with how a company operates. In my own words? It&#8217;s like making sure all the pieces of a puzzle - your company goals and the tech stuff - fit together just right.</p><h1>So, what does this mean?</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vlax!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vlax!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Vlax!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Vlax!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Vlax!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vlax!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png" width="722" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:722,&quot;bytes&quot;:2101030,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vlax!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Vlax!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Vlax!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Vlax!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03e275c2-b614-41b7-a519-84f0ecae210e_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Imagine your company as a ship. The goals are your destination (like offering awesome services or making your products super affordable). EA is the captain that charts the best course, using tech and smart strategies as its compass and map.</p><p>Now, here&#8217;s where it gets interesting. To steer the ship right, we need to know two things: where we are now (the &#8216;As-Is&#8217; state) and where we want to be (the &#8216;To-Be&#8217; state). Sometimes, there might even be a few pit stops (intermediate states) along the way. The trick is spotting the gaps - like if we&#8217;re missing a piece of tech or need to tweak a process - and then planning how to fill them. Think of it as a treasure map, marking where the treasure (our goals) is and plotting a route to get there.</p><h1>But hey, it&#8217;s not all about tech upgrades. </h1><p>Sometimes, it&#8217;s about changing how we do things or shaking up the team structure. The roadmap we create isn&#8217;t just a tech shopping list; it's more like a travel itinerary that includes who's doing what, when, and what we need to pack for the journey.</p><p>And just to make this super relatable, imagine a caf&#233; wanting to speed up their order process. Their &#8216;As-Is&#8217; is taking orders manually. Their &#8216;To-Be&#8217;? A cool app where customers order ahead. The gap? They need the app and maybe a bit of a process change. The roadmap lays out how they&#8217;ll get there, step by step.</p><p>To wrap it up, Enterprise Architecture isn&#8217;t just some stuffy corporate speak; it&#8217;s a practical way to make sure your business and tech are BFFs, working together to get you where you want to go. It&#8217;s about having a plan, but also being ready to adjust the sails when needed.</p><h1>How to Design an Enterprise Architecture: Making it Simple</h1><p>Alright, let's dive into the nitty-gritty of designing an EA. You might be wondering, "How do we build this thing?" Well, it's a bit like baking a cake &#8211; there are different recipes (or frameworks) you can follow, but the essentials remain the same.</p><p>One popular recipe is TOGAF (The Open Group Architecture Framework). It's like the classic vanilla cake &#8211; versatile and well-liked. TOGAF is cool because it's kind of a one-size-fits-all framework, suitable for a wide range of companies. And guess what? The same folks behind TOGAF, The Open Group, came up with something called Open Agile Architecture. It's like adding sprinkles to your vanilla cake, making TOGAF agile-friendly and ready for fast-paced business environments.</p><p>But here's the thing &#8211; businesses change, like, all the time. So, your EA needs to be a bit like a chameleon, changing colors to match the environment. That's why I'm all for agility in EA design. By setting up 'checkpoints' in your EA, it's like having rest stops on a long road trip. You get to pause, reassess, and make sure you're still on the right track, ensuring your EA stays relevant and valuable.</p><h1>What's in the Enterprise Architecture Box?</h1><p>Now, what goes into your EA depends on your recipe (framework) and what your company is all about. I usually like to focus on four main ingredients:</p><ol><li><p><strong>Business Architecture</strong>: This is understanding the heartbeat of your company &#8211; its capabilities, processes, and how it ticks. It's crucial to know where you are now (the As-Is state) and where you're heading (the To-Be state). It's like having a map for your business journey.</p></li><li><p><strong>Data Architecture</strong>: Here's where you get a grip on the data &#8211; what you need, how you're using it, and how it should flow in the future. It's all about making sure your data serves your business goals, both now and down the road.</p></li><li><p><strong>Application Architecture</strong>: This is about the tools in your toolbox &#8211; the systems and software that power your business processes. It's about figuring out what you've got, what you need, and how to bridge that gap.</p></li><li><p><strong>Infrastructure Architecture</strong>: Think of this as the foundation of your building. It's the hardware and other tech stuff that supports everything else. It's about making sure the physical and digital infrastructure aligns with your business needs.</p></li></ol><p>And there you have it! But hey, if you're curious about diving deeper into each of these areas, or how to document and communicate them, let me know. I'd love to chat more about it!</p><p></p>]]></content:encoded></item></channel></rss>