<?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[Suraj on Software]]></title><description><![CDATA[HI folks, I am Suraj, a Staff Software Engineer at Sofi Technology Solutions with over 10 years of software engineering experience working in large scale enterprises. Here you will find my perspectives on software engineering.]]></description><link>https://www.surajsangani.com</link><image><url>https://www.surajsangani.com/img/substack.png</url><title>Suraj on Software</title><link>https://www.surajsangani.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 08 Sep 2026 05:01:45 GMT</lastBuildDate><atom:link href="https://www.surajsangani.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Suraj Sangani]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[suraj.sangani@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[suraj.sangani@substack.com]]></itunes:email><itunes:name><![CDATA[Suraj Sangani]]></itunes:name></itunes:owner><itunes:author><![CDATA[Suraj Sangani]]></itunes:author><googleplay:owner><![CDATA[suraj.sangani@substack.com]]></googleplay:owner><googleplay:email><![CDATA[suraj.sangani@substack.com]]></googleplay:email><googleplay:author><![CDATA[Suraj Sangani]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Using AI Agent Teams to accelerate development]]></title><description><![CDATA[We are living in an exciting time.]]></description><link>https://www.surajsangani.com/p/using-ai-agent-teams-to-accelerate</link><guid isPermaLink="false">https://www.surajsangani.com/p/using-ai-agent-teams-to-accelerate</guid><dc:creator><![CDATA[Suraj Sangani]]></dc:creator><pubDate>Mon, 07 Sep 2026 21:04:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!V2WH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.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_!V2WH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V2WH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png 424w, https://substackcdn.com/image/fetch/$s_!V2WH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png 848w, https://substackcdn.com/image/fetch/$s_!V2WH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png 1272w, https://substackcdn.com/image/fetch/$s_!V2WH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V2WH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png" width="1280" height="719" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/107302d3-07ba-4617-8927-cecd6c884815_1280x719.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:719,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:218273,&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://www.surajsangani.com/i/214636609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.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_!V2WH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png 424w, https://substackcdn.com/image/fetch/$s_!V2WH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png 848w, https://substackcdn.com/image/fetch/$s_!V2WH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.png 1272w, https://substackcdn.com/image/fetch/$s_!V2WH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F107302d3-07ba-4617-8927-cecd6c884815_1280x719.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 aria-hidden="true" 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><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>We are living in an exciting time. Innovation in software development usually comes in waves and AI is a massive wave that has upended the way software developers approach feature work and has accelerated the amount of work that can get done in a short amount of time. Over the last week, I have been experimenting using Claude&#8217;s<span> </span><strong><a href="https://code.claude.com/docs/en/agent-teams">Agent Teams</a></strong><span> </span>feature in order to accelerate some of my development work and I wanted to share my experiences using this experimental feature.</p><p>To provide some context: envision a project comprising 10 distinct tasks. In a typical workflow, each engineer would independently spearhead a single task, driving it toward completion until the collective delivery of all 10 tasks culminates in the successful achievement of the overarching project objective.</p><p>For each task, we have built sufficient test harnesses to ensure the agent has successful criteria to judge its work when accomplishing a task. The agent first writes the tests that it must fail against, then writes the implementation against those tests and finally runs the tests again to ensure that the implementation is correct. It continues to do this until it gets the implementation of that task correct i.e. a test driven agentic loop.</p><p>I noticed that for each engineer, despite the task being quite templatized, it would still take them 2-3 days to complete the task along with the help of an agent guiding them through the development. So what I set out to accomplish is this - Could I run a team of agents that can accomplish not just a task, but an entire project by itself. That is when I ran into Claude Agent Teams.</p><p>Claude Agent Teams essentially allows you to have a team of agents working together in order to achieve a shared objective. The agents will have a team lead which will coordinate, organize and delegate tasks to its teammates in order to achieve the goal you&#8217;re working on. The team lead essentially is the main window and the only agent that you interact with. While you do have an option to interact with the teammates, I chose to interact only with the team lead and used the team lead to relay the message to appropriate teammates.</p><p>I set out with a prompt like this:</p><pre><code><code>I am intending to complete Project X. The skills to complete a project like this are already present in this repository where the agent can go research the code in order to accomplish a task and then use the loop-until-task-complete skill in order to complete the task. However we have not identified all the tasks for Project X. You can refer to the tasks done for Project Y as a reference. Create an agent team to explore this from different angles - one to do research, few of them to accomplish the tasks (one per task), and spin out multiple merge requests for each functionality that can be reviewed by an engineer on the Team.</code></code></pre><p>After sending this the agent set out to explore using subagents to come up with a plan that I can review. Another pattern I followed once I had the initial plan was to use an<span> </span><strong><a href="https://jatinmishra27.medium.com/when-your-ai-needs-an-enemy-the-case-for-adversarial-agents-30a906b2273b">adversarial agent</a></strong>. While I did not do the complete loop in an automated fashion as the article mentions; I did use the critique received by a parallel agent, in order to iteratively improve the plan and capture the missing pieces. The plan consisted of 4 Phases:</p><ol><li><p>Phase 0 - Creation of Tickets to track the work</p></li><li><p>Phase 1 - Bootstrap MR</p></li><li><p>Phase 2 - Research only MR to document the inventory of tasks</p></li><li><p>Phase 3 - Per task MRs (one agent, one task, one MR)</p></li></ol><p>Each phase of the plan had a significant amount of details and I spent around two days refining the plan itself in order to get the plan correct. For each Phase, the plan consisted of a success criteria for the phase and especially for Phase 3, the plan consisted of all the subtasks that the agents would perform in order to call the task done and create an MR. Between each Phase, the team lead would ask for my explicit approval before proceeding.</p><h3><strong>Learnings</strong></h3><h3><strong>Deadlocks and Race Conditions</strong></h3><p>One interesting race condition that I had to address was the testing between the per task agents. Theoretically you could have run multiple agents at the same time to ensure that the task finishes quickly. But practically, my local setup only has one database running in a docker container and if two agents were running at the same time that would cause contention. The team lead came up with an idea to assign locks to agents that are running at the same time. However one feedback I had to provide the team lead was to ensure that idle agents are not consuming the lock thereby leading to a deadlock situation.</p><h3><strong>Interactions with Teammates</strong></h3><p>According to Claude&#8217;s documentation, you could interact with teammates directly. But practically when I was running through the gauntlet, my messages sent to the teammates directly did not get any response. However if I asked the team lead to relay the messages they would get sent just fine. The team lead was also proactive in poking the teammates if they were idle when they were not supposed to be idle and it used git commit history as well in order to determine if a teammate was hung.</p><h3><strong>Inter-process communication</strong></h3><p>The lead agent did recommend me using the /loop 30m so that I would get an idea of where the execution of the project was but I was skeptical on the usage of the loop due to the number of tokens used and pollution of the context window. While the team lead was quite responsive when I asked for a status, there are still some bugs that Anthropic can sort out for communication between the team lead and the teammates. I had multiple times when the teammates were idling (in the worst case - overnight) and the team lead was under the false impression that the teammates were performing work.</p><h3><strong>Cost</strong></h3><p>Cost for the team lead session as per /cost: $514.93 (Note: This doesn&#8217;t account for the teammates cost)</p><p>ccusage for all the entire team comes out to $3300.</p><p>Total Duration (API): 6h 37m</p><p>Total Duration (wall): 3d 2h 10m</p><p>Models used - Opus 4.7 and Haiku 4.5</p><p>This is where the savings get interesting - Our initial estimates computed close to 110 Story Points for this work. This would likely take a single engineer about 6 months to complete this effort. Since we still need to spend time reviewing this code we can cut the estimates by half. But even so that is a significant saving in effort/$ spent.</p><h3><strong>Conclusion</strong></h3><p>At the end of the 3-day session, we merged in the bootstrapping code and the research inventory and now have around 15 merge requests which need to be reviewed by myself and my teammates.</p><p>This feature from Anthropic has a lot of potential. I can see this expanding quite a lot where agents can start picking up features from the Sprint Board itself and send out merge requests that the humans then review. I do want to also use this feature for a smaller feature task in order to understand how it scales for a smaller task. I suspect I could use it a lot to avoid pollution of my main window in order to create a coordinated workflow to complete a feature.</p>]]></content:encoded></item><item><title><![CDATA[Welcome to Suraj on Software]]></title><description><![CDATA[A place where I share my thoughts and experiences as a Software Engineer.]]></description><link>https://www.surajsangani.com/p/join-my-new-subscriber-chat</link><guid isPermaLink="false">https://www.surajsangani.com/p/join-my-new-subscriber-chat</guid><dc:creator><![CDATA[Suraj Sangani]]></dc:creator><pubDate>Tue, 30 Dec 2025 14:03:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KYZT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My name is Suraj Sangani. I am a Staff Software Engineer with over 10 years of experience working in medium and large scale enterprises. I started off as an intern at Amazon progressing all the way to SDE II before moving to Galileo (now Sofi Technology Solutions) as a Senior Software Engineer where I have been for the last 5.5 years.</p><p>In this blog, I intend to talk about my experiences and share some of the things I have learned along the way. Some of it I have lived through directly, some of it I have watched happen to others, and I hope a bit of it resonates with you. Please join the chat below if you would like to discuss or debate on anything related to software engineering. I am always up for a robust discussion about what folks run into in their day-to-day jobs. And do subscribe if this sounds like your kind of thing. I plan to post about once a month.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://open.substack.com/pub/mindfulengineering/chat&quot;,&quot;text&quot;:&quot;Join chat&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://open.substack.com/pub/mindfulengineering/chat"><span>Join chat</span></a></p><div><hr></div><h2>How to get started</h2><ol><li><p><strong>Get the Substack app by clicking <a href="https://substack.com/app/app-store-redirect">this link</a> or the button below.</strong> New chat threads won&#8217;t be sent sent via email, so turn on push notifications so you don&#8217;t miss conversation as it happens. You can also access chat <a href="https://open.substack.com/pub/mindfulengineering/chat">on the web</a>.</p></li></ol><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.com/app/app-store-redirect&quot;,&quot;text&quot;:&quot;Get app&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.com/app/app-store-redirect"><span>Get app</span></a></p><ol start="2"><li><p><strong>Open the app and tap the Chat icon.</strong> It looks like two bubbles in the bottom bar, and you&#8217;ll see a row for my chat inside.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KYZT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KYZT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KYZT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KYZT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KYZT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KYZT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:241528,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://kylewarrentest.substack.com/i/114198534?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KYZT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KYZT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KYZT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KYZT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f63c9a-2296-4c96-a2f9-52648999bb00_2000x1000.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 aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol start="3"><li><p><strong>That&#8217;s it!</strong> Jump into my thread to say hi, and if you have any issues, check out <a href="https://support.substack.com/hc/en-us/sections/360007461791-Frequently-Asked-Questions">Substack&#8217;s FAQ</a>.</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.surajsangani.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Mindful Engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Admitting your mistakes and taking ownership as a Software Engineer]]></title><description><![CDATA[How taking ownership of your changes regardless of their size, impact, and scope can help you grow in your career..]]></description><link>https://www.surajsangani.com/p/admitting-your-mistakes-and-taking</link><guid isPermaLink="false">https://www.surajsangani.com/p/admitting-your-mistakes-and-taking</guid><dc:creator><![CDATA[Suraj Sangani]]></dc:creator><pubDate>Wed, 24 Dec 2025 16:41:35 GMT</pubDate><content:encoded><![CDATA[<p>As a Software Engineer who has been in the industry for 10+ years, it would be foolish to say that I have not committed any mistakes. I thought it would be great to write down some of the experiences I have had when I committed those mistakes and how I rose above them in order to become a better software developer. While those mistakes are avoidable in hindsight, I am not intending to dive into why those mistakes were made; I would like to dive into how I grew from them. </p><p>During my time at Amazon, I was under immense time and performance pressure. We had a deliverable that was running 3 months behind schedule and management had put a lot of pressure on everyone to get the project back on track. My manager was doing a great job of shielding the software engineers from those time pressures but at the same time we were aware of the mounting pressure from senior leadership. These stresses caused me to go into a funk where I shipped two changes in consecutive months that caused outages. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.surajsangani.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Suraj&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>To ship code changes, Amazon has their own build pipelines that enables engineers to stagger their code changes from their local development environments to production systems serving their millions of customers. These pipelines could be either fully automated, semi-automated or manually triggered. For those pipelines that were manually triggered, engineers were required to write a change release document that would describe the changes going out, the metrics to be monitored when those changes went out, the testing performed for those changes, and rollback criteria. Despite writing those changes and being peer reviewed by other engineers, I somehow managed to ship back-to-back changes causing outages. These outages led to an all hands on deck situation with multiple senior engineers involved. </p><p>During these outages, I had two options - a) sit back and let the on-call engineer take responsibility or b) join the outage calls, and help out wherever possible. Its easy to take the first option. As a matter of fact, I have seen many engineers take the first option. It could also happen that the change that you deployed did not break immediately and broke after a while. The on-call engineer would debug the issue, mitigate it by rolling back the change or rolling forward with a fix and everyone would move on. </p><p>The latter option is what I opted for despite being backlogged with other tasks. This option did mean that I spent way more time working outside my normal hours because I could not forego my responsibility towards the already committed tasks. This idea of working outside hours and taking additional responsibility might be balked at by many others. However, at the same time, my thought process in my career has always been as follows: &#8220;When I am shipping a piece of software, no matter the size of it, it has my name attached to the software and therefore I am responsible for how it performs.&#8221; </p><p>There are a few advantages of taking the latter option. Incident calls provide a great opportunity of how changes perform in production and also how other systems react to your changes. Taking that responsibility also gets noted by everyone who joins the incident calls which sometimes can include senior leadership thus earning you more brownie points. Learning opportunities are plenty in any software development organization but picking up the right opportunities to learn is critical and incident calls are one of them.</p><p>I wouldn&#8217;t say I did everything correctly though. When the outage initially hit, even though I noted that an incident has occurred, I did not bother to check what caused the outage. This despite knowing that the outage happened in the exact same system I was working on. The on-call engineer who got assigned the incident, started looking into it, looped my manager in who in-turn then pinged me about the incident. After seeing those messages, I had a sinking feeling in my stomach but I decided to take responsibility and join the incident call.</p><p>As I grew more in my career at Galileo, I recently had a change which unfortunately broke in production. This happened due to my lack of experience working in C code and not understanding how memory leaks could happen due to the code change. In this particular situation, it was very apparent that this was my code that broke. I had a lot of learnings from what I had experienced in my career previously. I immediately notified both my manager and the on-call engineer in a group chat that there is a high probability that the change that I deployed could be the reason for the outage. The on-call engineer acknowledged this and started looking into the recent deployment and caught the bug that was deployed out. I was helping out wherever needed to take the shared responsibility and we were able to do a quick rollback to ensure there was no client impact.</p><p>In both the situations, I took responsibility for my changes however the perceived actions by my manager are slightly different. Earlier in my career, my manager would probably have marked this mistake against me had this been repeated again, but in the second situation, my manager acknowledged that bugs are part and parcel of code change deployments and would not hold the mistake against me.</p><p>I will leave you with the following advice that I received very early on in my career and has helped me a lot - &#8220;People are programmed to remember how you handle mistakes, not your successes.&#8221;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.surajsangani.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Suraj&#8217;s Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>