<?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[Harmonizing Complexity]]></title><description><![CDATA[Explore the realm of Harmonizing Complexity, where technical insights intersect with practical product problems. This blog delves into inventive solutions that bridge intricate concepts with everyday challenges.]]></description><link>https://blog.matangr.com</link><image><url>https://substackcdn.com/image/fetch/$s_!6Kdt!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d1f4151-602e-4510-b41a-3ca3dc234d45_1024x1024.png</url><title>Harmonizing Complexity</title><link>https://blog.matangr.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 04 May 2026 10:10:12 GMT</lastBuildDate><atom:link href="https://blog.matangr.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Matan Grady]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[matangr@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[matangr@substack.com]]></itunes:email><itunes:name><![CDATA[Matan Grady]]></itunes:name></itunes:owner><itunes:author><![CDATA[Matan Grady]]></itunes:author><googleplay:owner><![CDATA[matangr@substack.com]]></googleplay:owner><googleplay:email><![CDATA[matangr@substack.com]]></googleplay:email><googleplay:author><![CDATA[Matan Grady]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[#58 - Small doesn't mean fast]]></title><description><![CDATA[My detailed experience delivering a "small" feature to production , and why it took over two days]]></description><link>https://blog.matangr.com/p/55-small-doesnt-mean-fast</link><guid isPermaLink="false">https://blog.matangr.com/p/55-small-doesnt-mean-fast</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Mon, 01 Dec 2025 18:28:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!32zg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.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_!32zg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!32zg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png 424w, https://substackcdn.com/image/fetch/$s_!32zg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png 848w, https://substackcdn.com/image/fetch/$s_!32zg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!32zg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!32zg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png" width="499" height="484.26304945054943" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1413,&quot;width&quot;:1456,&quot;resizeWidth&quot;:499,&quot;bytes&quot;:3796852,&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.matangr.com/i/180427929?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.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_!32zg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png 424w, https://substackcdn.com/image/fetch/$s_!32zg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png 848w, https://substackcdn.com/image/fetch/$s_!32zg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.png 1272w, https://substackcdn.com/image/fetch/$s_!32zg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde384a23-28d7-4349-b79c-13eaa2b2a7c3_1476x1432.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><h2><strong>Overview</strong></h2><p>Every few months, I like to develop and release a very small feature in the product. And when I say feature, it can be as little as a const change or a typo fix. I do it because I feel I need to stay close to the weeds to understand why development is such a complicated and often long process. Usually, something we think is small, and the developers say will take a couple of hours, ends up taking a day or two. I want to embrace the process myself to really understand it.</p><p>This is my detailed walkthrough of a &#8220;tiny&#8221; feature I recently developed and released.</p><h2><strong>Ideation</strong></h2><p>As part of my work at Port, my team developed and maintains the Port MCP server. One aspect of an MCP server that is often overlooked is the MCP prompts. A prompt helps users discover and work with your MCP server and its tools in a more structured way.</p><p>Recently, the team added static prompts, which are prompts that all users get regardless of their configuration. I thought we could a great use of them. One pain point we had was that customers wanted to use the MCP server, but didn&#8217;t really know how. The feature idea was to add a prompt that helps them discover, for their specific setup and organization, what Port AI and the Port MCP server could help them with.</p><p>I had already built a prompt that worked pretty well through Claude, and when the team released support for static prompts in the MCP server, I felt it was the right time to contribute my new prompt.</p><h2><strong>Setting up the IDE</strong></h2><p>The first step was setting up my IDE. I had to find the relevant repository, clone it to my desktop, and figure out what is the right service (we have a monorepo setup). I opened Cursor and chatted a bit with the Opus 4.5 model to understand the process of adding a custom prompt and asked it to generate some basic guidelines.</p><p>Then, I tried to check out a new branch, and it immediately failed because my branch name didn&#8217;t match the standards. With Cursor&#8217;s help, I found what was missing. I also had to open a task that this branch would correlate with. I went to our task management tool, which in our case is Port, opened a new task, and then checked out the branch again. This time it worked, and I had a branch ready to start working on.</p><h2><strong>Coding</strong></h2><p>Since I had already done some pre-work with Opus, I pasted my prompt and let the Composer 1 model from Cursor generate the changes. The changes made sense, and I asked several follow-up questions about why it chose one thing and not another, just to make sure I understood the implementation and that it didn&#8217;t hallucinate anything.</p><p>I then used Sonet 4.5 to double-check the code, see if it could improve anything, and confirm that the implementation was consistent with my contribution. At this point, I also noticed that tests weren&#8217;t written for the new prompt, even though we had tests for the existing ones. I asked it to create tests as well.</p><h2><strong>Unit tests</strong></h2><p>When I looked at the tests, I noticed something strange. Prompts can have dynamic arguments, which justifies extensive tests. Mine was a static prompt, so it didn&#8217;t make sense to have eight different unit tests. I identified what I thought was crucial to test and asked again to simplify the tests.</p><p>At this point, I went back to Opus 4.5, since I needed more critical thinking and wanted to make sure it didn&#8217;t just satisfy me without checking the logic.</p><h2><strong>E2E tests</strong></h2><p>This was probably the hardest part. If you ask developers how they test, you&#8217;ll probably get different answers from each one. Some already have their local setup and want to test everything to make sure it behaves exactly how they expect. Others trust the code and assume that if they change something static or hard-coded, it will just work. Some run commands and check through the CLI that things work technically.</p><p>My personal preference is to see the actual production experience that users will see, just locally. That was a major challenge. I had to ramp up on how to spin up the local environment. I sat with one engineer for an hour and a half, another engineer for 30 minutes, and in between ran something like 20 or 30 different commands until I got something to work.</p><p>Then I failed because of permissions. It turns out I needed specific AWS roles. I won&#8217;t expand too much, but it took more than a day to collaborate with the team, get the permissions, and refresh my AWS profile. Even then, the specific services I needed still didn&#8217;t work. At some point, I gave up and relied on a local environment that one of my engineers had. He checked out my branch, we tested it together, and once we saw it worked, I finally had the confidence to proceed.</p><h2><strong>Pull request</strong></h2><p>This was the point where I moved from local development to collaboration. I opened the pull request and worked through the template and requirements, and then tried to find someone who could review my code.</p><p>Before that, we already had an AI coding assistant set up, Codex from OpenAI, which reviewed my PR and gave one comment that made sense. I consulted again with Opus 4.5, it confirmed the comment, and I fixed it.</p><p>I pushed the changes and waited for all the checks to run. This took around 20 minutes. After that, I saw several failures. One was code formatting, which asked me to run another command to fix it. I did this a couple of times until most errors were cleared. But then about 40% of the checks failed with no clear explanation.</p><p>I asked around and was told to re-run the checks, which we sometimes call flaky checks. This time it passed, and the PR was almost ready to merge.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KISO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KISO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png 424w, https://substackcdn.com/image/fetch/$s_!KISO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png 848w, https://substackcdn.com/image/fetch/$s_!KISO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png 1272w, https://substackcdn.com/image/fetch/$s_!KISO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KISO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png" width="383" height="646.6652631578947" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1604,&quot;width&quot;:950,&quot;resizeWidth&quot;:383,&quot;bytes&quot;:157677,&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.matangr.com/i/180427929?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.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_!KISO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png 424w, https://substackcdn.com/image/fetch/$s_!KISO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png 848w, https://substackcdn.com/image/fetch/$s_!KISO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.png 1272w, https://substackcdn.com/image/fetch/$s_!KISO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc99791a9-ef43-4065-8b54-26f5eb6d406e_950x1604.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></p><h2><strong>Merge and deploy</strong></h2><p>I got the final approval from the team and saw the scary green button saying &#8220;squash and merge&#8221;. We have an internal policy that you merge and immediately deploy within the allowed timeframes.</p><p>I made sure I could do it, merged, and deployed the code. The deployment took another 10 minutes.</p><p>At this stage, I just sat and waited to see if the deployment actually worked. It was a bit scary because a failed deployment might mean that the Port MCP server wouldn&#8217;t be available to customers. Now, I know it shouldn&#8217;t have happened since it passed all the gates, but I still didn&#8217;t feel comfortable. Once I saw it finished and verified that my new feature worked, I was relieved.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0a4m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0a4m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png 424w, https://substackcdn.com/image/fetch/$s_!0a4m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png 848w, https://substackcdn.com/image/fetch/$s_!0a4m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png 1272w, https://substackcdn.com/image/fetch/$s_!0a4m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0a4m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png" width="1456" height="864" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:864,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:313820,&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.matangr.com/i/180427929?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.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_!0a4m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png 424w, https://substackcdn.com/image/fetch/$s_!0a4m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png 848w, https://substackcdn.com/image/fetch/$s_!0a4m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.png 1272w, https://substackcdn.com/image/fetch/$s_!0a4m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe637b9f1-c882-44a4-93a7-25b5b26ebb81_2806x1666.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></p><h2><strong>It&#8217;s in production</strong></h2><p>I opened Claude and Cursor, used the new prompt in each, and saw how both delivered exactly what I hoped for. I wrote the release notes quickly and shared them in our internal Slack channel so everyone knew about it and could start spreading the word.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1HdR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1HdR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png 424w, https://substackcdn.com/image/fetch/$s_!1HdR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png 848w, https://substackcdn.com/image/fetch/$s_!1HdR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png 1272w, https://substackcdn.com/image/fetch/$s_!1HdR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1HdR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png" width="1456" height="613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:613,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:206880,&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.matangr.com/i/180427929?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.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_!1HdR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png 424w, https://substackcdn.com/image/fetch/$s_!1HdR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png 848w, https://substackcdn.com/image/fetch/$s_!1HdR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png 1272w, https://substackcdn.com/image/fetch/$s_!1HdR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61421e54-ef03-480e-8726-5569fddf22ca_1938x816.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Conclusions</strong></h2><p>Every few months, I develop something small in the product to feel the same friction developers live with. It helps me empathize with my team and identify bottlenecks. It also helps me imagine how agentic flows work around us and understand where I struggle, because that&#8217;s where an AI agent would struggle too.</p><p>It was a great experience, and I recommend it to every product manager. It helps us grow in empathy and understand that when engineers say a small task will take a few hours or maybe a day, it sometimes ends up taking two or three days, even if it&#8217;s small. Not because the feature is big, but because delivering a new capability to production is a complicated task.</p>]]></content:encoded></item><item><title><![CDATA[#57 - On Context Engineering]]></title><description><![CDATA[What Is Context Engineering, and How It Can Drive AI Adoption]]></description><link>https://blog.matangr.com/p/57-on-context-engineering</link><guid isPermaLink="false">https://blog.matangr.com/p/57-on-context-engineering</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Wed, 13 Aug 2025 07:05:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sIbH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_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_!sIbH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sIbH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!sIbH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!sIbH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!sIbH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sIbH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png" width="459" height="459" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93033238-298a-4a12-8ce5-4fe3ab823e5d_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;:459,&quot;bytes&quot;:2228628,&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.matangr.com/i/170852172?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_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_!sIbH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!sIbH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!sIbH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!sIbH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93033238-298a-4a12-8ce5-4fe3ab823e5d_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><h2>Overview</h2><p>I won't explain the term <a href="https://www.philschmid.de/context-engineering">Context Engineering</a>, but I do want to share my take on it, what it relates to, and some concrete examples from the engineering space.</p><h2>Context gaps</h2><p>As a B2B prospect, when I look for software, I usually search online. I have a pattern to find the software I think I need or want. I go to its website, see some use cases, and if I'm interested, I raise my hand and wait to be contacted.</p><p>At this point, there are some assumptions that only I know about:</p><ol><li><p>Why I think <strong>I need</strong> this software.</p></li><li><p>What are <strong>the problems</strong> that I believe I have that this software might help me with?</p></li><li><p>What is <strong>the value I perceive</strong> from this software that might solve these pain points?</p></li></ol><p>On the other hand, there's someone from a GTM team, for example, an SDR, seeing my hand raised, doing a bit of a discovery, and now he's trying to assess additional points -</p><ul><li><p>What he believes I'm <strong>looking for.</strong></p></li><li><p>What he assumes are my <strong>pain points.</strong></p></li><li><p>What is the <strong>possible value</strong> I might get from the product?</p></li><li><p><strong>How to start</strong> the sales process?</p></li></ul><h2>The different realities</h2><p>If we were to meet at this point, we'd have a lot of hidden context:</p><ol><li><p>What I think my pain points are.</p></li><li><p>What I think this product could help me with.</p></li><li><p>What the salesperson believes my perception of the product would be.</p></li><li><p>What the salesperson is trained on is the value of the product.</p></li><li><p>What are my true pain points?</p></li></ol><p>If we had the discussion today, it would be very difficult to bridge this gap. There are all kinds of different realities that we couldn't talk about - some are hidden, and some are between the lines.  It would be very hard to get alignment and action items from such a call.</p><p>This doesn't say these calls don't happen. But the usual sales process is:</p><ol><li><p>A B2B prospect comes in, wanting to see a real demo and get the price.</p></li><li><p>The salesperson arrives, asks a bunch of questions for 10 minutes, shows a couple of slides for an additional 5 minutes, and asks for a follow-up meeting where maybe they'll see a demo.</p></li></ol><h2>Ideal context situation</h2><p>Let's consider a different possibility. As a prospect, I know exactly what my pain points are and am very aligned with what I need. When I see the product, the value propositions are very clear. </p><p>The site is great, the messaging is on point, and I have a live demo. I even signed up, tried it for myself, and verified it can solve my pain points.</p><p>The salesperson on the other end has access to my usage data. He has wide and deep knowledge of the industry and where I specifically come from, so he can actually tailor what the product can do for me if I use it more extensively.</p><p>Now, at this point, if we meet, the chance we'll get aligned is very high. And a possible discussion would just be to go over a slide or two, make sure we fully understand the picture, discuss next steps, and possibly pricing.</p><p>In a way, if I already use the product, and I get it, I love it, I want to buy it, I don't need to see ten slides explaining the history of the company. I just don't.</p><h2>Transition to Engineering</h2><p>Let's switch the record and move the example to the engineering side.</p><p>Let's imagine I go into one of the generative AI products and just write something like:</p><blockquote><p><em>Provide the code to fix issue ACME-123.</em></p></blockquote><p>Obviously, the expected response would be: </p><blockquote><p><em>I'm happy to help you, but what is ACME-123?</em></p></blockquote><p>It's not that far from a salesperson, where a prospect comes in asking for a demo. The salesperson is asking, &#8220;What are we demoing for?&#8221;</p><p>Opening a blank GPT chat is like working without context.</p><p>Context engineering is how you add your unique context that the LLM is not trained on. It starts with simple prompts and instructions, followed by extensive data access so the generative AI gets the wider picture and eventually achieves higher accuracy with fewer attempts and words.</p><h2>Context engineering examples</h2><p>I want to share some real-world examples to make it concrete.</p><div><hr></div><h4>Service ownership</h4><p>Understanding the owner of a specific service so we can inquire about it and possibly contribute to it. The prompt would be:</p><blockquote><p>Who owns the service checkout in our company?</p></blockquote><p>Context engineering needed:</p><ul><li><p>Software catalog.</p></li><li><p>Team structures and their members.</p></li><li><p>Organizational structure.</p></li><li><p>The commit history of each service.</p></li><li><p>Service README file.</p></li><li><p>Recent Jira tickets per service.</p></li><li><p>Skill sets of engineers, especially those familiar with frameworks relevant to the service.</p></li></ul><h4><strong>Critical incidents</strong></h4><p>Understanding the production situation in regard to incidents. The prompt would be:</p><blockquote><p>What are the critical incidents we currently have?</p></blockquote><p>Context engineering needed:</p><ul><li><p>Identification of <strong>who</strong> &#8220;we&#8221; refers to (team, company, or specific user).</p></li><li><p>Understanding system and service dependencies.</p></li><li><p>Awareness of historical prompts and queries from the user to infer intent.</p></li><li><p>Access to incident data.</p></li><li><p>Incident priority levels.</p></li><li><p>Mapping of incidents to related services.</p></li><li><p>Identification of which services are considered critical.</p></li><li><p>Information on which customers are impacted by current incidents.</p></li></ul><h4><strong>Next tasks for today</strong></h4><p>Helping a developer quickly understand what they should focus on. The prompt would be:</p><blockquote><p>What are my next tasks for today?</p></blockquote><p>Context engineering needed:</p><ul><li><p>Current workload and task list.</p></li><li><p>Incident tickets assigned to the developer.</p></li><li><p>Jira tickets assigned to the developer.</p></li><li><p>GitHub issues opened in public repositories they own or contribute to.</p></li><li><p>Support tickets awaiting the team&#8217;s response.</p></li><li><p>Overdue on-call action items.</p></li><li><p>Open security issues nearing their SLA deadlines.</p></li><li><p>Developer&#8217;s daily calendar.</p></li><li><p>Pull requests to merge or review.</p></li><li><p>Prioritization context - company-wide priorities, strategic projects in progress, and teams the developer is part of.</p></li></ul><h4><strong>Provisioning cloud resources</strong></h4><p>In daily work, a developer may need to provision resources (e.g., a new Kubernetes namespace or a new database). The prompt would be:</p><blockquote><p>For task ACME-123, I need to create a new S3 bucket. How should I go about it?</p></blockquote><p>Context engineering needed:</p><ul><li><p>The task context (description, priority, links).</p></li><li><p>Organizational conventions (naming, tagging, environments).</p></li><li><p>Who is allowed to provision it, and what is the permission model?</p></li><li><p>Required approvals and the approver(s).</p></li><li><p>The standard process for this resource in the organization.</p></li><li><p>If using direct integrations: the API or step-by-step walkthrough.</p></li><li><p>If using Infrastructure as Code: how to author the Terraform file, where it should live, and who should approve the PR.</p></li></ul><h2>Conclusions</h2><p>Context engineering is about making LLMs more useful by giving them the right context to understand where developers are coming from and the ecosystem they operate in.</p><p>The challenge lies in providing high-quality context without over-exposing tools or data in ways that create chaos and erode trust, ultimately reducing AI adoption. To me, the concept is clear, but its execution is the true hurdle.</p>]]></content:encoded></item><item><title><![CDATA[#56 - My AI agent required more engineering than prompts]]></title><description><![CDATA[A case study on automating release changelogs and the messy work of building production-ready AI.]]></description><link>https://blog.matangr.com/p/my-ai-agent-required-more-engineering</link><guid isPermaLink="false">https://blog.matangr.com/p/my-ai-agent-required-more-engineering</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Tue, 22 Jul 2025 14:55:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!17dl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_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_!17dl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!17dl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!17dl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!17dl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!17dl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!17dl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png" width="612" height="408.1401098901099" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/229e9592-f040-4c0b-af29-05edd6811512_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;:612,&quot;bytes&quot;:3352877,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_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_!17dl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!17dl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!17dl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!17dl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F229e9592-f040-4c0b-af29-05edd6811512_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><figcaption class="image-caption">Illustration of a confused AI agent with Notion and Slack</figcaption></figure></div><h2>Intro</h2><p>My team and I used to create monthly changelogs for product releases. The manual process took about a week, with over a day just to gather the necessary information. I built an AI agent in n8n that streamlined this process to be real-time, reducing the time it takes to just a couple of hours.</p><p>In this post, I&#8217;ll dive into the details of how I did it and why it&#8217;s not as easy as LinkedIn makes it sound. When I hear someone say, &#8220;AI should be able to do that, right?&#8221; I recommend they try it out and see for themselves. The TL;DR is that it was much harder than you would expect.</p><p>Let&#8217;s dive in.</p><h2>High-Level Architecture</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bRFT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bRFT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png 424w, https://substackcdn.com/image/fetch/$s_!bRFT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png 848w, https://substackcdn.com/image/fetch/$s_!bRFT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png 1272w, https://substackcdn.com/image/fetch/$s_!bRFT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bRFT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png" width="1456" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:116603,&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;:false,&quot;internalRedirect&quot;:&quot;https://blog.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.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_!bRFT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png 424w, https://substackcdn.com/image/fetch/$s_!bRFT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png 848w, https://substackcdn.com/image/fetch/$s_!bRFT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png 1272w, https://substackcdn.com/image/fetch/$s_!bRFT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ce2536-2982-431a-b56c-d0a5070e7a7f_1806x964.png 1456w" sizes="100vw"></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">The architecture of the AI agent</figcaption></figure></div><p>The business workflow is such that every new feature release is announced internally on our Slack. Instead of gathering everything at the end of the month, the agent picks it up in real-time and notifies in the thread once it&#8217;s finished.</p><p>The workflow starts with a Slack trigger, then moves to a simple agent with access to broader context in Port (our internal developer portal, which is the product we&#8217;re building) and Notion, the tool where the release changelog is written.</p><p>The context in Port includes product themes, the owner PM, and some additional context on the release itself. The Notion page is essentially a running list of the month's releases.</p><p>To hint at the next steps, here&#8217;s how the current flow looks in n8n:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FzEo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FzEo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png 424w, https://substackcdn.com/image/fetch/$s_!FzEo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png 848w, https://substackcdn.com/image/fetch/$s_!FzEo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png 1272w, https://substackcdn.com/image/fetch/$s_!FzEo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FzEo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png" width="1456" height="353" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:353,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:323175,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.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_!FzEo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png 424w, https://substackcdn.com/image/fetch/$s_!FzEo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png 848w, https://substackcdn.com/image/fetch/$s_!FzEo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png 1272w, https://substackcdn.com/image/fetch/$s_!FzEo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f3e09d3-6ebc-49de-9edd-df0819bdfde2_1999x485.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The n8n workflow for the AI agent</figcaption></figure></div><p>When I&#8217;m asked, &#8220;How much time did it take to build it?&#8221; my answer is, &#8220;Probably two to three hours, but that initial time investment grew as I discovered more edge cases and worked to improve its accuracy.&#8221;</p><p>Similar to my post on building the MCP, building is one thing, but getting it to work is completely different.</p><p>Let&#8217;s go into the different parts and tradeoffs I encountered along the way.</p><h2>The Slack Trigger</h2><p>For the first take, I assumed the AI agent would do most of the heavy lifting in analyzing the message. But then I got this release note:</p><blockquote><p>Pete has joined the channel! &#128640;</p><p>Happy to announce that Pete is now part of this channel. With this new addition, expect sharper insights, faster feedback loops, and an extra boost of energy&#8212;drop a welcome message below!</p></blockquote><p>Confusingly, the workflow was getting triggered when new members joined the Slack channel. The AI model didn't figure out this wasn't a feature release and added it to the monthly changelog. A funny mistake, but an unacceptable one.</p><p>At this point, I was faced with a tradeoff that would surface again: invest more time in deterministic logic, or prompt and hope for the best with non-deterministic LLMs.</p><p>My solution was to improve the workflow:</p><ul><li><p>I saw the trigger step had a <code>type</code> and an optional <code>subType</code> property.</p></li><li><p>I added an <code>IF</code> section so that for a <code>channel_join</code> event, the workflow wouldn&#8217;t trigger.</p></li></ul><p>Like with all <a href="https://blog.matangr.com/p/wearing-a-developers-hat-for-a-few">development tasks</a>, getting it to work took its toll:</p><ol><li><p>Replicating the case with the right trigger (using execution logs and the debug editor).</p></li><li><p>Testing each step separately to ensure it worked as expected.</p></li><li><p>Testing E2E to see if the flow was broken.</p></li></ol><p>I found a few more cases like this (such as message deletions), and I handled them all in a similar way.</p><h2>Infinite Automation Loop</h2><p>While still in the experimental phase, I got a message saying I was DDOSing our Slack. A single release note got 50+ replies from the agent in less than a minute.</p><p></p><p>Here, I learned an interesting fact: sending a message in a thread is also considered a channel message. This created a loop:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!60JS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!60JS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png 424w, https://substackcdn.com/image/fetch/$s_!60JS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png 848w, https://substackcdn.com/image/fetch/$s_!60JS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png 1272w, https://substackcdn.com/image/fetch/$s_!60JS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!60JS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png" width="541" height="188.85010266940452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:340,&quot;width&quot;:974,&quot;resizeWidth&quot;:541,&quot;bytes&quot;:60684,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.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_!60JS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png 424w, https://substackcdn.com/image/fetch/$s_!60JS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png 848w, https://substackcdn.com/image/fetch/$s_!60JS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png 1272w, https://substackcdn.com/image/fetch/$s_!60JS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7c7233f-b10b-47bc-a4f3-4e703bbb8313_974x340.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Slack thread showing 57 replies from the AI agent</figcaption></figure></div><p>Similar to the previous case, I added a step that filters out thread messages. At this point, the workflow looks somewhat like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ove5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ove5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png 424w, https://substackcdn.com/image/fetch/$s_!Ove5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png 848w, https://substackcdn.com/image/fetch/$s_!Ove5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png 1272w, https://substackcdn.com/image/fetch/$s_!Ove5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ove5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png" width="1456" height="605" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:605,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:138200,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.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_!Ove5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png 424w, https://substackcdn.com/image/fetch/$s_!Ove5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png 848w, https://substackcdn.com/image/fetch/$s_!Ove5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png 1272w, https://substackcdn.com/image/fetch/$s_!Ove5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f592b1e-12bb-4fde-b362-4dce83c29a3d_1999x831.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI agent architecture with condition on the Slack trigger</figcaption></figure></div><h2>The AI Part(s)</h2><p>At this point, you might be missing some context on what I actually expected the AI agent to achieve. As it turns out, it was too much to ask from a single prompt, which led me to another tradeoff: one agent with massive instructions versus multiple smaller, more focused agents.</p><p>Similar to the previous tradeoffs, and perhaps generally in software, one large function is easier to build but harder to maintain and test, so I went with the focused agents approach.</p><p>Here is a list of the agents in the process and the task each had:</p><ol><li><p><strong>Type of release</strong> - This agent needs to categorize the release into pre-defined buckets based on instructions and historical assignments. The type of release later helps determine whether we need to add it to the changelog.</p></li><li><p><strong>Ownership</strong> - This agent gathers product component ownership from Port, categorizes the release message into one of these components, and determines ownership (which is later important for follow-ups on the changelog to add visuals, etc.).</p></li><li><p><strong>Message guidelines</strong> - This marketing-oriented agent knows our language, previous releases, and changelogs, and determines how to condense a detailed Slack announcement into a one-liner for our changelog.</p></li><li><p><strong>Release page</strong> - While it may sound easy, figuring out the right release page in Notion for the month is not a trivial task (I will elaborate on that below). This agent should output the page ID for the rest of the process.</p></li><li><p><strong>Existing or new announcement</strong> - In some cases, we build the release page in advance or send a couple of variations of the same feature in Slack. This agent needs to determine whether the release page already contains this feature.</p></li></ol><p>I believe it's clearer why going with smaller, more focused agents was the right choice in this case, but it also made our workflow much more complicated in terms of different failure points and data flow. I won&#8217;t draw it out, but you can imagine how it gets closer to the first workflow screenshot showing the final n8n flow.</p><p>I won&#8217;t dig into each step, but I do want to cover a few interesting steps and findings I had.</p><h2>Ownership AI</h2><p>This AI agent is relatively simple and started like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PGr2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PGr2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png 424w, https://substackcdn.com/image/fetch/$s_!PGr2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png 848w, https://substackcdn.com/image/fetch/$s_!PGr2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png 1272w, https://substackcdn.com/image/fetch/$s_!PGr2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PGr2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png" width="427" height="323.1826923076923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1102,&quot;width&quot;:1456,&quot;resizeWidth&quot;:427,&quot;bytes&quot;:100923,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.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_!PGr2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png 424w, https://substackcdn.com/image/fetch/$s_!PGr2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png 848w, https://substackcdn.com/image/fetch/$s_!PGr2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png 1272w, https://substackcdn.com/image/fetch/$s_!PGr2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74023f2d-c13f-4fa9-91fc-016e3374526b_1498x1134.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Diagram of an AI agent that needs to decide on ownership</figcaption></figure></div><p>However, the results were not great. I played with different models, but I felt it was something that GPT4.1-mini should be able to do (and thus save cost and time).</p><p>After some research and testing, I was able to improve it by adjusting the tool itself, rather than the prompt or the model.</p><p>Before the change, it was an array of JSON objects: </p><pre><code>[

  {

    &#8220;Name&#8221;: &#8220;frontend&#8221;,

    &#8220;Owner&#8221;: &#8220;Matan&#8221;

  },

  {

    &#8220;Name&#8221;: &#8220;backend&#8221;,

    &#8220;Owner&#8221;: &#8220;Phil&#8221;

  }

]</code></pre><p>After the change, it was a long formatted string:</p><pre><code>##Frontend\nOwner:Matan\n##Backend\nOwner:Phil\n</code></pre><p>It seems like the string version worked much better.</p><h2>Release Page &amp; Existing Announcements</h2><p>This was the trickiest part and really the heart of the workflow. If you just add everything being sent your way to incorrect pages, it misses the point and creates a burden rather than value.</p><p>At first, I had one agent tasked with both finding the relevant page and deciding whether the announcement should be added to it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OMS-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OMS-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png 424w, https://substackcdn.com/image/fetch/$s_!OMS-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png 848w, https://substackcdn.com/image/fetch/$s_!OMS-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png 1272w, https://substackcdn.com/image/fetch/$s_!OMS-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OMS-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png" width="439" height="432.7060931899642" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1100,&quot;width&quot;:1116,&quot;resizeWidth&quot;:439,&quot;bytes&quot;:128181,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.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_!OMS-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png 424w, https://substackcdn.com/image/fetch/$s_!OMS-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png 848w, https://substackcdn.com/image/fetch/$s_!OMS-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png 1272w, https://substackcdn.com/image/fetch/$s_!OMS-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf2eb68f-eeef-4fd8-8174-41655755b1a9_1116x1100.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A diagram of one AI agent with two Notion tools</figcaption></figure></div><p>The <code>get_pages</code> tool had a search function in Notion with a predefined query (e.g., &#8220;release notes - {{month}}&#8221;). The agent was able to run it with the right parameters, but I noticed that for some reason, Notion search didn't return the right page or the right order. </p><p>For example, a search for &#8220;Release notes - July 2025&#8221; brought up &#8220;Competition - July&#8221; as the first result. I tried increasing the number of results (from 10 to 50), but it was both inaccurate and consumed way too many tokens (as the response is a very long, non-LLM-optimized JSON).</p><p>After a few days, I had a better idea. I made sure all the release notes pages in Notion were under one parent page (it was a page, not a database) and changed the tool to bring that page's content instead. This way, I ensured the right pages were somewhere in the response. It didn&#8217;t solve the token consumption, but at least it worked.</p><p>At this point, I still saw many duplications in the release page, suggesting the agent was deciding to add announcements that were already on the page. I looked at past executions and the agent debug logs and saw that the tools did return the right data. You would expect the AI agent to &#8220;figure that out.&#8221;</p><p>I want to pause for a second and return to the tradeoffs I mentioned. The ideal implementation of an AI agent would be cheap, with broad context that requires minimal intervention, and capable of doing a very complex task.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eJBQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eJBQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png 424w, https://substackcdn.com/image/fetch/$s_!eJBQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png 848w, https://substackcdn.com/image/fetch/$s_!eJBQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png 1272w, https://substackcdn.com/image/fetch/$s_!eJBQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eJBQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png" width="558" height="203.86771653543306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:464,&quot;width&quot;:1270,&quot;resizeWidth&quot;:558,&quot;bytes&quot;:36160,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.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_!eJBQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png 424w, https://substackcdn.com/image/fetch/$s_!eJBQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png 848w, https://substackcdn.com/image/fetch/$s_!eJBQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png 1272w, https://substackcdn.com/image/fetch/$s_!eJBQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58e41f4d-3abc-4a53-a120-5643b02a1680_1270x464.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Sliders showing the ideal AI agent parameters</figcaption></figure></div><p>The reality is, you need to compromise and make tradeoffs to get the agent to actually work and provide good results consistently.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jj_E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jj_E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png 424w, https://substackcdn.com/image/fetch/$s_!Jj_E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png 848w, https://substackcdn.com/image/fetch/$s_!Jj_E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png 1272w, https://substackcdn.com/image/fetch/$s_!Jj_E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jj_E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png" width="594" height="218.109375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:470,&quot;width&quot;:1280,&quot;resizeWidth&quot;:594,&quot;bytes&quot;:36501,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.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_!Jj_E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png 424w, https://substackcdn.com/image/fetch/$s_!Jj_E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png 848w, https://substackcdn.com/image/fetch/$s_!Jj_E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png 1272w, https://substackcdn.com/image/fetch/$s_!Jj_E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e9cc272-479e-4f09-9877-1b43882ce9e8_1280x470.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Sliders showing the tradeoffs made on AI agent parameters</figcaption></figure></div><p>I was able to eventually get better results by applying these steps:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Np5h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Np5h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png 424w, https://substackcdn.com/image/fetch/$s_!Np5h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png 848w, https://substackcdn.com/image/fetch/$s_!Np5h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png 1272w, https://substackcdn.com/image/fetch/$s_!Np5h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Np5h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png" width="1456" height="527" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:527,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:175264,&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.matangr.com/i/168952958?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.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_!Np5h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png 424w, https://substackcdn.com/image/fetch/$s_!Np5h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png 848w, https://substackcdn.com/image/fetch/$s_!Np5h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png 1272w, https://substackcdn.com/image/fetch/$s_!Np5h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb796ad6b-93a5-4e71-be21-af8e2fdbd1bb_1999x724.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Diagram showing the final AI workflow to decide on the announcement</figcaption></figure></div><p>Now, some of you might raise a good point: Is this still an AI agent? The final step is just an LLM. That&#8217;s true, and I believe the definition of AI workflows and agents isn't binary; you make tradeoffs along the way. If an engineer decides to use a third-party library or an external automation tool instead of writing code, is he still an engineer? Of course, he is. Similarly, the entire flow is agentic and involves the right context, tools, and memory to achieve the task.</p><h2>Conclusions</h2><p>Building AI agents is definitely fun and satisfying, but it&#8217;s also challenging. Getting them to work in production and provide consistent results is hard. I highly recommend everyone try different frameworks and start today.</p><p>Here are my main learnings along the way:</p><ul><li><p><strong>Start small</strong> - While LinkedIn makes it sound like AI agents are ultra-smart AGIs, reality is different.</p></li><li><p><strong>Test, test, test</strong> - Make sure you have the right framework to test and debug the agent in different scenarios.</p></li><li><p><strong>Anticipate changes</strong> - The agent will change a lot after you first deploy it, so make sure you have the attention to monitor it and think about unique edge cases you wouldn&#8217;t expect.</p></li><li><p><strong>You don&#8217;t always need a hammer</strong> - Sometimes, a simple 4.1-mini LLM step can do the trick. Don&#8217;t force the use of thinking models and complex tooling if the task can be achieved with simpler tools. </p></li></ul>]]></content:encoded></item><item><title><![CDATA[#55 - Domain-driven AI]]></title><description><![CDATA[Why AI Needs Domain-Driven Design to Overcome Language Barriers]]></description><link>https://blog.matangr.com/p/domain-driven-ai</link><guid isPermaLink="false">https://blog.matangr.com/p/domain-driven-ai</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Thu, 10 Jul 2025 20:48:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GNdG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_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_!GNdG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GNdG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!GNdG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!GNdG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!GNdG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GNdG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png" width="665" height="443.4855769230769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b2a81d7-64ff-4671-98ae-eff3bcf95afb_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;:665,&quot;bytes&quot;:2599905,&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.matangr.com/i/168018954?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_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_!GNdG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!GNdG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!GNdG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!GNdG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2a81d7-64ff-4671-98ae-eff3bcf95afb_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><figcaption class="image-caption">Two confused persons stand next to a pipeline with ambiguous words and an LLM above</figcaption></figure></div><h2>Domain-specific LLM</h2><p>AI research companies will need to build large-language models (LLMs) tailored specifically to certain sectors, domains, and industries. This specialization will support high-quality AI agents and drive greater adoption. Soon, we might see models like O4-sales or Sonnet-5-devops. This isn&#8217;t a new idea; it&#8217;s rooted in the principles of domain-driven design.</p><p>It has been more than 20 years since the term <a href="https://www.port.io/glossary/domain-driven-design">domain-driven design</a> was coined, yet I still find it relevant today. To be clear, I read the entire <a href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">book</a> (as challenging as it was).</p><p>One persistent trend is the difficulty we face with language and communication within organizations. That&#8217;s precisely where bounded contexts and a ubiquitous language can help.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!14cD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!14cD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png 424w, https://substackcdn.com/image/fetch/$s_!14cD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png 848w, https://substackcdn.com/image/fetch/$s_!14cD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png 1272w, https://substackcdn.com/image/fetch/$s_!14cD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!14cD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png" width="639" height="395.6502590673575" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:478,&quot;width&quot;:772,&quot;resizeWidth&quot;:639,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&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_!14cD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png 424w, https://substackcdn.com/image/fetch/$s_!14cD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png 848w, https://substackcdn.com/image/fetch/$s_!14cD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png 1272w, https://substackcdn.com/image/fetch/$s_!14cD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f278f6-88cf-4fbc-9cf4-cc7b266bd9d0_772x478.png 1456w" sizes="100vw"></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">Bounded context of Sales &amp; Support (image taken from martinfowler.com)</figcaption></figure></div><p>In the era of AI, these concepts are more relevant than ever. I believe they form a critical part of <a href="https://blog.langchain.com/the-rise-of-context-engineering/">context engineering</a>. We&#8217;ve already learned that good AI output depends heavily on good input. Input, in this sense, includes training data, instructions, additional documents, memory, and more. Yet language, the central component in LLMs, varies significantly between individuals and carries nuances that AI must bridge effectively.</p><h2>Same word, different meaning</h2><p>Let&#8217;s consider two examples</p><h4><strong>First example - Dan from Marketing</strong></h4><p>Dan, a marketing manager, uses GPT daily. One of his goals is to optimize his sales pipeline and automate as much as possible while remaining in the driver&#8217;s seat. He uses prompts like:</p><ul><li><p>&#8220;How can I improve my <strong>pipeline</strong>?&#8221;</p></li><li><p>&#8220;Do we have any new <strong>leads</strong> today?&#8221;</p></li></ul><h4><strong>Second example - Jane from R&amp;D</strong></h4><p>Jane, a senior engineer, uses Claude daily. Her priority is to ensure infrastructure stability, prevent downtime, and maintain fast-paced task execution. She uses prompts like:</p><ul><li><p>&#8220;Why is my <strong>pipeline</strong> taking so long?&#8221;</p></li><li><p>&#8220;Do we have new <strong>leads</strong> on what happened?&#8221;</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hDDV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hDDV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png 424w, https://substackcdn.com/image/fetch/$s_!hDDV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png 848w, https://substackcdn.com/image/fetch/$s_!hDDV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png 1272w, https://substackcdn.com/image/fetch/$s_!hDDV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hDDV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png" width="558" height="554.5508241758242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1447,&quot;width&quot;:1456,&quot;resizeWidth&quot;:558,&quot;bytes&quot;:433617,&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.matangr.com/i/168018954?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.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_!hDDV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png 424w, https://substackcdn.com/image/fetch/$s_!hDDV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png 848w, https://substackcdn.com/image/fetch/$s_!hDDV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png 1272w, https://substackcdn.com/image/fetch/$s_!hDDV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a14e3b0-bd48-4132-93de-e3b48cf189ae_2006x1993.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Dan and Jane asking their LLMs about their pipelines</figcaption></figure></div><p>Both Dan (the marketing manager) and Jane (the senior engineer) use terms like &#8220;<strong>pipeline</strong>&#8221; and &#8220;<strong>lead</strong>.&#8221; Although LLMs are trained to recognize context, effective context engineering means minimizing the chance of misunderstandings by providing high-quality input. Therefore, a clearer prompt might look like:</p><blockquote><p>You are a marketing expert, and your goal is to help me improve my lead pipeline. I work as an SDR at Acme Inc. Our leads mainly come from LinkedIn and visits to our website.</p></blockquote><blockquote><p>I&#8217;m a senior engineer at Acme Inc. Help me improve my infrastructure pipeline to optimize velocity. Be highly technical and creative in your solutions.</p></blockquote><p>Without these clarifications, Dan might unintentionally receive a response about deployment pipelines and CI/CD automation, causing confusion and prompting him to clarify further or switch models.</p><h2>The language barrier</h2><p>Communication remains challenging with AI. This issue is amplified when autonomous AI agents encounter similar misunderstandings and must determine the correct context to reach accurate decisions. As AI agents increasingly operate across diverse domains, <strong>dedicated LLMs for these specific contexts</strong> will become necessary.</p><p>The solution to communication barriers lies in creating a shared language. This is where the concept of ubiquitous language comes into play. For example, an O3-sales model will understand terms like pipeline, lead, and QBR, while a Sonnet-5-devops model will excel in the CI/CD and Kubernetes ecosystems.</p><p>Organizations will face the challenge of clearly identifying their bounded contexts, selecting the models that best match their language, and bridging communication gaps between different departments (and their agents) using &#8220;translators.&#8221; For instance, when a marketing agent discusses a &#8220;<strong>pipeline</strong>&#8221; with a DevOps agent, the system will explicitly clarify what &#8220;<strong>pipeline</strong>&#8221; means within each domain.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bjuc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bjuc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png 424w, https://substackcdn.com/image/fetch/$s_!bjuc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png 848w, https://substackcdn.com/image/fetch/$s_!bjuc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png 1272w, https://substackcdn.com/image/fetch/$s_!bjuc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bjuc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png" width="555" height="525.6490384615385" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1379,&quot;width&quot;:1456,&quot;resizeWidth&quot;:555,&quot;bytes&quot;:465051,&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.matangr.com/i/168018954?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.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_!bjuc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png 424w, https://substackcdn.com/image/fetch/$s_!bjuc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png 848w, https://substackcdn.com/image/fetch/$s_!bjuc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png 1272w, https://substackcdn.com/image/fetch/$s_!bjuc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10f835e2-9856-4174-9a68-84fa646e034f_2055x1946.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Summary</h2><p>The next evolution in communication will focus on improving shared language and terminology between humans and AI applications, and among AI agents themselves. Achieving this will depend heavily on dedicated, domain-aware, industry-specific LLMs.</p><p></p>]]></content:encoded></item><item><title><![CDATA[#54 - Building My First Google Sheets Add-on]]></title><description><![CDATA[The unexpected challenges of building, testing, and publishing a Google Sheets add-on]]></description><link>https://blog.matangr.com/p/building-my-first-google-sheets-add</link><guid isPermaLink="false">https://blog.matangr.com/p/building-my-first-google-sheets-add</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Tue, 27 May 2025 20:12:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_tlp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_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_!_tlp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_tlp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!_tlp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!_tlp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!_tlp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_tlp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png" width="485" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e477f7ce-4048-4309-8a34-5ad36a2affdf_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;:485,&quot;bytes&quot;:2008994,&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.matangr.com/i/164588344?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_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_!_tlp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!_tlp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!_tlp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!_tlp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe477f7ce-4048-4309-8a34-5ad36a2affdf_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><h2><strong>Introduction</strong></h2><p>As part of my latest side-project release, I built and published my first <a href="https://evalkit.matangr.com/">Google Sheets add-on</a>. I wanted to solve a problem I faced while evaluating AI prompts and answers at scale. At first, I thought it would be a quick coding project that would take a few hours. But as I went deeper, I realized the real work wasn&#8217;t in writing the code. It was in testing, debugging, deploying, and publishing it so that others could use it too.</p><p>This post is a look at that process. It&#8217;s about how &#8220;vibe coding&#8221; makes it easier to get started, but taking that code and making it work for others is still complicated. Here&#8217;s what happened along the way.</p><p></p><h3><strong>The Motivation Behind the Add-on</strong></h3><p>The motivation for building this add-on came from my work at <a href="https://www.port.io">Port</a>. I needed to help the team move faster when adding AI features to our site. Specifically, I had to build a prompt for an AI agent and wanted to add example questions and answers for it (evals). </p><p>I did this manually - first writing the prompt, then listing expected questions and ideal answers, and finally running each through ChatGPT to see how it responded. It was a lot of manual work and didn&#8217;t scale when I wanted to test more than five questions. I found myself constantly updating the prompt, checking if the changes worked, and repeating the process over and over.</p><p>I wanted a way to automate this testing and make it easier to understand how well the prompt worked across a bigger set of questions. That was the starting point for this add-on.</p><p></p><h3><strong>What the Product Does</strong></h3><p>The add-on gives you a template in Google Sheets where you can define a prompt, a set of questions, and the expected answers. With a few clicks, it connects to an LLM that acts as a judge, running these questions through the prompt and returning the answers. It then generates a report showing the accuracy and how well the prompt performed.</p><p>The idea is to take what I was doing manually (adding questions, running them through ChatGPT, checking if the answers made sense) and make it scalable and repeatable. Now, instead of testing five questions by hand, I can test 30 or more at once and see a clear report of how each answer compares to what I expected.</p><p></p><h3><strong>Key Challenges and Hurdles</strong></h3><p>The first challenge was figuring out where to build this add-on. I wasn&#8217;t sure if Google Sheets was the right interface or if it should be something completely separate, like a custom app. I knew I needed something that felt like a database but was also flexible and easy to use.</p><p>The second challenge was all the backend work. Once the code was running for me, I had to make it work for others. This meant setting up a Google Cloud Project and dealing with all the permissions and APIs that come with Google Workspace add-ons. It wasn&#8217;t straightforward, and there was a lot of trial and error.</p><p>One thing that added friction was the lack of a native interface of <a href="https://developers.google.com/apps-script">Apps Script</a> (the Sheets code platform) with Claude and Cursor. I had to do a lot of copying and pasting between tools, which was clunky and slowed things down.</p><p>I also ran into an error because I was logged into multiple Google accounts at the same time. It took a few deep research and visiting Stack Overflow to figure out this was a common problem and how to work around it.</p><p>Finally, getting it published in the Google Marketplace was more complicated than I expected. Google&#8217;s review process had its own limitations and took more time than I thought (2 weeks). At each step (building, testing, publishing), I ran into new issues that required me to dig deeper and understand how everything really works.</p><p></p><h3><strong>Exploring Existing Solutions</strong></h3><p>Before deciding to build my own add-on, I looked for existing solutions to see if they could do what I needed. I searched the Google Workspace Marketplace for AI extensions and found a few options, like Claude for Sheets and GPT for Sheets. Some of them had a formula-based approach, while others were more template-driven.</p><p>I installed a few of these add-ons to see how they worked. Some offered basic integrations, but none of them fit my use case without a lot of extra manual work. Some were paid, which I didn&#8217;t want to commit to for a quick experiment. </p><p>The fact that these add-ons existed showed me that the technology was there; it just didn&#8217;t fully solve the problem I had. That gave me more confidence that I could build something better suited to my needs.</p><p></p><h3><strong>Deciding on Google Sheets</strong></h3><p>I decided to build the add-on in Google Sheets because that&#8217;s where I was already doing this work. I was writing questions, expected answers, and running the tests manually in a spreadsheet. Google Sheets was the natural place for it as it&#8217;s a lightweight database and was already part of my workflow.</p><p>Another reason was that I had some experience with Apps Script, which made it easier to add custom functions and logic. I knew I could connect it to external APIs and build the backend around it. </p><p>After testing existing add-ons and seeing they were mostly built on top of Google Sheets, I felt confident that Sheets could be the right platform for my own add-on, too.</p><p></p><h3><strong>Defining the Product&#8217;s Scope</strong></h3><p>At this point, I had a clear picture of what I wanted the add-on to do. I&#8217;d say about 70-80% of the scope was already defined in my head. I needed to let users add a prompt, list questions, and expected answers, and then run them through an LLM to see how well the prompt worked.</p><p>It also needed to create a report that showed how accurate the responses were, so I could see if prompt changes actually improved the results. I didn&#8217;t want it to be complicated and instead be just a few simple steps to go from a rough prompt to a clear evaluation.</p><p>From there, the plan was to iterate: build something simple, test it myself, and then see what else was needed to make it work for others.</p><p></p><h3><strong>The Development Timeline</strong></h3><p>The timeline for building this add-on was pretty straightforward, though not without its hiccups. I started by exploring if there were any similar add-ons already in the Marketplace. Once I confirmed that nothing fit my needs, I started working on a rough prototype using Google Apps Script.</p><p>I worked with Claude to help write and refine the initial code. After that, I iterated on the structure and logic until I had something that worked for me. At that point, it was about 70-80% done in terms of the core logic.</p><p>From there, the focus shifted to getting it ready for others to use. This meant setting up the Google Cloud project, configuring APIs, and dealing with all the backend details that aren&#8217;t obvious at first. I also did some real-world testing with additional accounts to make sure everything worked as expected.</p><p>The final push was preparing it for publication in the Marketplace. That part took the most time, mainly because of Google&#8217;s review process and some unexpected requirements that came up from it.</p><p></p><h3><strong>Testing and Debugging</strong></h3><p>Once I had the core logic in place, I started testing it with more questions and different prompts to see how well it worked. Running tests manually was easy at first, but it got more complicated as I added more questions and tried different LLMs.</p><p>A big part of testing was checking how the LLM handled the questions and how close the answers were to what I expected. I found a few bugs right away: some answers weren&#8217;t being parsed correctly, and some of the logic in comparing answers didn&#8217;t work the way I wanted.</p><p>Debugging was about going step by step and making sure each part did exactly what it was supposed to. Sometimes that meant adding new functions in Apps Script, and sometimes it meant tweaking the API calls to make sure they were giving back the data in the right format.</p><p>Even small changes in the prompt or in how the LLM was called made a difference in the results. So I spent a lot of time going back and forth, changing one thing at a time to see what worked best.</p><p>Besides the prompt, I also fixed issues around rate limiting, clearer error handling, and made the user interface more consistent and appealing.</p><p></p><h3><strong>Publishing the Add-on</strong></h3><p>After testing and fixing bugs, the next step was to publish the add-on in the Google Workspace Marketplace. I thought it would be a quick step; just filling in some forms and clicking &#8220;Publish.&#8221; But it turned out to be more complicated than expected.</p><p>First, I had to learn how Google Cloud actually works. That meant spending over an hour researching how to set it up, including watching three different YouTube videos to make sure I didn&#8217;t miss anything. There were settings in the Google CLOUD that didn&#8217;t have clear documentation, and I spent time figuring out how to make the add-on accessible to others without giving away too many permissions.</p><p>Then, I had to record a demo and fill out all kinds of details I hadn&#8217;t thought about before. The first feedback from Google was about the scopes I was using and instructions to avoid certain scopes to get approved. It took three rounds of submissions before I got a link to a much simpler way of dealing with permissions. None of the LLMs I was using had been able to figure that part out.</p><p>As part of publishing, I also needed a landing page for the add-on. I built that using <a href="https://bolt.new/">Bolt</a>, but deploying it to my domain through Netlify wasn&#8217;t straightforward. It required a more complicated DNS setup that took some extra time to figure out. This alone took three days.</p><p>In the end, publishing took longer than the actual coding and testing (around two weeks). But once it was done, the add-on was live in the Marketplace and ready for others to use.</p><p></p><h3><strong>Lessons Learned</strong></h3><p>This project reminded me that building something useful is more than just writing code. While vibe coding made it easier to get started, making it work for others required real curiosity and a deep understanding of the tools and systems involved.</p><p>Testing and debugging were harder than expected. Even small changes in the prompt or the API calls changed the results in ways I didn&#8217;t always expect. The process of making sure everything worked smoothly&#8212;and worked the same way for other people&#8212;took time and effort.</p><p>Publishing was the biggest surprise. I had assumed it would be just a few clicks, but it turned out to be a real project on its own. Understanding Google&#8217;s requirements and going through their review process made me realize that sharing your work is its own skill.</p><p>In the end, the most important lesson was that while it&#8217;s easier than ever to start building, taking something from &#8220;just built&#8221; to &#8220;ready for real users&#8221; still takes real work. </p><p>Similar to my <a href="https://blog.matangr.com/p/53-building-an-mcp-server">MCP building experience</a>, with software, the unknown is always much larger than the known. But that&#8217;s also the beauty and challenge of it!</p>]]></content:encoded></item><item><title><![CDATA[#53 - Building an MCP Server]]></title><description><![CDATA[The unexpected challenges of building, testing, and deploying an MCP server&#8212;and what I learned along the way.]]></description><link>https://blog.matangr.com/p/53-building-an-mcp-server</link><guid isPermaLink="false">https://blog.matangr.com/p/53-building-an-mcp-server</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Tue, 11 Mar 2025 18:46:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!C8_8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.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_!C8_8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C8_8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C8_8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C8_8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C8_8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C8_8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg" width="389" height="500.14285714285717" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1872,&quot;width&quot;:1456,&quot;resizeWidth&quot;:389,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!C8_8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C8_8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C8_8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C8_8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F325e89e3-4a5a-49b3-ac0f-2a3c30ecc8bc_1792x2304.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></figure></div><h2>Introduction</h2><p>Over the past month, I&#8217;ve come across the term MCP multiple times&#8212;first in internal discussions with my team, then on LinkedIn, and finally in recent product release notes. Since my team and I are actively working on building AI agents, I figured it was worth exploring to see what the hype is all about. I decided to share my experience with adding, using, and eventually building an MCP server.</p><h2>What is an MCP?</h2><p>A quick Google or ChatGPT search would probably provide an answer, though I have to admit I was surprised that Claude&#8212;Anthropic&#8217;s own AI, the company that actually introduced MCP&#8212;didn&#8217;t recognize the term.</p><p>In short, MCP is a protocol that enables AI agents to interact with third-party tools. For example, an AI assistant could fetch data from Jira to answer questions about open issues or even send a Slack message on your behalf. It acts as a bridge, allowing AI to extend its capabilities beyond just text-based responses and custom-built tools.</p><h2>What Is It Good For?</h2><p>The first thing I did was look for existing MCP servers I could connect to and see how they might be useful. The easiest place to start was the Claude, as it's the most straightforward LLM to integrate MCP into. I began by setting up a weather server using the sample instructions. This allowed me to ask Claude about the future weather forecast, and it would retrieve and provide the data. Nice, but not groundbreaking&#8212;any LLM with web search capabilities could do the same.</p><p>Next, I moved on to installing the Slack MCP server. To test its usefulness, I gave Claude the following prompt:</p><blockquote><p>"I used to check the Product Team channel daily to see if there were any updates I needed to address. Could you do that for me and summarize any pending action items?"</p></blockquote><p>After a few searches and attempts&#8212;done entirely on its own&#8212;Claude provided a summary. It informed me that I had missed five messages and that there was one key action item requiring my attention. Now that was starting to feel genuinely useful.</p><p>Taking it a step further, I then asked Claude:</p><blockquote><p>"Could you reply in the thread to the message that requires my attention with my response?"</p></blockquote><p>I provided my response, and Claude handled the rest. In just about three minutes, I reviewed my morning updates in a Slack channel, identified key action items, and even responded&#8212;something Claude also helped me formulate. Now <em>this</em> was productivity.</p><h2>Exploring MCP Servers and Their Potential</h2><p>Browsing through different MCP server directories, you&#8217;ll find a variety of integrations&#8212;GitHub, Linear, AWS, Notion, and more. Think of it as a library of APIs, but one that doesn&#8217;t require you to write code or fully understand API contracts. Instead, your AI assistant can integrate with these services, fetch data, and take action on your behalf.</p><p>Consider some practical use cases:</p><ul><li><p><em>"I have this PRD in Notion&#8212;here&#8217;s the link. Can you review it and suggest improvements?"</em></p></li><li><p><em>"This is an EPIC in JIRA, and we're building a test plan for it. Can you suggest five test cases for each user story?"</em></p></li></ul><p>MCP cuts the need to manually navigate APIs by simply issuing natural language commands. It makes AI-driven workflows significantly more accessible and efficient.</p><h2>Building My First MCP Server</h2><p>When speaking with key customers about interacting with AI agents, a common theme kept emerging: <em>meet developers where they work.</em> We repeatedly heard requests for <strong>VS Code extensions, plugins, or even Slack apps</strong>&#8212;tools that seamlessly integrate into existing workflows.</p><p>The MCP server presented itself as a potential quick win, allowing us to connect Cursor and support GitHub Copilot while integrating our platform into these developer-centric tools. Imagine interacting with our product over the platform with simple queries like:</p><ul><li><p>"What was the latest PR merged in the payment repository?"</p></li><li><p>&#8220;Why is this service failing to meet the desired security standards? Suggest action items&#8221;</p></li></ul><p>That alone is useful, but doing it <em>directly from your IDE</em> while connecting to other servers? Now that&#8217;s a <strong>real</strong> productivity boost.</p><h2>Figuring Out Where to Start</h2><p>Anthropic provides a quick start guide&#8212;which, to be honest, isn&#8217;t all that <em>quick</em> to start with. It took me some time to go through example repositories, review open-source code, and have multiple conversations with both Claude and ChatGPT before I finally settled on an approach.</p><p>I decided to use two example repositories as a foundation and worked with Claude to generate the initial boilerplate code. From there, I ensured my server's structure followed best practices, particularly for a Python-based MCP server.</p><p>Writing the core logic for the MCP server, given the boilerplate, wasn&#8217;t particularly complex. I even leveraged the recently published PyPort SDK, which made the process fairly straightforward.</p><p>The only real challenge came from the fact that the AI agent now operates asynchronously. Instead of simply handling a POST request via a REST API, the flow became slightly more involved. However, even with this added complexity, the implementation itself was still manageable and took no more than <strong>20 minutes</strong> to complete.</p><p>The real challenge? <strong>Testing and deploying it.</strong></p><h2>Testing and Debugging</h2><p>Following the MCP server documentation, I configured the server to run and connect it to either Claude or Cursor. However, when I first attempted this, I kept running into errors&#8212;the server simply wouldn&#8217;t start.</p><p>One key difference between the two tools is Claude&#8217;s built-in logging interface, which stores logs from the initialization process. Cursor doesn&#8217;t provide the same level of visibility. This meant I spent about an hour manually copying logs from Claude, pasting them into Cursor, and debugging the issues.</p><p>Ultimately, the problem boiled down to how the MCP server handles authentication arguments and environment variables. I later discovered that many others struggle with this as well, and some directories are even trying to bypass the issue by offering managed MCP servers that take care of authentication and configuration for you&#8212;like Composio.</p><p>How did I finally figure out the solution? Using OpenAI's deep research feature, which identified a very niche suggestion in a Reddit thread.</p><p>The feeling of asking Claude or Cursor a question and seeing it successfully trigger the AI agent we built was <em>enormous</em>&#8212;a mix of excitement and relief. It was a clear validation that everything was finally coming together.</p><p>With the server working, I was ready to publish it. However, it turned out to be more time-consuming than expected&#8212;taking even longer than the actual building and testing process.</p><h2>Publishing the MCP Server</h2><p>When looking at how other MCP servers were built, I decided to package mine using uv, Python&#8217;s package manager. I already knew the installation command, but I relied on Claude to walk me through the steps to properly package and publish it.</p><p>The process was relatively straightforward:</p><ol><li><p>Create a PyPI account.</p></li><li><p>Register the package.</p></li><li><p>Bundle it with a uv.lock file.</p></li><li><p>Run a series of packaging and publishing commands.</p></li></ol><p>That was it&#8212;or so I thought.</p><p>Similar to the testing challenges, when running commands via Claude and Cursor, the server failed to initialize due to authentication and environment variable issues. After hours of debugging logs and iterating, I decided to switch from environment variables to passing arguments directly. This was mainly due to Cursor&#8217;s limitations in handling environment variables during installation (which Composio for example solves).</p><p>Finally, after several iterations, it worked! The MCP server was now published, and others could install it.</p><p>But publishing it for myself was one thing&#8212;getting others to successfully use it was another challenge entirely.</p><p>To ensure it&#8217;s production-ready, I worked with two colleagues to test the installation process using the same commands I had documented.</p><ul><li><p>First test: A small typo in the installation instructions caused an issue, but after fixing it, everything worked smoothly.</p></li><li><p>Second test: This one was more challenging. As package managers and different Python versions were already defined, we had some compatibility issues.</p></li></ul><p>To resolve this, I turned to Claude once again and created a shell script that automates the setup, making it easier for others to install and configure the server without running into environment conflicts.</p><p>With that, I could finally consider my work done&#8212;our MCP server was built, tested, published, and ready for others to use.</p><h2>Lessons learned</h2><p>This experience reinforced the power of AI-assisted development and how much ownership product managers can take over technical solutions. My main takeaways include:</p><ol><li><p><strong>AI is not a magic bullet</strong>: Complex problems still require deep research, trial and error, and critical thinking.</p></li><li><p><strong>Testing and deployment were the hardest parts</strong>: Cursor offered little support, requiring multiple iterations before success.</p></li><li><p><strong>Making it work for others is a different challenge</strong>: Enterprise users expect stability, and ensuring compatibility across environments is not trivial.</p></li></ol><p>Despite the challenges, this was a fun and rewarding experience, proving that even new, uncharted technologies can be tackled and brought to life.</p>]]></content:encoded></item><item><title><![CDATA[#52 - Wearing a Developer’s Hat for a Few Weeks]]></title><description><![CDATA[Lessons from developing an internal tool to integrate systems]]></description><link>https://blog.matangr.com/p/wearing-a-developers-hat-for-a-few</link><guid isPermaLink="false">https://blog.matangr.com/p/wearing-a-developers-hat-for-a-few</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Sun, 26 Jan 2025 12:46:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bPNc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp" 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_!bPNc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bPNc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!bPNc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!bPNc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!bPNc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bPNc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp" width="372" height="372" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26b7d339-fc69-4637-abfe-d60f57d4e653_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;:372,&quot;bytes&quot;:48038,&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_!bPNc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!bPNc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!bPNc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!bPNc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26b7d339-fc69-4637-abfe-d60f57d4e653_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><h2>Introduction</h2><p>Some time ago, I wrote about <a href="https://blog.matangr.com/p/why-you-need-to-code-434ee5ed7e3b">why product managers need to code</a>. However, it wasn&#8217;t a deep dive; it was more of a tip or a suggestion. Recently, I took on a task for an internal tool improvement and built it from scratch. From this experience, I learned a lot about what it means to develop something, and how to better understand developers. In this post, I will share a deep dive into the process I went through, as well as the lessons I learned.</p><h2>Task background</h2><p>To keep things simple, the task was about integrating data between two third-party services. In one system, our product team manages customers&#8217; feature requests and general feedback. The other is our company&#8217;s CRM that houses all our customer data. The goal was to create better views and a smoother management experience for feature requests in the context of customers. </p><p>For example, being able to see, for each company, which feature requests they submitted, as well as identifying the top feature requests by total company votes and ARR (annual recurring revenue). This context cannot be achieved easily&#8212;if at all&#8212;in the existing product where we manage our feature requests. The task was about integrating the data so we could create these views.</p><h2>Lessons learned</h2><p>As the post will explain, this project took longer than I originally planned (and so did writing about it). For that reason, I&#8217;m including the lessons I learned upfront:</p><ol><li><p><strong>Development is Iterative - </strong>Each cycle revealed more about the scope, limitations, and allowed me to refine my estimations. What I imagined before starting was vastly different from what it became by the end.</p></li><li><p><strong>Estimation vs. Reality - </strong>Estimating is easy; being accurate is almost impossible. Focusing on the scope, goals, desired state, and making tradeoffs along the way was the best way to influence the timeline.</p></li><li><p><strong>Balancing Perfection and Delivery - </strong>Owning a project makes you want to perfect it, but it&#8217;s a challenge to balance releasing something fast that works&#8212;even with potential flaws&#8212;against the desire for perfection.</p></li></ol><h2>POC</h2><p>The POC stage was about validating what was possible and what it would require from a technical point of view. Since I needed to work with two third parties, the first step was to obtain access to each, understand their API documentation, and see if I could interact with their APIs. Luckily, for one of them, I was already familiar with its API, so that part was pretty straightforward. For the CRM, I had no prior experience. I needed to work with our CRM manager to get access and some basic knowledge, and then, using GPT and their API documentation, I was able to authenticate with their API.</p><p>The next step was to identify what I actually needed to do: what data to map, which objects to handle, how the data related to one another, and how to address duplication issues, among other things. At this point, I didn&#8217;t know all the open issues or questions, but that was acceptable for a proof of concept, where the main goal was simply to confirm that I could integrate with the two APIs and move data from A to B.</p><p>I also looked for an SDK for each API and successfully found one for the CRM. That came in handy when I needed to create a more complex integration. I finished this step with a better understanding of feasibility and started to get a sense of the scope of the task.</p><h2>Technical design</h2><p>At the POC stage, everything was local in my own repository and didn&#8217;t include any integration with existing infrastructure. In reality, the integration needed to sit somewhere, which meant a service had to host it and run it on the schedule we decided. The goal of the technical design phase was to determine the best way to integrate the two systems within our current infrastructure, now that I had confirmed they could be integrated.</p><p>I started by getting access to our development repository and discussing the best flow with the DevOps team. They suggested creating a specific folder for the code and using a GitHub workflow. This setup also dictated how the code should be built, what it should consume and output, and provided insights on troubleshooting and optimization I might need to include down the line to detect any issues.</p><p>This step was relatively short&#8212;taking a little more than a day. Looking back, I believe I was only about 10&#8211;15% of the way through completing the entire task at this point.</p><h2>The first development iteration</h2><p>Now the fun begins. I got access to the repository, created my own branch, and started developing the integration. I won&#8217;t go over every step in detail, but I will note that I relied heavily on Cursor&#8212;the Chat, the Composer, and the Agent&#8212;which was probably the main enabler for completing this task in a reasonable timeframe.</p><p>The scope of the first iteration was the &#8220;happy flow.&#8221; I didn&#8217;t focus on performance, optimization, error handling, or duplication yet. Instead, I just wanted to validate that what worked in the POC would also work in the real environment. Concretely, I took around 10 feature requests from the feature request system and synced them one by one to the CRM without any optimization, mostly relying on debug logs.</p><p>Looking back, this step was one of the hardest because it established the infrastructure and assumptions for future use cases. The decisions I made here affected later iterations, even though I could have refactored further down the line&#8212;but it would have been harder as the code got more complicated than I thought.</p><h2>Identifying missing use cases</h2><p>Once the integration was up and running, I started to notice various missing use cases. A feature request might already exist in the CRM, and I might need to update it rather than just create a new entry. Simply creating a feature request wasn&#8217;t enough&#8212;I also needed to associate it with the company and the user who submitted it. Sometimes, when pulling a feature request from a third party, certain fields are null, which can cause errors.</p><p>Moreover, some parts of the code were not optimized. Running on 10 feature requests took about half a minute, which could translate to hours for an entire database. This was just the tip of the iceberg, and I didn&#8217;t have any organized requirements document. Instead, I shared daily updates via a Slack channel, always including the next steps or tasks I identified. The more I worked, the more additional scope I found.</p><p>The first iteration was successful in that it worked, proving I had the skills to move forward. However, it was clear that I needed to continue implementing these missing use cases.</p><h2>The second development iteration</h2><p>The second iteration focused on implementing the missing use cases and preparing the integration for production readiness. This involved optimizing network requests to avoid rate limits, properly logging errors, and adding visibility into the process. If I&#8217;m integrating two third-party tools daily without knowing what actually happens&#8212;even if everything appears successful&#8212;it&#8217;s bound to become a problem later.</p><p>During this phase, while I still relied heavily on Cursor, I noticed its limitations as the codebase grew larger and more complex, containing multiple files and modules. For example, when I wanted to implement a new flow, Cursor often rushed into suggestions that didn&#8217;t align with my technical vision. To address this, I had to revisit my prompting techniques. I made sure to ask it to thoroughly analyze the code, understand the business logic, and treat the flow as intended. When needed, I corrected it and refined the prompts until we reached a decision together on the implementation.</p><p>As the code and business logic became more intricate, I had to get more involved in verifying everything worked as expected. This included regularly running end-to-end tests and executing the code from scratch to ensure nothing broke. By the time I completed this step, I believe I was 70&#8211;80% done. The integration was running, optimized, and included monitoring and logging for processing larger batches of feature requests end-to-end.</p><h2>Unit tests</h2><p>Unit tests are designed to test individual modules or functions in isolation, without running the full flow or interacting with third-party services. For example, I had to write business logic to extract the domains of users who voted on a feature request, filter for unique domains, and sync those to the CRM. This is a self-contained module that could be tested independently of the rest of the code.</p><p>For such cases, I built unit tests. I had to consider various scenarios: multiple domains, a single domain, missing email fields, and more. This ensured the code was resilient and handled errors while adhering to the business logic. While I manually tested these cases earlier, unit tests served as a fail-safe, catching unexpected issues that could arise later.</p><p>Although I wrote unit tests throughout the process, at this point, I paused to ensure that all internal functions and modules were properly tested. I also added some basic testing for external interactions by mocking third-party services. While mocking is inherently limited, it allowed me to have at least some safeguards in place. This became particularly important as the codebase grew more complex, and I wanted to ensure I wasn&#8217;t overlooking anything.</p><h2>Finalizing the desired scope</h2><p>The final step was about clarifying the deliverables based on everything completed so far. This meant solidifying decisions such as running the integration in a GitHub Workflow, printing a summary of how long the process took, breaking down the actions performed, and sending this summary to a Slack channel. It also included defining the scope we could handle, understanding the system&#8217;s limits, specifying which fields we would sync, identifying the environments we would work on, and so on.</p><p>While most of this had already been implemented, this step was about scoping and finalizing what would eventually reach production. It gave me clarity and confirmed that I was around 80&#8211;90% ready with the code.</p><h2>The third development iteration</h2><p>The third development iteration was simpler and shorter, with what I can only describe as a miracle. When I ran the dry run for the first time, it encountered a bug or two, which I managed to solve within two or three hours. And that was it&#8212;it worked. I was quite amazed at how smoothly it went.</p><p>I repeated the process several more times, using different variations, and it continued to perform as expected. At this point, it was time to finalize everything and align it with the infrastructure. This included building the GitHub workflows, ensuring everything worked locally, and beginning preparations for production deployment.</p><h2>End-to-end testing</h2><p>At this stage, I wanted to test the integration from a local instance using the production environment. My assumption was that if it worked in the sandbox, it should work in production as well. Unsurprisingly, it failed. There were notable differences between the sandbox and production environments, such as discrepancies in IDs, schema variations, and differences in how the environments were structured.</p><p>To address these issues, I worked closely with our CRM manager to resolve the discrepancies. In some cases, I had to adjust the code to account for differences between the two environments. Each fix was accompanied by linter checks, unit tests, and end-to-end testing on both environments.</p><p>While this process took longer than expected, by the end of it, the main code was stable and ready for the next step.</p><h2>Bug fixes</h2><p>At this point, I faced a dilemma&#8212;a trade-off between perfection and speed. On one hand, I wanted the code to be perfect: well-structured, clear, simple, and thoroughly tested. On the other hand, there was a push for a shorter time to market. I realized this is a common challenge for engineers. Once a feature is released, attention typically shifts to the next task, and unless there&#8217;s a critical bug, the released code might not get revisited.</p><p>Despite the pressure, I chose to invest time in improving the code during this phase. I focused on making the code more readable, ensuring there were enough logs to identify and fix potential bugs, and testing thoroughly. This phase also revealed bugs that weren&#8217;t apparent earlier. For example, just a day before the code was set to reach production, I discovered a critical issue: when updating a specific object, it didn&#8217;t work as expected and caused undesired behavior in the CRM.</p><p>Through this experience, I learned that finding bugs early is often more difficult than fixing them. This phase was dedicated to properly testing, fixing bugs, and covering as much ground as possible to ensure the code was production-ready.</p><h2>Monitoring and visibility</h2><p>Monitoring&#8212;particularly visibility into what the code is doing&#8212;was a concern throughout the process, but by this point, I adopted a more structured approach to ensure the application&#8217;s actions were well-documented and communicated. Ultimately, this meant refactoring parts of the code to ensure the statistics were accurate and building a system that relied heavily on tracking and reporting the integration&#8217;s operations.</p><p>I implemented a feature to send detailed summaries as Slack messages. These messages included key metrics such as the time taken for the process, the number of API requests, and the objects identified, created, or updated. Without this step, no one would have known what the application was doing, leading to potential assumptions that it wasn&#8217;t functioning properly.</p><p>Adding visibility not only provided transparency but also gave me valuable insights into the system&#8217;s behavior&#8212;such as update frequency, latency, and the overall performance of the code.</p><h2>Preparation for production</h2><p>In preparation for production, I performed a final full sync between the systems using the production environment and shared the results with key stakeholders, including the CRM manager, product team, and GTN teams, for review. While the code wasn&#8217;t technically on production yet, the data was live. I ran the next couple of syncs locally from my computer to catch errors early before fully transitioning to production.</p><p>This phase highlighted a familiar challenge for me: navigating the process of integrating code into the main branch (where the production code lives), the Pull Request process (requesting approval for the code integration), and understanding where everything fits. I had to ask a team leader where to place the code, realize I lacked the necessary permissions for the repository, request those permissions, and deal with a new repository structure that differed from what I was used to.</p><p>Once the code was in the correct location, I built the GitHub workflow file (a format to automate tasks within the repository). Here, I encountered another challenge&#8212;there&#8217;s no effective way to test a GitHub workflow file until it&#8217;s already on the main branch. This meant going through the pull request review process. Since this was for an internal tool that didn&#8217;t impact customers, the review process was relatively quick and lean. However, I know many developers face lengthy review cycles with numerous comments, sometimes taking days or even weeks. I got lucky this time&#8212;my code was approved and merged into production.</p><p>Even though the code was on production, it didn&#8217;t work perfectly yet. I spent a few more hours iterating, ensuring everything functioned as intended, including secrets management, Slack notifications, and the complete working process.</p><h2>Launch</h2><p>Launching the new process and integration was straightforward. An automated process now runs every few hours, syncing data between the two third-party systems. It also sends a clear message summarizing its actions, making monitoring effortless. Internal teams quickly noticed the improvement and provided very positive feedback, along with suggestions for further enhancements. It was a gratifying moment to see the results recognized and appreciated.</p><h2>Monitoring for performance and stability</h2><p>The maintenance phase has just begun, but for this type of internal tool, I&#8217;m confident we have the basics in place to monitor performance and stability. I&#8217;ve also started maintaining a to-do list of improvements I&#8217;d like to make in the code. Whether I&#8217;ll get to those items remains uncertain&#8212;probably about as likely as any other developer addressing their personal backlog of desired code refinements.</p><p>That said, this project has been a great experience. Not only did it allow me to promote and deliver a successful side project, but it also made a meaningful impact for the broader teams.</p>]]></content:encoded></item><item><title><![CDATA[#51 - Succeed by Taking One Step at a Time]]></title><description><![CDATA[How I almost lost an entire project by working in large batches, and lessons learned]]></description><link>https://blog.matangr.com/p/51-succeed-by-taking-one-step-at</link><guid isPermaLink="false">https://blog.matangr.com/p/51-succeed-by-taking-one-step-at</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Tue, 07 Jan 2025 06:41:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OVtp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin" 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_!OVtp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OVtp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin 424w, https://substackcdn.com/image/fetch/$s_!OVtp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin 848w, https://substackcdn.com/image/fetch/$s_!OVtp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin 1272w, https://substackcdn.com/image/fetch/$s_!OVtp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OVtp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin" width="487" height="487" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:487,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;output&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="output" title="output" srcset="https://substackcdn.com/image/fetch/$s_!OVtp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin 424w, https://substackcdn.com/image/fetch/$s_!OVtp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin 848w, https://substackcdn.com/image/fetch/$s_!OVtp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin 1272w, https://substackcdn.com/image/fetch/$s_!OVtp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c7e18d5-4ead-4e48-b6bf-aacb5ff1019c_1024x1024.bin 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><h2><strong>Introduction</strong></h2><p>There is a famous Israeli movie that has the quote: &#8220;Start as fast as you can, and gradually pick up the pace.&#8221; I want to tell a story about how the exact opposite happened to me and what I learned.</p><h2><strong>My side project experience</strong></h2><p>I worked on an interesting side project in Python. For the first day or two, I started with small PRs and small commits&#8212;one or two files at a time&#8212;always making sure the functionality was there and the code was tested. However, at some point, I needed to revamp everything to reach a viable version, my V1. </p><p>To do that, I needed more functionality, modules, and an improved project structure, and every step I took broke something else. If I changed the structure, the tests failed. If I improved the tests, I found issues in the source code. This back-and-forth went on for two or three days, touching around 15 files that completely changed the project&#8217;s structure. Moreover, all the changes were only in my local history&#8212;in my local branch, not in the remote one. I didn&#8217;t push the code at all. </p><p>Finally, when I reached a working state, I tried pushing my code, but I had a small violation around a file that should have been added to <code>.gitignore</code>. Unfortunately, it was already committed to my local branch. For those who don&#8217;t swim in the technical details, this practically means I couldn&#8217;t sync what I had on my computer with what I wanted in my GitHub repository. </p><p>I wasn&#8217;t sure how to fix that, and while experimenting with changes, I ended up reverting all the work done in all the files since the last push to the remote branch. Yes&#8212;<strong>two or three days of work were practically lost</strong>.</p><p>After a few conversations with Chat GPT and pulling my hair out (not that I have much), I found a Stack Overflow post in the nick of time. It explained a somewhat cumbersome but achievable way to restore everything from my local history in VS Code. Long story short, my project is now up and running, and I managed to overcome this huge risk of losing everything I did.</p><h2><strong>Lessons learned</strong></h2><p>I believe the main lesson here is about the <em>Big Bang</em> approach. Even though I started small&#8212;and recalling the phrase about running as fast as you can&#8212;I tried to build the best version that worked, but it came with a huge risk. I don&#8217;t think this applies only to code or projects in general; I can think of several areas it might affect. </p><p>Working in iterations, providing small changes, and keeping short feedback loops can benefit many situations. This experience strengthened that belief for me.</p><h2><strong>Practical example</strong></h2><h3><strong>Feature release</strong></h3><p>As product managers, we discuss features and their scope a lot. We always try to balance bringing some value to the customer with making a version that&#8217;s relatively easier to build and release. However, we don&#8217;t always consider the milestones along the way, even if they don&#8217;t reach the user.</p><p>For example, imagine a feature around creating a new marketplace for applications in a B2B SaaS product. The final release might include a marketplace page with lists of apps, integrations, and some install mechanism. Maybe that&#8217;s the minimum viable version for customers. But to avoid a Big Bang, show progress, mitigate risk, and boost morale, you need milestones that have significant impact&#8212;even if they&#8217;re internal. </p><p>Maybe the first milestone is showing how a single integration installs (available only to internal employees). Then the next milestone might be showing the marketplace page with just one integration. It could take another month to add the ten integrations you ultimately need, but everyone can see incremental progress, give feedback, and stay engaged throughout.</p><h3><strong>Projects</strong></h3><p>Sometimes we have large projects at work that involve different departments and have ambitious goals. We must work backward with first principles in mind, identifying the next checkpoint and ensuring each milestone is acceptable. One example is a company restructuring its organization. One option is for leadership to go off-site, figure everything out, and announce it in one Big Bang. In certain cases, that makes sense. </p><p>However, in most cases, you want to onboard employees, gather feedback, and engage everyone. The way to do that is by short feedback loops and small iterations. Perhaps you start by sharing the goals and current pains. Then you gather feedback on that. Next, you show the plan for achieving the new structure&#8212;what meetings you&#8217;ll have, what decisions need to be made. By the time you finalize the structure, employees feel more connected and informed.</p><h3><strong>Personal skills</strong></h3><p>It&#8217;s easy to say, &#8220;I&#8217;m going to learn a new language,&#8221; or &#8220;I want to code.&#8221; When the end goal is far away, it&#8217;s hard to stay engaged and motivated. Thinking back to my project experience and almost losing my code, imagine learning a new language: the first milestone might be counting from one to twenty and sharing it with someone (like syncing to a remote branch). Then maybe you learn how to order a coffee in that language and actually do it at a coffee shop. Keeping these small milestones and feedback loops ensures you spot errors&#8212;like a wrong accent or approach&#8212;early on, not at the very end.</p><p><strong>Closing thoughts</strong></p><p>While all of these examples sound obvious, I personally failed to follow them in my project, and I&#8217;ll likely slip up in my professional life too. Still, this has been an important lesson for me, and I hope it helps others. </p><p>Coming back to the famous Israeli movie, I want to claim that the way to succeed is by <strong>consistently taking one step at a time.</strong></p>]]></content:encoded></item><item><title><![CDATA[#50 - Is AI A Faster Horse or the Next Tesla?]]></title><description><![CDATA[How Generative AI is Transforming Technology, Business Models, and Our Approach to Problem-Solving]]></description><link>https://blog.matangr.com/p/50-is-ai-a-faster-horse-or-the-next</link><guid isPermaLink="false">https://blog.matangr.com/p/50-is-ai-a-faster-horse-or-the-next</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Wed, 18 Dec 2024 20:19:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ub7F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin" 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_!ub7F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ub7F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin 424w, https://substackcdn.com/image/fetch/$s_!ub7F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin 848w, https://substackcdn.com/image/fetch/$s_!ub7F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin 1272w, https://substackcdn.com/image/fetch/$s_!ub7F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ub7F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin" width="476" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65145519-9b01-4427-a963-75180e49114a_1024x1024.bin&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:476,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;output&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="output" title="output" srcset="https://substackcdn.com/image/fetch/$s_!ub7F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin 424w, https://substackcdn.com/image/fetch/$s_!ub7F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin 848w, https://substackcdn.com/image/fetch/$s_!ub7F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin 1272w, https://substackcdn.com/image/fetch/$s_!ub7F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65145519-9b01-4427-a963-75180e49114a_1024x1024.bin 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><h2>The dilemma</h2><p>AI in general, and GenAI specifically, are common trends and buzzwords. Recently, I was involved in several discussions about how to treat them in our roadmap. For example, a theme like &#8220;<em>Add AI to the produc</em>t&#8221; is poor as it discusses the solution without any context regarding the problem. Alternatively, using AI to solve a theme like &#8220;<em>Improve retention</em>&#8221; could make it seem as though AI is treated as a side project.</p><p>So, what should we do? Should we take the problems we identified so far and see where AI might help? Or should we focus on AI and discover whatwe can do with it?</p><p>To address this question, I drew on Henry Ford&#8217;s analogy.</p><blockquote><p>If I had asked people what they wanted, they would have said faster horses.</p></blockquote><p>AI, in this case, is like building a car&#8212;a transformative technology that changes the market entirely. However, I&#8217;m not a fan of clich&#233;s. Instead of stopping here, I decided to look at other technology trends to understand how they fit into this perspective and how to resolve my conflict. </p><h2>Technial references</h2><h3>Microservices vs. Microfrontend</h3><p>Microservices are something I see as disruptive technology. In the old days, everything was monolithic. Software products had one codebase. All the code was in one repository, and everyone contributed to that codebase. Eventually, that codebase would turn into the final product for the customer.</p><p>Microservices approached the complexity and maintenance challenges of monoliths in a completely different way. They abstracted the dependency and collaboration challenges by allowing the creation of multiple services, each focused on a specific context with limited ownership, while communicating with other components through defined interfaces.</p><p>This solved the problem but created an entirely new market. Suddenly, companies had tens or even hundreds of microservices to maintain. This shift required new infrastructure, new ways for services to communicate with one another, and new skills for developers. Previously, developers didn&#8217;t need to deploy or create new services&#8212;those were already part of the monolithic system. Now, developers had to manage things like service-level agreements (SLAs) and figure out how services should communicate effectively, such as through REST APIs.</p><p>Micro frontends, on the other hand, are more of an optimization than a disruption. They take the principles of what microservices achieved on the backend and apply them to the frontend. With this approach, codebases are simpler, and teams are more independent in deploying and utilizing the tech stack they want.</p><p>However, the challenges remain largely the same. While microfrontends solve similar problems slightly better, they don&#8217;t open up entirely new markets or business models the way microservices did. Instead, they represent an incremental improvement in managing complexity rather than a foundational shift.</p><h3>Internet and cloud computing</h3><p>Looking in a different direction, the Internet itself was arguably one of the most disruptive technologies ever, opening up an entirely new world of possibilities. However, advancements like 4G and 5G, while impressive, are incremental improvements. They enhance the existing infrastructure by providing faster Internet and greater accessibility, but they don&#8217;t change the market.</p><p>Cloud computing, on the other hand, represents a critical shift that reshaped the industry. Before its introduction, launching an online business or offering software came with the significant overhead of purchasing and maintaining infrastructure, such as servers and physical machines. This was a major blocker for many businesses.</p><p>Cloud computing removed this problem entirely, introducing a new way of working. In just a few minutes, you can now have a virtual server hosting your solution anywhere in the world. This transformation reduced entry barriers and created a new type of business.</p><h2>How to identify a disruptive technology</h2><p>When considering AI, and generative AI specifically, we need to evaluate just how disruptive it will be. Is it solving existing problems better, much like Henry Ford&#8217;s notion of &#8220;<em>faster horses</em>,&#8221; or is it creating entirely new markets and business models, maybe even a &#8220;<em>Tesla</em>&#8221;? </p><p>To answer this, I propose assessing AI through the following factors:</p><ol><li><p><strong>New Markets and models:</strong> Does AI create entirely new markets, product lines, or business models within its segment?</p></li><li><p><strong>Surface New Problems:</strong> Are there problems we hadn&#8217;t previously considered that AI now enables us to solve?</p></li><li><p><strong>Obsolete Problems:</strong> Are there issues we currently face that AI will render irrelevant altogether?</p></li></ol><p>These questions are important, as they can help us shape how we integrate them into our strategies and roadmaps.</p><h2>My answers</h2><p>I&#8217;ll admit to having a bit of imposter syndrome here, but my honest opinion is &#8220;yes&#8221; to all three questions. </p><p>First, there are undeniably new markets emerging: AI agents, generative AI platforms, and AI-driven ecosystems that didn&#8217;t exist before. These developments have also created new opportunities, such as the growing demand for faster and more capable processors and the significant rise in GPU usage.</p><p>For the second question regarding the new problems AI surfaces, it brought up privacy, intellectual property, and ethical concerns, to say the least. Over time, I believe these areas will have their own models and businesses.</p><p>As for the third question, obsoleting problems, definitely. I&#8217;ve experienced it firsthand. When I worked on a side project, I used to struggle with deploying it. Tools like <em>Replit</em> now abstract away the complexities. Similarly, in my past work on automations, I often faced challenges in finding the right steps and setups to achieve my goals. Now, with just a simple prompt, the solution is built right in front of me. I no longer need to be as knowledgeable or spend as much time figuring it out as I did before.</p><h2>My conclusions</h2><p>So, what does it all mean? In my opinion, it means that we need to view AI, and generative AI specifically, as a strategic opportunity we must position ourselves against. It&#8217;s not just another technology to solve existing problems; it&#8217;s a fundamentally new way of thinking that brings with it an entirely new type of problem-solving. To truly succeed, we need to consider not just the problems of today but also the problems of tomorrow&#8212;and the solutions of the day after.</p><p>For example, consider the context of e-commerce. It&#8217;s not far-fetched to imagine a future where my smart home knows my refrigerator is nearing the end of its life. It could proactively send me a suggestion for a replacement, and with a single click, the purchase is completed, and the new refrigerator is delivered and installed a few days later. This is a problem that doesn&#8217;t exist today but very well might tomorrow. Where would this position physical stores? Search engines? Technicians? </p><p>Another example comes from the travel industry. Today, the process of finding the cheapest flight ticket sustains an entire business model. However, in the future, AI agents that bid, crawl, and negotiate on my behalf could eliminate that market entirely. Companies and products must evolve to meet this new way of thinking.</p><p>I&#8217;m not suggesting that AI is the answer to everything. It certainly has its downsides and limitations, many of which we&#8217;ve yet to fully understand. But that doesn&#8217;t change the fact that it&#8217;s here to stay. It&#8217;s a disruptive technology that will revolutionize our lives, and to stay ahead, we must ride the wave and adapt.</p>]]></content:encoded></item><item><title><![CDATA[#49 - How I Reduced Costs by 85% Using AI]]></title><description><![CDATA[Leveraging AI and free hosting to create a sleek, affordable site]]></description><link>https://blog.matangr.com/p/how-i-reduced-costs-by-85-using-ai</link><guid isPermaLink="false">https://blog.matangr.com/p/how-i-reduced-costs-by-85-using-ai</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Mon, 02 Dec 2024 07:03:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GGrK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin" 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_!GGrK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GGrK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin 424w, https://substackcdn.com/image/fetch/$s_!GGrK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin 848w, https://substackcdn.com/image/fetch/$s_!GGrK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin 1272w, https://substackcdn.com/image/fetch/$s_!GGrK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GGrK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin" width="405" height="405" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:405,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;output&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="output" title="output" srcset="https://substackcdn.com/image/fetch/$s_!GGrK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin 424w, https://substackcdn.com/image/fetch/$s_!GGrK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin 848w, https://substackcdn.com/image/fetch/$s_!GGrK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin 1272w, https://substackcdn.com/image/fetch/$s_!GGrK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe8e8f3b-ec38-4bc3-89d1-5c83ac77a02f_1024x1024.bin 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><h2>Why does cost matter?</h2><p>Cost is a critical aspect of a product. To achieve product-market fit efficiently, you need to balance both income and value. Revenue represents value, but keeping costs low is equally essential. For example, if customers are loyal, valuable, and pay a decent amount, but acquiring them costs ten times their value, scaling becomes inefficient. Similarly, a feature with high usage that users enjoy might not be sustainable if the associated resource costs are too high. </p><p>When planning a product roadmap, the impact of a feature is just one side of the coin. The effort and maintenance it requires are the other. While it may not be a glamorous topic, cost is something we need to be mindful of and optimize when it makes sense.</p><h2>How I started my site</h2><p>A few years ago, I decided to build my own personal site&#8212;a space to showcase my work and share my thoughts. Later, I moved my blog to Medium and then to Substack, but that&#8217;s a story for another post. When I began this project, I naturally considered costs and chose what seemed reasonable at the time: a WordPress editor site hosted on a shared hosting plan. The cost was relatively low and billed annually, but it was still a recurring expense. As with other SaaS or online tools, the cost goes up over time, and mine had increased from ~$120 to ~$145.</p><p>A few months ago, I came across an interesting post about the cost of AI and strategies to reduce token expenses in products utilizing ChatGPT. This got me thinking about whether I could reduce the cost of my site and what tools I could leverage to achieve that. My main options were either finding a cheaper hosting plan or building a site from scratch with code and finding a simpler hosting solution. At the time, I didn&#8217;t want to invest more effort than I already had, so I simply assumed I would have to stick with the status quo.</p><h2>New site, lower cost</h2><p>Then, I came across <strong>v0</strong>. I had used it for some prototyping at work and thought, why not go all in and build a full site? I started experimenting with the free version and ended up creating something I truly liked. I decided to pay for the full version, which costs $20 a month, and began iterating to create a static site to replace my existing one.</p><p>At that point, I wasn&#8217;t sure how I was going to deploy it. So, I turned to my AI co-pilot, discussed the options, and discovered that Netlify offers a free hosting solution that matched my usage. I wasn&#8217;t entirely confident it would work, and I knew part of the process involved configuring a DNS from HostGator to Netlify. Honestly, the word &#8220;DNS&#8221; intimidated me. But I figured, why not give it a try?</p><p>The plan was straightforward:</p><ol><li><p>Get the site to at least 80% of my desired result in v0.</p></li><li><p>Deploy it on Netlify.</p></li><li><p>Attach it to my custom domain.</p></li></ol><h3>Prototype</h3><p>Working with v0 probably took the most time. It wasn&#8217;t difficult, but it required effort to communicate my vision to the AI&#8212;explaining what I was trying to achieve and the design I wanted. I shared screenshots of inspirational sites, provided videos, and gave custom instructions. It took about 20 to 30 iterations before we arrived at something I truly liked.</p><p>Once that was in place, the design system was ready, and we began personalizing it by incorporating all the text, images, and unique elements from my current site. Eventually, I had the homepage finalized. Like a good product manager, I understood that an MVP has to start somewhere, so I moved on to step 2 before building the other pages.</p><h3>First deployment</h3><p>I opened an account with Netlify, and it probably took me an hour or two to get everything working. I had to create a new Git repository, clone all the work I had done in v0 into it, ensure it had the proper build commands, and link it to Netlify.</p><p>It took some time to figure out the exact configuration required, mainly because, while v0 excels at creating Next.js applications, it doesn&#8217;t adhere well to standard directory structures or best practices. At one point, I even turned to YouTube and found a video showing a configuration someone else used, which finally resolved the issue.</p><p>With that, I had my site successfully deployed on Netlify. It was solid proof of concept that I was moving in the right direction.</p><p>Transferring the domain is reversible, but it felt like a danger zone I didn&#8217;t want to mess with until I was confident my site was ready to handle traffic. In a real-world scenario, there would likely be feature flags or other precautionary tools to manage such transitions.</p><h3>Full working prototype</h3><p>There were still issues with the homepage, like v0 using an online image I had uploaded instead of a static one from the assets folder. I decided to tackle that later since addressing it would cause a drift between the v0-generated code and my own. I continued working with v0 to build the new pages, ensuring the directories were structured properly and components were separated where relevant.</p><p>Finally, the site was complete in v0. I tested it for mobile compatibility, though I decided to overlook errors and linting issues for the time being. With that, I moved on to step 2.</p><h3>Making the site production-ready</h3><p>Working locally, I had to ensure my Git repository was in good shape&#8212;no console errors, no linting errors, and all images generated and loaded statically from the assets folder. While I had the technical knowledge to handle this, I used Cursor AI to assist with some of the changes, either by making adjustments directly or by following its guidance.</p><p>Thanks to the use of AI, this step took only about 30 minutes to ensure linting tests passed, the build succeeded, and the site was fully functional.</p><p>Now for the final step. It didn&#8217;t take much time, but when I changed the DNS, it felt a bit like I was breaking the internet. However, the next day, I woke up to see my new site live and running on my custom domain. At that point, I also disabled the renewal of my hosting plan with HostGator.</p><p>Overall, the entire process took me around 3 to 4 days.</p><h2>Cost saving</h2><p>So, how much did I save? My previous hosting plan with HostGator cost around $145 annually. With my new setup, I subscribed to v0 for one month at $20, and my hosting with Netlify is currently free. That&#8217;s a savings of approximately 85% annually, all while delivering a more flexible and modern site.</p><p>There are still some downsides, such as the lack of built-in plugins like Analytics and Google Console, or a lack of support. However, with the free versions of Cursor AI, ChatGPT, and Claude.ai, I have enough resources to figure out what changes I need to deploy.</p><h2><strong>Conclusion</strong></h2><p>A good product and result need a balance of effort and cost. The more we pay, the more value we expect. Reducing costs can boost satisfaction without sacrificing quality.</p>]]></content:encoded></item><item><title><![CDATA[#48 - Testing Culture]]></title><description><![CDATA[Explore how software testing strategies can reveal valuable insights into your organization]]></description><link>https://blog.matangr.com/p/48-testing-culture</link><guid isPermaLink="false">https://blog.matangr.com/p/48-testing-culture</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Wed, 13 Nov 2024 20:21:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KbgQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_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_!KbgQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KbgQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!KbgQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!KbgQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!KbgQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KbgQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png" width="451" height="451" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c04abe62-c256-4323-91ae-906d636b34cf_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;:451,&quot;bytes&quot;:1354932,&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_!KbgQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!KbgQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!KbgQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!KbgQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04abe62-c256-4323-91ae-906d636b34cf_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><div><hr></div><h2><strong>Intro</strong></h2><p>Someone I appreciate used to say that the only constant is change. To ensure a team or organization achieves its goals, it needs to be dynamic and willing to adjust structures and processes to the changing reality.</p><p>Software faces a similar challenge. Features keep being added, libraries are updated, technology changes, and throughout all of this, you need to make sure that everything works as expected.</p><p>I thought about how different testing approaches could shed light on how organizations and teams can test their structure, processes, and culture, and make sure they&#8217;re on the right track.</p><h2><strong>Unit testing</strong></h2><p>A unit test is a way to test a specific component in a specific scenario. It doesn&#8217;t mean the entire software works or that it will interact with other components, but this specific component in this specific scenario works.</p><p>Yesterday, I installed a bell on my kid&#8217;s bicycle. Unit testing meant I first tried the bell and saw it works&#8212;it rings. It doesn&#8217;t mean it connects to the bicycle yet; it doesn&#8217;t mean it&#8217;s positioned in a way my son can ring it, but I know this specific bell is working.</p><p>Similarly, thinking of product teams, a unit test could be whether a specific PM can write a compelling user story. It doesn&#8217;t mean it will get implemented, or the developers will understand it, or that it works for the entire product team, but this specific PM can write a specific user story.</p><h2><strong>Integration testing</strong></h2><p>Integration testing starts checking the communication between different components. Each component on its own passed the unit test, but that doesn&#8217;t mean they communicate well.</p><p>As an example, you could build a roof with Lego bricks and a house with the same bricks. Each on its own looks great, but they don&#8217;t connect because their sizes are not exactly the same.</p><p>Following the thread on product teams, an integration test could be to take the user story that the PM wrote and run it with the development team. See if it meets the other end and if the developers can collaborate on it and implement it.</p><h2><strong>E2E testing</strong></h2><p>End-to-end testing mimics a real flow that the user could potentially experience. Following the examples above, it could be riding a bicycle while ringing the bell or building a full house using Lego bricks.</p><p>To draw on the product example, end-to-end tests could be the full product life cycle: discovering a new idea, prioritizing and planning it, building the user story around it, implementing it successfully, and launching it.</p><p>We tested each component on its own and tested different components&#8217; integrations with one another, but now we are simulating a full end-to-end flow of the process.</p><h2><strong>Acceptance test</strong></h2><p>An acceptance test usually means that someone outside of the team who built the software tests it on their own terms and accepts it. Common examples include a PM testing a feature or a customer participating in an alpha group or usability tests.</p><p>The difference between end-to-end and acceptance testing is that end-to-end runs from the point of view of those who built the software, while acceptance testing is from those who use it.</p><p>Going back to the product team example, an acceptance test could be seen as a peer review effort, a kick-off meeting with stakeholders, or a general review of the product work process with the organization.</p><p>Acceptance tests are important because, at the end of the day, we build software for our users, just as we build processes and culture to meet our goals.</p><h2><strong>Load test</strong></h2><p>Load testing is conducted when everything works as expected, but we don&#8217;t know to what scale. It could mean running millions of requests to a service or looping through a process in parallel on a scale we haven&#8217;t seen yet. This type of test is crucial to make sure you meet the demand and have a resilient product.</p><p>In an organizational context, load testing could mean ideating and thinking about whether your current process and structure could handle being 2x, 5x, or 10x larger.</p><p>For example, if we have a team of five engineers and one QA, where everything goes through the QA, what would it look like if we had ten teams or if we had ten engineers in a team?</p><p>Alternatively, assume as a VP you&#8217;re running a planning meeting every two weeks with each team, and you have three teams. Would it work with ten teams?</p><p>Load testing your structure and processes is a way to make sure you&#8217;re setting up your organization for success in the future.</p><h2><strong>Smoke test</strong></h2><p>Finally, a smoke test is a type of test to see if a certain process or service is up and running. For example, every 15 minutes you might want to check if your signup process works. You don&#8217;t check its logic, its scale, or its end-to-end flow; you just want to make sure it&#8217;s available for users.</p><p>Similarly, a smoke test could be a heartbeat or a retro where you assess whether your current process, structure, or task is available and working as expected.</p><p>Some examples include checking a Jira board once a day to see tasks in different statuses, randomly picking a user story to see if it has valid content, or choosing a team once a week to join their daily stand-up.</p><p>These are ways you can check the pulse of the organization and its processes to see if everything works as expected. If it doesn&#8217;t, additional testing methods are required.</p><h2><strong>Conclusion</strong></h2><p>To conclude, software and products in general have similar concerns to companies and teams. They need to make sure they work efficiently, at scale, adapt to changes, and serve the end-user needs or goals.</p><p>I went over some popular testing strategies, and hopefully you got an idea of how to improve your visibility into your organization or team.</p>]]></content:encoded></item><item><title><![CDATA[#47 - Efficient Data Management Strategies]]></title><description><![CDATA[How ETL and Reverse ETL Transform Knowledge Work and Improve Efficiency]]></description><link>https://blog.matangr.com/p/47-efficient-data-management-strategies</link><guid isPermaLink="false">https://blog.matangr.com/p/47-efficient-data-management-strategies</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Tue, 05 Nov 2024 20:20:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LlOH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.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_!LlOH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LlOH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png 424w, https://substackcdn.com/image/fetch/$s_!LlOH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png 848w, https://substackcdn.com/image/fetch/$s_!LlOH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png 1272w, https://substackcdn.com/image/fetch/$s_!LlOH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LlOH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png" width="463" height="463" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:800,&quot;resizeWidth&quot;:463,&quot;bytes&quot;:1072126,&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_!LlOH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png 424w, https://substackcdn.com/image/fetch/$s_!LlOH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png 848w, https://substackcdn.com/image/fetch/$s_!LlOH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.png 1272w, https://substackcdn.com/image/fetch/$s_!LlOH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f42c65-af07-42d7-b306-d7e78fa15321_800x800.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><h2><strong>Introduction</strong></h2><p>I recently engaged in discussions around data strategies like ETL, reverse ETL and ELT. These buzzwords play a significant role in the data world. When you think about it, data is all around us&#8212;it shows up in project tracking, pull requests, and online courses. Given that nearly everything we do involves some form of data exchange, what can we learn from these strategies to improve how we handle data and ultimately become more effective?</p><h2><strong>Decision-Making with ETL</strong></h2><p>When we need to make a quick decision, we usually know what outcome we&#8217;re aiming for and what data we need to rely on. In these cases, we can use ETL, the most basic and common approach. ETL stands for <strong>Extract, Transform, and Load</strong>. It consumes more time because extraction and transformation take effort, but it&#8217;s effective in reaching a decision.</p><p>Take, for example, making a decision about a specific project. <strong>Extract</strong> would mean gathering all relevant data about the project&#8212;goals, tasks, estimates, and potential impacts&#8212;into one place. <strong>Transform</strong> would involve creating a brief or summary that&#8217;s digestible for others. Finally, <strong>Load</strong> could be presenting this information in a meeting or sharing it in an offline document for everyone to review. This one-time process helps in scenarios where you know exactly what you need to make an informed decision.</p><h2><strong>Gather Insights for Future Decisions with Reverse ETL</strong></h2><p>Sometimes, the decision you&#8217;re gathering insights for is still in the future, or you don&#8217;t yet need to make it. In these cases, you might have insights and data points you want to consider and save for later, even if you&#8217;re unsure what they&#8217;ll be used for or when. This is where <strong>reverse ETL</strong> becomes very useful.</p><p>You can start by extracting and transforming the data point into something digestible&#8212;perhaps a table where you log the insight, link, impact, and potential future relevance. Then, later, when you need to make a decision, you have a resource to refer back to. To demonstrate, imagine you collect customers' feedback on some unmet need over time, and once the moment comes and the company wants to kick off a new solution in that area, you already have a bunch of insights to rely on.</p><h2><strong>Enriching Data Insights with ELT</strong></h2><p><strong>In some situations,</strong> you want to enrich data insights with additional dimensions and data points. For example, when someone opens a Jira ticket, you might want to capture details like priority, team, component, size, and related documents. However, if opening a Jira ticket requires filling out 15 different fields, it becomes time-consuming, overly complex, and ultimately less efficient.</p><p>In such cases, it might make sense to use an <strong>ELT approach</strong>. ELT stands for <strong>Extract, Load, Transform</strong>. Imagine that you only provide the title and description when opening the Jira ticket. In the description, you might mention priority and components in free-text format. A separate process then transforms this initial input into the structured fields.</p><p>Another example could be feature requests. When someone opens a feature request for your product, you don&#8217;t want to create obstacles by requiring extensive details. They can simply explain what they want. Later, the product team can transform this information by adding custom fields, assigning categories, or rephrasing the feature request in standard terms. This approach is ideal for cases where you need a more efficient, fast, and scalable way to ingest data.</p><h2><strong>Schedule Sync vs. Real-Time</strong></h2><p>One approach to gathering product insights, such as customer requests, friction points, or feature usage, is&nbsp;<strong>Schedule Sync</strong>. With this method, you review various insights from multiple sources on a recurring basis (e.g., weekly). You collect relevant insights and push them into a chosen destination&#8212;whether it&#8217;s a database, a document, or a spreadsheet.</p><p>The other approach is <strong>Real-Time</strong>. Whenever you encounter a data point related to the product, like a support chat, a public review, or a feature request, you immediately extract, transform, and load it into the destination.</p><p>The difference is that the Real-Time approach ensures data freshness but can compromise consistency. On the other hand, Schedule Sync offers more consistency and a reliable view of the data, though it comes with a delay before insights are available.</p><p>Choosing between these depends on the use case. Real-Time is usually preferred when the timing is critical, and you must act quickly. This is often the case with new competitors in the space, strategic feature requests, or urgent bugs.</p><h2><strong>Stay Up-to-Date with CDC</strong></h2><p>Imagine you&#8217;re tracking a major feature release and monitoring where you stand on a weekly basis. You need information on the engineering tasks, marketing campaign plan, and the design studio collateral. So, you gather the marketing tasks from Monday, you pull in Gantt charts from JIRA, and you build your own view of the project and its expected launch date.</p><p>As you review this week by week, you need to ensure that your destination&#8212;whether a slide or a spreadsheet&#8212;stays up-to-date. Instead of rechecking all tasks and repeating the entire process, you can use a <strong>Change Data Capture (CDC)</strong> approach. With CDC, you can query and extract only the items that have changed and perform ETL on those updates.</p><p>For instance, you could set up a view to show JIRA tickets updated in the last seven days or retrieve the latest updates from Monday boards. This makes keeping your destination data current much more efficient and less time-consuming.</p><h2><strong>Conclusions</strong></h2><p>As knowledge workers, much of our work involves data ingestion, manipulation, and management. Understanding the patterns and strategies used to handle data in the software world can enhance our productivity and improve our day-to-day workflows.</p>]]></content:encoded></item><item><title><![CDATA[#46 - Managing Incidents in Code and Beyond]]></title><description><![CDATA[Key concepts from production incidents applied to unstructured problems]]></description><link>https://blog.matangr.com/p/46-managing-incidents-in-code-and</link><guid isPermaLink="false">https://blog.matangr.com/p/46-managing-incidents-in-code-and</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Sun, 20 Oct 2024 19:58:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QZzu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.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_!QZzu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QZzu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png 424w, https://substackcdn.com/image/fetch/$s_!QZzu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png 848w, https://substackcdn.com/image/fetch/$s_!QZzu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png 1272w, https://substackcdn.com/image/fetch/$s_!QZzu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QZzu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png" width="768" height="439" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff314650-e792-4b63-8cba-6b6c66624f00_768x439.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:439,&quot;width&quot;:768,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:704598,&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_!QZzu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png 424w, https://substackcdn.com/image/fetch/$s_!QZzu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png 848w, https://substackcdn.com/image/fetch/$s_!QZzu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.png 1272w, https://substackcdn.com/image/fetch/$s_!QZzu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff314650-e792-4b63-8cba-6b6c66624f00_768x439.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><div><hr></div><h2>Introduction</h2><p>As a software engineer, your work doesn't end when your code reaches production. Actually, one could say it's just the beginning. Once your code is in production, it must be maintained, addressed, improved, and always available. An "incident" is a term used in software engineering to refer to a case where code in production is unavailable, doesn't behave as it should, or adversely impacts customers.</p><p>You're probably familiar with the term "bug" in software engineering. An incident is like a bug on steroids, which needs to be addressed now. Incident management refers to the entire lifecycle from the moment you identify an incident until it's resolved and ideally won't happen again. Incident management matters because a product that constantly has incidents will impact customers and, eventually, revenue. It's unrealistic to never have incidents. It is reasonable to resolve them fast (in time to resolve metric) and do your best, so the same incident does not happen again.</p><p>This post will explore the main concepts around incident management and how we can apply them and learn from them in real-world problems.</p><h2>Identifying an Incident</h2><p>The first challenge is to know when an incident happens. Let's take, for example, a website that starts sending errors and doesn't load for customers. Do you know it when the first customer encounters it? Do you know when the 100th customer encounters it? Or do you find out when a customer calls the company's CEO and says their website doesn't work? That's the first challenge. You must ensure your services and products are production-ready to identify an incident correctly. Production-ready means having logs, metrics, and observability tools in place, which help you understand the system's status at any time.</p><p>The second step would be to identify what is expected and abnormal. For example, if you monitor a database's CPU usage over time, you see a percentage considered normal, 70%. And then you can say anything above 70% is potentially an incident. The third step is to define benchmarks and rules for what is actually an incident. For example, if the CPU goes above 90% on Saturday and the checkout smoke test fails, it is an incident.</p><p>It's important to know that incidents are not black and white. There is no one-size-fits-all. Incidents could have different priorities and affect other areas, so the approach to identifying and managing them should be flexible.</p><h2>Triage and War Room</h2><p>Once an incident is triggered, the owning engineer must triage it: What&#8217;s the priority? Who needs to be informed or involved? What&#8217;s the impact? Should the status page be updated, or should a meeting be opened? The triaging process is where these critical decisions are made.</p><p>The engineer typically starts a war room, physically or virtually, bringing in the necessary people. The company is aware of the incident, and insights are shared. Customer success may report impacted clients, support can highlight relevant tickets, and DevOps shares system performance insights. Relevant teams then join the effort.</p><p>The engineer is responsible for communicating the impact, current actions, next steps, and update timing. They also track completed and pending tasks. In short, triaging and the war room move the incident from acknowledgment to active resolution.</p><h2>Managing the Incident</h2><p>During the incident, it&#8217;s important to first focus on mitigation. For example, if the site doesn&#8217;t load, you might be able to get it to load in specific regions or ensure that some parts of the site are functional. After that, the goal is to fully resolve the incident and ensure no loose ends remain&#8212;all affected customers should no longer be impacted.</p><p>To achieve this, the incident owner must be empowered to access all the necessary resources. That engineer should be available if they need a specific engineer&#8217;s help. They must be granted during the incident if they require permissions they don&#8217;t usually have. It&#8217;s about ensuring they are fully empowered with the right tools to mitigate and resolve the issue.</p><h2>Closing and Analyzing</h2><p>An incident isn&#8217;t genuinely closed until a Root Cause Analysis (RCA) is in place. In other words, you can only consider the incident over and closed once you understand what caused it and have identified the steps needed to prevent it from happening again. As the old saying goes, "Fool me once, shame on you; fool me twice, shame on me." Preventing the following incident is not about chance or destiny. We must act on our findings and take the necessary steps to ensure it doesn&#8217;t happen again.</p><p>When closing an incident, it&#8217;s important to ensure everyone is in the loop and aware of the impact and the final resolution. If there&#8217;s an external status page, it should be updated accordingly. Finally, the RCA should include concrete action items that the team can take to prevent similar incidents in the future.</p><h2>Applying It to Real-World Problems</h2><p>I believe we can learn from the structured approach to incident management and apply some of its principles to the non-structured problems we might face daily. I will review three issues that each organization has likely encountered and explain how I apply certain practices from incident management to deal with them.</p><h3>Deal with Employee Retention</h3><p>The negotiation to retain an employee often starts when they&#8217;ve already decided to leave. Similar to how services are monitored, you should consider how to sense the 'heartbeat' of each employee to get early signals of churn risk. Examples include skip-level 1-on-1s, internal NPS or feedback surveys, and recurring sessions with an HRBP. Building processes and tools to monitor and be 'alerted' when something goes off track is crucial. For example, if a UX designer&#8217;s 1-on-1 with the VP felt disengaged, didn&#8217;t answer the NPS survey, and missed the last company all-hands meeting, it might require check-in and potentially 'trigger an incident.'</p><h3>Implement a New Tool or Process</h3><p>Let&#8217;s assume the team has been working with Jira, and the company has decided to switch to Monday. This type of change resembles managing an incident&#8212;a clear outcome (complete the transition), a defined timeframe (as soon as possible), and implementation is spread across the organization. It&#8217;s important to have a clear owner, such as a Program Manager, to manage this. Next, they must plan and communicate milestones, as engineers do when communicating a mitigation plan. If additional resources or permissions are needed during the process&#8212;like admin access to Jira or dedicated sessions with teams&#8212;the owner must be empowered to obtain them. Ownership and access to resources are crucial to success in these cases.</p><h3>Quarterly Planning</h3><p>Before planning the next quarter, we usually reflect on the previous one. However, this reflection often remains shallow. Inspired by the root cause analysis and the 'five whys,' we should dig deeper to understand why the past quarter went well (or didn&#8217;t). With clear understanding and action items, we can plan the next quarter and ensure we don&#8217;t repeat the same mistakes&#8212;or, hopefully, we repeat our successes. As with incidents, the quarter isn&#8217;t over until a deep analysis is conducted and insights are extracted to improve the next one.</p><h2>Summary</h2><p>I'm obsessed with productivity and efficiency; a big part is decision-making. With incident management, each decision counts, and the faster, the better. While incidents clearly impact our day-to-day, problems and dilemmas often don&#8217;t. I believe we can take inspiration from incident management&#8212;topics like on-call schedules, alerting &amp; monitoring, war rooms, and root cause analysis&#8212;to handle non-structured problems in our day-to-day lives more efficiently and faster.</p>]]></content:encoded></item><item><title><![CDATA[#45 - Keeping OKRs Relevant with Virtual DOM]]></title><description><![CDATA[Applying Virtual DOM Concepts to Keep OKRs Relevant and Efficient]]></description><link>https://blog.matangr.com/p/45-keeping-okrs-relevant-with-virtual</link><guid isPermaLink="false">https://blog.matangr.com/p/45-keeping-okrs-relevant-with-virtual</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Mon, 14 Oct 2024 07:02:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hFpz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_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_!hFpz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hFpz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!hFpz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!hFpz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!hFpz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hFpz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png" width="480" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/899ce0a9-0448-4897-bcd7-824c3e055602_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;:480,&quot;bytes&quot;:1121205,&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_!hFpz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!hFpz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!hFpz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!hFpz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F899ce0a9-0448-4897-bcd7-824c3e055602_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><div><hr></div><h2>OKRs Are Dynamic</h2><p>OKRs are a common framework used to manage and organize a company's tasks and projects to meet its specific goals and objectives. When defining OKRs, you can think of it as a top-to-bottom process where the company decides its objectives and key results. Then, each department feels about how they can contribute to them, and eventually, each team needs to decide on the top priority and most impactful tasks to meet those objectives.</p><p>However, in reality, OKRs are a bit more dynamic. Let's take an example where the original goal was to&nbsp;<em>improve the user's time-to-value&nbsp;</em>&#8212;let's say, improve onboarding to first action time by 30%. In reality, once the teams and departments start working towards this goal, they realize that they have achieved it in a way, but then <em>retention goes down</em>. This means they improved the onboarding dramatically, but retention took a hit. Previously, it took longer to onboard users, but those already onboarded were able to find meaningful experiences and remained engaged with the product. With the new enhancements, it's not like that anymore.</p><p>They went back to management to discuss and decide to change the KR. Now, instead of looking at onboarding time, they look at two-week retention. The interesting question is how this KR change should impact the company.</p><ul><li><p>Option #1: Wait for the next planning cycle and hope the people involved in these discussions will do what they can with the new KR. </p></li><li><p>Option #2: Regroup and plan everything again, validating the plans and ensuring the current tasks and internal objectives meet the new KRs. </p></li></ul><p>There might be a third option: take a step back and explore the world of front-end applications.</p><h2>Lessons from the Virtual DOM</h2><p>Imagine a webpage where you have certain elements: you have the header and the footer, and then maybe you have a catalog area, a "Purchase Now" button, and so on. The elements are structured in some hierarchy, as shown below.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aaps!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aaps!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png 424w, https://substackcdn.com/image/fetch/$s_!aaps!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png 848w, https://substackcdn.com/image/fetch/$s_!aaps!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png 1272w, https://substackcdn.com/image/fetch/$s_!aaps!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aaps!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png" width="1456" height="1333" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1333,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:130235,&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_!aaps!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png 424w, https://substackcdn.com/image/fetch/$s_!aaps!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png 848w, https://substackcdn.com/image/fetch/$s_!aaps!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.png 1272w, https://substackcdn.com/image/fetch/$s_!aaps!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ed8e17-4f3c-4577-9711-9bc7f29d8a18_2090x1913.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>Web browsers treat the webpage as a tree structure (Document Object Model, DOM). Let&#8217;s assume the active sale has a timer of two minutes, and once the sale ends, the webpage will:</p><ol><li><p>Remove the active sale.</p></li><li><p>Show the next sale.</p></li><li><p>Refresh the product carousel.</p></li></ol><p>The webpage has several alternatives:</p><ul><li><p>Option #1: Wait for the next page to refresh to load updated data. </p></li><li><p>Option #2: Refresh the page and load the entire page from scratch.</p></li></ul><p>See where I&#8217;m going with this analogy? It's a similar problem to the one we introduced earlier with our OKRs example. </p><p>Luckily, we have a third option. Let&#8217;s discuss how it decides on changes to apply to the current page.</p><p>Instead of directly manipulating the <code>DOM</code> (e.g., refresh the page and components), the Virtual DOM compares the current state against the desired state. Once done, it changes only the elements needed instead of the entire page. Let&#8217;s see it in action:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vQFs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vQFs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png 424w, https://substackcdn.com/image/fetch/$s_!vQFs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png 848w, https://substackcdn.com/image/fetch/$s_!vQFs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png 1272w, https://substackcdn.com/image/fetch/$s_!vQFs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vQFs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png" width="1456" height="967" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:967,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:176610,&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_!vQFs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png 424w, https://substackcdn.com/image/fetch/$s_!vQFs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png 848w, https://substackcdn.com/image/fetch/$s_!vQFs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.png 1272w, https://substackcdn.com/image/fetch/$s_!vQFs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e7ad19-e5a3-4bc0-b6cc-fa5d346e2151_2454x1629.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>In the example above, the virtual DOM updates only the necessary components instead of triggering a full page refresh. This improves performance and enhances the user experience.</p><p>The page&#8217;s tree structure plays a crucial role here. When the sale ends, multiple elements need updating, and we can identify them by examining the components (nodes) under the Sale Banner, such as the title, label, and price.</p><h2>Keeping OKRs Up to Date</h2><p>Let&#8217;s return to our OKRs example. After the company published its OKRs, each department created its plan. Now, let&#8217;s think of the DOM. The DOM represents the OKRs, structured so that each task ties directly to its relevant key result and each key result to its objective. This creates a tree-like structure, starting from the company&#8217;s top objective down to the last task connected to it.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_f4w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_f4w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png 424w, https://substackcdn.com/image/fetch/$s_!_f4w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png 848w, https://substackcdn.com/image/fetch/$s_!_f4w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png 1272w, https://substackcdn.com/image/fetch/$s_!_f4w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_f4w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png" width="1456" height="224" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:224,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:118432,&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_!_f4w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png 424w, https://substackcdn.com/image/fetch/$s_!_f4w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png 848w, https://substackcdn.com/image/fetch/$s_!_f4w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png 1272w, https://substackcdn.com/image/fetch/$s_!_f4w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ef70fc9-7837-4bdd-8755-1f627bbec426_3840x590.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When changing the onboarding KR to a retention KR, we can consider this process the <strong>Virtual DOM</strong>.&nbsp;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RdJb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RdJb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png 424w, https://substackcdn.com/image/fetch/$s_!RdJb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png 848w, https://substackcdn.com/image/fetch/$s_!RdJb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!RdJb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RdJb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png" width="1456" height="643" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:643,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:184411,&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_!RdJb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png 424w, https://substackcdn.com/image/fetch/$s_!RdJb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png 848w, https://substackcdn.com/image/fetch/$s_!RdJb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!RdJb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e340f2f-cd3c-4972-8c22-70acbe0639a0_2652x1172.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>Looking at the tree structure, it&#8217;s clear that we need to revisit tasks 1 &amp; 2. However, this doesn&#8217;t necessarily mean we will change them. For example, &#8220;<em>Implement in-app guides</em>&#8221; may remain relevant to the new retention KR.</p><p>We don&#8217;t need to involve the entire organization. By identifying the potentially affected areas, we can focus on discussing changes with the relevant teams. Once the updates are finalized, we publish and share the new version with everyone&#8212;just like updating a webpage after a sale ends.</p><p>Here are some tips that you can take right now to implement this:</p><ol><li><p><strong>Ensure every relation is in place</strong>, meaning each department's KR relates to the company's original KR. It's much easier to build it in a more structured way with tools like Notion or spreadsheets.</p></li><li><p><strong>Link the day-to-day tasks</strong>&#8212;whether our personal tasks, marketing projects, or R&amp;D features&#8212;to tie back up. It's hard; sometimes, it might be related to more than one KR, and still, we need to have a structured way to revisit it in the future.</p></li><li><p><strong>Once changes occur, see them in a structured way</strong>&#8212;because you have already identified all the affected tasks and maybe KRs&#8212;and bring all the relevant people to the table to build an updated plan version.</p></li><li><p><strong>Once you have an update</strong>, update the OKRs, change the tasks, revisit efficiently, and share it with the company.</p></li></ol><h2>Summary</h2><p>Overall, we drew inspiration from how web pages manage state changes and applied that to the OKRs process. While goals and objectives are typically set once a quarter or year, finding a way to revisit them weekly and efficiently implement changes across the company as needed can be a key to success.</p>]]></content:encoded></item><item><title><![CDATA[#44 - Learning from the Past with Decision Logs]]></title><description><![CDATA[How Git Commit Practices Can Help Track and Improve Decisions Over Time]]></description><link>https://blog.matangr.com/p/44-learning-from-the-past-with-decision</link><guid isPermaLink="false">https://blog.matangr.com/p/44-learning-from-the-past-with-decision</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Wed, 09 Oct 2024 20:52:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nD65!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_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_!nD65!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nD65!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!nD65!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!nD65!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!nD65!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nD65!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png" width="526" height="526" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_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;:526,&quot;bytes&quot;:874976,&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_!nD65!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!nD65!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!nD65!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!nD65!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ff8d2c8-c006-4ee5-a32f-98ea10633dfa_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><div><hr></div><h2>Intro</h2><p>I once worked in a large organization that frequently restructured its teams, roles, and hierarchies to adapt to changing goals and realities&#8212;sometimes as often as once a year. Over time, it started to feel like history was repeating itself, as the lack of knowledge about past decisions frequently led to poor outcomes.</p><p>At one point, the organization had structured itself around geographical management&#8212;each site or group was overseen by someone managing multiple disciplines and roles. Later, after reflecting on various insights, management shifted to a profession-based model, where roles were managed independently to allow disciplines to grow and specialize (similar to guilds in a squads model).</p><p>Years later, they reverted to the original geographical structure for various reasons. What concerned me wasn&#8217;t the decision itself but the fact that no one seemed to remember why it hadn&#8217;t worked well the first time. Unsurprisingly, the same issues reappeared.</p><p>I believe we can learn a lot from how codebases are managed to avoid these organizational problems.</p><h2>Enter Git Commit</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!atBB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!atBB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png 424w, https://substackcdn.com/image/fetch/$s_!atBB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png 848w, https://substackcdn.com/image/fetch/$s_!atBB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png 1272w, https://substackcdn.com/image/fetch/$s_!atBB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!atBB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png" width="478" height="236" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42405479-0396-425c-a607-7e5218330d34_478x236.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:236,&quot;width&quot;:478,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Git graph. Branch main points to F&#8594;E&#8594;D&#8594;C&#8594;B&#8594;A. Branch feature points to H&#8594;G&#8594;C&#8594;B&#8594;A. Highlighted commits: H,G,C,B,A.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Git graph. Branch main points to F&#8594;E&#8594;D&#8594;C&#8594;B&#8594;A. Branch feature points to H&#8594;G&#8594;C&#8594;B&#8594;A. Highlighted commits: H,G,C,B,A." title="Git graph. Branch main points to F&#8594;E&#8594;D&#8594;C&#8594;B&#8594;A. Branch feature points to H&#8594;G&#8594;C&#8594;B&#8594;A. Highlighted commits: H,G,C,B,A." srcset="https://substackcdn.com/image/fetch/$s_!atBB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png 424w, https://substackcdn.com/image/fetch/$s_!atBB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png 848w, https://substackcdn.com/image/fetch/$s_!atBB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png 1272w, https://substackcdn.com/image/fetch/$s_!atBB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42405479-0396-425c-a607-7e5218330d34_478x236.png 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption">Credit: <a href="https://darekkay.com/blog/git-commit-ranges/">Darekkay.com</a></figcaption></figure></div><p>A commit in <a href="https://blog.matangr.com/p/34-enhancing-alignment-using-git">Git</a> represents a piece of code added to the codebase. In the diagram above, the <code>main</code> branch reflects the current state of the code. To reach this state, you must pass through all the changes made along the way&#8212;from A to F. This concept is similar to <a href="https://blog.matangr.com/p/39-event-driven-tracking">event sourcing</a>.</p><p>When committing to the code, you must include your identity and explain the change. This combination allows for valuable insights, such as:</p><ul><li><p>Who last modified this line of code? (via the &#8220;blame&#8221; feature)</p></li><li><p>Why did we add this function?</p></li><li><p>When was this file deleted?</p></li></ul><p>Additionally, Git allows you to return to a previous state of the code at any time, like reverting from point F back to point E.</p><h2>Why do we need it?</h2><p>Putting the technical jargon aside, consider you have a recipe for a cake. Over time, you start experimenting and improving the recipe. Maybe even other members join and update based on their own taste. Eventually, you have only the final version with zero knowledge of how it got there or that something even changed.</p><p>As computers became common and you could develop software on personal computers, the need for collaborative work increased, and source code management (SCM) was created. With it, we can work on scale, collaborate effectively, and recover quickly from incidents.</p><h2>Back to the re-organization</h2><p>Returning to my initial story, let&#8217;s imagine this was the case:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2EyX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2EyX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png 424w, https://substackcdn.com/image/fetch/$s_!2EyX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png 848w, https://substackcdn.com/image/fetch/$s_!2EyX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png 1272w, https://substackcdn.com/image/fetch/$s_!2EyX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2EyX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png" width="590" height="436.4217032967033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1077,&quot;width&quot;:1456,&quot;resizeWidth&quot;:590,&quot;bytes&quot;:176585,&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_!2EyX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png 424w, https://substackcdn.com/image/fetch/$s_!2EyX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png 848w, https://substackcdn.com/image/fetch/$s_!2EyX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.png 1272w, https://substackcdn.com/image/fetch/$s_!2EyX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6338b44a-6b44-4b23-bb40-59b4f27cfa40_2325x1719.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 ability to scale and learn from past experiments improves when historical changes and who made them are visible. Additionally, working with context is always the better option.</p><p>In reality, managing decisions for a team or a company isn&#8217;t like managing code. However, it can be done using decision logs.</p><h2>Tips for effective decision logging</h2><p>You can get started with your own Decision Version Control system today:</p><p>1. <strong>Create a Simple Google Sheet</strong>: Set up a Google Sheet with columns for <strong>Area</strong>, <strong>Date</strong>, <strong>Decision</strong>, and <strong>Owner</strong> to track all significant 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_!Jqw9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jqw9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png 424w, https://substackcdn.com/image/fetch/$s_!Jqw9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png 848w, https://substackcdn.com/image/fetch/$s_!Jqw9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png 1272w, https://substackcdn.com/image/fetch/$s_!Jqw9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jqw9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png" width="1456" height="423" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:423,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:206138,&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_!Jqw9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png 424w, https://substackcdn.com/image/fetch/$s_!Jqw9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png 848w, https://substackcdn.com/image/fetch/$s_!Jqw9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.png 1272w, https://substackcdn.com/image/fetch/$s_!Jqw9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb6972-3617-4698-bc82-54890e58ee08_2680x778.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>2. <strong>Set a Review Timeline</strong>: For each decision, determine a time to revisit it (e.g., six months from now).</p><p>3. <strong>Automate Reminders</strong>: Set automated reminders for essential decisions to prompt a review at the appropriate time.</p><p>4. <strong>Conduct Retrospectives</strong>: When reviewing a past decision, ask yourself if it was right and what lessons can be drawn from it.</p><p>5. <strong>Leverage Historical Context</strong>: Review past entries in the same area before making new decisions to gain valuable context and avoid repeating mistakes.</p><p></p>]]></content:encoded></item><item><title><![CDATA[#43 - Risk Metrics Before Success Metrics]]></title><description><![CDATA[From Risk Metrics to Actionable Insights]]></description><link>https://blog.matangr.com/p/43-risk-metrics-before-success-metrics</link><guid isPermaLink="false">https://blog.matangr.com/p/43-risk-metrics-before-success-metrics</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Fri, 04 Oct 2024 19:51:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BR28!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp" 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_!BR28!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BR28!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!BR28!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!BR28!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!BR28!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BR28!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp" width="442" height="442" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab77b336-3bb0-4c65-824e-8b67424b01ce_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;:442,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Create an image of a car dashboard with a few key warning lights, such as the check engine and low fuel lights, symbolizing risk metrics. Next to the dashboard, include a simple graph showing a downward trend, representing a decline in performance or system health. The focus is on these key elements without too much additional detail. Capture the scene with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field. Use a shutter speed of 1/250s to avoid motion blur, and an ISO setting of 200 for clarity. Apply a high-contrast look with a warm white balance to highlight the warning lights and graph.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="Create an image of a car dashboard with a few key warning lights, such as the check engine and low fuel lights, symbolizing risk metrics. Next to the dashboard, include a simple graph showing a downward trend, representing a decline in performance or system health. The focus is on these key elements without too much additional detail. Capture the scene with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field. Use a shutter speed of 1/250s to avoid motion blur, and an ISO setting of 200 for clarity. Apply a high-contrast look with a warm white balance to highlight the warning lights and graph." title="Create an image of a car dashboard with a few key warning lights, such as the check engine and low fuel lights, symbolizing risk metrics. Next to the dashboard, include a simple graph showing a downward trend, representing a decline in performance or system health. The focus is on these key elements without too much additional detail. Capture the scene with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field. Use a shutter speed of 1/250s to avoid motion blur, and an ISO setting of 200 for clarity. Apply a high-contrast look with a warm white balance to highlight the warning lights and graph." srcset="https://substackcdn.com/image/fetch/$s_!BR28!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!BR28!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!BR28!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!BR28!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab77b336-3bb0-4c65-824e-8b67424b01ce_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><div><hr></div><h2>Intro</h2><p>In my previous post, I explored how to break high-level metrics into actionable working agreements, using the DORA metrics framework as a reference. Now, I&#8217;d like to extend this concept to our day-to-day practices.</p><p>Imagine our team is working on a new feature to increase product adoption, and we decided to measure success by tracking the average weekly sessions per user. What should we monitor once the feature is deployed and the rollout begins? Should we immediately focus on weekly sessions per user? Of course not.</p><h2>Risk Metrics</h2><p>In the example above, the primary focus is on&nbsp;<em>risk metrics during most deployments</em>. These typically include error logs, CPU utilization, overall system health, user complaints, and bugs. Within the first few hours, you&#8217;re more likely to detect if the new feature introduces any <em>regressions</em> than to see a noticeable impact on the defined KPI. This aligns with the broader concept of monitoring: ensuring your product remains functional and efficient and maintains its normal KPIs.</p><h4>Tips for defining risk metrics</h4><ul><li><p>They should be <strong>easily measurable</strong>.</p></li><li><p>Regressions should be identifiable <strong>within minutes</strong>.</p></li><li><p>They should impact <strong>critical product flows</strong>.</p></li></ul><p>For instance, the <em>number of login attempts</em> is a crucial risk metric. It allows you to spot regressions quickly, and the impact on the product is significant. However, consider factors like seasonality (e.g., weekends), which can lead to false positives.</p><h2>Leading and Lagging Metrics</h2><p>Metrics can signal that something is about to happen (<em>leading</em>) or reflect something that has already occurred (<em>lagging</em>). It&#8217;s crucial to select the right metrics based on your goals.</p><p>At one point, I worked with a product team that spent&nbsp;70% of its allocation&nbsp;on maintenance&#8212;addressing bugs, technical debt, and production stabilization. This was a classic&nbsp;<em>lagging metric</em>, representing an already escalated situation. To address this, I began tracking <em>leading indicators</em> like the throughput rate of maintenance tickets and the number of production alerts.</p><p>For example, there were weeks when we had three daily alerts, ten new tickets were opened, and we only closed four. By tracking these metrics regularly, patterns began to emerge, and addressing them eventually helped us reduce our overall maintenance allocation from <strong>70% to 40%</strong>.</p><h4>Tips for defining leading metrics</h4><ul><li><p>Use methods like the KPI tree to drill down to actionable, lower-level metrics.</p></li><li><p>Apply a root cause mindset by asking why. For example, &#8220;Why do we spend so much time on maintenance? Because we have too many tickets. Why do we have so many tickets? Because new ones keep opening before we can close the old ones.&#8221;</p></li><li><p>Define actions based on results. For example, if the throughput rate hits a 50% threshold, we will halt new work and escalate to the group manager. If no actionable step can be tied to a metric, it&#8217;s probably not a good leading indicator.</p></li></ul><h2>Conclusion</h2><p>Defining metrics is only the first step. The real challenge lies in tracking, monitoring, and continually improving them. It is crucial to invest more time in working with risk metrics and identifying the correct leading indicators. Focusing on these can transform minor improvements into meaningful, long-term changes impacting overall performance.</p>]]></content:encoded></item><item><title><![CDATA[#42 - Breaking Down Metrics to Build Up Success]]></title><description><![CDATA[Using the KPI Tree Approach to Create Impactful Working Agreements]]></description><link>https://blog.matangr.com/p/42-breaking-down-metrics-to-build</link><guid isPermaLink="false">https://blog.matangr.com/p/42-breaking-down-metrics-to-build</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Mon, 23 Sep 2024 13:57:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Be5x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp" 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_!Be5x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Be5x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Be5x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Be5x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Be5x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Be5x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp" width="508" height="508" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6a2d64b-cc74-447b-a611-2e5b55a9a188_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;:508,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A visually clear representation of a KPI tree concept. In the center, there is a tree with nodes connected by lines, representing various metrics. The tree structure starts with high-level goals at the top and branches out into smaller, actionable sub-metrics. The scene is captured with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field, with a shutter speed of 1/250s and an ISO of 200 for a clear, well-lit image. The image has a warm white balance and high contrast to highlight the tree structure and create visual engagement. The background is minimalistic, ensuring the focus remains on the tree and its branching nodes, without any text.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="A visually clear representation of a KPI tree concept. In the center, there is a tree with nodes connected by lines, representing various metrics. The tree structure starts with high-level goals at the top and branches out into smaller, actionable sub-metrics. The scene is captured with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field, with a shutter speed of 1/250s and an ISO of 200 for a clear, well-lit image. The image has a warm white balance and high contrast to highlight the tree structure and create visual engagement. The background is minimalistic, ensuring the focus remains on the tree and its branching nodes, without any text." title="A visually clear representation of a KPI tree concept. In the center, there is a tree with nodes connected by lines, representing various metrics. The tree structure starts with high-level goals at the top and branches out into smaller, actionable sub-metrics. The scene is captured with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field, with a shutter speed of 1/250s and an ISO of 200 for a clear, well-lit image. The image has a warm white balance and high contrast to highlight the tree structure and create visual engagement. The background is minimalistic, ensuring the focus remains on the tree and its branching nodes, without any text." srcset="https://substackcdn.com/image/fetch/$s_!Be5x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Be5x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Be5x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Be5x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6a2d64b-cc74-447b-a611-2e5b55a9a188_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><div><hr></div><p>When we immerse ourselves in data points, insights, and signals as part of our work, it&#8217;s easy to get overwhelmed. Deciding what to focus on and what to ignore can be challenging. This dilemma is present in almost every role: how a Product Manager chooses the key metrics to track, how a Sales Engineer scopes and prioritizes an implementation, how a Salesperson identifies the core dilemmas, and how an Engineer pinpoints the root cause of an incident.</p><p>A Gartner survey found that knowledge workers use an average of 11 software applications (along with additional tools they may create for themselves). For example, in the case of a software incident, consider the multitude of applications, logs, and messages one needs to sift through to get to the root of the problem. Root Cause Analysis (RCA) is a methodology that involves digging deep until the actual cause of an issue is identified.</p><p>In this post, I will discuss how a KPI tree employs a similar approach&#8212;only from the other direction&#8212;to help you stay focused and improve what truly matters. </p><p>I&#8217;ll focus on the&nbsp;<em>Change Lead Time</em>&nbsp;metric in software development in the example below. This metric measures the time it takes to implement and deploy a piece of software to production. Improving it in isolation is nearly impossible, like trying to resolve a vague, acute incident without clarity. To tackle this, we&#8217;ll use the KPI tree technique to break it down.</p><p>First, we&#8217;ll deconstruct the metric by identifying the stages contributing to the total lead time. We&#8217;ll ask ourselves: What are the specific steps that make up the entire lead time cycle?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZW-i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZW-i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png 424w, https://substackcdn.com/image/fetch/$s_!ZW-i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png 848w, https://substackcdn.com/image/fetch/$s_!ZW-i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png 1272w, https://substackcdn.com/image/fetch/$s_!ZW-i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZW-i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png" width="470" height="471.614010989011" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1461,&quot;width&quot;:1456,&quot;resizeWidth&quot;:470,&quot;bytes&quot;:134567,&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;: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_!ZW-i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png 424w, https://substackcdn.com/image/fetch/$s_!ZW-i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png 848w, https://substackcdn.com/image/fetch/$s_!ZW-i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png 1272w, https://substackcdn.com/image/fetch/$s_!ZW-i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce18c7a6-f559-4a62-8c48-1db3ea944146_1996x2003.png 1456w" sizes="100vw"></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>Change lead time is the sum of all the steps in the process. We can ask ourselves, &#8220;How can I improve the time it takes to review a PR?&#8221; This brings us closer to the root cause and a leading metric we can actually improve.</p><p>But we can go even further:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Daa3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Daa3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png 424w, https://substackcdn.com/image/fetch/$s_!Daa3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png 848w, https://substackcdn.com/image/fetch/$s_!Daa3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png 1272w, https://substackcdn.com/image/fetch/$s_!Daa3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Daa3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png" width="596" height="402.7912087912088" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:984,&quot;width&quot;:1456,&quot;resizeWidth&quot;:596,&quot;bytes&quot;:138360,&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_!Daa3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png 424w, https://substackcdn.com/image/fetch/$s_!Daa3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png 848w, https://substackcdn.com/image/fetch/$s_!Daa3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.png 1272w, https://substackcdn.com/image/fetch/$s_!Daa3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66d7da57-a05b-42c5-ad74-3f9d42ea698c_2432x1644.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 time to reach a PR is the number of commits in a PR multiplied by the average time to commit code. This makes it specific and actionable. But we won&#8217;t stop here:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-66q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-66q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png 424w, https://substackcdn.com/image/fetch/$s_!-66q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png 848w, https://substackcdn.com/image/fetch/$s_!-66q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png 1272w, https://substackcdn.com/image/fetch/$s_!-66q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-66q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png" width="1456" height="748" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:748,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165170,&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_!-66q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png 424w, https://substackcdn.com/image/fetch/$s_!-66q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png 848w, https://substackcdn.com/image/fetch/$s_!-66q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.png 1272w, https://substackcdn.com/image/fetch/$s_!-66q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F371e9307-cf44-4d16-8a3d-4a9e84fa2e6d_2789x1433.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>After breaking it down further, we can now focus on improving even smaller metrics, like reducing the average coding time or the time to understand requirements. The point is clear: the more we dissect the primary metric, the more actionable it becomes.</p><p>Next, we&#8217;ll work in reverse, exploring how optimizing these lower-level metrics can significantly impact the high-level objective.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JvCI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JvCI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png 424w, https://substackcdn.com/image/fetch/$s_!JvCI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png 848w, https://substackcdn.com/image/fetch/$s_!JvCI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!JvCI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JvCI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png" width="1456" height="692" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:692,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177577,&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_!JvCI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png 424w, https://substackcdn.com/image/fetch/$s_!JvCI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png 848w, https://substackcdn.com/image/fetch/$s_!JvCI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!JvCI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b8df5b7-9e76-4c7c-b945-d5099c965d89_2901x1378.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 more precise the requirement, the less time it takes to understand it. To ensure clarity, I&#8217;ve added criteria for an explicit requirement, such as limiting it to one user story and including at least two examples. These <em>working agreements</em> are designed to influence the primary metric by improving its underlying sub-metrics.</p><p>We can continue this process with the remaining metrics and evaluate the results over time. Based on their impact, working agreements can be refined and adapted. The key takeaway is that we are now laser-focused on improving our primary metric.</p><p></p>]]></content:encoded></item><item><title><![CDATA[#41 - Decision-Making Without Full Context]]></title><description><![CDATA[Applying Software Patterns to Make Quick, Effective Decisions]]></description><link>https://blog.matangr.com/p/41-decision-making-without-full-context</link><guid isPermaLink="false">https://blog.matangr.com/p/41-decision-making-without-full-context</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Sun, 15 Sep 2024 07:35:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!k419!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.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_!k419!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k419!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png 424w, https://substackcdn.com/image/fetch/$s_!k419!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png 848w, https://substackcdn.com/image/fetch/$s_!k419!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png 1272w, https://substackcdn.com/image/fetch/$s_!k419!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k419!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png" width="540" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:768,&quot;resizeWidth&quot;:540,&quot;bytes&quot;:1147427,&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_!k419!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png 424w, https://substackcdn.com/image/fetch/$s_!k419!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png 848w, https://substackcdn.com/image/fetch/$s_!k419!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.png 1272w, https://substackcdn.com/image/fetch/$s_!k419!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bb2bd88-7d83-446f-a9e1-68c0a6f8757e_768x768.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><div><hr></div><h2>Intro</h2><p>In my last post, I highlighted how context improves decision-making. This time, I&#8217;ll focus on decision-making and how to proceed when context is lacking.</p><p>While context is necessary, we must avoid analysis paralysis and prioritize making decisions and taking action.</p><p>Let&#8217;s explore some software design concepts that help tackle this issue.</p><h2>Lazy Loading</h2><p>Do you sometimes experience a web page where more content loads as you scroll, or images start blurry and gradually sharpen? That's lazy loading in action.</p><p>The system identifies which components are essential (required context) to display immediately, while other elements can be deferred and loaded later. This approach improves performance by working with minimal context.</p><p>You can "lazy load" in life, like learning a new language. If you're planning a trip to France, you might start by learning basic phrases to get around. Later, you can pick up vocabulary related to food and shopping. You "load" new words only when needed, avoiding the overwhelm of learning everything upfront and moving forward gradually.</p><h2>Circuit Breaker</h2><p>Imagine a product team overwhelmed with work&#8212;top-priority projects, critical bugs, and more. As frustration builds, a key team member falls ill. Pushing the team harder won&#8217;t necessarily help. Instead, using a &#8220;circuit breaker&#8221; approach, you acknowledge the disruption and pause new requests to the team. You check in daily to monitor their status, resuming work only when they return to normal.</p><p>This pattern protects systems from crashing, improves resilience, and isolates problems. It shows how, even without full context or resources, quick decisions can still be made and more considerable setbacks prevented.</p><h2>Concurrency Control</h2><p>Imagine a restaurant (yes, food again!) where each time a customer orders, everyone else must wait until that order is completed before the next one can be taken. Why? This is to avoid the situation where you order something unavailable because someone else just ordered the last one.</p><p>Not very efficient, right? This approach is called <strong>Pessimistic</strong> Concurrency Control. It assumes there will be conflicts between orders, so they must be processed one at a time. In other words, you need the full context (what everyone else has ordered) to take a new order.</p><p>Alternatively, the <strong>Optimistic</strong> alternative assumes that there won't be conflicts most of the time. Here, everyone can take orders at their own pace, but when an order is submitted to the system, it might turn out that a dish you ordered is no longer available ("We're sorry, the Mediterranean Garden Delight is sold out"). This approach avoids exhaustive checks, allowing faster action even if you occasionally lack full context.</p><h2>Avoid Analysis Paralysis</h2><p>While seeking more context is essential, moving forward and making decisions is even more crucial. Overthinking and overanalyzing waste resources can lead to missed opportunities. Instead, try these tips:</p><ul><li><p><strong>Clear Criteria:</strong> Define what is essential to move forward and what is merely nice to have.</p></li><li><p><strong>Imperfection is Perfection:</strong> Recognize that striving for perfection is unnecessary, so choose your battles wisely.</p></li><li><p><strong>Always End Meetings with Action Items:</strong> Set a rule that no meeting ends without clear action items. It&#8217;s better to make a decision, even if it&#8217;s wrong, than to make none.</p></li><li><p><strong>Iterate:</strong> All the examples above allow for mistakes, iterations, and improvements. The first attempt may not be perfect but will lead to a better solution.</p></li></ul><h2>Conclusion</h2><p>Context is valuable in decision-making, but action is essential to avoid stagnation. Techniques like lazy loading, circuit breakers, and optimistic concurrency control in software design show how to proceed efficiently even with limited context by focusing on progress and adaptability.</p>]]></content:encoded></item><item><title><![CDATA[#40 - Context in Software Design]]></title><description><![CDATA[How Managing Information Improves Decisions and Reduces Complexity]]></description><link>https://blog.matangr.com/p/40-context-in-software-design</link><guid isPermaLink="false">https://blog.matangr.com/p/40-context-in-software-design</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Sun, 08 Sep 2024 19:32:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uBaF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp" 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_!uBaF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uBaF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!uBaF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!uBaF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!uBaF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uBaF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp" width="612" height="349.7142857142857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8369e01-dcb4-45b3-bac2-778ccf0d1b00_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;:612,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A cityscape with buildings representing different microservices, each unique in style. Simple symbols on the buildings show functions like 'Order' or 'Customer.' Subtle lines connect some buildings, suggesting limited communication. The scene is clear, minimal, and focused, captured with a Canon TS-E 17mm f/4L Tilt-Shift lens, f/8 aperture, 1/250s shutter speed, ISO 200, with warm white balance and high contrast.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="A cityscape with buildings representing different microservices, each unique in style. Simple symbols on the buildings show functions like 'Order' or 'Customer.' Subtle lines connect some buildings, suggesting limited communication. The scene is clear, minimal, and focused, captured with a Canon TS-E 17mm f/4L Tilt-Shift lens, f/8 aperture, 1/250s shutter speed, ISO 200, with warm white balance and high contrast." title="A cityscape with buildings representing different microservices, each unique in style. Simple symbols on the buildings show functions like 'Order' or 'Customer.' Subtle lines connect some buildings, suggesting limited communication. The scene is clear, minimal, and focused, captured with a Canon TS-E 17mm f/4L Tilt-Shift lens, f/8 aperture, 1/250s shutter speed, ISO 200, with warm white balance and high contrast." srcset="https://substackcdn.com/image/fetch/$s_!uBaF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!uBaF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!uBaF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!uBaF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8369e01-dcb4-45b3-bac2-778ccf0d1b00_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><div><hr></div><h2>Intro</h2><p>A (vegan) customer walks into a restaurant (why are stories always about food?), reads the menu, and orders a salad (the "Mediterranean Garden Delight"). The cook prepares the meal, and the waiter serves it. However, the customer receives a not-so-vegan salad dressing. What went wrong?</p><p>I strongly believe in context&#8212;the more context you have (ideally in one place), the better decisions you can make. Let&#8217;s revisit the restaurant story with this in mind:</p><ul><li><p>Before entering, the customer knew the restaurant&#8217;s name, location, and perhaps some reviews.  </p></li><li><p>After entering, they saw the menu and maybe a dish or two nearby.  </p></li><li><p>The waiter knew what the customer ordered but didn&#8217;t ask about dietary restrictions.  </p></li><li><p>The cook only knew which meal to prepare and for which table.</p></li></ul><p>Had the waiter asked about dietary restrictions, or if the menu clearly listed allergens, or if the customer had provided this info earlier, the experience would have been much smoother.</p><p>That said, context comes at a cost&#8212;asking for more information can slow things down, reduce conversions, and cause fatigue.</p><p>Now, let&#8217;s look at how context works in software design and share some tips for managing it.</p><h2>Context</h2><blockquote><p>Context refers to the circumstances that form the setting for an event, statement, or idea, allowing it to be fully understood.</p></blockquote><p>Here are some technical examples of context:</p><ul><li><p>Frontend application context  </p></li><li><p>AI LLM context  </p></li><li><p>Microservices bounded context</p></li></ul><p>Let&#8217;s dive into each.</p><h3>Frontend Context Can Change</h3><p>Frontend apps have context, often called state. For example, when I log into a gaming site, the context might include my username, recently played games and scores.</p><p>In our restaurant example, the frontend is the menu. The menu was printed last week, so it may not reflect what&#8217;s actually available (e.g., the waiter might inform you of unavailable dishes).</p><p>Similarly, changing the web application context and managing state updates are crucial. We&#8217;ll touch on this more later.</p><h3>Varied Context Types</h3><p>In LLMs (like Claude or GPT), the context window is the maximum number of tokens (characters) that can be processed. The context can include text, files, or media. Some context is required (like the prompt), while others are optional (like the temperature setting).</p><p>In our restaurant, there's a limit to how much you can order (you likely can&#8217;t order 1,000 meals) and optional parameters (you can request a meal change, but it&#8217;s not mandatory).</p><h3>Bounded Context to Simplify</h3><p>In microservices, particularly in domain-driven design, bounded context allows each service to manage its own terms. For instance, a &#8220;Campaign&#8221; in the acquisition service refers to paid ads, while in the game service, it refers to a character&#8217;s journey.</p><p>Similarly, the customer uses "Order" to mean the dishes they&#8217;ve chosen, while the cook uses "Order" to refer to missing ingredients. Setting the context makes communication more evident.</p><h2>Tips</h2><p>To make better decisions and reduce cognitive load, use these tips for managing context:</p><ol><li><p><strong>Set the stage</strong>: Define the bounded context&#8212;what domain are we in, and what are the key terms?</p></li><li><p><strong>Just enough</strong>: Provide enough context, but keep it concise. Explain why something matters and offer examples.</p></li><li><p><strong>Multi-modal</strong>: Context isn&#8217;t just text. Use visuals, documents, and verbal explanations to clarify.</p></li><li><p><strong>Stay updated</strong>: Context changes. Keep everyone updated and make sure changes are communicated clearly.</p></li></ol><p>Let&#8217;s look at an example of building a budget for the new year.</p><ul><li><p><strong>Stage</strong>: The manager shares the goal, boundaries (which budget areas we&#8217;re discussing), and standard terms (budget, cap, Opex, ROI).  </p></li><li><p><strong>Context window</strong>: Provide access to past budget sessions, a shared file, a timeline, and FAQs.  </p></li><li><p><strong>Variety</strong>: Use visuals, spreadsheets, office hours, and recordings.  </p></li><li><p><strong>Updates</strong>: Send weekly emails and ensure everyone has the latest version with updates.</p></li></ul><p>Though context has a cost, providing the proper context at the right time usually pays off.</p>]]></content:encoded></item><item><title><![CDATA[#39 - Event-Driven Tracking]]></title><description><![CDATA[Using Event Sourcing Concepts to Gain Clearer Insights]]></description><link>https://blog.matangr.com/p/39-event-driven-tracking</link><guid isPermaLink="false">https://blog.matangr.com/p/39-event-driven-tracking</guid><dc:creator><![CDATA[Matan Grady]]></dc:creator><pubDate>Tue, 20 Aug 2024 19:50:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3Ke-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp" 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_!3Ke-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3Ke-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!3Ke-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!3Ke-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!3Ke-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3Ke-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp" width="428" height="428" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf26b26e-d952-45ba-8539-4058896ae180_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;:428,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A minimalist flowchart with a series of simple event icons, such as a lightbulb for an idea, a gear for a process, and a checkmark for completion, connected by arrows. Each event icon represents a step in a process, with the arrows showing the flow from one event to the next, ultimately leading to a final state. The image should visually convey the concept of building the current state from a sequence of past events, with a clean and professional design. The background is plain, allowing the event flow to stand out clearly. Capture the scene with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field, with a shutter speed of 1/250s to avoid motion blur, and an ISO setting of 200 for a clear, well-lit image. Use a warm white balance and high contrast to enhance the image's clarity and engagement.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="A minimalist flowchart with a series of simple event icons, such as a lightbulb for an idea, a gear for a process, and a checkmark for completion, connected by arrows. Each event icon represents a step in a process, with the arrows showing the flow from one event to the next, ultimately leading to a final state. The image should visually convey the concept of building the current state from a sequence of past events, with a clean and professional design. The background is plain, allowing the event flow to stand out clearly. Capture the scene with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field, with a shutter speed of 1/250s to avoid motion blur, and an ISO setting of 200 for a clear, well-lit image. Use a warm white balance and high contrast to enhance the image's clarity and engagement." title="A minimalist flowchart with a series of simple event icons, such as a lightbulb for an idea, a gear for a process, and a checkmark for completion, connected by arrows. Each event icon represents a step in a process, with the arrows showing the flow from one event to the next, ultimately leading to a final state. The image should visually convey the concept of building the current state from a sequence of past events, with a clean and professional design. The background is plain, allowing the event flow to stand out clearly. Capture the scene with a Canon TS-E 17mm f/4L Tilt-Shift lens for a wide-angle view, set at f/8 for moderate depth of field, with a shutter speed of 1/250s to avoid motion blur, and an ISO setting of 200 for a clear, well-lit image. Use a warm white balance and high contrast to enhance the image's clarity and engagement." srcset="https://substackcdn.com/image/fetch/$s_!3Ke-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!3Ke-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!3Ke-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!3Ke-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf26b26e-d952-45ba-8539-4058896ae180_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><div><hr></div><h2>State vs. Events</h2><p>Are you familiar with meetings like Sprint Retrospectives, Post-Mortems, or Project Retrospectives, where you struggle to recall anything beyond the final outcome? We naturally focus on results rather than the process, on the end goal rather than the journey itself. However, the journey is significant, and to gain deeper insights and context, we need to understand the evolution.</p><p>I once led a several-month project and insisted on holding a retrospective. The first step was to create a list of events that described the project after each significant change. It looked something like this&#8212;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6WKU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6WKU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png 424w, https://substackcdn.com/image/fetch/$s_!6WKU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png 848w, https://substackcdn.com/image/fetch/$s_!6WKU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!6WKU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6WKU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png" width="1456" height="902" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:902,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:218002,&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;: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_!6WKU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png 424w, https://substackcdn.com/image/fetch/$s_!6WKU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png 848w, https://substackcdn.com/image/fetch/$s_!6WKU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!6WKU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a6999bb-7e77-4004-85eb-f2a6585df1fe_2541x1574.png 1456w" sizes="100vw"></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 approach is inspired by Event Sourcing. In a previous post, I discussed <a href="https://blog.matangr.com/p/event-driven-communication-cd86465de277">event-driven communication</a>. In this post, I'll focus on tracking and analyzing using the event-sourcing method.</p><h2>Event Sourcing</h2><p>In traditional state-based systems, we decide what information to record and store in the latest state. For example, we might store the estimated project duration or the current scope at a given time.</p><p>With event sourcing, we record only events; the actual state is derived by "replaying" these events. Here&#8217;s an example from our project&#8212;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tPdJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tPdJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png 424w, https://substackcdn.com/image/fetch/$s_!tPdJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png 848w, https://substackcdn.com/image/fetch/$s_!tPdJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png 1272w, https://substackcdn.com/image/fetch/$s_!tPdJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tPdJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png" width="1456" height="1209" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1209,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:239030,&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_!tPdJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png 424w, https://substackcdn.com/image/fetch/$s_!tPdJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png 848w, https://substackcdn.com/image/fetch/$s_!tPdJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.png 1272w, https://substackcdn.com/image/fetch/$s_!tPdJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7177fed-267c-4e3e-9048-b56bc5b3f87b_2195x1822.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>Let&#8217;s demonstrate it with another example. Imagine an e-commerce site that manages online purchases. A traditional state-based approach will look something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tSMi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tSMi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png 424w, https://substackcdn.com/image/fetch/$s_!tSMi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png 848w, https://substackcdn.com/image/fetch/$s_!tSMi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png 1272w, https://substackcdn.com/image/fetch/$s_!tSMi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tSMi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png" width="1456" height="344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133099,&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_!tSMi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png 424w, https://substackcdn.com/image/fetch/$s_!tSMi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png 848w, https://substackcdn.com/image/fetch/$s_!tSMi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png 1272w, https://substackcdn.com/image/fetch/$s_!tSMi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94bf70ad-2843-4408-84cd-afea12c2d507_4111x972.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>While this provides a snapshot of the current purchase status, it lacks context about how it got there. For example, it becomes difficult if we want to refund delivery costs for orders that stayed in "Awaiting Delivery" for more than three days. This would likely require redesigning the data model and possibly migrating data (assuming it's available). Now, let&#8217;s see how event sourcing could solve this&#8212;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VU0A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VU0A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png 424w, https://substackcdn.com/image/fetch/$s_!VU0A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png 848w, https://substackcdn.com/image/fetch/$s_!VU0A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png 1272w, https://substackcdn.com/image/fetch/$s_!VU0A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VU0A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png" width="1456" height="708" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:708,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:262858,&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_!VU0A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png 424w, https://substackcdn.com/image/fetch/$s_!VU0A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png 848w, https://substackcdn.com/image/fetch/$s_!VU0A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.png 1272w, https://substackcdn.com/image/fetch/$s_!VU0A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82fdf505-bb6b-495f-890e-cbaf55285577_2867x1395.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>In this example, the purchase events are in chronological order, allowing us to replay them at any time to gain insights into their current or previous state.</p><h2>Why Use It?</h2><p>Event sourcing offers several benefits:</p><ul><li><p><strong>Context</strong>: Provides insight into how the state is derived.</p></li><li><p><strong>Scalability</strong>: Enables the separation of writing new, unopinionated events from calculating the current state.</p></li><li><p><strong>Flexibility</strong>: Simplifies adapting to changes and new requirements since the state can always be derived by replaying past events.</p></li></ul><h3><strong>Our Project Example</strong></h3><p>Returning to the project example, recording and reviewing events changed my perception of the project's success. Suddenly, I could see all the change management, reduced resources, and increased scope, which, in the bigger picture, reframed the project as successful. Simply looking at the start and end dates wouldn&#8217;t have provided this perspective.</p><h3>How to Get Started:</h3><ol><li><p><strong>Identify Objective Data Points</strong>: Decide on the key data points you can track, such as scope, available resources, dates, and other indisputable facts.</p></li><li><p><strong>Maintain a Log</strong>: Record every change by adding a new event to the log, capturing the agreed-upon data points.</p></li><li><p><strong>Define the &#8220;Projection&#8221;</strong>: Determine what you want to assess in the final state, such as project duration, the number of scope changes, or invested man-months.</p></li><li><p><strong>Replay the Events</strong>: Go through the events chronologically and calculate the &#8220;projection&#8221; to analyze the project's evolution.</p></li></ol><p>While this approach can be tedious and resource-intensive, it provides valuable context and data-driven insights that outweigh opinions. Objective data points offer a more reliable assessment than the subjective analysis of one individual.</p><h2>More Use Cases</h2><p>Here are some other areas where a similar approach can be applied:</p><ul><li><p><strong>Decision-Making</strong>: Log each step and opinion from ideation to the final decision. This helps provide context and insights into why decisions were made, making revisiting and questioning confident choices easier.</p></li><li><p><strong>Conflict Resolution</strong>: Track the events from the beginning of the conflict. Record who was involved, what each person said, and the actions taken. Agreeing on the facts and events leading up to the conflict brings you 80% closer to resolving it.</p></li><li><p><strong>Career Growth Tracking</strong>: Knowing where you are now is more accessible than understanding how you got here. Tracking changes and decisions in your career allows you to be more candid and honest with yourself. Knowing your journey so far can help you better craft the road ahead.</p></li></ul><h2>Summary</h2><p>Event sourcing is an architectural design pattern that manages the state through an event log. It offers benefits like richer history, improved context, and the ability to "time travel." This technique can also be applied to project management and career growth tracking to gain more objective insights into how things evolved.</p><p>Will you give it a try?</p>]]></content:encoded></item></channel></rss>