<?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[automation hacks]]></title><description><![CDATA[Helping you elevate ⚡️ your software testing and automation.]]></description><link>https://newsletter.automationhacks.io</link><image><url>https://substackcdn.com/image/fetch/$s_!rTV8!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32988dfb-ec1a-4968-ac60-591ff8032f0f_1024x1024.png</url><title>automation hacks</title><link>https://newsletter.automationhacks.io</link></image><generator>Substack</generator><lastBuildDate>Sun, 05 Apr 2026 15:35:05 GMT</lastBuildDate><atom:link href="https://newsletter.automationhacks.io/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Gaurav Singh]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[automationhacks@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[automationhacks@substack.com]]></itunes:email><itunes:name><![CDATA[Gaurav Singh]]></itunes:name></itunes:owner><itunes:author><![CDATA[Gaurav Singh]]></itunes:author><googleplay:owner><![CDATA[automationhacks@substack.com]]></googleplay:owner><googleplay:email><![CDATA[automationhacks@substack.com]]></googleplay:email><googleplay:author><![CDATA[Gaurav Singh]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Senior Engineering Traits: Come with solutions not problems!]]></title><description><![CDATA[Why being a complainer at work; does not really work in your favor; especially when communicating to leadership.]]></description><link>https://newsletter.automationhacks.io/p/senior-engineering-traits-come-with-solutions-not-problems</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/senior-engineering-traits-come-with-solutions-not-problems</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sun, 29 Mar 2026 01:43:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uevT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.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_!uevT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uevT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png 424w, https://substackcdn.com/image/fetch/$s_!uevT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png 848w, https://substackcdn.com/image/fetch/$s_!uevT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png 1272w, https://substackcdn.com/image/fetch/$s_!uevT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uevT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1025822,&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://newsletter.automationhacks.io/i/192473155?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.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_!uevT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png 424w, https://substackcdn.com/image/fetch/$s_!uevT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png 848w, https://substackcdn.com/image/fetch/$s_!uevT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.png 1272w, https://substackcdn.com/image/fetch/$s_!uevT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ba27d1-4fc8-4df2-9346-16235aca4a7e_1408x768.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">Generated with Gemini Pro</figcaption></figure></div><p>We have all been there, something is not working.</p><p>You are not happy.</p><p>You want to put it out in the world and your manager/skip seems to be an empathetic ear around.</p><p>You decide to vent and rant. It feels great at the moment, but was it effective in actually solving the problem and what could be unintentional side effects? Let&#8217;s break it down a bit.</p><h2>Complaints, galore!</h2><p>It could be any of the below situations</p><ul><li><p>A project timeline is too aggressive and impractical to deliver</p></li><li><p>A cross functional partner is too demanding.</p></li><li><p>Another team is not prioritising your dependency and giving an impractical timeline to deliver a work that you need to move forward</p></li><li><p>A difficult co-worker is not working well or withholding information from you</p></li><li><p>A piece of software or infra is badly designed and the accrued tech debt is slowing you down</p></li><li><p>A system you depend on is heavily undocumented with no usage/API information</p></li><li><p>A team member is not pulling their weight</p></li></ul><p>So on and so forth.</p><p>Ouch! These all seem like pretty gnarly problems.</p><p>Some of them may look like problems that your manager should pitch in and solve for you.</p><p>They also may look like great topics to discuss in your 1:1&#8217;s with your manager or skip level.</p><p>You may decide to vent and rant in front of your manager for 40-45 mins, thinking now you and your leaders are on the same page.</p><p>You may also feel more relaxed after venting on a topic.</p><p>But, then what?</p><h2>What your leader may hear?</h2><p>Did you pay any attention to how the person on the other side of the table may perceive these?</p><p><em>Disclaimer: This is just one of the many possibilities of how your leaders may read this situation. These intentionally adopt a devil&#8217;s advocate mindset.</em></p><p>Remember your leader is also human and each one of us have their own set of beliefs and preconceived biases.</p><p>It may also go in one of the below directions as well.</p><p><strong>A cross functional partner is too demanding</strong></p><p><em>[Leader] maybe, this person is not able to work with challenging situations and their negotiation and conflict resolution skills needs improvement</em></p><p><strong>Another team is not prioritising your dependency and giving an impractical timeline</strong></p><p><em>[Leader] Did they communicate in the right way? could their collaboration and trust building skills improve?</em></p><p><strong>A difficult co-worker is not working well or withholding information from you</strong></p><p><em>[Leader] Are they not able to work well with others? What else have they tried to smoothen the collaboration?</em></p><p><strong>A project timeline is too aggressive and impractical to deliver</strong></p><p><em>[Leader] As an experienced engineer, why are they not able to push back in the right way with data? Should I trust them with more responsibility?</em></p><p><strong>A piece of software or infra is badly designed and the accrued tech debt is slowing you down</strong></p><p><em>[Leader] Okay, but what can they do to solve this or improve the status quo? Did they research the problem space? Is there a design doc already?</em></p><p><strong>A team member is not pulling their weight</strong></p><p><em>[Leader] What have they tried already with the person? Did they dive deeper to figure out the root cause?</em></p><p>Get it?</p><p>After reading the possible inner monologues, you may be thinking, <em>hold on now, the manager here is very skeptical and does not have a lot of trust in their engineer, does it?</em></p><p>Your leader may not necessarily think the exact same things.</p><p>They may be supportive and non judgemental and work with you to dig deeper into the problem. You&#8217;ll never know how they took it for sure but may get signals (verbal or non verbal). &#129300;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/senior-engineering-traits-come-with-solutions-not-problems">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to run and build your own MCP servers for AI Agents]]></title><description><![CDATA[Learn how to add MCP servers into your AI workflows and build one using Python SDK, and inspect them when required.]]></description><link>https://newsletter.automationhacks.io/p/how-to-run-and-build-your-own-mcp-servers-for-ai-agents</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/how-to-run-and-build-your-own-mcp-servers-for-ai-agents</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Wed, 11 Mar 2026 01:31:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cbky!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.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_!cbky!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cbky!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png 424w, https://substackcdn.com/image/fetch/$s_!cbky!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png 848w, https://substackcdn.com/image/fetch/$s_!cbky!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png 1272w, https://substackcdn.com/image/fetch/$s_!cbky!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cbky!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png" width="1456" height="1060" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1060,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:703664,&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://newsletter.automationhacks.io/i/190573071?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.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_!cbky!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png 424w, https://substackcdn.com/image/fetch/$s_!cbky!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png 848w, https://substackcdn.com/image/fetch/$s_!cbky!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.png 1272w, https://substackcdn.com/image/fetch/$s_!cbky!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14159fa8-1501-4d80-8c2d-522f608036b7_2477x1803.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>Why MCP?</h2><p>Before <a href="https://modelcontextprotocol.io/docs/getting-started/intro">MCP (Model context protocol)</a> and <a href="https://agentskills.io/home">Agent skills</a> were introduced as open standards, Developers had to write their own functions and prompts to provide LLM&#8217;s (Large language models) access into <strong>existing data sources</strong> and tools (such as API&#8217;s, databases, files). Many ask their models to generate APIs or scripts on demand to achieve some outcome and hope for the best. &#129310;</p><p>You had to provide the right context and hope that the agent would discover the correct <a href="https://aws.amazon.com/what-is/api/">API (Application programming interfaces)</a> function to pick. Also, from an LLM&#8217;s perspective, to identify the right resources to do a task, it had to load everything in its context window and then go from there. This was both inefficient and also wasteful in nature.</p><p>While this approach somehow worked with the occasional hallucination, in practice, it made it incrementally hard to produce systems that can be reused between developers and relied upon.</p><p>MCP makes an attempt at solving this problem.</p><p>Just like web frameworks and REST/gRPC helped standardize API development by providing a framework and structure for writing better API&#8217;s. MCP provides a similar structure on how an LLM could interact with different data sources and do tasks for you.</p><h2>What does it mean in practice?</h2><p>MCP allows LLMs to use capabilities from different systems such as,</p><ol><li><p>API&#8217;s</p></li><li><p>Data sources and resources (files, databases),</p></li><li><p>Use Tools (scripts) to perform different tasks at hand.</p></li></ol><p>Let&#8217;s understand this with an example.</p><p>Say,. You want your LLM to be able to provide you with helpful info about the weather before you leave your house. Assume you have an API that provides your weather information for different countries and states in the US.</p><p>How can you make it easy for your LLM to interface/use this API as you instruct it in natural english?</p><p>You can either use an MCP server exposed by this provider or create your own to get the LLM to query the weather and then return a response in natural language like English. You don&#8217;t need to know how the API is implemented under the hood, nor how the MCP server is created, but adding it to your client (IDE or a desktop/web app) provides you the capability to make use of it.</p><p>Sounds cool? Yes, it is. We&#8217;ll build this MCP server shortly for this exact use case.</p><h2>Anatomy of an MCP server</h2><p>What makes an MCP server?</p><p>Well, three main things really.</p><h3>Tools</h3><p>MCP servers expose a set of tools that your model can invoke to get a task done. What are some examples of tools? If you open tools in VS code in Github Copilot chat, you can see a few built-in tools like <strong>search files</strong> in workspace, <strong>read files</strong> in workspace, <strong>execute code</strong> and apps on your machine etc. If you can write a function to do something, it can be exposed as a tool.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EcTq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EcTq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png 424w, https://substackcdn.com/image/fetch/$s_!EcTq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png 848w, https://substackcdn.com/image/fetch/$s_!EcTq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png 1272w, https://substackcdn.com/image/fetch/$s_!EcTq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EcTq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png" width="1214" height="1130" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1130,&quot;width&quot;:1214,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EcTq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png 424w, https://substackcdn.com/image/fetch/$s_!EcTq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png 848w, https://substackcdn.com/image/fetch/$s_!EcTq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.png 1272w, https://substackcdn.com/image/fetch/$s_!EcTq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e012897-a1ee-470f-bd7c-4eff4f87e915_1214x1130.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>More concretely, there are 3 types of tools</p><ol><li><p><strong>Built in</strong> &#8211; built out of the box by your IDE (Integrated Development Environment)/CLI (Command line interface) Agent. For example, see <a href="https://code.visualstudio.com/docs/copilot/reference/copilot-vscode-features#_chat-tools">GitHub Copilot in VS Code cheat sheet</a> for list of tools</p></li><li><p><strong>MCP tools</strong> &#8211; these are third party open source tools that are built by developers, see <a href="https://github.com/mcp?page=1">MCP Registry</a>  for a list of the popular ones</p></li><li><p><strong>Extension tools</strong> &#8211; Within VS code&#8217;s context, you get a bunch of tools when you install an extension, you can also use <strong>language model tools API</strong> to provide functionality while accessing the full range of <strong>VS code extension APIs</strong>. If curious, you can read <a href="https://code.visualstudio.com/api/extension-guides/ai/tools">Language Model Tool API | Visual Studio Code Extension API</a></p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/how-to-run-and-build-your-own-mcp-servers-for-ai-agents">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Unpacking Agent skills and AI Coding Agents on CLI]]></title><description><![CDATA[We unpack what AI Coding Agents on CLI look like with GHC CLI and dive deeper into Agent skills and how to create an Agent]]></description><link>https://newsletter.automationhacks.io/p/unpacking-agent-skills-and-ai-coding-agents-on-cli</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/unpacking-agent-skills-and-ai-coding-agents-on-cli</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Thu, 26 Feb 2026 16:21:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JvFF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.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_!JvFF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JvFF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png 424w, https://substackcdn.com/image/fetch/$s_!JvFF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png 848w, https://substackcdn.com/image/fetch/$s_!JvFF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png 1272w, https://substackcdn.com/image/fetch/$s_!JvFF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JvFF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png" width="1456" height="671" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:671,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:857273,&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://newsletter.automationhacks.io/i/189266406?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.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_!JvFF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png 424w, https://substackcdn.com/image/fetch/$s_!JvFF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png 848w, https://substackcdn.com/image/fetch/$s_!JvFF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png 1272w, https://substackcdn.com/image/fetch/$s_!JvFF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfbd8e6-da6d-4883-b4a0-a55d95097732_3774x1740.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>AI Agents may be a bit confusing to start with because there are so many different flavors of them on different toolchains.</p><p>If you are new to the topic, you may be wondering:</p><p>What is an Agent? How are they different from chat bots like Chat GPT / Microsoft copilot / Gemini etc?</p><p>The quick dirty answer is: They can <em><strong>do stuff</strong> for you apart from answering questions.</em></p><p>Notice the emphasis on &#8220;Do&#8221;</p><p>What stuff?</p><p>Below are some common use cases in the world of Software Engineering</p><ol><li><p>They can <strong>write</strong> code for you; it could either be source code like a UI component in a React JS web app, a backend service, an automated test using playwright, Selenium, Appium or other tools</p></li><li><p>They can <strong>edit</strong> existing code for you i.e. help you with refactoring code</p></li><li><p>They can <strong>analyse</strong> your code and explain how it works; you can ask questions and use them to explain certain snippets</p></li><li><p>They can even <strong>write docs</strong> for you</p></li><li><p>They can generate <strong>diagrams</strong></p></li></ol><p>The list is quite exhaustive and increasing and thus all the hype and excitement.</p><p>Sounds pretty magical right?</p><p>You now have the capability to <strong>insert text in English</strong> and <strong>get</strong> one of these artifacts as output: <strong>code, docs, images, videos etc</strong>. And this could be a one time ask or even a system that can generalize a bit.</p><p>Like a nice person, model and tooling ask for your permissions before doing something a bit more serious, like <strong>run a command, </strong>take over your screen and do stuff for you etc.</p><p><strong>A word of caution:</strong></p><p>Also, just like you won&#8217;t hand over your bank account passwords to a stranger. Please don&#8217;t <strong>trust a machine with unattended access</strong> on your personal data. Do not relinquish control. Don&#8217;t be lazy; be smart and know how to work well with technology. Anything that is sensitive in nature like your secrets (passwords, passphrases), bank details etc should be guarded. If you don&#8217;t want it in public; guard it and be careful around security and access control.</p><p>With that moral obligation off my chest, let&#8217;s dive in</p><p>For this blog, I&#8217;ll assume you have a programming background or are in technology space but even if not, the general principles are still pretty intuitive to know about.</p><h2>How can Agents do so much?</h2><p>The lay person answer is:</p><ol><li><p>We provide them relevant context and knowledge in the form of docs.</p></li><li><p>We give them clear instructions on how to go about their business with examples of what good looks like</p></li><li><p>We give them access to tools and resources using Model context protocol (MCP) servers; MCP being your glorified API (Application programming interface) for Agents to interact with your favourite tools and technologies e.g. Google docs, Figma, etc</p></li><li><p>We now teach them fine grained skills using Agent skills such has how to execute a test, how to fetch logs and make sense of the returned data etc</p></li><li><p>Agents now have larger context windows and memory capabilities as well, so they can remember stuff as they execute a given request for you.</p></li></ol><p>And that&#8217;s kind of it, broadly.</p><h2>Types of run modes</h2><p>At the moment, there are 3 main types of modes in which Agents can run:</p><ol><li><p><strong>Local</strong> - on your machine, in an IDE (Integrated development environment) like VSCode, PyCharm etc</p></li><li><p><strong>Background - </strong>on your machine, but in a terminal via CLI (Command line interface)</p></li><li><p><strong>Cloud - </strong>on a cloud VM or container, these are generally integrated with your version control (VCS) systems like Github and can work autonomously and generate a pull request (PR) for you.</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/unpacking-agent-skills-and-ai-coding-agents-on-cli">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Senior Engineering Traits: High agency and ownership]]></title><description><![CDATA[Taking ownership of a hard problem space and driving projects forward are key traits that separates a high agency senior engineer from others. In this blog, I unpack my intuition on these.]]></description><link>https://newsletter.automationhacks.io/p/senior-engineering-traits-high-agency-and-ownership</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/senior-engineering-traits-high-agency-and-ownership</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sun, 08 Feb 2026 16:26:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!C1_s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.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_!C1_s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C1_s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png 424w, https://substackcdn.com/image/fetch/$s_!C1_s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png 848w, https://substackcdn.com/image/fetch/$s_!C1_s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png 1272w, https://substackcdn.com/image/fetch/$s_!C1_s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C1_s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png" width="1012" height="726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/63937620-9631-44a8-8596-c7846caecf9a_1012x726.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:1012,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1322930,&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://newsletter.automationhacks.io/i/187300840?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.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_!C1_s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png 424w, https://substackcdn.com/image/fetch/$s_!C1_s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png 848w, https://substackcdn.com/image/fetch/$s_!C1_s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.png 1272w, https://substackcdn.com/image/fetch/$s_!C1_s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63937620-9631-44a8-8596-c7846caecf9a_1012x726.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">Generated by Gemini Nano Banana</figcaption></figure></div><p>Here is the upfront secret about senior engineers.</p><p>They need to show high ownership over a meaningful technical scope. The definition of scope varies based on your specialization, context or discipline, but it&#8217;s usually a product, technology or infrastructure that is deemed valuable to the business.</p><p>What do I mean by ownership?</p><p>It is the act of understanding the nuances of the problem space deeply, establishing yourself as the go-to-expert, setting the right goals and priorities, crafting a roadmap and then working backwards from customer impact.</p><p>You may push back by saying that even mid level engineers have ownership over their own frameworks, tools, infrastructure, components, app/service etc &#8230; etc &#8230;</p><p>What is so special about a Senior engineer&#8217;s ownership level here?</p><p>I think it boils down to complexity and ambiguity of the problem space. Leaders generally expect their senior engineers to be able to hold their own in their chosen domain, be able to build clarity over unknown areas and solve hard problems.</p><p>Another way of thinking about this is that you<strong> own the impact</strong> and are a <strong>stakeholder</strong>. If the project fails, you also fail with it and are accountable.</p><p>The F word here can be scary depending on how you look at it. Each failure is an opportunity to learn, reflect and get better at not making the same mistakes again. It&#8217;s anyways much better than not trying at all. Even if you fail, at least you&#8217;ve been in the race.</p><p>Let&#8217;s dive a bit deeper and understand how you can personally cultivate an ownership mindset.</p><h2>Do you care in the first place?</h2><p>Before reading further, ask yourself do you actually care about this?</p><p>You can be an adequate senior engineer without showing strong ownership as well; your career growth may naturally get stunted though. If you do choose that path, make sure you are really okay with it.</p><p>One natural way to have more ownership is to care; pick something that you either are intrinsically motivated and passionate about or something that solves a real need or pain point for your org and company. Such scopes are often higher risk and higher reward in nature.</p><h2>Learn deeply first &#127754;</h2><p>You should know your space deeply first to be able to take ownership.</p><p>Learning the fine art of how to learn well, asking the right clarifying questions at the right time and not stopping until you have a pretty good mental model of the space is the right first step.</p><p>If this is not the case for you, this is the first thing to start with.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/senior-engineering-traits-high-agency-and-ownership">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Senior engineering traits: Be specific and clear]]></title><description><![CDATA[Have you been in meetings observing a standout software engineer? What skills or traits do they usually exhibit? Let&#8217;s unpack three most important behavioural traits.]]></description><link>https://newsletter.automationhacks.io/p/senior-engineering-traits-be-specific-and-clear</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/senior-engineering-traits-be-specific-and-clear</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Mon, 02 Feb 2026 16:48:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mCDI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_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_!mCDI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mCDI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!mCDI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!mCDI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!mCDI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mCDI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png" width="552" height="552" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_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;:552,&quot;bytes&quot;:1167814,&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://newsletter.automationhacks.io/i/186631216?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_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_!mCDI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!mCDI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!mCDI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!mCDI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798a4ebb-fb4e-4ada-abf3-c8be0dd789fd_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><figcaption class="image-caption">Generated by Gemini Nano Banana</figcaption></figure></div><p>A trait that <em>really</em> separates great software engineers from your run of the mill ones is the clarity they have and how they can talk and convey their thoughts and ideas in very specific manner</p><p>&#8220;I didn&#8217;t have time to write a short letter, so I wrote a long one instead.&#8221; - Mark Twain</p><p>The quote captures what clarity is and why it is hard to achieve. It requires deep and clear mental models of the technology you are discussing about, and is often built on top of years of experience and practical intuition that can be developed only by being hands on.</p><p>Have you observed below?</p><ol><li><p>Sometimes people go on a monologue during meetings and keep on speaking for 5-10 mins without saying anything of substance? It&#8217;s quite easy to ramble or even speak in uncertain terms</p></li><li><p>Also, often quite visible in poorly written design docs, you&#8217;ll often see docs and posts that are extremely long yet <strong>sparse</strong> in terms of high quality content. You have to really work hard to separate signal from noise in such design docs.</p></li><li><p>Also, long paragraphs that have tons of words, yet lack any specific new idea or original thought.</p></li></ol><p>If you catch yourself doing this, stop and reflect on whether you <em>actually know</em> what you are talking about?</p><p>And, For my impostor syndrome afflicted friends, It&#8217;s completely okay if you don&#8217;t though, but realising this and trying to learn more so that you can compress your intuition into specific words that are information dense, void of fluff language, is a skill that will really separate you from others around you.</p><p>This is also a learned and practiced skill that gets better with time. If you are intentional about improving your verbal and written communication and are generally passionate about your area enough to go deep, chances are you&#8217;ll mostly get there.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/senior-engineering-traits-be-specific-and-clear">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Managing up as a Software Engineer]]></title><description><![CDATA[Learn the subtle art of helping your manager, manage you better and in the process create a win win situation for the both of you.]]></description><link>https://newsletter.automationhacks.io/p/managing-up-as-a-software-engineer</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/managing-up-as-a-software-engineer</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sun, 25 Jan 2026 16:34:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7DCX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.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_!7DCX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7DCX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png 424w, https://substackcdn.com/image/fetch/$s_!7DCX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png 848w, https://substackcdn.com/image/fetch/$s_!7DCX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png 1272w, https://substackcdn.com/image/fetch/$s_!7DCX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7DCX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png" width="553" height="379.6077419354839" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:532,&quot;width&quot;:775,&quot;resizeWidth&quot;:553,&quot;bytes&quot;:797524,&quot;alt&quot;:&quot;A male employee in a hoodie talking about some ideas with his manager.&quot;,&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://newsletter.automationhacks.io/i/185731697?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A male employee in a hoodie talking about some ideas with his manager." title="A male employee in a hoodie talking about some ideas with his manager." srcset="https://substackcdn.com/image/fetch/$s_!7DCX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png 424w, https://substackcdn.com/image/fetch/$s_!7DCX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png 848w, https://substackcdn.com/image/fetch/$s_!7DCX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.png 1272w, https://substackcdn.com/image/fetch/$s_!7DCX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b5c50ab-b39e-473e-8e5e-6d817b486c2e_775x532.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">Generated by Gemini Nano Banana Pro</figcaption></figure></div><p>You may have heard this before, <em>&#8220;Your relationship with your direct manager is extremely crucial and can make or break your career&#8221;</em></p><p>Is this a trite statement?</p><p>Yes, let me be a bit more specific</p><p>Your manager by virtue of their title and role are in a lot of conversations and rooms which you will never be in. A core expectation for a manager is to retain and grow their people, so they are incentivised to be invested in your growth, but have you given them any reason to do so?</p><p>You may be thinking, shouldn&#8217;t they do this automatically? Yes, but they also have to manage other engineers at different levels and understand and try to fulfil their expectations as well. This is just one aspect of their job. They have to also ensure delivery happens on time to make progress towards the organization&#8217;s objectives, optics of the team, relationship with cross functional partners etc&#8230; etc &#8230;</p><p>Yes, their time is precious, and while they are managing you. You should also help them manage you, but learn how to manage up.</p><h2>Should I manage my manager?</h2><p>This may sound a bit counter intuitive, if you are running into this term for the first time.</p><p>Managing up is the art of how you ensure you and your manager are in sync, how you provide them all the necessary context to mentor/sponsor you effectively.</p><p>How do you do it?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/managing-up-as-a-software-engineer">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Stop Forgetting: How a Work Journal Fuels Your Software Engineering Career]]></title><description><![CDATA[How should a software engineer go about structurally capturing their contributions and impact and why does it matter?]]></description><link>https://newsletter.automationhacks.io/p/stop-forgetting-how-a-work-journal-fuels-your-software-engineering-career</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/stop-forgetting-how-a-work-journal-fuels-your-software-engineering-career</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sun, 11 Jan 2026 16:15:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ExoA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ExoA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ExoA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png 424w, https://substackcdn.com/image/fetch/$s_!ExoA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png 848w, https://substackcdn.com/image/fetch/$s_!ExoA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png 1272w, https://substackcdn.com/image/fetch/$s_!ExoA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ExoA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1825478,&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://newsletter.automationhacks.io/i/184219595?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.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_!ExoA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png 424w, https://substackcdn.com/image/fetch/$s_!ExoA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png 848w, https://substackcdn.com/image/fetch/$s_!ExoA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.png 1272w, https://substackcdn.com/image/fetch/$s_!ExoA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e3682d-6a61-484c-9702-c34970f959c4_1408x768.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">Generated by Gemini Nano banana</figcaption></figure></div><p>Tell me if any of below scenarios seem familiar</p><p>Each annual performance year</p><ul><li><p>Do you feel massive impostor syndrome as you start hunting down slack/teams group chat/channel post messages, emails and wiki&#8217;s/docs to piece together an impact story?</p></li><li><p>After an intense week at work, you are left wondering if you got anything actually done?</p></li><li><p>Did your work have any impact and is it appropriate to your scope and level at work?</p></li></ul><p>You seemed to be busy all the time and were multi-tasking a lot. Where did all the time go?</p><p>Well, I used to face the same problem until I started keeping a work journal to track what I&#8217;ve been working on.</p><p>I&#8217;ve found this practice recommended by many senior and principal engineers and have been following this personally for the past 7 years at 4 different companies with some really good benefits.</p><p>What are some of these magical benefits?</p><p>Well &#8230;</p><ol><li><p>You can read your journal and reflect on how the week went and what did you build/work on?</p></li><li><p>Read your past work and give a better standup update to your peers and leaders</p></li><li><p>Create a weekly summary for your leaders</p></li><li><p>Roll up a weekly updates into a monthly summary for broader discussion during one on ones</p></li><li><p>Automatically have bunch of data points around impact for your annual performance review</p></li><li><p>Your major projects/impact could even be something you can update in your LinkedIn or resume when the time comes around to search for a new gig. Having crisp impact stories are really effective during behavioral interviews for senior engineer interviews</p></li></ol><p>With LLM (Large language models), you can use them to analyse and get some free brainstorming/coaching from your friendly AI (Artificial intelligence) model</p><p>It only takes ~10 mins out of your workday and this simple yet effective practice gives you the peace of mind that you don&#8217;t have to remember what the heck you have been doing at work over the past year.</p><p>In this blog, Let me share my personal approach and template with you. If you like it, feel free to steal it and adapt to your own needs.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/p/stop-forgetting-how-a-work-journal-fuels-your-software-engineering-career?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading automation hacks! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/p/stop-forgetting-how-a-work-journal-fuels-your-software-engineering-career?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.automationhacks.io/p/stop-forgetting-how-a-work-journal-fuels-your-software-engineering-career?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>
      <p>
          <a href="https://newsletter.automationhacks.io/p/stop-forgetting-how-a-work-journal-fuels-your-software-engineering-career">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Your playbook to onboard well on a new team]]></title><description><![CDATA[How should you go about onboarding to a new team? What tactics make sense. I help break down all this and more in a 6 week journey.]]></description><link>https://newsletter.automationhacks.io/p/your-playbook-to-onboard-well-on-a-new-team</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/your-playbook-to-onboard-well-on-a-new-team</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sat, 03 Jan 2026 02:46:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p5NZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_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_!p5NZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p5NZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!p5NZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!p5NZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!p5NZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p5NZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png" width="532" height="532" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d74e520-4f29-4883-8ca1-9d2f9773173a_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;:532,&quot;bytes&quot;:1443280,&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://newsletter.automationhacks.io/i/183308584?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_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_!p5NZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!p5NZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!p5NZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!p5NZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d74e520-4f29-4883-8ca1-9d2f9773173a_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><figcaption class="image-caption">Generated by Gemini Nano banana</figcaption></figure></div><p></p><p>We have tons of advice on <a href="https://newsletter.automationhacks.io/p/how-i-got-that-job-at-microsoft">how to prepare well for interviews</a>, how to <a href="https://newsletter.automationhacks.io/p/ace-your-qa-tech-interview">succeed in an interview</a>, <a href="https://newsletter.automationhacks.io/p/how-to-negotiate-your-tech-job-salary">negotiate your salary</a> etc and get that job that you seek.</p><p>But &#8230;</p><p>What about when you finally join the company?</p><p>How do you ensure you land well in your new role and put yourself in a position to succeed?<br><br>I feel this topic has not gotten much love &#10084;&#65039;, and I hope to change that a little bit with this blog.</p><p>With many companies offering remote positions, I&#8217;ve found assimilating and onboarding well as a new team member is quite an art in itself. Many new employees struggle in this phase especially given that expectations from managers have increased.</p><p>I&#8217;ve worked at 7 different companies over my 14+ years of career in Software engineering and have onboarded onto multiple teams and companies of different scale. During my early career years, I mostly went with the natural flow and the vibe, but over the years I&#8217;ve refined a method out of the madness and learned a thing or two about certain practices that are quite helpful while onboarding.</p><p>Let&#8217;s get into those.</p><p><strong>Disclaimer and caveat:</strong> I will structure this in terms of loose timeline ranges of 1st week, 2-3, 4-6 weeks etc. These are just there to give you some mental hooks around how to frame your onboarding journey in your mind, depending on your context it may take longer or shorter.</p><p>For example, If you are a senior engineer tasked with a complex cross functional problem from the get go, it may take longer. Please don&#8217;t put unnecessary pressure on yourself to go faster etc. It does not help.</p><p>Do what comes naturally to you, but acknowledge the fact that any manager generally expects a new hire to be productive and fairly independent in <strong>~ 3 months</strong> (give or take) from the date of joining. For any exceptional cases, please align with your manager.</p><h2>Your 1st week &#9786;&#65039;</h2><p><em>Setup your fundamentals, meet people and leaders</em></p><p>There are two common scenarios when it comes to onboarding on a new team</p><ol><li><p>You are a new employee to the company</p></li><li><p>You are a seasoned employee, but are onboarding on to a new team in either the same org or different org.</p></li></ol><p>For this blog, I&#8217;m mostly adopting the persona of a new employee to the company as that I feel is more challenging, but the approaches and practices mentioned here remain quite similar.</p><h3>Setup your basics &#128024;</h3><p>Let&#8217;s start with the the fundamentals, during your first week</p><ol><li><p>Get your work equipment (laptop, phone), swag etc</p></li><li><p>Install tools and software required for day to day working</p></li><li><p>Sort out admin stuff like your documentation, setup payroll</p></li><li><p>Attend orientation from HR team and other peers/leaders</p></li><li><p>Meet and greet with people on the team and cross functional areas etc.</p></li></ol><p>The first week is always exciting with tons of things going on and the best advice I can give at this stage is to focus on setting up these fundamentals well.</p><p>Don&#8217;t be in a hurry to onboard just yet. Take your time to understand the environment you are in first.</p><h3>General onboarding mindset and approach &#129432;</h3><p>Below are a few tactical things you can do right away.</p><h4>Don&#8217;t be lazy. Take notes</h4><p>Please don&#8217;t rely on your memory to help you take in all sorts of random facts, procedures or context about your team/org/environment. Our brains are meant for higher order thinking and remembering all the details is not particularly your brains strong suit.</p><p>How should one take notes?</p><p>The simplest advice I can give is to go with whatever medium you are most comfortable with. Paper notes more your thing? Good, take those.</p><p>If you ask me personally, You should use a cloud drive with docs that can be easily accessed and modified or <a href="https://automationhacks.io/2019/10/19/plain-text-note-taking-system-using-markdown-for-technical-notes/">even markdown plain text notes</a></p><p>Ask questions and be curious</p><p>If you don&#8217;t understand something <strong>yet</strong>, don&#8217;t keep quiet. Ask clarifying questions to understand context better. Being silent when you are new on the team does not work in your favor, as it leaves everyone wondering if you actually are getting what&#8217;s being discussed.</p><p>Here is the secret, when you are so new, no one expects much from you, <strong>utilize the newbie hat</strong> and ask questions, also take the effort to note down the answers and resources shared by others and offer to update the onboarding docs FAQ sections. This is such a low hanging fruit, that I&#8217;m often surprised that more people don&#8217;t do this.</p><p>Your team will thank you since you took the time to do something no one likes to do; write good docs.</p><p>Speak to your manager and senior engineers on the team</p><p>You should have a 1:1 with your direct manager and a few senior engineers on the team who you may be working with.</p><p>Please don&#8217;t focus <strong>only on pleasantries</strong> but ask them:</p><ol><li><p>What do they work on? Their history, journey on the team.</p></li><li><p>What are their biggest pain points?</p></li><li><p>What are the current goals the team or org is working towards?</p></li><li><p>What is a low hanging fruit they wish someone can help them with?</p></li><li><p>Who should you talk to next?</p></li></ol><p>These are some example topics you can get into, you should have a sense of what people on your team work on and start peacing the parts of the puzzle.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/your-playbook-to-onboard-well-on-a-new-team">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Good habits for Software Engineers]]></title><description><![CDATA[&#8220;I&#8217;m not a great programmer; I&#8217;m just a good programmer with great habits.&#8221; - Kent Beck]]></description><link>https://newsletter.automationhacks.io/p/good-habits-for-software-engineers</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/good-habits-for-software-engineers</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sun, 05 Oct 2025 16:56:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!SA3E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_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_!SA3E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SA3E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!SA3E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!SA3E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!SA3E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SA3E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1180049,&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://newsletter.automationhacks.io/i/175352138?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_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_!SA3E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!SA3E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!SA3E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!SA3E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba65181-d19b-4c33-97ec-c176dc2a981a_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><figcaption class="image-caption">Generated using Gemini 2.5 Flash</figcaption></figure></div><p>Do you want to be a great Software Engineer? There are many things beyond knowing how to code or a technology deeply. In this blog, I break down all the habits that have served me over the years and that I&#8217;ve picked up on by observing other successful senior engineers.</p><p>I&#8217;ve been a software engineer for around 14+ years now and I feel this profession has been truly incredible in terms of learning new technologies, meeting incredibly talented people and working on a whole buffet of problems related to Testing. The feeling and rush of working together with a group of people to land a feature, capability, project with style and taste and see it being used by millions of people and create value in the world is truly unparalleled and makes it all worthwhile.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>I&#8217;ve also had the joy and privilege to <strong>mentor</strong> or influence many bright upcoming engineers around me in my day jobs and on <a href="https://topmate.io/automationhacks/">Topmate</a>. Each one is a beautiful snowflake with their own unique habits, workflows, aspirations and world view. I still learn from them and their unique perspectives.</p><p>Over the years, I&#8217;ve made tons of personal mistakes, learned a lot of things through experience and being at the craft for this long and in this blog I wanted to share some of these <strong>habits</strong> which <strong>I wish I had adopted sooner</strong> and looking back have made all the difference in my life.</p><p>Some of these may sound obvious to you and this is not a short laundry list of checklist items to evaluate, but hang on and read the whole thing. You just might pick up something a bit more nuanced?</p><h2>3 pillars for a software engineer</h2><p>What are the 3 most important pillars that a software engineer should focus on?</p><ol><li><p>&#9829;&#65039;Health</p></li><li><p>&#129730;Connection with Family and friends</p></li><li><p>&#129489;&#8205;&#128187;Career and growth</p></li></ol><p>Wait, you may be wondering the 1st two points have nothing to do as an engineer, so why are these here?</p><p>Yes. You are right and they are at the top because as you&#8217;ll discover failing in these fails you in your career as well.</p><h2>Health</h2><p>Why is focussing on health so important?</p><p>Software engineers could become incredibly <strong>unhealthy</strong> &#129298; pretty fast. We sit at our desks for long hours putting an incredible amount of toll on our bodies and minds, some of us are over caffeinated on coke or coffee and binge on junk food from the vending machines <em>a lot</em>.</p><p>Have you observed the intense fatigue you experience as you close the end of your work day with a heavy head, tired legs and slightly burning watery eyes.</p><p>Sometimes I wonder, all I did was type away on my keyboard and talked to people, how is it that I feel so tired at the end of the day?</p><p>I&#8217;m not a lifestyle and fitness coach, but I&#8217;ve seen many software engineers neglect focussing on their health that ends up causing a lot of harm. If you also want to do this job for as long as you possibly can, you need to start taking care of the fundamentals first.</p><p>What do I mean by health?</p><p>Let&#8217;s break it down a bit, shall we?</p><h3>&#128170; Physical health</h3><p>Let&#8217;s focus on our most important asset first: our body. &#128170;</p><ol><li><p><strong>&#129681; Posture:</strong> You should learn about ergonomics and invest in getting yourself a good height adjustable table, chair, monitor, keyboard and mouse. Please don&#8217;t type away on your laptop with a hunched body. The amount of time and money you&#8217;ll spend here is negligible compared to the amount you may have to pay later in hospital bills to relieve yourself of back pain, neck pain and wrist pain etc. Here is a good <a href="https://download.microsoft.com/download/E/4/1/E413E1EC-B4E7-4B49-B786-F07BA02C57D3/Healthy_Computing_Employee_Reference_Guide.pdf">downloadable PDF</a> to know more and get started.</p></li><li><p><strong>&#9728; &#65039; Taking regular breaks: </strong>Ergonomics and having good equipment is a great first start, but your body needs movement. After every 45 mins of sitting at your desk, take a 5 min break to walk around, stretch your body. It would relieve the built up tension in your muscles and your body will really thank you.</p></li><li><p><strong>&#129371; Hydration: </strong>Humans need at least 2-3 liters of water in a day. Avoid having too much coffee, tea or soft drinks. Yes, 1-2 cups of tea is perfectly okay but don&#8217;t go overboard on caffeine/coke in order to stay alert and pound away.</p></li><li><p><strong>&#129336; Regular exercise: </strong>Take the time to go to the gym <strong>at least 2-3 times </strong>in a week, join a dance class or learn how to do Yoga. I personally set up calendar reminders on my personal calendar and also used <a href="https://habitica.com/">Habitica</a> to nudge me into forming these habits and do a self evaluation on if i&#8217;m on track with these or not. There is something about your digital avatar losing health because you did not follow up on your dailies.</p></li><li><p><strong>&#127807; Diet and nutrition: </strong>Please learn about nutrition, chew your food and ideally prefer home cooked food over hitting the restaurants every alternate day. Learning how to cook delicious, healthy and nutritious food is literally a superpower. &#129464;</p></li></ol><h3>&#129504; Mental health</h3><p>If you follow the above advice, hopefully you are investing in your body and this will also have a direct impact on your cognition, mood and energy levels.</p><p>You&#8217;ll notice the increased energy and productivity to do more, but what about your most important partner in crime: Your mind?</p><ol><li><p><strong>&#129496; Meditation: </strong>I started meditating using <a href="https://www.headspace.com/">Headspace</a> in 2018 and have had a pretty regular meditation practice followed by 10-15 mins of Yoga with surya namaskars in the morning. You can choose your own workflow/app for this but I&#8217;ve found this incredibly helpful to be more relaxed, calm and mindful. Yes, I&#8217;m still a work in progress but I really enjoy learning new things about the art and science of mindfulness. I&#8217;ve found software engineering could burn you out pretty fast and having a healthy mind is table stakes</p></li><li><p><strong>&#128211; Reflection: </strong>Set up some regular time blocks to reflect on your day, activities and growth. Take the time to organize your thoughts better, reframe challenges into opportunities and more and cultivate a growth mindset</p></li><li><p><strong>&#128591; Gratitude: </strong>You only get 1&#65039;&#8419; one life, and it&#8217;s your own. Please don&#8217;t compare yourself to others journeys and highlight reels. I occasionally take some time to remind myself of things that I&#8217;m grateful for before a meal or sleeping and the things that are going well in my life and trust me it helps. Of course, I&#8217;ve blocked all social media app notifications and I&#8217;m embarrassed by the joy of missing out (JOMO) instead of fear of missing out (FOMO).</p></li><li><p><strong>&#9992;&#65039; Travel: </strong>Please don&#8217;t be glued to your office and desk 365 days a year. The world is vast with interesting experiences and you should plan regular breaks and travel with your friends and family to unwind and not think about your work/office. Yes, working on your career and success is important, but it&#8217;s not the most important thing you&#8217;ll do with your life. There is a life beyond the tech-verse, explore it!</p></li></ol><h3>&#128564; Good Sleep</h3><p>This is an area you should <strong>never neglect</strong> for anything.</p><p>We all have different <a href="https://my.clevelandclinic.org/health/articles/circadian-rhythm">circadian rhythm</a>s. Whether you are a morning person or night owl, getting 7-8 hours of good quality sleep is essential.</p><p>Invest in building good habits like slowing down with a calm and relaxing <strong>night routine</strong> wherein you ensure your body is primed to sleep and wake at consistent times. Your body will thank you.</p><p>Your projects and tasks will still be there when you wake up, but if you don&#8217;t sleep well, your body will not be able to repair itself and you&#8217;ll pay the toll the next day anyways so cutting on it really does not help.</p><h3>&#128176; Financial health</h3><p>I consider it to also be part of your health.</p><p>Why?</p><p>My logic is simple. If you don&#8217;t have good financial habits and money, you&#8217;ll not be able to think of anything else. Your career success can help you acquire money, but saving and growing it is a different skill.</p><p>This is also a topic they don&#8217;t teach well in school but is extremely important. Investing in living a life of simplicity and moderation where you live way below your means while you invest in your career growth and invest smartly may be the single most important thing to learn early on in your career.</p><p>How I wish I knew more about the financial traps early on in my career and not miss out on the wonders of <strong>compounding</strong>. It&#8217;s never too late to start and the best day to start your personal finance journey is today. I&#8217;ve found <a href="https://zerodha.com/varsity/module/personalfinance/">Personal finance modules in Zerodha Varsity</a> and <a href="https://www.youtube.com/@Zero1byZerodha">Zero1 by Zerodha - YouTube</a> to be incredibly useful.</p><h3>&#8987; Working hours</h3><p>This one has become unnecessarily controversial</p><p>Working 10-14 hours daily or <a href="https://en.wikipedia.org/wiki/996_working_hour_system">996</a> culture has been <strong>way over glorified</strong> by hustle/startup culture with promises of exponential growth and riches. Your body may be able to sustain itself for short bursts of such an environment but this is definitely not scalable over a long time period.</p><p>This is also truly a personal decision and I <em>will not</em> tell you how to live your life, but personally I&#8217;ve found <strong>8-9 hours</strong> of <strong>focussed, well planned</strong> work a day to be more than enough for my brain to sustain. If I can do this consistently for 5 days with some good outcomes, impact or progress at work then I can head into the weekend feeling like I spent my time well.</p><p>Why does discipline this matter?</p><p>I don&#8217;t wish to have a <strong>5 year</strong> career sprint, retire and sip martinis on a beach somewhere. I realize that is aspirational for my people and I have no issues if that&#8217;s what you are striving for.</p><p>I <strong>want to work </strong>for as long as I possibly can, have the <strong>desire</strong> and love for the craft, and this is directly proportional to me having a holistic life. Thus, I need <strong>time</strong> to focus on all the other stuff I&#8217;ve mentioned above. If I work 14 hours a day, when would I realistically have the time for other stuff?</p><p>So yeah, healthy boundaries are incredibly important to me.</p><p>There are <em>some</em> exceptions to this as well.</p><ol><li><p>Your production service may be down</p></li><li><p>Your app may be crashing leading to direct revenue loss,</p></li><li><p>or you may be a new employee with no trust or street cred yet.</p></li></ol><p>In such cases you should definitely try to help your company get over the issue in the most safe, efficient way possible or spend a bit extra time ramping up and being productive. But don&#8217;t make it a long term habit.</p><p>So let&#8217;s summarise <strong>health</strong> shall we?</p><p>Please focus on below core priorities.</p><ol><li><p>Your <strong>body</strong></p></li><li><p>Your <strong>mind</strong></p></li><li><p>Your <strong>sleep</strong></p></li><li><p>Your <strong>finances</strong></p></li></ol><p>and you&#8217;ll be fine &#8230; Well, mostly! &#128527;&#129335;</p><h2>&#129309; Connection</h2><p>Why are you working as a software engineer?</p><p>It could be because of any of the below:</p><ul><li><p>Do you have a deep love for the craft?</p></li><li><p>You are a technology nerd who has passion for learning new things,</p></li><li><p>You love solving hard technical problems</p></li><li><p>You enjoy developing yourself as an engineer and professional</p></li><li><p>You aspire to climb the career ladder</p></li><li><p>You want to genuinely help your product and company win the market</p></li><li><p>&#8230; etc &#8230; etc</p></li></ul><p>All of the above are great ideals to strive for and what makes this job fun and rewarding to spend 8-9 hours of your weekdays</p><p>A more pragmatic reason for why you may want to work for someone else is also <strong>to earn enough money </strong>to<strong> support yourself and your family</strong>. So in the end, it does boil down to social connection doesn&#8217;t it?</p><p>If you neglect your social connections in the pursuit of career success and meaning, then does the <strong>end justify the means</strong>?</p><h3>&#127969; Make intentional family time</h3><p>Spending quality intentional time with your partner, children, parents, siblings and other relatives can be incredibly rewarding.</p><p>Your family is probably the biggest area for you to invest your time, attention and care in. Over your career, you will probably work for multiple employers and meet many interesting people in your life that you can call friends. However, at the end of it all. Family is what will hopefully stick with you in all your good and bad times.</p><p>A popular anecdote that I often copy and repeat is: <br><br>You will not remember code, powerpoint presentations, or projects on your death bed but you&#8217;ll definitely cherish the connections you made, experiences you lived and memories you created with your family and friends. These relations compound with time as well if you nurture them.</p><p>We humans are social creatures and we need these connections to not only live life well, but they also create the necessary support structure for us to thrive at work as well.</p><p>So please, give them your time and full attention. They deserve it.</p><h3>&#127867; Friends time</h3><p>Friendships and bonds are amazing. These are relations you nurture not out of obligation but out of choice and as such they can be incredibly precious.</p><p>Friends support you, give advice, laugh with you, act like free therapists and are generally damn fun to spend time with.</p><p>So, take the time to stay in touch and connect with your childhood, college friends, meet prior colleagues, mentors that hopefully become friends and connections. Attend mixers and work events and be nice to folks around you.</p><p>Engineers can sometimes have a pretty myopic and dystopian view of other engineers in their vicinity, sometimes treating them as competition. However, for the most part, everyone is mostly trying their best to explore their own life&#8217;s stories and your workplace should not be a zero sum game.</p><p>You can choose to be additive and make some cool friends in the process. Please bear in mind that it can&#8217;t always be sunshine and rainbows, but you can develop genuine connections and friendships with people at work. If you choose to take the humane approach, you&#8217;ll often find this network that you build may be your biggest takeaway from a job or role far exceeding returns earned from your take home pay as well.</p><h2>&#127970; Career</h2><p>Okay, 2000 words in, give or take and we haven&#8217;t spoken anything about your actual career as a software engineer.</p><p>Where the hell is this blog going? &#128533;</p><p>If you&#8217;ve been a patient reader so far. Thank you! Give yourself a pat in the back.</p><p>I think you must have realised by now that your <strong>health</strong> and <strong>connection with others</strong> is a <strong>super important lever &#129495;</strong> in your hand, pretty vital to your career success and overall well being.</p><p>If these areas are sorted, you may literally be able to move mountains &#9968;&#65039; at work. &#128521;</p><p>If not, ahh.. Life is going to be tough. Truly your choice. I mean it!</p><p>With that said, Shall we look into what good habits for a Software engineer look like?</p><h3>&#128524; Deep Focus blocks</h3><p>Hopefully you are no stranger to <em><a href="https://en.wikipedia.org/wiki/Flow_(psychology)">The</a></em><a href="https://en.wikipedia.org/wiki/Flow_(psychology)"> </a><em><strong><a href="https://en.wikipedia.org/wiki/Flow_(psychology)">Flow</a></strong></em></p><p>The magical state of mind when ideas, code, docs all flow in a perfect stream. Where the world reduces to your monitor, keyboard and IDE/ doc/sheet editor and <em>nothing else matters </em>except the problem you are solving one step at a time. Losing track of time in such a state is quite common and software engineers are addicted to this state. This may be the real reason you fell in love with the craft all those years ago.</p><p>However, do you have the time at work?</p><p>What about the 4 back to back meetings with a 30 mins delay in between, 10 DM&#8217;s and constant ping and notifications you have on your Teams/slack that you absolutely <em>must respond</em> to right away?</p><p>Yes, this is the modern workplace and we all suffer from some degree of <a href="https://en.wikipedia.org/wiki/Attention_deficit_hyperactivity_disorder">ADHD (Attention deficit hyperactivity disorder)</a>. Welcome to the struggle!</p><p>But, there is a better way and it&#8217;s actually quite simple. <br><br>Let me break it down for you.</p><ol><li><p>Find a quiet place at home with a workstation, a focus room at work or in the worst case noise cancelling headphones in your open office.</p></li><li><p>Block <strong>2 hours</strong> calendar blocks on your calendar. Anything less is not really useful. 30 mins to 1 hour does not count.</p></li><li><p>Turn off notifications on your email / instant messaging clients / mobile phone</p></li><li><p>Take 10 mins to get into the zone</p></li><li><p>And then go and work on the problem that you really care about with impact.</p></li></ol><p>If you can get 2 such blocks in a day, congratulations &#127882; it&#8217;s a day well spent at work.</p><p>If not even one &#128542;, you need to take a hard look at what you&#8217;ve been doing at work all this time.</p><p>Stop trying to look busy, and actually be busy producing meaningful and impactful work.</p><h3>&#128245;Turn off notifications</h3><p>Psst! Do you know the big secret?</p><p>You can pretty much <strong>turn off notifications</strong> from devices/apps constantly stealing your attention every moment.</p><p>The world actually can wait for a couple of hours. We often give ourselves too much self importance. In the worst case, if something is truly burning you just might get a call and then it&#8217;s fine to break your focus block and go solve that urgent and important thing.</p><h3>&#128212; Work journal</h3><p>Do you ever wonder:</p><ol><li><p>What the hell have I been doing for the whole day and actually got done? Yet feel totally drained and exhausted?</p></li><li><p>Does this compound badly to you having to look at your past emails, teams/slack posts when the time comes for you to write your annual review?</p></li><li><p>Does your boss need to constantly pull you aside for that quick update?</p></li></ol><p>Yes, all of these are real problems.</p><p>It&#8217;s also not possible for you to have a perfect recall and memory of everything you did.</p><p>Maintaining a work journal is very important and helps solve these problems.</p><p>What does it look like in practice?</p><p>Glad you asked, Say you want to start this practice from October month</p><ol><li><p>Create a doc and put it in your cloud drive (GDrive, OneDrive, Dropbox etc)</p></li><li><p>Add title of October 2025</p></li><li><p>Add H2 of Week 1 - Mon, 6th Oct - Fri, 10 Oct</p></li><li><p>Add H3 with Mon, Tue, Wed, Thu, Fri</p></li><li><p>Add H4 with your current project title, say Project A, Project B, Meetings etc</p></li><li><p>Take 5 mins at the end of your day or after you&#8217;ve completed something meaningful and add a bullet point under these</p></li><li><p>When the week is done, summarize your impact under each project</p></li><li><p>When the month is done, summarize these weekly summaries into a monthly one</p></li><li><p>And voila, you have a pretty good, detailed reflection of how your time was spent and what the hell did you actually do</p></li><li><p>If you did something truly outstanding, put it in a <a href="https://jvns.ca/blog/brag-documents/">brag doc</a> and share it with your manager</p></li></ol><p>This practice has few really good benefits</p><ol><li><p>You can use this for self reflection, if the points are thin or the work is mostly busy work, it may be time to carve out intentional time to work on the big meaty problems</p></li><li><p>You can refer to this before standups and give clear, concise updates and sound cool while doing it.</p></li><li><p>You can share this monthly summary with your manager and ask for feedback on what else you should be doing</p></li><li><p>Annual reviews don&#8217;t seem that intimidating</p></li></ol><p>I&#8217;ve seen this practice advocated for by many Principal engineers and have been following this for the past 5 years. It does help!</p><p>The only barrier to this is laziness and procrastination, but hey. There is nothing called a free lunch. You may also be tempted to use an LLM (Large Language model) for some of this work and sure you can use it in a way that works for you. I&#8217;ve found summarizing these points and reflecting on them does help me self calibrate.</p><h3>&#127793; Learn</h3><p>Yes, you learn a ton at work.</p><p>The projects you work on, that legacy framework or stack, one off tidbits from a Teams/slack message from that Principal or Senior engineer you admire, hallway conversations and all of these are great ways to grow.</p><p>But &#8230;</p><p>You <em>still</em> need to carve <strong>intentional learning time</strong> for yourself</p><p>Why is this important? &#129300;</p><p>If you take the time to learn a topic in good detail, it helps you develop solid taste in that ecosystem and often awareness and knowledge of a technology helps in you making an educated design choice.</p><p>It&#8217;s hard to create this dedicated time during working hours since you have couple of projects running in parallel</p><p>So block time to learn outside work, this can be either morning or evening or nights or weekends, it depends when you can create that time for you, but regardless of whatever time you block on the calendar, make sure you stick to this. Consistency really is the key</p><h3>&#128211; Notetaking</h3><p>I don&#8217;t care what tool you use but make sure you have structured notes on different topics somewhere.</p><p>Ideally synced and backed up in the cloud and searchable and editable on all your devices &#8211; laptop, mobile or tablet</p><p>Every time you learn something new related to a topic, come back and take 5-10 minutes to update your notes. Learned a new subcommand in git that worked for this niche usecase, come back and update. Discovered a new cool python module, you know what to do &#128521;</p><p>You&#8217;ll notice after some years, you will start using this as your second brain and you can very quickly recall good practices, bespoke approaches to solving certain problems and appear like a total wizard to the folks around you. Your knowledge will compound with each year and you&#8217;ll see the difference in yourself as you are not struggling with fundamentals, but building on top of these.</p><h3>&#9997;&#65039; Writing is the new super power</h3><p><em>Good writing is clear thinking made visible - Bill Wheeler</em></p><p>If you can strip away distractions and put down your thoughts in a doc in a concise and clear manner, it would really set you apart from your colleagues.</p><p>It&#8217;s no secret that a large part of software engineering is to communicate your ideas to other people, and influence without authority</p><p>Meetings are one expensive high bandwidth way of doing so, but often drains everyone.</p><p>Being able to write down your ideas on a doc, post or thread can help others participate or review and give you feedback on their own time.</p><p>Sharing my own personal journey, I started blogging in 2018 and in my opinion this was the inflection point that had led me to become a much better writer and communicator. This not only helped me in building a brand on social media but also immensely at work, as I could explain my ideas/thoughts clearly to different stakeholders in good writing and a positive comment from an interviewer where they went through my <a href="https://newsletter.automationhacks.io/">newsletter</a> and <a href="https://automationhacks.io/">blog</a> to see what i&#8217;ve been up to outside work does not hurt my chances.</p><p>This is a core skill for Senior engineers and with AI models working primarily on text and instructions, being able to write down a project, specifications in clear English may just <strong>be as important</strong> as learning to code.</p><p>And that&#8217;s all folks.</p><p>I hope I left you with some ideas and approaches that help you in your software engineering career.</p><p>Did I miss any other good habits to develop? Please drop in your thoughts in the comments to share them with others and if you got something valuable from this, please share it with your friends and colleagues.</p><p>Enjoyed reading this?</p><p>Subscribe to the <a href="https://newsletter.automationhacks.io/">newsletter</a> and <a href="https://www.youtube.com/@automationhacks">YouTube channel (@automationhacks)</a> for more insights &#9889; into <strong>software testing</strong> and <strong>automation,</strong> or connect on <a href="https://topmate.io/automationhacks/">topmate</a> for a personalized 1:1 session.</p><p><em>Disclosure: I&#8217;ll earn a small commission if you decide to purchase some of the educative.io text courses linked in the blog for your learning and growth. Their <a href="https://www.educative.io/courses/grokking-the-system-design-interview?aff=x4QL">system design courses</a></em> and <em><a href="https://www.educative.io/courses/grokking-coding-interview?aff=x4QL">grokking coding interview</a> courses are arguably quite helpful for interview prep</em>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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[How i got “that” job at Microsoft]]></title><description><![CDATA[What does the interview process look like at Microsoft India for a Senior engineer? What tips and approaches work well. In this blog, I&#8217;ll breakdown my interview experience and reflections.]]></description><link>https://newsletter.automationhacks.io/p/how-i-got-that-job-at-microsoft</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/how-i-got-that-job-at-microsoft</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Wed, 09 Jul 2025 15:51:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MP6Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.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_!MP6Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MP6Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!MP6Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!MP6Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!MP6Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MP6Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2864378,&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://newsletter.automationhacks.io/i/167916887?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.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_!MP6Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!MP6Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!MP6Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!MP6Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbfedd2-2105-4a15-aa04-fdbf4d146c7a_2048x2048.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">Generated by Gemini Imagen4 </figcaption></figure></div><p></p><p>Firstly, some news! &#127882; I recently started my new gig at Microsoft Bangalore as a Senior Software Engineer in Teams Mobile Engineering Systems team.</p><p>This team is focused on improving developer productivity by providing the tools, frameworks and infrastructure required by Teams mobile developers to land their changes in a safe and predictable manner and optimize the build test deploy loops.</p><p>In this blog, I demystify and give you an idea on how the Interview process was like at Microsoft and share my perspective on how to prepare well by offering your some tactical tips</p><p>I previously wrote a post about <a href="https://automationhacks.io/2022/01/02/how-i-got-that-job-at-meta">how I got a job at Meta London</a> and this blog would mostly build on top of that, it may be a good idea to read that first and come back to get additional insights on how the process is different here. Go ahead, I'll wait.</p><p>The process as you may have already imagined is pretty standard in larger tech companies but I did notice some nuances that were unique to the Microsoft interview loop.</p><p>Broadly it looks like below:</p><ol><li><p>Getting the interview</p></li><li><p>Coding round</p></li><li><p>Domain round</p></li><li><p>System design round</p></li><li><p>Behavioral/Leadership round</p></li></ol><p>Let&#8217;s break it down a bit.</p><p><strong>Disclaimer:</strong> This blog would give you a rough outline of the process, how to prep and the mindset to have as you approach the interview loop. Some of this is already published in the public domain by Microsoft <a href="https://careers.microsoft.com/v2/global/en/hiring-tips">How we hire </a>and <a href="https://careers.microsoft.com/v2/global/en/hiring-tips/interview-tips.html">Interview tips</a>. I will not be discussing any questions asked or answers given to respect the company NDA.</p><h2>Getting that interview</h2><p>How did I discover this position?</p><p>I mostly used LinkedIn search with a custom query to pick up roles/descriptions that seemed like a fit for my interests and skill set</p><p>You can paste a query like below in the search box under Jobs and replace it with keywords relevant to your specific industry</p><pre><code>((SDET OR "Automation" OR "Test" OR "Quality" OR "QA") AND (Senior OR Lead OR Staff OR Principal)) OR

((Test OR Quality OR "QA" OR "Quality Assurance" OR "QE" OR "Automation") AND ("Manager" OR "Head" OR "Director"))</code></pre><p>As you can see, I cast a pretty wide net. One of the perks of being a senior engineer in the industry with decades plus of experience.</p><p>This query led me to this position on a fine day.</p><p>I could see some strong overlap with my past experience and skills and also felt there were few areas which were going to be huge learning opportunities for me so targeting this position was a no brainer.</p><p>I then used LinkedIn network to find 1st level connections in Microsoft and reached out to someone I knew and trusted for a referral.</p><p>I tailored my resume and sent it off to my contact</p><p>And then I waited &#8230;</p><p>After getting the referral, I did not hear back for a couple of weeks and reached out to my referrer. Luckily they were able to follow up internally with the hiring manager to try to get the profile prioritised.</p><blockquote><p>It helped that this position was for the same team my referrer worked at so a direct line to the reporting manager did make it easier.</p></blockquote><p>Your mileage really may vary here but having someone who can advocate for you internally helps a lot.</p><p>&#9889;Tip: The obvious tip is to invest in building your network. LinkedIn is a good place to do so and there are nuances on how to do this well. The potential gains are opportunities not just for your career growth but also learning and developing yourself as an engineer.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/how-i-got-that-job-at-microsoft">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[💰 How to negotiate your tech job salary]]></title><description><![CDATA[Many candidates leave money on the table by either not negotiating or doing it in a suboptimal way; don&#8217;t be that person.]]></description><link>https://newsletter.automationhacks.io/p/how-to-negotiate-your-tech-job-salary</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/how-to-negotiate-your-tech-job-salary</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sun, 22 Jun 2025 02:49:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DZQO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>In this blog, I&#8217;ll share practical insights that you can use to ensure you land your next role with the right compensation. Let&#8217;s go &#127939;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DZQO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DZQO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!DZQO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!DZQO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!DZQO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DZQO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1531076,&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://newsletter.automationhacks.io/i/166501678?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.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_!DZQO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!DZQO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!DZQO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!DZQO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51201e94-f0b2-4fb5-9b77-e9c929ffe780_2048x2048.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">Generated by Gemini 2.5 Flash</figcaption></figure></div><p>If you are searching for a new job, one aspect you should be prepared for is handling salary negotiations in a professional and prepared manner.</p><p>If you perform well in this phase of the interview loop, you could easily walk away with a better total compensation, which means more income for your savings, future, and family.</p><p>As engineers, quite often we feel awkward asking for more, or we don&#8217;t know the right way to handle these conversations, leading to suboptimal results. Many engineers don&#8217;t even ask, thinking they will come across as greedy and fearing that the job offer may be rescinded.</p><p>However, you are not doing any favors to yourself by thinking this way.</p><p>In this blog, I&#8217;ll help break down principles and tactics from my personal experience and provide you with actionable tips on how you could negotiate your salary the right way.</p><h2>&#128508; 4 pillars of negotiation</h2><p>There are a few key principles in doing salary negotiations the right way. Let&#8217;s understand what these are, and then I&#8217;ll help you with some helpful simulation prompts to practice handling different situations</p><h3>&#9968;&#65039; Get some leverage</h3><p>If you are negotiating for a better salary, you should understand what leverage you have:</p><p>Understanding what leverage you have would help you know how much you can ask or how hard you can negotiate.</p><p>Self-reflection on the below would help you self-analyse if you have leverage:</p><ul><li><p>Do you have a high current compensation that could be used as an anchor point?</p></li><li><p>Do you have a competing offer?</p></li><li><p>Are you an immediate joiner, or can you join faster than other candidates?</p></li><li><p>Do you bring skills and experience to the table that other candidates don&#8217;t, or are you a better fit for the role?</p></li><li><p>Do you come with a strong referral from an existing employee?</p></li><li><p>Did you nail the interview process and come off as a strong candidate?</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p><h3>&#128202; Always do your market research.</h3><p>Many candidates appear for interviews without clarifying basic things about the role.</p><ul><li><p>How long has this role been open?</p></li><li><p>Why is the role open?</p></li><li><p>How many candidates are in the pipeline?</p></li><li><p>What level does this role play in the organization's career framework?</p></li><li><p>What is fair pay for this role in this company or roles at similar levels in other companies in the same region or economic zone?</p></li><li><p>Who is the final decision maker for this position?</p></li></ul><p>When you speak to the recruiter or hiring manager, clarifying the above questions helps you further in salary negotiations.</p><p>How?</p><p>Let&#8217;s say you are the only candidate in the pipeline and do well, the company may consider paying you a bit more to close the position.</p><p>If you know who the final decision maker is, you can leverage this information to request the recruiter to reach out to them once during final negotiations.</p><p>Understanding how much other people are making in similar roles could be used during negotiations to provide actual data points and ask for a matching offer.</p><h3>&#128566; Don&#8217;t reveal your numbers until they make an offer</h3><p>During initial conversations and also during the interview process, the recruiter, leadership, or hiring manager may ask you for below information.</p><ol><li><p>Current or Last drawn compensation</p></li><li><p>Salary expectations</p></li><li><p>Competing offer amounts</p></li></ol><p>You might be expecting this, or this may be a surprise, but revealing this information early in the process does not work in your favor. I&#8217;ll discuss some common strategies that you can use to politely deflect.</p><p>What&#8217;s the harm in being transparent with this information?</p><ul><li><p><strong>Outside range:</strong></p><ul><li><p>If this is the first conversation you are having with the recruiter/hiring manager, and you are outside the range, the recruiter will likely move on to other candidates and drop your profile. You may be okay with this, but this also means you&#8217;ll have fewer opportunities to talk to engineers and leaders in other companies. Many times, once the company understands what you bring to the table, they are more flexible on compensation later on.</p></li><li><p>If you reveal these during the interview process and say you are either at the top of their range or outside their range, they may consider offering the job to another candidate who may be within the range and may also be a strong performer.</p></li></ul></li><li><p><strong>Lowball offer:</strong></p><ul><li><p>Say your current compensation is 20 Lakhs per annum (LPA), and the company can easily pay 35 LPA for the role. The moment you reveal your current compensation early in the process, the company may give you a 30% hike and offer you 26 LPA. Very few recruiters/hiring managers would pay you the fair starting range.</p></li><li><p>Also, revealing the competing offer amount before the company has offered you may create a lowball scenario. Say you have a competing offer of 28 LPA while the company range starts from 35 LPA. The recruiter may say, We can match the offer and do a little better and offer you 29 LPA. You may think you are getting a better offer, but in reality, you are leaving around 6 LPA on the table.</p></li></ul></li></ul><p>You may think recruiters and hiring managers are evil for doing this, but this is just how this process works. It&#8217;s not personal; if they have an opportunity to save the company some money, they will most certainly take that.</p><p>You should anticipate that they will ask you for this information at different stages; it&#8217;s their job, you should let them do their job, and ensure you also handle this in a respectful, gracious manner.</p><p>You should try to ensure you reach the offer stage and let them make the offer first.</p><p>Do this, and you will increase your chances of maximizing your total compensation.</p><h3>&#129707; Don&#8217;t set a low anchor</h3><p>Assume you&#8217;ve done some back-and-forths with the recruiter or hiring manager, and they keep pressing for you to reveal your salary information.</p><p>Some candidates don&#8217;t have a clear number in mind and ask for a lesser amount or a very small increment.</p><p>In either scenario, you, as the candidates, end up walking with a lesser amount.</p><p>You should always research what salary range the company can offer and the ideal figure you are looking for, and go at least 20-25% higher than that. This ensures you have a high anchor, and the recruiter may attempt to meet you somewhere in the middle.</p><p>This strategy does not always work, you have to be mindful of when you can do this versus not.</p><p>For example, if you know the company can offer you 25 LPA, asking for 50 LPA will not work out.</p><h2>&#127947;&#65039; Practice simulations</h2><p>The above pillar and advice sound great; however, in reality, the conversations can be very dynamic, and it's a good idea to have some mental hooks on how to respond to different situations.</p><h3>&#129309; Before the offer</h3><p>Let&#8217;s walk through some situations and how you can respond to these.</p><p>Remember the key goal here: <strong>don&#8217;t provide any numbers early on</strong>, and <strong>try to deflect</strong> until you reach the offer stage.</p><p>Any numbers you provide at this stage do not work in your favor.</p><p>What if they remove you from the pipeline because you did not provide salary information?</p><p>&#127882; Congratulations, you&#8217;ve dodged a huge red flag and bullet. Any recruiter or company that does not have the basic flexibility and plays this hardball early on would probably not be the environment that you would want to work in anyway.</p><h4>&#129436; Initial recruiter conversation</h4><p>* <strong>Smith</strong> &#8211; imaginary recruiter in this role play</p><p>* <strong>Neo</strong> - best damn candidate on the planet &#128521;</p><h4>&#129706; Salary expectations?</h4><p>You would want to convey that you are open and negotiable at this stage and interested in evaluating the opportunity holistically. This sets the right early tone for the process, where the recruiter knows you are savvy.</p><p><strong>Recruiter:</strong> What are your salary expectations?</p><p><strong>Candidate:</strong></p><ol><li><p>Hey Smith<sup>*</sup>, I&#8217;m <strong>open</strong> and <strong>negotiable</strong> for the right opportunity</p></li><li><p>(If they press you or follow up again) I&#8217;m excited to <strong>learn more about the position</strong>, <strong>meet the team</strong>, and understand the <strong>challenges</strong> and <strong>opportunities</strong> for me to make an impact, and I'm happy to discuss compensation once we&#8217;ve done those</p></li></ol><h4>&#8597;&#65039; Tell me your expected range?</h4><p><strong>Recruiter:</strong> Can you provide me with the range or number that you would be comfortable with?</p><p><strong>Candidate:</strong> Smith, can you tell me a bit more about the salary range for this role?</p><p>If they press again.</p><p><strong>Recruiter:</strong> We need this data to move forward</p><p><strong>Candidate:</strong> I <strong>understand and appreciate</strong> your need to get my salary expectations. At this point, I want to learn more about the role, meet the team, and if it's a fit, then happy to discuss salary expectations.</p><h2>&#128176; Let them make the offer.</h2><p>If you&#8217;ve done well in the interview process and the recruiter reaches out and lets you know that they are willing to offer and asks about your expectations</p><p><strong>Recruiter: </strong>Congratulations, Neo. We have decided to offer you and I need your last drawn compensation and expectations to roll out the offer.</p><p><strong>Candidate:</strong> Smith, if your company believes I&#8217;m the right fit, I would love to see an offer in writing and discuss how it aligns with my needs</p><p>If they press more, you should push back and understand the rationale.</p><p><strong>Recruiter:</strong> At this stage, this is a mandatory part of the process to get these numbers</p><p><strong>Candidate:</strong> Mandatory part?</p><p>If they confirm they need the information and cannot proceed, you can push back with</p><p><strong>Recruiter: </strong>I&#8217;ll need this information to roll out the offer; it's part of our process</p><p><strong>Candidate:</strong> Smith, I just want to understand, has there been a situation where the candidate didn&#8217;t provide this information at this stage</p><p><strong>Recruiter:</strong> This is a stopping point</p><p><strong>Candidate:</strong> I would need to think about it. I prefer for companies to present the offer first. I don&#8217;t want to lose the opportunity, but I would need to think about what those numbers need to be &#8230;</p><p><em>And then pause and see if this forces Smith to cave in and come up with the offer.</em></p><h2>&#128305; Set a high anchor</h2><p>If you have a tough recruiter at hand, and they are not willing to budge without getting your salary information</p><p><strong>Recruiter:</strong> Unfortunately, we&#8217;ve reached a stopping point. We have other candidates in the pipeline who have provided salary, and I&#8217;ve been given a directive from leadership that we need to get this information before</p><p>If you want the job, <strong>set the anchor high</strong>. At least 20% higher than the number that you want.</p><p>If you get a surprise reaction from the recruiter</p><p><strong>Recruiter:</strong> This number is high, this is way out of our range, and I wish you had discussed this before (some emotional reaction)</p><p><strong>Candidate:</strong></p><ul><li><p>I want to <strong>thank you again for all your time and effort</strong>. As I said earlier. I&#8217;m <strong>open</strong> and <strong>negotiable</strong> for the right opportunity.</p></li><li><p>This is <strong>about the number I&#8217;m looking for</strong>, but I would <strong>like to see an offer from your company</strong> and see how it can make sense for both of us, because I&#8217;m interested, and it sounds like you guys are as well.</p></li></ul><h2>&#127937; After the offer</h2><p>If they make a verbal offer, Congratulations, you won the first battle. Get an offer in writing <strong>first.</strong></p><p>Also, check if there is a deadline.</p><p>&#10060; Don&#8217;t say:</p><p><em><strong>Is this negotiable</strong></em></p><p>&#9989; Instead, say:</p><p><em><strong>Thank you! I&#8217;m so excited to be at this stage. I&#8217;d like a day or two to discuss this offer that you&#8217;ve put on the table for me with my family and get back to you.</strong></em></p><p>You should ideally do the negotiation over a phone call and not via email, as this allows you the opportunity to observe your recruiter's tone and speech to decide where the flexibility lies.</p><h3>&#8265;&#65039; Ask open-ended questions</h3><p>Start by asking open-ended questions.</p><ul><li><p><em>Is there flexibility to move the base salary up?</em></p></li><li><p><em>Is there flexibility to get more stock?</em></p></li><li><p><em>Is there flexibility to get a sign-on bonus?</em></p></li></ul><h3>&#129776; Present your ask</h3><p>You should know your numbers at the top of your mind before you do this. You can start with</p><p><em><strong>&#8220;Based on the value, I believe I&#8217;ve demonstrated, and based on my research and what you know about the organization. I&#8217;m looking for X amount as total compensation.&#8221;</strong></em></p><p>Always go a little high, so that you allow them to meet you in the middle.</p><p>If they say the offer is not negotiable, and you know they are not the decision maker, you can say</p><p><em><strong>&#8220;I would appreciate it if you could go back and ask on my behalf.&#8221;</strong></em></p><h3>&#128208; Know your numbers</h3><p>If they say you are at the top of the base pay band, you can say,</p><p><em><strong>&#8220;Is there potential to get more stock or a sign-on bonus?&#8221;</strong></em></p><p>Here, your research matters. You should have the data as a link or screenshot that proves this is a number for this role, company, and level.</p><h3>&#10062; General fallbacks</h3><p>If they ask something that you don&#8217;t have an answer to, you can always say something like:</p><ul><li><p><em>Let me think about it.</em></p></li><li><p><em>Can you help me understand where this question is coming from? (in a nice tone)</em></p></li></ul><p>If they give you an ultimatum like</p><ol><li><p><em>&#8220;If I meet these, would you accept the offer on the spot&#8221;?</em></p></li><li><p><em>&#8220;I&#8217;ll need a handshake from you now, so that you&#8217;ll agree to these no's and sign the offer.&#8221;</em></p></li></ol><p>You should not accept ultimatums, You can say something like:</p><p><em>&#8220;It's something I&#8217;d strongly consider, I&#8217;m happy to be at this stage. It's something that I&#8217;d need to discuss with my family.&#8221;</em></p><p>Negotiate everything at the same time.</p><ul><li><p>Get a timeline from the recruiter &#8211; when can I expect an answer?</p></li><li><p>Do a lot of research &#8211; anticipate back and forth with a recruiter.</p></li></ul><h3>&#127912; Get creative</h3><p>If they are not giving what you want, you can get creative and see what else can be negotiable. Sometimes, companies have flexibility on these aspects, which may make an impact on your quality of life at the company.</p><ul><li><p>If the bonus is going to be prorated, can I get the bonus amount for the full year?</p></li><li><p>Can I accrue vacation days immediately?</p></li><li><p>Can I get an extra 2 weeks of vacation?</p></li></ul><h2>Conclusion</h2><p>I&#8217;ll leave you with this thought.</p><p><em>&#8220;You can be uncomfortable for 30 mins, knowing you&#8217;ll end up with a better offer, or you can be polite, knowing very well you left money on the table&#8221;</em></p><p>The choice is yours, my friend!</p><p>Let me know if you would like to do a mock interview around these lines.</p><p>&#10084;&#65039;Loved reading this? Please subscribe to the <a href="https://newsletter.automationhacks.io/">newsletter</a> and <a href="https://www.youtube.com/@automationhacks">YouTube channel (@automationhacks)</a> for more insights into <strong>software testing</strong> and <strong>automation,</strong> or connect on <a href="https://topmate.io/automationhacks/">topmate</a> for a personalized 1:1 session.</p><p><em>Disclosure: I&#8217;ll earn a small commission if you decide to purchase some of the educative.io text courses linked in the blog for your learning and growth. Their <a href="https://www.educative.io/courses/grokking-the-system-design-interview?aff=x4QL">system design courses</a></em> and <em><a href="https://www.educative.io/courses/grokking-coding-interview?aff=x4QL">grokking coding interview</a> courses are quite helpful for interview prep</em>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>]]></content:encoded></item><item><title><![CDATA[🚀 Ace your QA Tech interview]]></title><description><![CDATA[How does the tech interview for a QA or SDET leader look in 2025? What type of interviews are conducted, and what strategies could help you land your next role? Let&#8217;s unpack all these and more in this]]></description><link>https://newsletter.automationhacks.io/p/ace-your-qa-tech-interview</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/ace-your-qa-tech-interview</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Mon, 09 Jun 2025 16:42:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fRdJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.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_!fRdJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fRdJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png 424w, https://substackcdn.com/image/fetch/$s_!fRdJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png 848w, https://substackcdn.com/image/fetch/$s_!fRdJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png 1272w, https://substackcdn.com/image/fetch/$s_!fRdJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fRdJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png" width="1456" height="1335" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1335,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:536071,&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://newsletter.automationhacks.io/i/165559122?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.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_!fRdJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png 424w, https://substackcdn.com/image/fetch/$s_!fRdJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png 848w, https://substackcdn.com/image/fetch/$s_!fRdJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png 1272w, https://substackcdn.com/image/fetch/$s_!fRdJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf4dff2-9c2d-4d9f-98eb-b1a0533674f1_2151x1972.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I recently completed full interview loops at multiple companies, including startups, product, and Big Tech.</p><p>I was targeting 2 major role archetypes.</p><ol><li><p>Engineering manager - QA role expected to support a team of 6 - 12 QA engineers or SDETs</p></li><li><p>Senior IC (Individual contributor) or Tech lead roles focused on engineering productivity.</p></li></ol><p>In this blog, I&#8217;ll share my personal experience navigating these interview loops,</p><p>If you or a friend is looking for similar opportunities, this blog should provide a good mental model on what kind of interview rounds exist and how you can orient yourself to perform well in these interviews.</p><p>Let&#8217;s go &#127939;</p><h2>Why target both IC and EM roles? &#129342;</h2><p>You may wonder why I didn't focus on just one role.</p><p>The reason is quite simple for me.</p><p>I enjoy hands-on work that delves deep into technologies, and I also love working with and mentoring people, often preferring roles that push the boundaries.</p><p>I&#8217;ve played three major variations of these roles in the past five years.</p><ol><li><p>Hands-on Engineering Manager (EM) at <strong>Gojek</strong></p></li><li><p>Senior IC focused on building test infrastructure and frameworks in a complex technology landscape at <strong>Meta.</strong></p></li><li><p>Principal IC supporting a group of engineers at <strong>CRED</strong></p></li></ol><p>And I enjoyed both aspects quite well.</p><p>If you personally have a strong inclination for either IC or EM roles, it's fine to only target such roles and companies. It would also make the decision process smoother for you later on, as you can avoid doing an Apple &#127822; to Oranges &#127818;comparison.</p><h2>What are the major interview types? &#129300;</h2><p>I&#8217;ve mainly seen the following types of rounds.</p><p>We&#8217;ll divide it into 3 main types of conversations &#8211; Technical, Behavioural, and Recruiter, each with its focus and expectations.</p><ul><li><p><strong>Technical</strong>: The main questions that this loop tries to answer are: Are you a fit technically for this role? Can you raise the engineering bar from your skills, past experiences, and attitude</p></li><li><p><strong>Behavioral: Do you have the right attitude, and how do you work on all the nontechnical stuff &#8211; communication, collaboration, conflict resolution</strong></p></li><li><p><strong>Recruiter: Initially, to identify if you are in the ballpark vicinity of someone who can do this job, and how much it would cost the company.</strong></p></li></ul><p>Let&#8217;s form a high-level intuition first before going deeper.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p><p><strong>Introductory call</strong></p><p>A short <strong>30m - 45m</strong> call with the hiring manager or recruiter to align on a high level if the role seems like a mutual fit</p><p><strong>Technical rounds (45m to 1h 30m)</strong></p><p>Here few rounds are unique to Big Tech companies vs startups/product companies.</p><p><strong>Big Tech</strong></p><ul><li><p><strong><a href="https://www.educative.io/courses/grokking-coding-interview?aff=x4QL">Coding rounds</a></strong>: focused on problem solving on an algorithmic or data structures problem, and your communication skills as you work through them.</p></li><li><p><strong><a href="https://www.educative.io/courses/grokking-the-system-design-interview?aff=x4QL">System design</a> </strong>&#8211; design a large-scale distributed system or a core engineering system like log processing, build tools, etc.</p></li></ul><p><strong>Startups and product</strong></p><ul><li><p><strong>Take-home assignment</strong>: Build an automation framework on either API, web, or mobile, based on your preference, and using open-source tools and libraries.</p></li><li><p><strong>Technical discussion</strong> on <strong>framework design and tradeoffs</strong>: if company does take home assignments, you&#8217;ll have to explain your design choices and answer follow up questions or if is the first round, this could be a problem statement given on the spot targeting API, Web or Mobile use case, and you&#8217;ll have to explain the framework design by breaking down components</p></li></ul><p><strong>Common</strong></p><ul><li><p><strong>Testing acumen: </strong>Given a problem, application, or system, how would you test its different aspects, what cases can you think of, and what approach would you follow</p></li><li><p><strong>Domain knowledge</strong> round to focus on:</p><ol><li><p>CI/CD, Cloud, Testing tooling, or frameworks</p></li><li><p>The domain the role expects knowledge over, for example: mocking, stubbing, integration testing, load testing, and their related tooling.</p></li></ol></li></ul><p><strong>Behavioral (45m to 1h)</strong></p><ul><li><p><strong>Your experience, projects, or resume walkthrough</strong>: such interviews focus on what you&#8217;ve written in your resume and check, for instance, the challenges you've solved, how you handled conflict, did negotiation, what process improvements you created, etc</p></li><li><p><strong>Discussion with a cross-functional partner</strong> (product or developer) to evaluate how you collaborate and get work done across teams and functions (like dev, PM, business, sales, marketing, compliance, legal, etc, to name a few)</p></li><li><p><strong>Behavioral interviews</strong> focusing on <strong>team/stakeholder management</strong>, leadership, and how you handle different situations at work</p></li><li><p>Hiring manager interview</p></li><li><p><strong>Recruiter discussion</strong></p></li></ul><p>Let&#8217;s break these different rounds down in more detail so that you have a better idea of each phase.</p><p>I&#8217;ll also provide some strategies on how you could prepare well and ace these.</p><h2>Resume and referral</h2><p>Before we get into the actual interview rounds, let&#8217;s briefly pay our respects to the most important first step &#8230;</p><p>Creating the opportunity.</p><h3>Get a referral and thank me later &#129309;</h3><p>Any good interview loop usually starts with:</p><ol><li><p>Searching for relevant openings you are interested in</p></li><li><p>Finding out if you have a mutual connection from your network</p></li><li><p>Preparing a resume tailored to this role</p></li><li><p>Getting a referral</p></li><li><p>Hopefully &#129310;&#127996;a recruiter shortlists your resume if they see a strong fit.</p></li></ol><p>Each of these steps requires patience, good writing, and timely, respectful follow-ups.</p><blockquote><p>&#9889;Tip: Please <strong>leverage your network on social media</strong> to get a referral from someone who works at the company. I&#8217;ll do a deep dive on how to create opportunities for yourself in a future blog, as it has more nuance.</p></blockquote><p>Why index heavily on referral?</p><p>Your chances increase manyfold if:</p><ul><li><p>An existing employee can refer and vouch for your skills.</p></li><li><p>They can also advocate for you internally and help oil the communication rails between the hiring manager and the recruiter. I&#8217;ve personally observed how many times a friend has helped grease internal processes to help move the process forward, leading to better outcomes for me.</p></li></ul><p>If you don&#8217;t have a trusted colleague or friend in the company you want to apply for, don&#8217;t sweat it; you can use the strategies below.</p><ol><li><p>Cold Linked message or email someone you are connected with, but don&#8217;t know personally</p></li><li><p>If you find a mutual connection, then ask your connection to introduce you to them and help connect.</p></li></ol><p>It&#8217;s fair that not everyone is open to referring a stranger on the internet, when someone declines or does not respond; don&#8217;t take it to heart, move on to other options.</p><p>Remember to follow up, your referrer has their workload and life to manage, and referring to you may not be on the top of their priority list; reminding them periodically could go a long way.</p><p>Again, I really cannot stress enough how <strong>building a strong network</strong> from your past companies, communities, and being <strong>active on platforms like LinkedIn, X</strong>, or <strong>teaching</strong> others could help you build an organic network in the long run.</p><p>More on this later in a future blog. I promise. &#129310;&#127996;</p><h3>Write a sharp resume</h3><p>Having a neat, sharply written resume that puts your <strong>past contributions, impact, </strong>and<strong> skills </strong>in the best light is critical.</p><p>Luckily, you can leverage your friendly LLM to help with improving the structure and presentation.</p><blockquote><p>&#128680;<em>Please be careful <strong>not to add made-up numbers</strong> that are not grounded in reality, as it can be a real eyesore for an experienced engineer/manager and they can easily smoke this out on their bullshit meter. Be honest and transparent. Do not lie to get the job. You are not doing anybody any favors with this approach.</em></p></blockquote><p>I can recommend <a href="https://www.amazon.in/Google-Resume-Gayle-Laakmann-Mcdowell/dp/8126538058">The Google Resume by Gayle Laakmann </a>McDowell for tips on a well-written resume.</p><p>Once you have your first draft, make sure to get it reviewed by a trusted peer or friend to give you feedback.</p><p>You&#8217;ll likely have blind spots or biases, and a peer review is usually very helpful to catch those ahead of time.</p><h2>Introductory call &#128241;</h2><p>Most companies start their loop with an introductory call with a hiring manager or recruiter.</p><p>They have taken a look at your resume already and want to evaluate a few things.</p><ol><li><p>Are you genuinely interested in the role?</p></li><li><p>How strong of a fit are you for the role in terms of skills?</p></li><li><p>Are you within their budget?</p></li></ol><p>They will usually give you an overview of the role, the team you&#8217;ll be working with, the company setup, and the expectations.</p><p>Generally, they will ask you to <strong>&#8220;Tell me about yourself &#8230; &#8220; </strong>and take it from there.</p><p>As a candidate, it's a good practice to have a <strong>clear outline of your major contributions in the past 3 companies</strong> in a short 3 - 5 min intro. You should make it practical and mention points where there is a strong overlap with your demonstrated contribution/experience and the role you are applying for.</p><p>If this is an EM role, try to highlight contributions where you led a team, mentored a group of engineers, led a project E2E, or conducted hiring/performance reviews, etc.</p><p>If an IC role, highlight technical contributions you are most proud of, mentoring, and leadership without influence.</p><p>Asking an LLM to analyse a job description and your resume to find this out is a helpful preparation exercise.</p><p>The prompt could be something like</p><blockquote><p><em>As an experienced recruiter, please find below the resume [file name] and job description text. Help me identify how closely my resume fits this role?</em></p><p><em>What are the 5 key areas where there is a strong fit and 5 areas with zero to no overlap?</em></p><p><em>Help me frame a short, 200-word, concise, bulleted introduction that can be used to answer the &#8220;Tell me about yourself&#8221; question in compelling language.</em></p></blockquote><p>&#128721;Before asking the LLM, I&#8217;ll also encourage you to <strong>do this exercise yourself first</strong> and leverage your brain, because once the LLM gives you the data, you will already be biased.</p><p>Remember: You are going to be in the interview, not your LLM</p><h2>Technical rounds &#129489;&#8205;&#128187;</h2><p>You can expect different types of technical rounds</p><h3>Coding &#129489;&#8205;&#128187;</h3><p>BigTech companies and many high-growth scale-ups or product companies have 1-2 <a href="https://www.educative.io/courses/grokking-coding-interview?aff=x4QL">coding rounds</a> focused on solving 1-2 Leetcode-style problems within 45 mins. I had <a href="https://automationhacks.io/2022/01/02/how-i-got-that-job-at-meta#step-4-coding-interview-screening-and-onsite">previously written</a> about this when I was preparing for my meta interview, and I would still recommend this.</p><p>Additionally, I found that instead of randomly solving problems. Focusing on Leetcode's top<a href="https://leetcode.com/studyplan/top-interview-150/"> 150</a> gives you good, rounded practice.</p><p>Practice daily to ensure you are hands-on and can talk out loud while solving the problem.</p><h3><a href="https://www.educative.io/courses/grokking-the-system-design-interview?aff=x4QL">System design</a> &#127744;</h3><p>If this role is in a BigTech or high-growth product company, you could expect the interviewer may ask you to design a large-scale distributed system.</p><p>You can <a href="https://automationhacks.io/2022/01/02/how-i-got-that-job-at-meta#step-5-system-design-interview">read this section</a> of the blog that I wrote on this topic.</p><p>An additional good resource that I&#8217;ll recommend is the <a href="https://www.youtube.com/@hello_interview">Hello Interview</a> YouTube channel, which covers a lot of ground on topics that you should be aware of, and also some popular questions.</p><p><a href="https://www.youtube.com/watch?v=UEAMfLPZZhE&amp;list=PLeKd45zvjcDFUEv_ohr_HdUFe97RItdiB">Distributed Systems 1.1: Introduction</a> series by Martin Klepmann is also helpful to understand some fundamental concepts around distributed systems</p><p>Once you have the theory down, practice solving standard problems like Chat, Video store, E-commerce, and Payment systems. Another tip is to record yourself while answering or designing a system and watch it later to observe if you are clear while explaining your thinking.</p><p>Longer term, it&#8217;s quite beneficial to take an interest and understand how different engineering systems work under the hood, like your test runner, build system, log processing and storage, analytics, and time series database. You&#8217;ll have better confidence when you get an unfamiliar problem or system, to be able to reason from fundamentals.</p><p>I know and appreciate that the learning scope is huge and you probably cannot cover everything, but treat this like a longer-term endeavour to build knowledge about these disparate engineering systems, and not only for the imminent interview.</p><p>&#128161; The chances of running into this round in a startup are lower. When in doubt, it's better to clarify this with your recruiter.</p><h3>Take-home assignment &#127969;</h3><p>Some products or startups have a round like this.</p><p>Essentially, they will give you a take-home assignment where the task is to design a test framework to achieve some flow on either a dummy application or even their public-facing app, website, or API.</p><p>If this is something you&#8217;ve done a few times at work, you should be able to write solid, clean code to create a framework that covers important areas like:<br><br></p><ul><li><p>Test configuration</p></li><li><p>Test data management</p></li><li><p>Designing Test Suites</p></li><li><p>Test parallelisation</p></li><li><p>Making API calls</p></li><li><p>Performing UI actions on either web or mobile</p></li><li><p>Assertions</p></li><li><p>CI/CD</p></li><li><p>Clean modular classes that can be extended, test reporting, etc.</p></li></ul><p>It&#8217;s better to study frameworks that exist in your past roles and how they are organised, and create a diagram out of it, which you can use as a base to implement the framework.</p><p>For example, below is what a high-level framework may look like without any particular 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_!wAKs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wAKs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png 424w, https://substackcdn.com/image/fetch/$s_!wAKs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png 848w, https://substackcdn.com/image/fetch/$s_!wAKs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png 1272w, https://substackcdn.com/image/fetch/$s_!wAKs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wAKs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png" width="1456" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wAKs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png 424w, https://substackcdn.com/image/fetch/$s_!wAKs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png 848w, https://substackcdn.com/image/fetch/$s_!wAKs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.png 1272w, https://substackcdn.com/image/fetch/$s_!wAKs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa102f72f-c5f4-457b-b98d-7775d770b79b_1600x845.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>You may have to explain these different layers in an interview, and having a good, solid intuition helps a lot.</p><p>Below is a sample framework showing a detailed architecture using the Java ecosystem and its tools for API testing</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z86p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z86p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png 424w, https://substackcdn.com/image/fetch/$s_!z86p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png 848w, https://substackcdn.com/image/fetch/$s_!z86p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png 1272w, https://substackcdn.com/image/fetch/$s_!z86p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z86p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png" width="1456" height="765" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:765,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!z86p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png 424w, https://substackcdn.com/image/fetch/$s_!z86p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png 848w, https://substackcdn.com/image/fetch/$s_!z86p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.png 1272w, https://substackcdn.com/image/fetch/$s_!z86p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d43802a-a59c-40ef-9c1a-e07ae68a8da2_1600x841.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>You should have a clear intuition about how to approach a web or mobile automation framework and related domain concepts.</p><p>You can follow the basic concepts in <a href="https://testautomationu.applitools.com/python-api-testing/">this course</a> that I created on Test Automation University on API automation framework in Python.</p><p>In general, be curious and learn how things work under the hood.</p><h3>Technical discussion on frameworks &#128172;</h3><p>If you created a framework and shared the code with the interview team, usually the next round would focus more on you walking the interviewers through:</p><ul><li><p>How did you design the framework?</p></li><li><p>What tradeoffs did you consider while deciding on different tools or libraries, or layers in your framework?</p></li></ul><p>You should practice this beforehand using an online whiteboard so that you can clearly explain everything on the day.</p><p>Remember: No one is looking for perfect code, but it should be of good quality.</p><p>The panel may ask you to implement a follow-up or explain how you would modify it to support new features or use cases.</p><p>If there were no take-home assignment, then the interviewer may ask which area you are comfortable with: API, Web, or Mobile, then ask you to describe a framework to test a sample application covering certain requirements.</p><p>They might give you scenarios like how your framework would handle third-party APIs, rate limiting, mocking, stubbing, or load on APIs</p><p>These questions are grounded in checking the limits of your knowledge, and most of these should be things you should have an understanding of if you&#8217;ve been doing this at work or paying attention to how others around you are building these components.</p><h3>Testing acumen &#129504;</h3><p>Many companies may have this round, which aims to check how well you can test and your critical thinking skills.</p><p>Interviewer may give you either a real-world system like a parking system, an e-commerce website like Amazon, a reward and incentive system like Google Pay rewards, ride ride-hailing system like Uber, etc.</p><p>They may describe a system and then ask you how you would design test cases, automation approach, etc.</p><p>I find having a structured approach to be quite helpful in thinking through and answering these. You get bonus points if you can write these on some whiteboard and think out loud as you explain:</p><p>You should:</p><ol><li><p>Ask clarifying questions to understand the problem, the system, and its constraints</p></li><li><p>Think of functional cases - positive, negative, edge first</p></li><li><p>Then move to Nonfunctional cases - Load, stress, volume, accessibility, usability, security, concurrency, reliability, chaos, depending on what your interviewer is more interested in.</p></li></ol><p>This round helps separate a lot of good testers from mediocre ones, as this shows how wide and deep you can think and reason about a system, which is a core skill for people in testing.</p><h3>Domain knowledge</h3><p>Another technical format is where the interviewer may ask you to explain the architecture of the app, backend, or infrastructure that you support in your current role.</p><p>In general, practicing explaining this with a diagram is good practice, and it's great if you can explain how you tested each layer.</p><p>Any modern distributed system would usually have an API gateway, load balancer, db, queue, cache, and being able to explain this shows that you are a technical person on the team and not looking at things just from a black box perspective.</p><p>The interviewer may also go over different things in your resume and ask you follow-up questions to check your understanding of those concepts. Anything in your resume is fair game here, so make sure you only add technologies that you feel comfortable enough to answer questions on</p><p>If the role is more frontend-heavy, you can expect questions on:</p><ul><li><p>Selenium/Appium API</p></li><li><p>How do you manage browsers/devices</p></li><li><p>How your infrastructure scales.</p></li><li><p>How are the different layers designed</p></li><li><p>What common problems occur, and how do you handle those</p></li><li><p>How do parallel or concurrent runs work? What problems do you see, and how do you design solutions for them</p></li></ul><p>If it's backend-heavy, then:</p><ul><li><p>Which HTTP/gRPC/GraphQL client or library do you use</p></li><li><p>How is the CI/CD setup designed</p></li><li><p>How does load testing happen</p></li><li><p>How do you test the cache, queue, and DB layers</p></li></ul><h2>Behavioural &#129681;</h2><p>If you do well on the technical interviews, you will come across some form of evaluation to check your team management, leadership, stakeholder management, conflict resolution, negotiation, and project management skills.</p><p>These are extremely important if the role involves supporting a group of engineers, and doing well on this provides a good signal to the hiring team in regards to your seniority.</p><p>You can read the <a href="https://automationhacks.io/2022/01/02/how-i-got-that-job-at-meta#behavioral-interview">previous write-up on this</a>.</p><p>In my experience, these tend to have few variations and focus areas</p><h3>Past work or resume walkthrough</h3><p>Quite often, the interviewer will go through your resume and ask you to explain your past roles and ask questions along these lines.</p><ul><li><p>What role were you hired for?</p></li><li><p>What was your most challenging or impactful project?</p></li><li><p>A time when you had to manage conflict either with a peer, a manager, or a junior member?</p></li><li><p>How do you mentor a team member (junior or senior)?</p></li><li><p>How do you lead projects?</p></li><li><p>How do you manage deadlines?</p></li><li><p>A time when you had to push back in case of quality being subpar?</p></li><li><p>A time when your curiosity and contributions made an outsized impact on a project or feature delivery?</p></li><li><p>Reason for leaving</p></li></ul><p>So on and so forth..</p><p>There are tons of variations of these questions, but it's important to have a good awareness of your past 3 companies at the top of your mind. I find it helpful to document these broader stories on a yearly basis so that you can use these to tell richer stories in these rounds.</p><p>It&#8217;s important to be aware of what you have mentioned in your resume and be prepared to explain your contributions. It would be a good idea to have these written out in advance and review them before you go for any behavioural interview.</p><p>Also, remember to <strong>make your examples level appropriate</strong>. If you are interviewing for a senior or staff candidate, your examples should do justice to the scope or complexity that you can expect to tackle in such roles in this job.</p><h3>Collaboration with cross-functional partners (XFN)</h3><p>This round checks how you work with leaders across QA, Backend, Mobile, SRE teams and business, and other functions</p><p>I&#8217;ve seen flavours of such interviews where a leader from product, design, technical program management (TPM), or sales/marketing functions may conduct a behavioural interview focusing on how well you work with other teams and functions.</p><p>It&#8217;s usually a good idea to have some strong stories around these lines prepared ahead of time. For example:</p><ul><li><p>Tell me about a time when you had a conflict with the dev team.</p></li><li><p>How do you work with product management and business functions?</p></li><li><p>Tell me about a time when your feedback and contribution led to better design or implementation.</p></li><li><p>Tell me about a time when you accomplished something difficult by collaborating across team boundaries.</p></li></ul><h3>Team and stakeholder management</h3><p>You can expect a behavioural interview along these lines, where the interviewer wants to understand how you lead a team and manage expectations from different stakeholders.</p><p>You can expect questions like</p><ul><li><p>What metrics or KPI do you use to measure the success of a team?</p></li><li><p>What's your leadership philosophy?</p></li><li><p>How do you mentor early and mid-career vs senior engineers?</p></li><li><p>A time when you had to convince the team to stretch to handle an urgent and important project?</p></li><li><p>How do you manage deadlines and project releases?</p></li><li><p>How do you manage non-performance?</p></li><li><p>How do you do performance reviews and reward the right individuals?</p></li><li><p>How do you measure success?</p></li><li><p>What's your intuition around growing people under your care?</p></li></ul><h3>Hiring manager</h3><p>Your hiring or reporting manager may already be part of one of the previous loops, or they may also do a focused discussion.</p><p>Whether they focus more on technical or behavioral depends on the exact role specification and your performance in previous rounds.</p><p>In general, the hiring manager may check around:</p><ul><li><p>Salary expectations</p></li><li><p>What's the reason for the change</p></li><li><p>What are you looking for in this role/motivations for your role?</p></li><li><p>How do you work with other members on the team?</p></li></ul><h2>Recruiter discussion</h2><p>If all the previous rounds went well and the hiring panel decides to extend an offer, then the recruiter will reach out to you to convey their interest and then move you to the offer stage and salary negotiations.</p><p>I&#8217;ll write about this topic around negotiation in more detail, since it's a very nuanced topic in itself and often something engineers rarely practice well.</p><p>I&#8217;ll leave you with a few general guidelines that you should consider:</p><ul><li><p>Try to have <strong>competing offers</strong> in hand to put yourself in a favourable situation.</p></li><li><p><strong>Don&#8217;t reveal your salary expectations</strong> <strong>or last compensation EARLY</strong> in the process. Once you reach the offer stage, try to <strong>let them make you an offer first,</strong> and then go ahead with negotiations with valid data points (competing offers, market research, etc)</p></li><li><p>Show <strong>genuine interest</strong> and be <strong>extremely gracious and kind</strong> at this stage. No recruiter or hiring manager likes a cocky overconfident candidate and remember that handling this stage poorly may also lead to you not getting an offer or in worst cases rescinding of the offer.</p></li></ul><h2>Conclusion</h2><p>I hope this write-up provided you with a good mental model of what the different interview flavours you can expect are as you look for your next opportunity.</p><p>A lot of it is <strong>good preparation, fundamentals, and practice,</strong> and if you&#8217;ve prepared well, represented yourself well in interviews, you could be a step closer to your next dream job or role.</p><p>All the best!</p><p>You&#8217;ve got this. &#129309;</p><p>&#10084;&#65039; Loved reading this? Please subscribe to the <a href="https://newsletter.automationhacks.io/">newsletter</a> and <a href="https://www.youtube.com/@automationhacks">YouTube channel (@automationhacks)</a> for more &#9889;<strong>insights</strong> into <strong>software testing</strong> and <strong>automation,</strong> or connect on <a href="https://topmate.io/automationhacks/">topmate</a> for a personalized 1:1 session.</p><p><em>Disclosure: I&#8217;ll earn a small commission if you decide to purchase some of the educative.io text courses linked in the blog for your learning and growth. Their <a href="https://www.educative.io/courses/grokking-the-system-design-interview?aff=x4QL">system design courses</a></em> and <em><a href="https://www.educative.io/courses/grokking-coding-interview?aff=x4QL">grokking coding interview</a> courses are quite helpful for interview prep</em>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>]]></content:encoded></item><item><title><![CDATA[🗃️ Unboxing Github Copilot Agent mode]]></title><description><![CDATA[We&#8217;ll use GitHub Copilot Agent mode to build a developer productivity feature for analysing failing test stack traces and grasp the nuances as we vibe code our way]]></description><link>https://newsletter.automationhacks.io/p/unboxing-github-copilot-agent-mode</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/unboxing-github-copilot-agent-mode</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Mon, 05 May 2025 05:23:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4i5m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.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_!4i5m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4i5m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png 424w, https://substackcdn.com/image/fetch/$s_!4i5m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png 848w, https://substackcdn.com/image/fetch/$s_!4i5m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png 1272w, https://substackcdn.com/image/fetch/$s_!4i5m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4i5m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png" width="1456" height="796" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:796,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:279352,&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://newsletter.automationhacks.io/i/162864544?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.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_!4i5m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png 424w, https://substackcdn.com/image/fetch/$s_!4i5m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png 848w, https://substackcdn.com/image/fetch/$s_!4i5m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.png 1272w, https://substackcdn.com/image/fetch/$s_!4i5m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cef543c-ea10-4418-b0a8-7bc7e2564bc5_2232x1221.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">Agent and MCP ecosystem in 2025</figcaption></figure></div><p></p><p>Github Copilot recently <a href="https://github.blog/news-insights/product-news/github-copilot-the-agent-awakens/">announced</a> the general availability of <strong>Agent mode</strong></p><p>Agentic AI, Agents, and MCP (Model context protocol) have been buzzwords that have filled much of the Internet and social media chatter in the past few months. Among all the hype about its capabilities, it&#8217;s hard to separate noise from signal.</p><p>In this blog, I&#8217;ll explain these technologies and how we can use them practically in our day-to-day software engineering workflow in simple, non-marketing language for real software engineers.</p><p>Let&#8217;s dive right in. &#129405;</p><h2>Agent mode for beginners &#129300;</h2><p>The usage aspect of Agent mode is similar to Edits or chat.</p><p>You <strong>specify a <a href="https://www.educative.io/courses/all-you-need-to-know-about-prompt-engineering?aff=x4QL">prompt</a></strong> and let the <a href="https://www.educative.io/courses/essentials-of-large-language-models-a-beginners-journey?aff=x4QL">LLM</a> do its thing, but let&#8217;s take a deeper look at these different terms, concepts, and capabilities that this new mode brings and try to form a good mental model</p><h3>What is Agent mode?</h3><p>And how is this different from <a href="https://newsletter.automationhacks.io/p/copilot-edits-edit-multiple-files">GitHub Copilot Edits</a> or <a href="https://newsletter.automationhacks.io/p/ai-for-testing-2-code-assistance-inline-chat-and-chat-commands">Copilot chat</a>?</p><p>All perfectly valid questions.</p><p><strong>Agent mode</strong> can be thought of as a more powerful version of Copilot Edits that:</p><ul><li><p>Can use <strong>tools </strong>to achieve tasks that require more planning</p></li><li><p>Understand and reference multiple files in your codebase without having to specify them manually</p></li><li><p>Create and run tests with your permission</p></li><li><p>Running commands on the terminal</p></li></ul><p>It does this while putting the developer in control to review and approve different stages, such as which tools to use, accept, or reject changes, etc.</p><p>Tools here can be thought of as a function that exposes some capability from an <strong>Application, CLI, API, or data source.</strong> They can be used to achieve a certain task by leveraging the <strong><a href="https://modelcontextprotocol.io/introduction">model context protocol (MCP)</a></strong>. A simple example could be reading a file and writing a file in your own codebase.</p><h3>What is MCP?</h3><p>A couple of helpful analogies that I find helpful when thinking about MCP</p><ol><li><p>MCP is like the <strong>USB-C port for AI </strong>applications</p></li><li><p>It supports a more <strong>plug-and-play</strong> way of working with AI, wherein you or Agent can add a relevant MCP server to make it easier for your AI model to talk to and leverage its capabilities to complete a certain task</p></li></ol><p>MCP also helps <strong>reduce hallucination problems to a certain degree</strong> for <a href="https://www.educative.io/courses/essentials-of-large-language-models-a-beginners-journey?aff=x4QL">LLMs (Large language models)</a>, as they now provide a more deterministic and efficient way to work with different <strong>tools</strong> and <strong>resources</strong></p><p>The community has already picked up this idea and started producing a bunch of <a href="https://github.com/punkpeye/awesome-mcp-servers">MCP servers</a> for different existing applications to support LLM-driven development, <a href="https://community.openai.com/t/preparing-for-mcp-in-responses/1152972">along with OpenAI</a></p><p>What does a <a href="https://modelcontextprotocol.io/introduction">MCP</a> server look like in practice, and should you care?</p><p>For the most part, discovering relevant tools and MCP is something that Agent mode itself may take care however, if you are deeply engrossed in the domain and know that what you are trying to build would require a certain specific MCP server, you could also add those while initiating the session</p><p>You can refer to the <a href="https://github.com/github/github-mcp-server?tab=readme-ov-file">GitHub MCP server</a> README to understand what GitHub functionality is exposed.</p><p>In practice, it looks like a function wherein the parameters are specified with their data type, and whether a field is <strong>required/optional</strong></p><ul><li><p>get_issue - Gets the contents of an issue within a repository</p><ul><li><p>owner: Repository owner (string, required)</p></li><li><p>repo: Repository name (string, required)</p></li><li><p>issue_number: Issue number (number, required)</p></li></ul></li><li><p>get_issue_comments - Get comments for a GitHub issue</p><ul><li><p>owner: Repository owner (string, required)</p></li><li><p>repo: Repository name (string, required)</p></li><li><p>issue_number: Issue number (number, required)</p></li></ul></li></ul><p>We can do a deeper dive in MCP later, but for now, this basic intuition is good enough.</p><p>What would a workflow look like with Agent mode as a developer?</p><ol><li><p><strong>Prompt:</strong> Come up with an <strong>idea</strong> and a <strong>detailed prompt</strong> for what you want to achieve. &#8211; It could be an enhancement of an existing feature to add a new capability, add test coverage for a particular area, etc</p></li><li><p><strong>Server:</strong> Add relevant MCP servers that provide said capabilities, or let Agent mode autodiscover it. &#8211; For example, if you are building a CI/CD feature, and you want to leverage the underlying CI tool, you can add an MCP server for that tool, like Jenkins, GitHub Actions, etc</p></li><li><p><strong>Instructions:</strong> Add relevant instructions in a custom_instructions.md file to highlight <strong>rules</strong>, for example. You can say <em>add a changelog of every change that you made to keep track of what the last change</em> made by Agent mode was.</p></li><li><p><strong>Execution:</strong> Let Agent mode go off and execute on your idea, review the suggestions for accuracy, and only merge changes that make sense.</p></li><li><p><strong>Fine-tuning:</strong> Take control back and edit or refactor the code further before shipping it.</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><h2>An actual pairing session with Copilot Agent mode</h2><p>I paired with Copilot Agent mode to build a feature that was in my mind for some time.</p><p>Let&#8217;s go through the steps and, in the process, understand different nuances</p><p>When you launch the Agent mode window for the first time on VS Code, you&#8217;ll see a welcome message that gives you a hint about how to leverage its capabilities</p><p>You can:</p><ol><li><p>Attach context using hash #</p></li><li><p>at the rate @ to chat with extensions</p></li><li><p>Use a forward slash (/) to use commands</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_!QlIO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QlIO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png 424w, https://substackcdn.com/image/fetch/$s_!QlIO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png 848w, https://substackcdn.com/image/fetch/$s_!QlIO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png 1272w, https://substackcdn.com/image/fetch/$s_!QlIO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QlIO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png" width="728" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:728,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QlIO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png 424w, https://substackcdn.com/image/fetch/$s_!QlIO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png 848w, https://substackcdn.com/image/fetch/$s_!QlIO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.png 1272w, https://substackcdn.com/image/fetch/$s_!QlIO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c6ec111-3826-4500-998a-2d0789ff0e69_728x794.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 ask Copilot Agent mode to build a feature in the <a href="https://github.com/automationhacks/test-infra">test-infra</a> codebase.</p><p>You can follow different changes that were created by Agent mode and my pairing in tandem in the branch <a href="https://github.com/automationhacks/test-infra/tree/failure_auto_fixes">failure_auto_fixes</a></p><h3>Initial prompt and setup &#9000;&#65039;</h3><p>Let&#8217;s set up a session</p><p>We&#8217;ll copy and paste the below prompt in the chat window</p><blockquote><p>As a Java programmer, I want you to implement a developer productivity feature.</p><p>I want you to be able to connect to the report portal instance running on localhost:8080 on this machine and figure out the reason for a failing test from the stack trace, and then suggest a fix for this in the tests under `src/test/java/io/automationhacks/testinfra/reqres` package.</p><p>This should be built in a scalable manner such that this auto-analysis can run on every test suite run or at a scheduled time.</p><p>The report portal has an MCP server here:</p><p>https://github.com/reportportal/reportportal-mcp-server</p><p>API docs can be found here</p><p>https://developers.reportportal.io/api-docs/service-api/get-test-items</p></blockquote><p>And select <strong>Agent</strong> from the drop-down to indicate you want to use <strong>Agent mode</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!woK3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!woK3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png 424w, https://substackcdn.com/image/fetch/$s_!woK3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png 848w, https://substackcdn.com/image/fetch/$s_!woK3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png 1272w, https://substackcdn.com/image/fetch/$s_!woK3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!woK3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png" width="1456" height="668" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:668,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!woK3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png 424w, https://substackcdn.com/image/fetch/$s_!woK3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png 848w, https://substackcdn.com/image/fetch/$s_!woK3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.png 1272w, https://substackcdn.com/image/fetch/$s_!woK3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff056a5fb-b5af-4c92-9770-58ab5a68ebe5_1482x680.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>I additionally want Copilot to have a set of rules while working on the problem.</p><p>I created a <a href="https://github.com/automationhacks/test-infra/blob/failure_auto_fixes/custom_instructions.md">custom_instructions.md</a> file and attached it to the context</p><blockquote><p># Instructions</p><p>## Rules</p><p>- After making a change, update the ai_changes/changelog.md file with what change was made with a timestamp to make it easy to follow</p><p>- Keep the code clean, modular, and extensible for future changes</p><p>- Prepare a plan before executing and document that in a ai_changes/plan.md file. Also, capture the prompt that was provided by the developer to trigger that change</p><p>- Don't hallucinate or make up stuff.</p><p>- Always check your work before completing the task</p></blockquote><h3>&#128195; Planning</h3><p>Copilot Agent mode first breaks the problem down into:</p><ol><li><p>Requirements</p></li><li><p>Research and setup</p></li><li><p>Created an implementation plan</p></li><li><p>Dove into implementing this plan.</p></li></ol><p>During this process, tools were also used to check if the file exists in the codebase.</p><p>Wherever details are not provided in the prompt, it will proceed to make reasonable assumptions</p><p>You&#8217;ll also notice the Agent mode periodically prompts you as the user to decide if the direction in which it is proceeding is making sense or not.</p><p>You can decide to pause and refine your prompts or give additional instructions to nudge it in a particular direction, or let it continue.</p><p>You can review changes made at each phase by clicking on the file and seeing how many lines were added or removed. For exampl,e <strong>ReportPortalClient.java +69 -1 </strong>indicates 69 lines added and 1 removed</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5cdC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5cdC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png 424w, https://substackcdn.com/image/fetch/$s_!5cdC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png 848w, https://substackcdn.com/image/fetch/$s_!5cdC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!5cdC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5cdC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png" width="995" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:995,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5cdC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png 424w, https://substackcdn.com/image/fetch/$s_!5cdC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png 848w, https://substackcdn.com/image/fetch/$s_!5cdC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!5cdC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc903c45-1a96-4740-90a9-c9ed839c590d_995x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#128736;&#65039; Checking and fixing compilation issues</h3><p>For this problem, Copilot identified the correct components, so I just let it continue onwards</p><p>It did a couple of interesting things in this phase</p><ol><li><p>It reads existing files to determine if the required libraries are present</p></li><li><p>After finishing the initial implementation, it also checks the written code to verify if there were any problems. If it detects a compilation error, it makes fixes and repeats this till the code compilation or building works fine.</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_!7hKL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7hKL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png 424w, https://substackcdn.com/image/fetch/$s_!7hKL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png 848w, https://substackcdn.com/image/fetch/$s_!7hKL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!7hKL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7hKL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png" width="1108" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1108,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7hKL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png 424w, https://substackcdn.com/image/fetch/$s_!7hKL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png 848w, https://substackcdn.com/image/fetch/$s_!7hKL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!7hKL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe44acf09-e0f9-4f13-8a4f-ae5344fcc4e2_1108x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#128200; Drives improvements</h3><p>It&#8217;s already impressive that it could reach this stage without any user intervention, so I let it continue onwards.</p><p>Here, Copilot makes additional improvements by centralizing config management with a properties file and a utility class to provide getters. This is usually a good idea and something I would have done at this stage as well. It again did a round of checks and summarized all the changes it made.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EF6u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EF6u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png 424w, https://substackcdn.com/image/fetch/$s_!EF6u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png 848w, https://substackcdn.com/image/fetch/$s_!EF6u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!EF6u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EF6u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png" width="1039" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1039,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EF6u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png 424w, https://substackcdn.com/image/fetch/$s_!EF6u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png 848w, https://substackcdn.com/image/fetch/$s_!EF6u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!EF6u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff358ac26-bd01-4875-91af-4a87e512c4a5_1039x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#129514; Testing</h3><p>Now was the moment of truth; things looked good on a high level. I asked it to run the tests and see if the solution works.</p><blockquote><p>Please follow the readme instructions to run all regression tests on the terminal and validate if the above solution works, to suggest fixes when a test fails</p></blockquote><p>Copilot prompted me to run a gradle command to run the tests &#129321;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ouo0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ouo0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png 424w, https://substackcdn.com/image/fetch/$s_!ouo0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png 848w, https://substackcdn.com/image/fetch/$s_!ouo0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png 1272w, https://substackcdn.com/image/fetch/$s_!ouo0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ouo0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png" width="1456" height="716" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34739c60-d580-419b-9855-79779b163799_1512x744.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:716,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ouo0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png 424w, https://substackcdn.com/image/fetch/$s_!ouo0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png 848w, https://substackcdn.com/image/fetch/$s_!ouo0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.png 1272w, https://substackcdn.com/image/fetch/$s_!ouo0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34739c60-d580-419b-9855-79779b163799_1512x744.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>Sadly, most of the tests failed, and also the implemented code did not work for checking stack trace failures in ReportPortal &#129300;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2ptT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2ptT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png 424w, https://substackcdn.com/image/fetch/$s_!2ptT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png 848w, https://substackcdn.com/image/fetch/$s_!2ptT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png 1272w, https://substackcdn.com/image/fetch/$s_!2ptT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2ptT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png" width="1456" height="554" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:554,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2ptT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png 424w, https://substackcdn.com/image/fetch/$s_!2ptT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png 848w, https://substackcdn.com/image/fetch/$s_!2ptT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png 1272w, https://substackcdn.com/image/fetch/$s_!2ptT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ce58a2-3a1c-4022-8094-641e134a5874_1600x609.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#129343; Debugging</h3><p>Copilot, like any good junior engineer, started breaking down the failures in the logs and tried to come up with the next steps</p><p>It correctly identified that:</p><ol><li><p>ReqRes tests failed due to 401 errors</p></li><li><p>ReportPortal client failed due to 400</p></li></ol><p>It correctly spotted that the project name was not updated correctly in its created properties file and modified it, ran tests again</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!empo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!empo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png 424w, https://substackcdn.com/image/fetch/$s_!empo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png 848w, https://substackcdn.com/image/fetch/$s_!empo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!empo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!empo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png" width="1138" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1138,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!empo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png 424w, https://substackcdn.com/image/fetch/$s_!empo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png 848w, https://substackcdn.com/image/fetch/$s_!empo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!empo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc128de0a-ac2c-4472-966b-3262a8f5bd22_1138x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>A bunch of wrong turns</h3><p>At this time, Copilot made many unnecessary changes to the test files, such as:</p><ol><li><p>Removing ReportPortal annotation code that was required.</p></li><li><p>Modifying the team names to something else</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_!UjWm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UjWm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png 424w, https://substackcdn.com/image/fetch/$s_!UjWm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png 848w, https://substackcdn.com/image/fetch/$s_!UjWm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png 1272w, https://substackcdn.com/image/fetch/$s_!UjWm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UjWm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png" width="1456" height="779" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:779,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UjWm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png 424w, https://substackcdn.com/image/fetch/$s_!UjWm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png 848w, https://substackcdn.com/image/fetch/$s_!UjWm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.png 1272w, https://substackcdn.com/image/fetch/$s_!UjWm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fa7a1f-b8f9-42ba-93e7-cd6960b19a87_1600x856.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>It also hallucinated certain values that were not present in the enum constants, leading to build failures</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RvKl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RvKl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png 424w, https://substackcdn.com/image/fetch/$s_!RvKl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png 848w, https://substackcdn.com/image/fetch/$s_!RvKl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png 1272w, https://substackcdn.com/image/fetch/$s_!RvKl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RvKl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png" width="1456" height="1388" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1388,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RvKl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png 424w, https://substackcdn.com/image/fetch/$s_!RvKl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png 848w, https://substackcdn.com/image/fetch/$s_!RvKl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.png 1272w, https://substackcdn.com/image/fetch/$s_!RvKl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe3740f-2e7d-4e05-a881-5a85cbd2bec4_1600x1525.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>I discarded these changes since they did not make sense</p><h3>&#129489;&#127995;&#8205;&#128187; Enter a human software engineer</h3><p>I went a couple of rounds with this flow before realizing that Copilot is not able to figure out the real issue. I visited the ReqRes site and saw that they had introduced a new API key header with a rate limit of 100 requests per day. No wonder the tests were broken due to 401</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6z56!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6z56!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png 424w, https://substackcdn.com/image/fetch/$s_!6z56!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png 848w, https://substackcdn.com/image/fetch/$s_!6z56!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!6z56!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6z56!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png" width="978" height="1460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1460,&quot;width&quot;:978,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6z56!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png 424w, https://substackcdn.com/image/fetch/$s_!6z56!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png 848w, https://substackcdn.com/image/fetch/$s_!6z56!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!6z56!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68994a5d-757d-4ac9-8e49-35490b4548c8_978x1460.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>I tested one method after adding the header and then provided this context to Copilot to do further refactoring for me.</p><blockquote><p>Looks like the reason why ReqRes tests were failing were because the site has introduced an API key on their site. I requested one and added it to testRegisterSuccessful. Could you apply this change to other tests and run them to verify the 1st issue is resolved and then focus on the 2nd part of the problem wherein report portal API returns us a 4XX error</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FDhV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FDhV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png 424w, https://substackcdn.com/image/fetch/$s_!FDhV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png 848w, https://substackcdn.com/image/fetch/$s_!FDhV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!FDhV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FDhV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png" width="1362" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1362,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FDhV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png 424w, https://substackcdn.com/image/fetch/$s_!FDhV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png 848w, https://substackcdn.com/image/fetch/$s_!FDhV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!FDhV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe419ee6c-84c0-4858-973b-472dbbda7aef_1362x1600.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>I continued with the cycle multiple times, and it took some time for Agent mode to correctly refactor all the tests to add the new header.</p><p>But &#8230; &#9995;</p><p>The core issue of being able to pull a stack trace for a failing test remained.</p><p>Agent mode was not able to figure out the correct API sequence to fetch stack traces for failed tests.</p><p>I wasted <strong>close to 40-45 minutes trying to get it to <a href="https://en.wikipedia.org/wiki/Vibe_coding">&#8220;vibe code&#8221;</a> the solution out as the cool kids suggest</strong>, after which I decided to explore the API docs for ReportPortal myself.</p><p>It turned out Copilot was close but not all the way, it was hallucinating some query params for the API that is able to fetch the failed results. I explored the Report portal UI and then, using Chrome developer tools, analyzed XHR requests to figure out the correct APIs that the application uses to display failed tests and their stack traces.</p><p>I then played around with the APIs in Postman and identified a sequence of steps that should work, and <a href="https://github.com/automationhacks/test-infra/blob/failure_auto_fixes/prompts/report-portal-get-failed-stack-traces.md">wrote it in a markdown file</a> to provide as context</p><p>Agent mode was now able to modify the ReportPortalClient inline with provided APIs while also being able to figure out why the other tests were failing (due to API key being set in query params instead of header &#129318;).</p><p>You can find the changes in <a href="https://github.com/automationhacks/test-infra/commit/09bd9c60aa8ccd4cccd87b8d50eed0ad19a28712">this commit</a></p><h3>&#9940; Build failure again</h3><p>Copilot modified a method in ReportPortalClient but did not update all the code references, leading to build failures.</p><p>Also, I noticed it kept on running all the tests in the workspace when we could only run one sample test to validate the flow.</p><p>I prompted it to only run the one case, and it did understand that the build was failing. However, it went on to make a bunch of nonsensical changes, leading to unimported packages, etc, again.</p><p>At this point, I realised. It was time to take a pause and jump into this problem and solve it the right way.</p><p>I fired up my trusty IntelliJ and started digging into the problem one by one.</p><p>I was able to fix the build failure quite easily and realised an earlier implementation was not required since we were already preparing a list of failed test items.</p><p>Below is the commit log and the commits that I made to fix the build problems. It&#8217;s funny, but as a developer, coding the solution yourself helps you understand it deeply and grasp its structure much better. When you are reviewing code, you tend to prefer speed over quality at each step, and also do not have a good mental model of classes, methods, and their relationship</p><blockquote><p>- Update AutoTestAnalyzer to get list of failed test items directly and not query JsonNode</p><p>- Fixed a bug wherein `/api/v1` was being added unnecessarily</p><p>- Fixed ReportPortalClient urls</p><p>- Added a failing tag to run a targeted test</p><p><a href="https://github.com/automationhacks/test-infra/commit/4bccbbd146d8db9885c33193756c2a90a07b72fd">Commit 1</a></p><p>- Add model classes for Report Portal test item response and refactor AutoTestAnalyzer to utilize new structure</p><p>- Pull stack trace from failing tests description itself</p><p>- Updated loggers to log requests</p><p><a href="https://github.com/automationhacks/test-infra/commit/b0f920567e1cfcc0156aac77bc867e90e3abfa52">Commit 2</a></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZLHQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png 424w, https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png 848w, https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png 1272w, https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png" width="1456" height="349" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:349,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png 424w, https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png 848w, https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png 1272w, https://substackcdn.com/image/fetch/$s_!ZLHQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb6ab81-3c24-41f3-bbc4-9bad30722a22_1600x383.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>I ran the failing test and saw that I could finish the loop till the point where I was able to identify a failing test, and then the analyzer returned a result</p><pre><code>May 04, 2025 9:56:00 PM io.automationhacks.testinfra.TestAnalysisListener onExecutionFinish

INFO: Test execution finished. Starting test analysis...

May 04, 2025 9:56:00 PM io.automationhacks.testinfra.AutoTestAnalyzer analyzeFailingTests

INFO: Fetching failing tests from Report Portal...

May 04, 2025 9:56:00 PM io.automationhacks.testinfra.AutoTestAnalyzer analyzeFailingTests

INFO: Found 1 failing tests. Analyzing stack traces for suggestions...

May 04, 2025 9:56:00 PM io.automationhacks.testinfra.AutoTestAnalyzer logAnalysisResult

INFO: Test Item ID: 884

Suggestion: Assertion failed: 1 expectation failed.. Review the assertion conditions.</code></pre><h3>LLM-based test analyzer</h3><p>At this point, I felt confident that the flow would work to hand back control to Agent mode.</p><blockquote><p>I have made changes in ReportPortalClient and AutoTestAnalyzer to be able to pull the error stack trace. I want you to now focus on StackTraceAnalyzer such that it can detect a failure pattern and then provide a suggestion via an LLM or an Agent mode</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vGep!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vGep!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png 424w, https://substackcdn.com/image/fetch/$s_!vGep!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png 848w, https://substackcdn.com/image/fetch/$s_!vGep!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!vGep!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vGep!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png" width="984" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:984,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vGep!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png 424w, https://substackcdn.com/image/fetch/$s_!vGep!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png 848w, https://substackcdn.com/image/fetch/$s_!vGep!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!vGep!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1522d448-1c1d-4482-9275-60e970528fb9_984x1600.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>I could now see that Agent mode smartly did manual analysis on a failing test and then added a fallback using an LLM call to OpenAI GPT 3.5. It also went ahead and added tests for the analyzer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5ZTe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5ZTe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png 424w, https://substackcdn.com/image/fetch/$s_!5ZTe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png 848w, https://substackcdn.com/image/fetch/$s_!5ZTe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png 1272w, https://substackcdn.com/image/fetch/$s_!5ZTe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5ZTe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png" width="1456" height="838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5ZTe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png 424w, https://substackcdn.com/image/fetch/$s_!5ZTe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png 848w, https://substackcdn.com/image/fetch/$s_!5ZTe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.png 1272w, https://substackcdn.com/image/fetch/$s_!5ZTe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ea0562-b1a5-43c6-9a64-fe98b237ccc8_1600x921.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>To be honest, this feature seems quite close to completion, and if I were to continue down the path. I feel like this could be added as an operational feature in ReportPortal for teams, of course, after the code is cleaned up and polished.</p><p>You could follow all the commits <a href="https://github.com/automationhacks/test-infra/commit/f4f3ceac2d2733387578d781be36dfbf01940ed2">here</a> on GitHub</p><h2>Conclusion</h2><p>I hope this practical example gives you a sense of what working with GitHub Copilot Agent mode looks like in actual practice</p><p>Here are my top key takeaways</p><ol><li><p><strong>Powerful:</strong> Agent mode is a powerful coding tool and can write code pretty fast for more complex problems and leverage tools (terminal, code search, external MCP servers) to write powerful solutions</p></li><li><p><strong>Verify:</strong> It sometimes goes down wrong paths and makes nonsensical changes. As a developer, you should take your time and review each change. <strong>Don&#8217;t vibe code </strong>further if you don&#8217;t understand what&#8217;s going on</p></li><li><p><strong>Learn:</strong> Knowing programming languages, frameworks deeply would help to separate good code from bad. Building taste requires time and practice.</p></li><li><p><strong>Write code yourself:</strong> Sometimes, it's okay to take on the driver mode, pause the AI Agent, and write the code yourself. It may be faster and easier for you to maintain the code later on</p></li><li><p><strong>Quality:</strong> Code quality produced by Agent mode is more like an eager early-career engineer. It lacks polish, but that could be fixed by adding in some Senior engineer intuition and more descriptive <a href="https://www.educative.io/courses/all-you-need-to-know-about-prompt-engineering?aff=x4QL">prompts</a></p></li><li><p><strong>Not omnipotent:</strong> AI is not god, it does not know what it does not know. You have to hold it a little bit and provide the right context, prompts, and knowledge to achieve its tasks</p></li><li><p><strong>Testing:</strong> Tests tend to be more unit test-like; you should consider writing functional tests for the code it produces as well</p></li></ol><p>Overall, it's an impressive new shiny tool in your toolkit as a professional Software engineer, and you should use it, but with caution &#9888;&#65039; Mix it with your experience and intuition, and you can achieve impressive things.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p><h2>References</h2><ol><li><p><a href="https://github.blog/news-insights/product-news/github-copilot-agent-mode-activated/">Vibe coding with GitHub Copilot: Agent mode and MCP support rolling out to all VS Code users - The GitHub Blog</a></p></li><li><p><a href="https://modelcontextprotocol.io/introduction">Model Context Protocol</a></p></li><li><p><a href="https://code.visualstudio.com/docs/copilot/chat/mcp-servers">Use MCP servers in VS Code (Preview)</a></p></li></ol><p>Enjoyed reading this?</p><p>Subscribe to the <a href="https://newsletter.automationhacks.io/">newsletter</a> and <a href="https://www.youtube.com/@automationhacks">YouTube channel (@automationhacks)</a> for more &#9889;<strong>insights</strong> into <strong>software testing</strong> and <strong>automation,</strong> or connect on <a href="https://topmate.io/automationhacks/">topmate</a> for a personalized 1:1 session.</p><p><em>Disclosure: I&#8217;ll earn a small commission if you decide to purchase some of the educative.io text courses linked in the blog for your learning and growth. Their <a href="https://www.educative.io/courses/grokking-the-system-design-interview?aff=x4QL">system design courses</a></em> and <em><a href="https://www.educative.io/courses/grokking-coding-interview?aff=x4QL">grokking coding interview</a> courses are arguably quite helpful for interview prep</em>.</p><p>Until next time, happy testing!</p><p></p>]]></content:encoded></item><item><title><![CDATA[How to run LLMs locally ⤵️ with Ollama]]></title><description><![CDATA[Setup Ollama on docker, run Llama3.2 and deepseek-r1 models locally, chat with open web UI, and use CLI/API, all in 30 mins with the privacy of your machine &#128640;]]></description><link>https://newsletter.automationhacks.io/p/how-to-run-llms-locally-with-ollama</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/how-to-run-llms-locally-with-ollama</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Tue, 25 Feb 2025 16:48:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RCft!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.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_!RCft!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RCft!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png 424w, https://substackcdn.com/image/fetch/$s_!RCft!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png 848w, https://substackcdn.com/image/fetch/$s_!RCft!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png 1272w, https://substackcdn.com/image/fetch/$s_!RCft!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RCft!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png" width="1456" height="708" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.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;:385086,&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://newsletter.automationhacks.io/i/157898513?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.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_!RCft!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png 424w, https://substackcdn.com/image/fetch/$s_!RCft!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png 848w, https://substackcdn.com/image/fetch/$s_!RCft!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png 1272w, https://substackcdn.com/image/fetch/$s_!RCft!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed87b8d-c4a4-40b0-b7cd-e051eea1e7ed_2334x1135.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>Why use local LLMs?</h2><p>You can publicly access LLM (Large language models) for your day-to-day workflows via any of the providers by visiting their site.</p><p>In this blog series so far on Gen AI for testing, we&#8217;ve seen how <a href="http://chatgpt.com">ChatGPT.com</a> could be used to <a href="https://newsletter.automationhacks.io/p/ai-for-testing-1-gen-ai-and-test-design-supercharge-your-prompting-skills">generate test cases by understanding prompting</a>, Github <a href="https://newsletter.automationhacks.io/p/ai-for-testing-2-code-assistance-inline-chat-and-chat-commands">copilot for chat</a>, and Copilot <a href="https://newsletter.automationhacks.io/p/copilot-edits-edit-multiple-files">edits</a> can be used with available models from <a href="https://openai.com/">Open AI</a> and <a href="https://www.anthropic.com/">anthropic</a>. If you are a new reader; welcome &#128075; and feel free to subscribe and check out previous editions on <a href="https://newsletter.automationhacks.io/">automation hacks</a></p><p>These models are wonderful and powerful on the web, however, for any sophisticated use case, you will <strong>need access to their API</strong>. It's quite cheap as of now but you&#8217;ll still need to get subscriptions ranging from <a href="https://openai.com/chatgpt/pricing/">$20 to $200 per month for OpenAI</a> or <a href="https://www.anthropic.com/pricing">Anthropic</a></p><p>With a business license, You mostly have guarantees that your data should be <a href="https://support.anthropic.com/en/collections/4078534-privacy-legal">protected and secured</a> but you may always have concerns at the back of your mind that your proprietary and confidential data is leveraged to train subsequent models, maybe even exposing your confidential company to data leaks. &#129335;Plus a closed ecosystem blackbox is not a lot of fun, is it?</p><p>On the flip side, there is a thriving ecosystem of <a href="https://www.oracle.com/artificial-intelligence/ai-open-weights-models/">open-weight</a> models that can be run on your local laptop or company infrastructure and leveraged for tasks suitable for LLMs. In this blog, we&#8217;ll take a look at Ollama which is one such solution built by the OSS community.</p><h2>Ollama</h2><p>I recently came across <a href="https://github.com/ollama/ollama">ollama</a>, a wonderful tool that enables you to host local models and run inference. It has an MIT license code and 129K stars as of Feb 2025. Let&#8217;s understand how to set up ollama to host <a href="https://www.deepseek.com/">Deepseek</a> and <a href="https://www.llama.com/">Llama</a>, open-source models</p><h3>Running LLMs locally and using CLI</h3><p>We will run ollama using Docker to provide isolation and easy management of <a href="https://hub.docker.com/r/ollama/ollama">Ollama Docker image</a></p><p>Let&#8217;s download the ollama image from the docker hub and start the container by running below</p><pre><code>docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama</code></pre><p>Once this command finishes execution, we can verify that ollama is running by running below</p><pre><code>docker ps -a | grep -i "ollama"</code></pre><p>Next, let&#8217;s run a small model from meta LLama 3.2 with 1 billion params</p><pre><code>docker exec -it ollama ollama run llama3.2:1b</code></pre><p>Let&#8217;s also download deepseek-r1</p><pre><code>docker exec -it ollama ollama run deepseek-r1</code></pre><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p><p>Other <a href="https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#model-library">available models</a> are</p><ul><li><p>Llama3.3 &#8594; 70B &#8594; 43 GB</p></li><li><p>Llama3.2 &#8594; 3B &#8594; 2 GB</p></li><li><p>Deepseek-r1 &#8594; 7B &#8594; 4.7 GB</p></li></ul><p>Ollama also recommends certain heuristics for how much computing power you need to run these models locally</p><ul><li><p>8 GB RAM to run 7B model</p></li><li><p>16 GB RAM to run 13B model</p></li><li><p>32 GB RAM to run 33B model</p></li></ul><p>I have an Apple M1 Pro with 10 CPU, and 32 GB RAM and this should be able to run llama3.2 and deepseek-r1 models comfortably, however since RAM may be required for other system processes, we&#8217;ll make sure our docker resource access is limited</p><p>If you have docker desktop installed, you can go to <strong>Settings &#8594; Resources &#8594; Advanced</strong> and restrict the resources appropriately. For example</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z1Gz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z1Gz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png 424w, https://substackcdn.com/image/fetch/$s_!z1Gz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png 848w, https://substackcdn.com/image/fetch/$s_!z1Gz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png 1272w, https://substackcdn.com/image/fetch/$s_!z1Gz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z1Gz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png" width="1456" height="1078" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1078,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!z1Gz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png 424w, https://substackcdn.com/image/fetch/$s_!z1Gz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png 848w, https://substackcdn.com/image/fetch/$s_!z1Gz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.png 1272w, https://substackcdn.com/image/fetch/$s_!z1Gz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbb2257-b0e0-4ad3-aff7-70ab6fe2a79a_1600x1185.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>Once you run the above command, you should get a command line interface like below</p><p>You can type a prompt and get a response by using <a href="https://newsletter.automationhacks.io/p/ai-for-testing-1-gen-ai-and-test-design-supercharge-your-prompting-skills">prompting techniques like we learned earlier</a>.</p><blockquote><p>Side note: Prompting an LLM is a super important skill to learn in 2025 and if you want to learn more you can refer to this cool <a href="https://www.educative.io/courses/all-you-need-to-know-about-prompt-engineering?aff=x4QL">course &#8220;All You Need to Know About Prompt Engineering&#8221;</a> on <a href="https://www.educative.io/courses/all-you-need-to-know-about-prompt-engineering?aff=x4QL">educative</a> to deep dive.</p></blockquote><p>I&#8217;ll give the same prompt we gave earlier to generate some tests.</p><pre><code>&gt;&gt;&gt; """
... # MISSION
...
... 1. Generate test cases to test google homepage
... 2. Please Cover functional, non functional cases from web, mobile and backend perspective.
...
... # INPUT
...
... 1. Google home page is an app that takes the following inputs:
...
... * `Search box`
... *  User can either click on `Google search button` or `I'm feeling lucky button`
...
... # RESPONSE FORMAT
...
... 1. csv with columns as `Test ID`, `Title`, `Preconditions`, `Steps`, `Expected Result`
... """
</code></pre><p>You can see CPU and memory spike up as the model tries to generate text as per your requirements.</p><p>It may be a bit slow but given more computing (CPU and memory) it should be able to return results faster</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xcxA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xcxA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png 424w, https://substackcdn.com/image/fetch/$s_!xcxA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png 848w, https://substackcdn.com/image/fetch/$s_!xcxA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png 1272w, https://substackcdn.com/image/fetch/$s_!xcxA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xcxA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png" width="468" height="493.6253602305475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:732,&quot;width&quot;:694,&quot;resizeWidth&quot;:468,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xcxA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png 424w, https://substackcdn.com/image/fetch/$s_!xcxA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png 848w, https://substackcdn.com/image/fetch/$s_!xcxA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.png 1272w, https://substackcdn.com/image/fetch/$s_!xcxA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffad7c7d1-cde7-41ac-bb44-3c40a4ff228c_694x732.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><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W5KF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W5KF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png 424w, https://substackcdn.com/image/fetch/$s_!W5KF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png 848w, https://substackcdn.com/image/fetch/$s_!W5KF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png 1272w, https://substackcdn.com/image/fetch/$s_!W5KF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W5KF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png" width="498" height="500.9122807017544" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:688,&quot;width&quot;:684,&quot;resizeWidth&quot;:498,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W5KF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png 424w, https://substackcdn.com/image/fetch/$s_!W5KF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png 848w, https://substackcdn.com/image/fetch/$s_!W5KF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.png 1272w, https://substackcdn.com/image/fetch/$s_!W5KF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0eb82bd-4d94-4452-9dde-2015c4c95256_684x688.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>Below is what deepseek comes up with, along with the familiar chain of thought being exposed at the beginning</p><pre><code>Okay, so I need to create test cases for Google's homepage based on the user's requirements. Let me break it down. First, the user mentioned covering both functional and non-functional tests from web, mobile, and backend perspectives. The inputs are the search box and two buttons: Google Search and "I'm Feeling Lucky."

Starting with functional tests:

For the web interface:

Test if the search box works when you type a query and press enter.
Check if the search box updates the page correctly.
Verify that clicking either button takes you to the corresponding search result.

Now, non-functional tests for the web might include performance metrics like load time, response time, and error handling on invalid inputs.

For mobile:

Ensure the search box is functional but requires a long press or swipe for buttons.
Check app store ratings and download stats.

Backend-wise, I need to test if Google can handle multiple requests simultaneously without crashing.

Non-functional tests here would involve load times with many users and stress testing under high traffic.

Wait, did I miss any cases? Maybe performance on different devices or network conditions for mobile. Also, error handling when there's no internet connection&#8212;like not being able to sign in or search properly. 

Here is a structured approach based on your requirements:
Test Cases Overview:
Functional Tests:

Search Box Interaction: Verify the search box updates and submit results.
Button Clicks: Ensure both buttons trigger correct actions.

Non-Functional Tests:

Performance Metrics (Web): Measure load/response times; handle invalid inputs.
Mobile Functionality: Check touch interactions for buttons, and app store stats.
Backend Stress Testing: Evaluate response under high load.

Cross-Device Testing: Ensure functionality across different mobile devices and screen sizes.
Test Cases Table:
| Test ID | Title                                      | Preconditions                          | Steps | Expected Result | |---------|--------------------------------------------|----------------------------------------|--------||---------|--------------------------------------------|----------------------------------------|----------------------------------------------------------------------|------------------| | FT01    | Search Box Works                           | Open Google homepage                    | Type "example.com" in search box, press Enter                     | Search result displayed at top | | FT02    | Search Box Updates Correctly                | Open Google homepage                    | Type "example.com" in search box (slide down or up)               | Webpage updates with results            | | FT03    | Google Search Button Clicks to Home Page     | Open Google homepage, click Search      | Click on "I'm Feeling Lucky" link                             | Takes user to featured articles | | NFT01   | Mobile Search Box Functionality             | Open Google homepage (mobile version)   | Swipe up or long press for search box inputs                    | Results displayed correctly | | NFT02   | Mobile Google Buttons Clicks               | Open Google on mobile device            | Click "I'm Feeling Lucky" on mobile                            | Takes user to featured articles          | | NFT03   | App Store Metrics                           | Open Google homepage                   | Check app store ratings, downloads, etc.                      | Correct stats displayed                | | BFT01   | Backend High Load Stress Testing            | Simulate high traffic scenario         | Test multiple simultaneous searches                            | System handles load without crashing    |
Notes:
Ensure testing across different devices and screen sizes for mobile functionality.
Validate app store availability across platforms.

This covers both functional and non-functional aspects from web, mobile, and backend perspectives.
</code></pre><p>Not bad at all, eh?</p><h3>How about a UI?</h3><p>CLI is cool for a programmer but you may be used to having a web GUI at your disposal to see past chats and use UI to write your prompts and also provide additional details.</p><p>Ollama comes with a wonderful GUI that can be used for this purpose</p><p>Let&#8217;s set up open-webui by running below command</p><pre><code>docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main</code></pre><p>Once you hit </p><p>http://localhost:3000/, it will bring up a familiar-looking web UI like below</p><p>This provides:</p><ol><li><p>Access to the previous 30 days of chat</p></li><li><p>Model selector at the top</p></li><li><p>Chat interface to prompt LLMs</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_!mrij!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mrij!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png 424w, https://substackcdn.com/image/fetch/$s_!mrij!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png 848w, https://substackcdn.com/image/fetch/$s_!mrij!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png 1272w, https://substackcdn.com/image/fetch/$s_!mrij!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mrij!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png" width="1456" height="1112" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1112,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mrij!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png 424w, https://substackcdn.com/image/fetch/$s_!mrij!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png 848w, https://substackcdn.com/image/fetch/$s_!mrij!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.png 1272w, https://substackcdn.com/image/fetch/$s_!mrij!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86b2eafb-9967-410e-992f-34d40a2b3000_1600x1222.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>I tried to prompt it to tell me a joke and discovered that the previous generation in progress slowed down dramatically.</p><blockquote><p><strong>Reflection:</strong> In the current state even with 4 CPU and 12 GB RAM, the generation is quite slow and sequential. Boy, these LLMs while wonderful at text generation are super resource-hungry. I wonder if a day will come when the most powerful models will run on my phone at a fraction of the cost.</p></blockquote><p>Also, deepseek-r1 by default uses reasoning and thus <strong>&#8220;thinks&#8221;</strong> longer while revealing its chain of thoughts (in this case 14 minutes for a joke). This example is trivial and not something to use the model for but still interesting to observe the reasoning patterns.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6neb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6neb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png 424w, https://substackcdn.com/image/fetch/$s_!6neb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png 848w, https://substackcdn.com/image/fetch/$s_!6neb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png 1272w, https://substackcdn.com/image/fetch/$s_!6neb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6neb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png" width="1456" height="1285" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1285,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6neb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png 424w, https://substackcdn.com/image/fetch/$s_!6neb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png 848w, https://substackcdn.com/image/fetch/$s_!6neb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png 1272w, https://substackcdn.com/image/fetch/$s_!6neb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fde0d3f-9490-48e6-83de-e9ff9a5d0a30_1600x1412.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Does Ollama expose an API?</h3><p>Now CLI and web GUI are cool and would help you with exploration in a more chat style, but what if you want to build some utility on top of LLMs, you gotta have <a href="https://www.educative.io/courses/python-rest-api-development-a-comprehensive-guide?aff=x4QL">an API</a></p><blockquote><p><strong>Reflection:</strong> &#129503;God help you if you are trying to force fit LLMs to solve a problem that would otherwise be straightforward to solve via some other open-source library or tool, but hey, I don&#8217;t judge. You do whatever floats your boat.</p></blockquote><p>Ollama has a <a href="https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-completion">well-defined API</a> surface that allows you to:</p><ol><li><p>Choose the model you want to use</p></li><li><p>Send a text prompt and get the answer in the desired format</p></li></ol><p>For example, say I wanted to <a href="https://www.educative.io/courses/a-front-end-web-developers-guide-to-testing?aff=x4QL">write a playwright test</a> using Java to open Google search and type a keyword</p><p>I could invoke the below API /generate method with the below options:</p><ol><li><p>Choose the model</p></li><li><p>Write my text prompt.</p></li><li><p>I also want to get all of the text in one shot so can set the <strong>stream</strong> as a <strong>false</strong></p></li><li><p>I&#8217;ve set the temperature as 0.8 for it to be creative.</p></li></ol><pre><code>curl --location 'http://localhost:11434/api/generate' \
--header 'Content-Type: application/json' \
--data '{
  "model": "llama3.2:1b",
  "prompt":"Write a playwright test in java to open google search and type in keyword meta llama. Make sure the code is clean, concise and follows best practices for modularity",
  "stream": false,
  "options": {
    "temperature": 0.8
  }
}'
</code></pre><p>And it came up with below</p><pre><code>{
   "model": "llama3.2:1b",
   "created_at": "2025-02-25T01:14:15.302218386Z",
   "response": "```java\nimport javax.swing.*;\nimport java.awt.*;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\n\npublic class SearchPanel {\n    private JFrame frame;\n    private JTextField inputField;\n    private JButton searchButton;\n\n    public SearchPanel() {\n        createAndShowGUI();\n    }\n\n    private void createAndShowGUI() {\n        // Create the main window\n        frame = new JFrame(\"Google Search\");\n        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        frame.setLayout(new FlowLayout());\n\n        // Input field for user input\n        inputField = new JTextField(20);\n\n        // Button to trigger search action\n        searchButton = new JButton(\"Search\");\n\n        // Add input field and button to the frame\n        frame.add(inputField, new BorderLayout.CENTER);\n        frame.add(searchButton, BorderLayout.SOUTH);\n\n        // Connect search button's \"actionPerformed\" method\n        searchButton.addActionListener(new ActionListener() {\n            @Override\n            public void actionPerformed(ActionEvent e) {\n                String keyword = inputField.getText();\n                if (keyword.length() &gt; 0) {\n                    try {\n                        Process process = Runtime.getRuntime().exec(\"gnome-terminal -e --title=Google Search -t google.com -m \\\"Search for \" + keyword + \"\\\"\");\n                        process.waitFor();\n                    } catch (IOException | InterruptedException ex) {\n                        JOptionPane.showMessageDialog(frame, \"Error searching for '\" + keyword + \"': \" + ex.getMessage());\n                    }\n                }\n            }\n        });\n    }\n\n    public static void main(String[] args) {\n        SwingUtilities.invokeLater(new Runnable() {\n            @Override\n            public void run() {\n                new SearchPanel();\n            }\n        });\n    }\n}\n```",
   "done": true,
   "done_reason": "stop",
   "context": [
       128006,
       9125,
       ...
       74694
   ],
   "total_duration": 21054774635,
   "load_duration": 15001166,
   "prompt_eval_count": 81,
   "prompt_eval_duration": 61000000,
   "eval_count": 339,
   "eval_duration": 20978000000
}
</code></pre><p>I printed this in a <a href="https://www.educative.io/courses/learn-to-code-python-for-absolute-beginners?aff=x4QL">Python</a> shell to get more readable text</p><pre><code>python3
&gt;&gt;&gt; print(""" &lt;insert response here&gt; """)</code></pre><p>And it returned below.</p><pre><code>```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class SearchPanel {
    private JFrame frame;
    private JTextField inputField;
    private JButton searchButton;


    public SearchPanel() {
        createAndShowGUI();
    }


    private void createAndShowGUI() {
        // Create the main window
        frame = new JFrame("Google Search");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());


        // Input field for user input
        inputField = new JTextField(20);


        // Button to trigger search action
        searchButton = new JButton("Search");


        // Add input field and button to the frame
        frame.add(inputField, new BorderLayout.CENTER);
        frame.add(searchButton, BorderLayout.SOUTH);


        // Connect search button's "actionPerformed" method
        searchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String keyword = inputField.getText();
                if (keyword.length() &gt; 0) {
                    try {
                        Process process = Runtime.getRuntime().exec("gnome-terminal -e --title=Google Search -t google.com -m \"Search for " + keyword + "\"");
                        process.waitFor();
                    } catch (IOException | InterruptedException ex) {
                        JOptionPane.showMessageDialog(frame, "Error searching for '" + keyword + "': " + ex.getMessage());
                    }
                }
            }
        });
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SearchPanel();
            }
        });
    }
}
```</code></pre><p>I don&#8217;t know Playwright API well enough <strong>yet</strong> but this probably looks wrong, for some reason Llama thought it needed to create a Java AWT component for search</p><p>In reality, it should look something like <a href="https://playwright.dev/java/docs/intro">below</a></p><pre><code>package org.example;


import com.microsoft.playwright.*;


public class App {
    public static void main(String[] args) {
        try (Playwright playwright = Playwright.create()) {
            Browser browser = playwright.chromium().launch();
            Page page = browser.newPage();
            page.navigate("http://playwright.dev");
            System.out.println(page.title());
        }
    }
}</code></pre><p>Friendly reminder: models could be wrong and we as engineers need to use judgment to choose the right one for the use case and prompt them well, I think providing some examples of what you are looking for may help yield better results but that&#8217;s an exercise I&#8217;ll leave to you.</p><p>And that&#8217;s all folks! &#129365;</p><h2>Conclusion</h2><p>Let&#8217;s do a quick recap, shall we?</p><p>Hopefully, you take away the below</p><ol><li><p>Ollama can run on docker containers and run open weights models on your infrastructure like Llama, deepseek, etc</p></li><li><p>You can use CLI, Open Web UI for chat, or an extensible API to build on top of</p></li><li><p>Choosing the right model/size for the use case is important</p></li><li><p>Deepseek-r1 reasoning models are slower but can spew more accurate results</p></li><li><p>Models can be wrong or hallucinate; don&#8217;t forget to check their work and learn the topic yourself before using their output.</p></li></ol><p>The world still needs you &#129781;, you human engineer. Don&#8217;t gaslight yourself with Gen AI hype and give up just yet! I&#8217;m rooting for you!</p><p>Enjoyed reading this?</p><p>Subscribe to the <a href="https://newsletter.automationhacks.io/">newsletter</a> and <a href="https://www.youtube.com/@automationhacks">YouTube channel (@automationhacks)</a> for more &#9889;<strong>insights</strong> into <strong>software testing</strong> and <strong>automation,</strong> or connect on <a href="https://topmate.io/automationhacks/">topmate</a> for a personalized 1:1 session.</p><p><em>Disclosure: I&#8217;ll earn a small commission if you decide to purchase some of the educative.io text courses linked in the blog for your learning and growth. Their <a href="https://www.educative.io/courses/grokking-the-system-design-interview?aff=x4QL">system design courses</a></em> and <em><a href="https://www.educative.io/courses/grokking-coding-interview?aff=x4QL">grokking coding interview</a> courses are arguably quite helpful for interview prep</em>.</p><p>Until next time, happy testing!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>]]></content:encoded></item><item><title><![CDATA[Summary of deep dive into LLMs like ChatGPT from Andrej Karpathy ⚡️]]></title><description><![CDATA[We often fear the unknown, because we just don't know. Often the simplest thing we can do is to begin anywhere and learn!]]></description><link>https://newsletter.automationhacks.io/p/summary-of-deep-dive-into-llms-like</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/summary-of-deep-dive-into-llms-like</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Fri, 21 Feb 2025 01:21:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!auTG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.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_!auTG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!auTG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg 424w, https://substackcdn.com/image/fetch/$s_!auTG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg 848w, https://substackcdn.com/image/fetch/$s_!auTG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!auTG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!auTG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8655434,&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://newsletter.automationhacks.io/i/157589592?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.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_!auTG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg 424w, https://substackcdn.com/image/fetch/$s_!auTG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg 848w, https://substackcdn.com/image/fetch/$s_!auTG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!auTG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38d870c2-56fb-43db-bf44-337d7c1c25d6_8192x5464.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@nate_dumlao?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Nathan Dumlao</a> on <a href="https://unsplash.com/photos/person-holding-white-and-black-i-love-you-print-card-fs_l0Xqlc90?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Andrej Karpathy probably needs no introduction, but if you are hearing the name for the first time, he is a world-renowned expert in AI and deep learning who knows his stuff having led major projects at Tesla, OpenAI</p><p><a href="https://youtu.be/7xTGNNLPyMI?si=RLBC_N7PCaWDkaxN">This video</a> shines a light on how LLMs are trained, what they are good for, and what they are not and I found it highly practical. It does not explain math, or underlying algorithms but gives you a solid intuition about the current landscape</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><h2>What I took away from this?</h2><ul><li><p>Models are extremely good for brainstorming generating ideas, and writing code but by definition act like stochastic parrots often imitating data provided by a human expert and generate</p></li><li><p>We should not blindly trust what it generates or deploy it in mission-critical areas as it will have hallucinations. While we should use it for inspiration, we should *always review and verify its outputs before* using it for production-grade work. They are wonderful tools in our toolbelt and we should leverage them to make ourselves more productive.</p></li></ul><h2>What are the major steps?</h2><p><strong>Pre-training:</strong> LLMs are first trained on WWW text to form a base models where text is converted in tokens. A model can have X parameters which are knobs that can be tuned to get different outputs and are the vector of probabilities that LLMs use to produce outputs.</p><p><strong>RLHF (reinforcement learning from human feedback):</strong> Human labelers sit down and write ideal responses to questions which the model then tries to imitate. This leads to GPT models like GPT4o. They work extremely well in verifiable domains like math or code</p><p><strong>RL (reinforcement learning)</strong> is the next evolution where model outputs are scored by humans and a reward model to nudge the model into producing relevant outputs. Reasoning models can produce their chain of thoughts where they check their work, and backtrack if required to improve accuracy like Open AI o1, o3. This approach helps models perform better in unverifiable domains</p><h2>Tips</h2><p>You can ask models to use web search, or code to perform better at tasks like math</p><h2>Tools</h2><ul><li><p><a href="https://tiktokenizer.vercel.app/">Tiktokenizer</a>: convert human-readable text into tokens that the model uses</p></li><li><p><a href="https://hyperbolic.xyz/">Hyperbolic</a>: cloud to run models</p></li><li><p><a href="https://www.together.ai/">Together AI</a>: cloud to run models</p></li><li><p><a href="https://huggingface.co/">Hugging Face</a>: download data sets</p></li><li><p><a href="https://lmstudio.ai/">LM Studio</a>: Download local models</p></li></ul><h2>Stay up to date with news</h2><ul><li><p><a href="https://www.ainews.com/">AiNews.com</a></p></li></ul><p>Highly recommend watching the video</p><p><a href="https://youtu.be/7xTGNNLPyMI">Deep Dive into LLMs like ChatGPT</a></p><p>and thank you Andrej for putting this out in the world.</p><p>#AI #GenAI #LLM</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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[Copilot Edits: Edit multiple files and enhance your coding workflow ✨]]></title><description><![CDATA[Get into a true pair programming workflow where Copilot takes on the driver role and you help it navigate changes in your codebase]]></description><link>https://newsletter.automationhacks.io/p/copilot-edits-edit-multiple-files</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/copilot-edits-edit-multiple-files</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Fri, 31 Jan 2025 01:06:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!IA9O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_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_!IA9O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IA9O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!IA9O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!IA9O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!IA9O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IA9O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png" width="508" height="508" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_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;:508,&quot;bytes&quot;:275159,&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_!IA9O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!IA9O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!IA9O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!IA9O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3c298c-a7b9-440e-bb45-ef4a6c5ed096_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><figcaption class="image-caption">Generated using Microsoft Copilot with DALL.E</figcaption></figure></div><p></p><h2>Introduction</h2><p>Github Copilot recently introduced the ability to edit multiple files in VS code. As of writing, this feature is currently in preview and titled <strong>Edit with Copilot</strong></p><p>The possibilities with this capability are immense. You can now pair more efficiently with Copilot and ask it to make changes in your codebase across multiple files in natural language</p><p>I took this feature for a spin on the <a href="https://github.com/automationhacks/test-infra/tree/main">test-infra</a> codebase with a straightforward use case and found the results surprisingly accurate.</p><p>In this blog, Let&#8217;s take a look at an example workflow step by step and understand <strong>how to work</strong> with this feature and then also discuss some ideas on how this could be useful in your day-to-day workflows</p><p>I use <a href="https://www.jetbrains.com/idea/">Jetbrains IntelliJ IDEA IDE</a> for most of my professional development, but this capability is not exposed yet on the GitHub plugin there. We&#8217;ll use <a href="https://code.visualstudio.com/">VS code</a> to see this workflow. If you are not familiar with VS code yet you can <a href="https://code.visualstudio.com/docs/introvideos/basics">read this</a> to understand some of the basics</p><p>Without further adieu let's dive in &#127946;</p><h2>Launch Edit with Copilot</h2><p>When you start Copilot edits in VS code you are greeted with this UI. You can add files to your working set. In this case, I have a test file opened which was added by default and we can also add additional files</p><p>Another useful feature is that you can switch the model that would be used for code generation under the hood such as <a href="https://claude.ai/">Claude 3.5 Sonnet</a> from Anthropic or <a href="https://openai.com/index/hello-gpt-4o/">GPT 4o</a> from Open AI</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aips!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aips!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png 424w, https://substackcdn.com/image/fetch/$s_!aips!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png 848w, https://substackcdn.com/image/fetch/$s_!aips!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!aips!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aips!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png" width="916" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:916,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aips!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png 424w, https://substackcdn.com/image/fetch/$s_!aips!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png 848w, https://substackcdn.com/image/fetch/$s_!aips!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!aips!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f69154-b5d3-4739-bd26-3c4c070b445a_916x1600.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>Describe the change</h2><p>Copilot edit is more like an experienced <a href="https://martinfowler.com/articles/on-pair-programming.html">pair engineer</a> in the <strong>driver</strong> role while you adopt the <strong>navigator/observer/reviewer</strong> role and instruct to perform some edits.</p><p>To begin with, You should have a clear idea of what change you want to make in the codebase. Quite often <strong>this is the most challenging aspect</strong> of working on large codebases because it implies you have a solid understanding of the code structure and what&#8217;s happening under the hood.</p><p>If you are not sure where the changes need to be made, the results probably won&#8217;t be great.</p><p>In such cases using <strong><a href="https://newsletter.automationhacks.io/p/ai-for-testing-2-code-assistance-inline-chat-and-chat-commands">chat</a></strong> to figure out higher-level solutions or brainstorming before you jump into edits could be a good way of thinking about this.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>Let&#8217;s say I have the below test method <a href="https://github.com/automationhacks/test-infra/blob/main/src/test/java/io/automationhacks/testinfra/reqres/users/ReqResCreateUserTest.java">ReqResCreateUserTest</a> and I want to make a simple change to introduce a BaseTest class and move the setup method to that. There are other test classes in the same package that have this duplicated code that I would want to apply this refactoring later on</p><pre><code>package io.automationhacks.testinfra.reqres.users;

&#8230;

public class ReqResCreateUserTest {

    @BeforeClass(alwaysRun = true)
    public void setup() {
        RestAssured.baseURI = "https://reqres.in/api";
    }

    @Test(groups = {Team.IDENTITY, Groups.SMOKE})
    @Service(Services.CREATE_USER)
    @Attributes(attributes = {@Attribute(key = "team", value = "identity")})
    public void testCreate() {
        String requestBody = "{\"name\": \"morpheus\", \"job\": \"leader\"}";

        given().contentType(ContentType.JSON)
                .body(requestBody)
                .when()
                .post("/users")
                .then()
                // TODO: Broken test example, change to 201 to fix
                .statusCode(200)
                .body("name", equalTo("morpheus"))
                .body("job", equalTo("leader"))
                .body("id", notNullValue())
                .body("createdAt", notNullValue());
    }
}
</code></pre><p>I prompted something like the below</p><blockquote><p><em>Help me create a base test class in testng that all the classes in package io.automationhacks.testinfra.reqres.users; inherit from and that has the common setup method to set the base URL</em></p></blockquote><p>And copilot edit understood the 2 main changes required for this</p><ol><li><p>Create a new base test class</p></li><li><p>Modify the existing class to inherit</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_!VD12!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VD12!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png 424w, https://substackcdn.com/image/fetch/$s_!VD12!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png 848w, https://substackcdn.com/image/fetch/$s_!VD12!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png 1272w, https://substackcdn.com/image/fetch/$s_!VD12!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VD12!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png" width="1266" height="916" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:916,&quot;width&quot;:1266,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VD12!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png 424w, https://substackcdn.com/image/fetch/$s_!VD12!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png 848w, https://substackcdn.com/image/fetch/$s_!VD12!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.png 1272w, https://substackcdn.com/image/fetch/$s_!VD12!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7e3a19d-2853-4e92-9502-51c0fb0cc0b9_1266x916.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>It created the base class pretty well</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VkJY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VkJY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png 424w, https://substackcdn.com/image/fetch/$s_!VkJY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png 848w, https://substackcdn.com/image/fetch/$s_!VkJY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png 1272w, https://substackcdn.com/image/fetch/$s_!VkJY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VkJY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png" width="1456" height="866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:866,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VkJY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png 424w, https://substackcdn.com/image/fetch/$s_!VkJY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png 848w, https://substackcdn.com/image/fetch/$s_!VkJY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.png 1272w, https://substackcdn.com/image/fetch/$s_!VkJY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68e3141-3332-4a82-b521-8560e0c618c0_1600x952.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>It was also able to make the change in inheritance hierarchy for the test file</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TfMd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TfMd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png 424w, https://substackcdn.com/image/fetch/$s_!TfMd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png 848w, https://substackcdn.com/image/fetch/$s_!TfMd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png 1272w, https://substackcdn.com/image/fetch/$s_!TfMd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TfMd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png" width="1456" height="580" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:580,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TfMd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png 424w, https://substackcdn.com/image/fetch/$s_!TfMd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png 848w, https://substackcdn.com/image/fetch/$s_!TfMd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.png 1272w, https://substackcdn.com/image/fetch/$s_!TfMd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a49a08a-8bdb-4d85-aee6-4a24e1ead48c_1600x637.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>Accept or discard changes</h2><p>I also got an option to choose if I want to Accept or Discard this change and an option to cycle through all the changes</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uA8T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uA8T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png 424w, https://substackcdn.com/image/fetch/$s_!uA8T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png 848w, https://substackcdn.com/image/fetch/$s_!uA8T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png 1272w, https://substackcdn.com/image/fetch/$s_!uA8T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uA8T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png" width="654" height="136" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:136,&quot;width&quot;:654,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uA8T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png 424w, https://substackcdn.com/image/fetch/$s_!uA8T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png 848w, https://substackcdn.com/image/fetch/$s_!uA8T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png 1272w, https://substackcdn.com/image/fetch/$s_!uA8T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46f2ae62-e85a-4b72-89f8-0a78fe7e0cfb_654x136.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>I also realized that I was not explicit that in this refactoring, I wanted copilot to also r<strong>emove the setup method</strong> from the test classes so I made a follow-up prompt</p><blockquote><p><em>Remove the setup method in child classes</em></p></blockquote><p>And Copilot was quick to grasp that, it also enhanced the prompt with more context like <em>&#8220;since it is already inherited from the base class&#8221; </em>&#129300;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wGOT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wGOT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png 424w, https://substackcdn.com/image/fetch/$s_!wGOT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png 848w, https://substackcdn.com/image/fetch/$s_!wGOT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png 1272w, https://substackcdn.com/image/fetch/$s_!wGOT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wGOT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png" width="1254" height="638" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:638,&quot;width&quot;:1254,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wGOT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png 424w, https://substackcdn.com/image/fetch/$s_!wGOT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png 848w, https://substackcdn.com/image/fetch/$s_!wGOT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.png 1272w, https://substackcdn.com/image/fetch/$s_!wGOT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8ef6edc-662b-46a4-ae81-8b16fa869858_1254x638.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>And made the change as expected</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2AFo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2AFo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png 424w, https://substackcdn.com/image/fetch/$s_!2AFo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png 848w, https://substackcdn.com/image/fetch/$s_!2AFo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png 1272w, https://substackcdn.com/image/fetch/$s_!2AFo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2AFo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png" width="1456" height="1263" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1263,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2AFo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png 424w, https://substackcdn.com/image/fetch/$s_!2AFo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png 848w, https://substackcdn.com/image/fetch/$s_!2AFo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.png 1272w, https://substackcdn.com/image/fetch/$s_!2AFo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff32bf69c-527c-478f-bd6c-905d8fed05d6_1600x1388.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>I realized that there are a few unused imports left in the file and while it&#8217;s easy to make this change yourself, I figured why not let Copilot do this job. &#129335;</p><blockquote><p><em>Also make sure to remove any unused imports</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!No3U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!No3U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png 424w, https://substackcdn.com/image/fetch/$s_!No3U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png 848w, https://substackcdn.com/image/fetch/$s_!No3U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png 1272w, https://substackcdn.com/image/fetch/$s_!No3U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!No3U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png" width="1240" height="1532" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1532,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!No3U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png 424w, https://substackcdn.com/image/fetch/$s_!No3U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png 848w, https://substackcdn.com/image/fetch/$s_!No3U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.png 1272w, https://substackcdn.com/image/fetch/$s_!No3U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5aedf2bb-7248-459c-ae99-e744183e8314_1240x1532.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>And I could see the imports optimised</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M0aa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M0aa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png 424w, https://substackcdn.com/image/fetch/$s_!M0aa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png 848w, https://substackcdn.com/image/fetch/$s_!M0aa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png 1272w, https://substackcdn.com/image/fetch/$s_!M0aa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M0aa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png" width="1456" height="749" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:749,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!M0aa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png 424w, https://substackcdn.com/image/fetch/$s_!M0aa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png 848w, https://substackcdn.com/image/fetch/$s_!M0aa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.png 1272w, https://substackcdn.com/image/fetch/$s_!M0aa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d1127e7-66e0-4380-863d-e8dff6e2079e_1600x823.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>Like a responsible engineer, I ran the test to make sure it still works with this change and it was fine.</p><p>Note: The test here fails due to legitimate reasons. I had changed the expectation of the assertion on purpose to check some test infra components that I&#8217;m building when a test fails.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fSeL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fSeL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png 424w, https://substackcdn.com/image/fetch/$s_!fSeL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png 848w, https://substackcdn.com/image/fetch/$s_!fSeL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!fSeL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fSeL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png" width="1456" height="1243" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1243,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fSeL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png 424w, https://substackcdn.com/image/fetch/$s_!fSeL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png 848w, https://substackcdn.com/image/fetch/$s_!fSeL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!fSeL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6c693dc-cfc3-4905-8fc9-5d9870cfb4aa_1600x1366.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Reflection:</strong> This entire workflow took couple of minutes or so and was quite fast. I did notice that you have to constantly adopt the hat of a <strong>reviewer</strong> and ensure that the change Copilot edits make is in line with your expectations. It&#8217;s important to keep the batch size small so that you can reason about the changes.</p><p>Maybe this is what future engineers would spend most of their time on. Read, understand,d and review code over and over. I would imagine this could be quite taxing, in the long run, to constantly read lots of code but don&#8217;t have anecdotes on long-term use yet</p><h2>Change in multiple files</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jayd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jayd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png 424w, https://substackcdn.com/image/fetch/$s_!jayd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png 848w, https://substackcdn.com/image/fetch/$s_!jayd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png 1272w, https://substackcdn.com/image/fetch/$s_!jayd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jayd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png" width="864" height="356" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:864,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jayd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png 424w, https://substackcdn.com/image/fetch/$s_!jayd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png 848w, https://substackcdn.com/image/fetch/$s_!jayd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.png 1272w, https://substackcdn.com/image/fetch/$s_!jayd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F031bc1da-4fb3-47fb-9595-06c662a0dbcd_864x356.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>I became more excited and thought why not apply the same change to all the files in the user package and prompted below:</p><blockquote><p><em>Please apply the same changes in all files in users package</em></p><p><em>Relative path: src/test/java/io/automationhacks/testinfra/reqres/users</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8HIJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8HIJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png 424w, https://substackcdn.com/image/fetch/$s_!8HIJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png 848w, https://substackcdn.com/image/fetch/$s_!8HIJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png 1272w, https://substackcdn.com/image/fetch/$s_!8HIJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8HIJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png" width="1248" height="1270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1270,&quot;width&quot;:1248,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8HIJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png 424w, https://substackcdn.com/image/fetch/$s_!8HIJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png 848w, https://substackcdn.com/image/fetch/$s_!8HIJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.png 1272w, https://substackcdn.com/image/fetch/$s_!8HIJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b30596e-4077-4381-aca8-f6ca63c5a7a5_1248x1270.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>Copilot went ahead and applied the change but also made some additional changes like changing groups or even the expected status code.</p><p>&#129327; It also figured out from the comments that 204 was the expected status code and I had introduced some logic to make the test flaky and corrected that, although with wrong syntax.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DKVK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DKVK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png 424w, https://substackcdn.com/image/fetch/$s_!DKVK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png 848w, https://substackcdn.com/image/fetch/$s_!DKVK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png 1272w, https://substackcdn.com/image/fetch/$s_!DKVK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DKVK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png" width="1456" height="798" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DKVK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png 424w, https://substackcdn.com/image/fetch/$s_!DKVK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png 848w, https://substackcdn.com/image/fetch/$s_!DKVK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.png 1272w, https://substackcdn.com/image/fetch/$s_!DKVK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f2bda13-8f4e-4eed-a5b1-48ab99e66f91_1600x877.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>So, I went back and gave a more clear expectation</p><blockquote><p><em>Please make below changes in all files in users package</em></p><p><em>Relative path: src/test/java/io/automationhacks/testinfra/reqres/users</em></p></blockquote><ol><li><p><em>&#65279;&#65279;&#65279;Ensure the class extends BaseTest</em></p></li><li><p><em>&#65279;&#65279;&#65279;Remove any unused imports</em></p></li><li><p><em>&#65279;&#65279;&#65279;Do not change the @Test annotation or anything in the test body</em></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_!P_8e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P_8e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png 424w, https://substackcdn.com/image/fetch/$s_!P_8e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png 848w, https://substackcdn.com/image/fetch/$s_!P_8e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!P_8e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P_8e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png" width="1072" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1072,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P_8e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png 424w, https://substackcdn.com/image/fetch/$s_!P_8e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png 848w, https://substackcdn.com/image/fetch/$s_!P_8e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!P_8e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c96f385-188b-46a1-8fbb-226641f0da07_1072x1600.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>Copilot did the right job and correctly updated all the files within the user's package. &#127882;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z8M5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z8M5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png 424w, https://substackcdn.com/image/fetch/$s_!Z8M5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png 848w, https://substackcdn.com/image/fetch/$s_!Z8M5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png 1272w, https://substackcdn.com/image/fetch/$s_!Z8M5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z8M5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png" width="1456" height="773" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ad7e44d-0356-4807-86b4-467449314246_1600x849.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:773,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Z8M5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png 424w, https://substackcdn.com/image/fetch/$s_!Z8M5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png 848w, https://substackcdn.com/image/fetch/$s_!Z8M5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png 1272w, https://substackcdn.com/image/fetch/$s_!Z8M5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ad7e44d-0356-4807-86b4-467449314246_1600x849.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Reflection: </strong>Copilot is not a mind reader, while it has a lot of context and can try to infer some things, you still need to be concise and clear on what you want it to do. Knowing <a href="https://newsletter.automationhacks.io/p/ai-for-testing-1-gen-ai-and-test-design-supercharge-your-prompting-skills">how to prompt well</a> and good English writing skills is a good skill to have in 2025</p><h2>Ideas</h2><p>This feature is exciting, it expands the use case of code generation and assistance into more of an editing workflow. This has the potential to make each developer significantly faster in repeating changes across a codebase or improving it methodically</p><p>I can see some obvious use cases for this<br><br></p><ol><li><p>Given file X as an example, write a test that does Y</p></li><li><p>Implement a new function in existing library code that does Z and then write tests for it</p></li></ol><h2>Closing thoughts</h2><p>After this pair programming session, I realized below</p><blockquote><p><em>This <strong>could</strong> be a future mode for software development<strong> </strong>and is a natural evolution of IDE&#8217;s capabilities. It brings more intelligence to the code-editing process</em></p></blockquote><p>Yes, if we are being honest. This was not at all a complex change.</p><p>Even simple IntelliJ refactorings can achieve this change pretty fast with auto code formatting in place or even a human hand coding this.</p><p>But the idea here was the explain the feature in a simple-to-understand workflow. The capability and the accuracy of edits are quite amazing.</p><p>This could be a really useful addition to a programmer's toolbelt and you could use it for increasingly complex tasks. God knows we need all the help we can get to manage the increasingly complex software engineering space.</p><p>Also, this reinforces that as a Senior engineer, you cannot slack off, you need to understand the underlying concept you want Copilot edits to apply to your codebase.</p><p>I see a risk that human software engineers may lose a bit of muscle memory when it comes to hand coding so it's important to keep them sharp with doing some work yourself as well. But this has been the story of software engineering anyway. We are moving towards higher levels of abstraction and better tooling &#128519;</p><h2>References</h2><ol><li><p><a href="https://code.visualstudio.com/docs/copilot/copilot-edits">Copilot Edits</a></p></li><li><p><a href="https://martinfowler.com/articles/exploring-gen-ai.html#memo-11">Exploring Generative AI</a></p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>]]></content:encoded></item><item><title><![CDATA[Enhance Your Coding with GitHub Copilot: AI-Powered Autocomplete, Inline Chat, and Quick Chat Commands 🥷]]></title><description><![CDATA[Learn how to harness its AI capabilities for smarter code autocompletion, contextually relevant suggestions via inline chat, and time-saving quick commands in the chat window.]]></description><link>https://newsletter.automationhacks.io/p/ai-for-testing-2-code-assistance-inline-chat-and-chat-commands</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/ai-for-testing-2-code-assistance-inline-chat-and-chat-commands</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sun, 19 Jan 2025 02:44:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QaM1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_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_!QaM1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QaM1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!QaM1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!QaM1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!QaM1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QaM1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png" width="566" height="566" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43c253db-a874-4dc4-8b9b-24a63dee1603_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;:566,&quot;bytes&quot;:286748,&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_!QaM1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!QaM1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!QaM1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!QaM1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43c253db-a874-4dc4-8b9b-24a63dee1603_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><figcaption class="image-caption">Generated using Microsoft Copilot with DALL.E 3</figcaption></figure></div><p>GitHub Copilot is a fantastic addition to the professional software engineers toolbelt and can help with lot of common day-to-day tasks. I&#8217;ve been leveraging its capabilities heavily over the past year and I felt it makes a ton of sense to unpack this in a bit more detail.</p><p>In this blog, we&#8217;ll use GitHub Copilot to illustrate these interaction modes</p><ol><li><p>Autocomplete suggestions as you type code in your IDE (Integrated development environment)</p></li><li><p>Inline chat for a specific piece of code or problem</p></li><li><p>Chat with commands and references</p></li></ol><p>If you are using JetBrains IDE&#8217;s like IntelliJ or Pycharm or Visual Studio code</p><ol><li><p>Please make sure to install the Github Copilot plugin or extension in your IDE of choice</p></li><li><p>Then, follow the steps to authorize them to access your GitHub account.</p></li></ol><p>GitHub <a href="https://docs.github.com/en/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/about-github-copilot-free">recently made Copilot free up to a limited set of autocomplete or chat interactions</a> &#129321; and you can use this to play around with its capabilities &#128588;.</p><h2>Autocomplete &#9989;</h2><p>I truly love this feature. &#10084;&#65039;</p><p>Why?</p><p>So much of writing automated tests involves writing similar code leveraging existing classes, utilities, or helper functions and assertions.</p><p>GitHub Copilot can help by helping you speed up the test authoring aspect. It autocompletes code for you <strong>as you type</strong> by displaying the <strong>suggested code in grey</strong>.</p><p>If the suggestion looks acceptable, you can press the TAB key, and that code is inserted at a given caret location. You can then edit the code to suit your specific requirements. You could also partially accept a suggestion as well.</p><p>If not, you can continue writing code and it will try to figure out what you are trying to write and suggest.</p><p>Could you make it more effective?</p><p>Yes, there are a few distinct things you can try to help Github Copilot make better suggestions. Let&#8217;s go over them next</p><h3>Open relevant files</h3><p>GitHub Copilot gives preference to what files you have open at the time that you are trying to write a piece of code. It also has context of your workspace but providing targeted reference to correct files would increase the chances of getting a more relevant autocompletion.</p><p>This makes logical sense since you would probably not have unnecessary files open when working on a codebase anyway.</p><p>Here are a few common use cases</p><ol><li><p>If you are trying to <strong>write a new test</strong> that follows a given pattern that is already repeated in another file, having that file open would help Copilot suggest better autocompletes.</p></li><li><p>If you are writing <strong>assertions</strong> on a given test method and want to reuse existing methods then having the assertions file open would allow Copilot to suggest relevant suggestions for better</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><h3>Write only the method signature</h3><p>You can write the method's signature with its <strong>name, parameters, and types</strong>, and the GitHub copilot will auto-complete that function in your IDE.</p><p>This works better in strongly typed languages like Java, but you can also use <a href="https://docs.python.org/3/library/typing.html">Python-type hints</a> to provide sufficient context to Copilot</p><p>Let&#8217;s take an example</p><p>Say you want to write the below function that returns epoch seconds for the current UTC time in Java</p><p>If you write below:</p><p>public long getEpochSecondsForCurrentTimeInUTC() {}</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yO4q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yO4q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png 424w, https://substackcdn.com/image/fetch/$s_!yO4q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png 848w, https://substackcdn.com/image/fetch/$s_!yO4q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png 1272w, https://substackcdn.com/image/fetch/$s_!yO4q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yO4q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png" width="1456" height="437" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:437,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yO4q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png 424w, https://substackcdn.com/image/fetch/$s_!yO4q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png 848w, https://substackcdn.com/image/fetch/$s_!yO4q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.png 1272w, https://substackcdn.com/image/fetch/$s_!yO4q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d777f2-61bd-4490-b624-c7eb46a136f0_1600x480.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>You can see Copilot takes the function signature and suggests an implementation</p><p>public long getEpochSecondsForCurrentTimeInUTC() {</p><p>return System.<em>currentTimeMillis</em>() / 1000;</p><h3>Write an inline comment</h3><p>Another way of getting autocompletes is to write a <strong>short comment</strong> stating what code you want to generate and Copilot takes that as input and generates code along those lines</p><p>For example below, I&#8217;ve prompted Copilot to generate a function that gives me a delta date by describing what I&#8217;m looking for</p><p>// Write a Java function that takes a date and time format and no of days and can return the date after adding the no of days</p><p><em>// Write a java function that takes a date and time format and no of days and can return the date after adding the no of days</em></p><p>public String addDaysToCurrentDate(String dateFormat, int days) {</p><p>SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);</p><p>Calendar c = Calendar.<em>getInstance</em>();</p><p>c.add(Calendar.<em>DATE</em>, days);</p><p>return sdf.format(c.getTime());</p><p>}</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MPkM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MPkM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png 424w, https://substackcdn.com/image/fetch/$s_!MPkM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png 848w, https://substackcdn.com/image/fetch/$s_!MPkM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png 1272w, https://substackcdn.com/image/fetch/$s_!MPkM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MPkM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png" width="1456" height="213" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:213,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MPkM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png 424w, https://substackcdn.com/image/fetch/$s_!MPkM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png 848w, https://substackcdn.com/image/fetch/$s_!MPkM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png 1272w, https://substackcdn.com/image/fetch/$s_!MPkM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec7bdf87-47f5-47ef-b27d-fb1d88ab1ca5_1600x234.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>Generate tests &#129514;</h2><p>What if you want to test your utilities?</p><p>Say you want to test the previously written test utility method, you can put the caret at the relevant position and then Right Click &#8594; select GitHub Copilot &#8594; Generate tests</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mIeR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mIeR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png 424w, https://substackcdn.com/image/fetch/$s_!mIeR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png 848w, https://substackcdn.com/image/fetch/$s_!mIeR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png 1272w, https://substackcdn.com/image/fetch/$s_!mIeR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mIeR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png" width="1456" height="1239" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1239,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mIeR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png 424w, https://substackcdn.com/image/fetch/$s_!mIeR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png 848w, https://substackcdn.com/image/fetch/$s_!mIeR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png 1272w, https://substackcdn.com/image/fetch/$s_!mIeR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc1c1aa-7624-44f7-bc9b-b8fa581d15ee_1600x1361.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This will initiate a Github Copilot chat session and generate tests for this simple function.</p><p>You can then copy and paste these methods and put them in a test file to have some instant coverage. Also notice, it uses the file <strong>DateTimeHelpers</strong> file as a reference</p><p>The same technique could be used to <strong>generate unit tests for any simple function</strong>. If the function you are testing is a bit complex, then you may have to do some back-and-forth prompting to arrive at a good set of tests.</p><p>Another tip is to have some example tests whose style you want to mimic.</p><p>Having that file open may result in better results, you can also prompt stating please generate tests following the coding style followed in &lt;X.java&gt; and it would consider them giving you more accurate tests following your project&#8217;s style guide.</p><p>You can also see the generated tests <a href="https://github.com/automationhacks/test-infra/blob/24ae311bd2348333a598ab81711e64ae1e6e8d91/src/test/java/io/automationhacks/testinfra/tests/DateTimeHelperTest.java#L8">here</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DrGg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DrGg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png 424w, https://substackcdn.com/image/fetch/$s_!DrGg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png 848w, https://substackcdn.com/image/fetch/$s_!DrGg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!DrGg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DrGg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png" width="998" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:998,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DrGg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png 424w, https://substackcdn.com/image/fetch/$s_!DrGg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png 848w, https://substackcdn.com/image/fetch/$s_!DrGg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!DrGg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1090f6-e502-4757-82ac-2b323ec9f0a1_998x1600.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>Inline chat &#128172;</h2><p>Inline chat is a way to prompt Copilot to do something in the context of the code you are working with.</p><p>Continuing our previous example, say I autocompleted getEpochSecondsForCurrentTimeInUTC method and I want to write a comment explaining the method.</p><blockquote><p><strong>Clean code Tip:</strong> Your code comments should always explain the <strong>why</strong> or <strong>what</strong> and not the <strong>how</strong>. Your code should be clear and readable so that the reader can understand the how by just reading the code</p></blockquote><p>You can press Opt + enter (on Mac) and then select <strong>Open GitHub Copilot Inline chat</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nIFt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nIFt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png 424w, https://substackcdn.com/image/fetch/$s_!nIFt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png 848w, https://substackcdn.com/image/fetch/$s_!nIFt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png 1272w, https://substackcdn.com/image/fetch/$s_!nIFt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nIFt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png" width="1456" height="481" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:481,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nIFt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png 424w, https://substackcdn.com/image/fetch/$s_!nIFt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png 848w, https://substackcdn.com/image/fetch/$s_!nIFt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.png 1272w, https://substackcdn.com/image/fetch/$s_!nIFt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4b543a-1363-4cee-b7e8-88df4d3dae6c_1458x482.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>Now type in your prompt</p><p>in this case, I just prompt it to generate a comment</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KXQu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KXQu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png 424w, https://substackcdn.com/image/fetch/$s_!KXQu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png 848w, https://substackcdn.com/image/fetch/$s_!KXQu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png 1272w, https://substackcdn.com/image/fetch/$s_!KXQu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KXQu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png" width="1456" height="545" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:545,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KXQu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png 424w, https://substackcdn.com/image/fetch/$s_!KXQu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png 848w, https://substackcdn.com/image/fetch/$s_!KXQu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.png 1272w, https://substackcdn.com/image/fetch/$s_!KXQu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F055d2a15-30a8-4dee-8c99-08abfa566d73_1600x599.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>You can now see the suggested comment and even a side-by-side diff if required</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zzEv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zzEv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png 424w, https://substackcdn.com/image/fetch/$s_!zzEv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png 848w, https://substackcdn.com/image/fetch/$s_!zzEv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!zzEv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zzEv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zzEv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png 424w, https://substackcdn.com/image/fetch/$s_!zzEv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png 848w, https://substackcdn.com/image/fetch/$s_!zzEv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!zzEv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64e70127-4346-4b30-81a1-8b7e5954d900_1600x1000.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>Side by side view can help you contextualize where the change would be inserted</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-mWK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-mWK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png 424w, https://substackcdn.com/image/fetch/$s_!-mWK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png 848w, https://substackcdn.com/image/fetch/$s_!-mWK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png 1272w, https://substackcdn.com/image/fetch/$s_!-mWK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-mWK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png" width="1456" height="1218" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1218,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-mWK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png 424w, https://substackcdn.com/image/fetch/$s_!-mWK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png 848w, https://substackcdn.com/image/fetch/$s_!-mWK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.png 1272w, https://substackcdn.com/image/fetch/$s_!-mWK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d08a7c-dffa-4e74-b650-1e422b005853_1600x1339.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>Now this is just one example, you can use this to get Copilot to do specific generation in the context of your current code. For instance,</p><ol><li><p>You could use this way to prompt and generate some specific code</p></li><li><p>or tests for a given condition.</p></li><li><p>Fix a problem with the code</p></li></ol><h2>Copilot chat &#128488;&#65039;</h2><p>Beyond autocomplete and inline chat interaction modes that we saw above.</p><p>You can also start a regular chat session to ask Github Copilot to do something for you</p><p>This is similar to many other chat interfaces and you can leverage the same prompting techniques that we discussed in the 1st blog of this series.</p><p><a href="https://newsletter.automationhacks.io/p/ai-for-testing-1-gen-ai-and-test-design-supercharge-your-prompting-skills">Gen AI and Test Design: Supercharge your Prompting skills</a> to get better results.</p><h3>Add specific references</h3><p>A couple of interesting new features here are:</p><p>You can choose which <strong>specific file</strong> you want the chat to <strong>take as a reference</strong> by clicking on the plus</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!36Xm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!36Xm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png 424w, https://substackcdn.com/image/fetch/$s_!36Xm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png 848w, https://substackcdn.com/image/fetch/$s_!36Xm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png 1272w, https://substackcdn.com/image/fetch/$s_!36Xm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!36Xm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png" width="1456" height="781" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:781,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!36Xm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png 424w, https://substackcdn.com/image/fetch/$s_!36Xm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png 848w, https://substackcdn.com/image/fetch/$s_!36Xm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png 1272w, https://substackcdn.com/image/fetch/$s_!36Xm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff70e46a3-0a87-4521-a120-bb5fafb1ca67_1466x786.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Follow-up prompt suggestion</h3><p>And that Copilot also provides you with a suggested next message</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nTFN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nTFN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png 424w, https://substackcdn.com/image/fetch/$s_!nTFN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png 848w, https://substackcdn.com/image/fetch/$s_!nTFN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png 1272w, https://substackcdn.com/image/fetch/$s_!nTFN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nTFN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png" width="1456" height="303" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:303,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nTFN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png 424w, https://substackcdn.com/image/fetch/$s_!nTFN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png 848w, https://substackcdn.com/image/fetch/$s_!nTFN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png 1272w, https://substackcdn.com/image/fetch/$s_!nTFN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F852ed87b-032c-46f5-8e56-7ef71b1ebb4d_1500x312.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>Use the forward slash to see commands</h3><p>Unlike other LLMs, Copilot is tailored for coding and as such provides you with convenient commands to use. You can press forward slash and then review available actions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9LHq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9LHq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png 424w, https://substackcdn.com/image/fetch/$s_!9LHq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png 848w, https://substackcdn.com/image/fetch/$s_!9LHq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png 1272w, https://substackcdn.com/image/fetch/$s_!9LHq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9LHq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png" width="1456" height="530" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:530,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9LHq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png 424w, https://substackcdn.com/image/fetch/$s_!9LHq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png 848w, https://substackcdn.com/image/fetch/$s_!9LHq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png 1272w, https://substackcdn.com/image/fetch/$s_!9LHq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3174807f-bf9a-4806-bf92-f1aa24c3aa9d_1466x534.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is a rapid way of prompting Copilot to perform these common operations.</p><p>You can select a piece of code and then quickly use /doc /simplify /tests /fix to prompt Copilot to take action on them</p><p>For E.g. below I just asked it to generate a doc for the newly added method and Copilot suggested a pretty nice comment for me.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Getp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Getp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png 424w, https://substackcdn.com/image/fetch/$s_!Getp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png 848w, https://substackcdn.com/image/fetch/$s_!Getp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png 1272w, https://substackcdn.com/image/fetch/$s_!Getp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Getp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png" width="1456" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Getp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png 424w, https://substackcdn.com/image/fetch/$s_!Getp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png 848w, https://substackcdn.com/image/fetch/$s_!Getp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.png 1272w, https://substackcdn.com/image/fetch/$s_!Getp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75b06f04-657a-41a5-a22d-15ecefb79b55_1600x527.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>Recap</h2><p>Let&#8217;s recap what we learned in this blog</p><ol><li><p>Github Copilot offers coding assistance with autocomplete, inline chat, and chat interfaces</p></li><li><p>Keeping relevant files open or explicitly proving context helps get better results</p></li><li><p>You can provide a  method signature or inline comment to prompt Copilot to take action</p></li><li><p>Inline chat helps you get contextual changes at the  caret position</p></li><li><p>You can leverage chat commands to perform common actions like fix, explain, generate tests, simplify, generate docs, etc. I&#8217;ll leave it to you to try these on your own</p></li></ol><p>In the next edition, we will explore <strong>Github Copilot multi-file edits</strong></p><p>Subscribe to the <a href="https://newsletter.automationhacks.io/">newsletter</a> and <a href="https://www.youtube.com/@automationhacks">YouTube channel (@automationhacks)</a> for more &#9889;<strong>insights</strong> into <strong>software testing</strong> and <strong>automation,</strong> or connect on <a href="https://topmate.io/automationhacks/">topmate</a> for a personalized 1:1 session.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>]]></content:encoded></item><item><title><![CDATA[Prompt Engineering for Test Design: Supercharge Your AI Skills]]></title><description><![CDATA[Learn Prompt Engineering techniques to supercharge your GenAI skills and create effective test designs. This post provides a user-focused overview of the GenAI landscape and practical prompting tips]]></description><link>https://newsletter.automationhacks.io/p/ai-for-testing-1-gen-ai-and-test-design-supercharge-your-prompting-skills</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/ai-for-testing-1-gen-ai-and-test-design-supercharge-your-prompting-skills</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Thu, 02 Jan 2025 03:28:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lBFS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.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_!lBFS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lBFS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png 424w, https://substackcdn.com/image/fetch/$s_!lBFS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png 848w, https://substackcdn.com/image/fetch/$s_!lBFS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png 1272w, https://substackcdn.com/image/fetch/$s_!lBFS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lBFS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png" width="1456" height="638" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:638,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:303558,&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_!lBFS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png 424w, https://substackcdn.com/image/fetch/$s_!lBFS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png 848w, https://substackcdn.com/image/fetch/$s_!lBFS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.png 1272w, https://substackcdn.com/image/fetch/$s_!lBFS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf83c94-e430-4d47-bcab-b69de09407d7_2870x1258.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">GenAI landscape</figcaption></figure></div><p>Learn the GenAI landscape from a user perspective and prompting tips to generate a test design for the Google Home page</p><h2>Overview</h2><p>It&#8217;s 2025, and at this point, GenAI does not need an introduction. November 30, 2022, shook the world when <a href="https://openai.com/index/chatgpt/">Open AI launched</a> ChatGPT and captured the imagination of people worldwide.</p><p>We live in a world now where we can ask GenAI to solve different kinds of problems for us like</p><ol><li><p>Generate code</p></li><li><p>Edit multiple files</p></li><li><p>Generate images, videos</p></li><li><p>Ask questions about problems and incrementally build solutions</p></li></ol><p>It&#8217;s fascinating to see this technological progress, even though there seems to be a lot of noise and hype around it.</p><p>Many people are putting out clear signals. I feel like we all got a cool new technology upgrade added to our toolchains as a professional software engineer, and we should leverage it in the <em>right way</em></p><p>I&#8217;ve so far been silently watching this space evolve. I use many of the tools and techniques in my daily workflows, and I feel it's time to put my take on how AI is helpful for testing.</p><p>I&#8217;m by no means an expert but I&#8217;ll build and learn in public and hopefully take you with me on this learning journey.</p><h2>My current mental model &#129504;</h2><p>Let&#8217;s adopt the POV (point of view) of a senior engineer focussed more on the user layer and how can they leverage and integrate GenAI in their day-to-day workflows</p><p><strong>Side note:</strong> Stephen Wolfram wrote a fascinating piece on <a href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/">What Is ChatGPT Doing &#8230; and Why Does It Work?</a> I recommend reading this if you want a better intuition on how this technology <em>really works</em> under the hood.</p><h3>Interfaces &#128241;</h3><p>I see 5 main ways to interact with GenAI and get it to do something helpful for you</p><ol><li><p><strong>Chat:</strong> Type a question in a chat box and see a streaming answer being typed back</p></li><li><p><strong>Inline chat: </strong>While coding you can type a prompt in the context of the code you are working on</p></li><li><p><strong>Voice:</strong> Speak your prompt out loud in natural language and hear the response back</p></li><li><p><strong>Autocomplete while coding: </strong>Coding assistants predict what you want to write and then provide an autocomplete suggestion</p></li><li><p><strong>Multi-file editing: </strong>Coding assistants provide context on a few files where you want to make a change and then type a prompt for GenAI to make that change for you.</p></li></ol><h3>Input modes &#10145;&#65039;</h3><p>We can write prompts or type in your question or task along with the required context such as:</p><ol><li><p>Ask a question and follow up</p></li><li><p>Prompt to make an edit and accept/discard</p></li></ol><h3>Outputs &#11013;&#65039;</h3><p>And get back a result in the below formats that you can then either use as is or refine further in more incremental cycles of back and forths</p><ol><li><p>Text</p></li><li><p>Code generation</p></li><li><p>Transform text into images or videos</p></li></ol><p>Depending on your use case you may use one or more of these interfaces to get to the desired outcomes.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><h3>Vendors</h3><p>Who are the major vendors at the moment?</p><p>There are few players who have managed to corner a large section of the customer base at this moment and more keep on coming every few weeks.</p><blockquote><p><strong>&#9888;&#65039;</strong><em><strong>Caution: </strong>You may be tempted to try to keep up with every single change in AI and while you can certainly try, it can quickly turn out to be quite exhausting. I&#8217;ll suggest sticking to your core tools in the beginning and being comfortable with them first and taking one new tool to tinker and experiment with as you form a better intuition for yourself. If you find it better for your workflow, please switch by all means, But there should be a method to madness isn't there?</em></p></blockquote><p>Here I&#8217;m focussing on solutions that are relevant to primarily coding and testing.</p><p><strong>General purpose</strong></p><ol><li><p>ChatGPT</p></li><li><p>Gemini</p></li><li><p>Microsoft copilot</p></li></ol><p><strong>Search</strong></p><ol><li><p>Perplexity</p></li></ol><p><strong>Coding</strong></p><ol><li><p>Github Copilot</p></li><li><p>Claude</p></li><li><p>ChatGPT</p></li></ol><p><strong>IDE</strong></p><ol><li><p>Cursor</p></li><li><p>VSCode</p></li><li><p>JetBrains IDE</p></li></ol><p>Sometimes vendors are evolving more into a <a href="https://github.blog/news-insights/product-news/bringing-developer-choice-to-copilot/">platform where they provide a layer of abstraction over different models</a> and allow the user to switch between them like VSCode with Github copilot supports both OpenAI and Anthropic&#8217;s models</p><h3>Major models</h3><p>In no particular order</p><ol><li><p>OpenAI</p></li><li><p>Claude</p></li><li><p>Google Gemini</p></li><li><p>Llama</p></li></ol><p>Each of these models provides sub-models of different sizes like small, medium, and large.</p><p>What size is useful for what task is still not an exact science at the moment but as we use it more, we&#8217;ll probably form a better intuition and have more research further down the line</p><p>With this solid foundation of what technological surface areas we are working with.</p><p>Let&#8217;s now dive into each and see how it could help us with testing, shall we? &#128512;</p><h2>Generate test cases with LLMs</h2><p>Before you explore anything else, learning how to chat well with LLMs is super important as you&#8217;ll see. This forms the basis for using chat interfaces and inline chat well during problem-solving and coding.</p><p>When it comes to chatting efficiently with LLM, we need to keep in mind below</p><ol><li><p>Specify the outcomes you want LLM to produce.</p></li><li><p>Learn how to provide the necessary context to the model</p></li><li><p>Provide examples and clear steps or instructions</p></li><li><p>Ask it to perform a chain of thought by adding <strong>think step-by-step</strong></p></li><li><p>Specify the role/character you want the LLM to adopt</p></li></ol><p>Let&#8217;s understand these with some examples.</p><p>You can find these prompts and generated output in <a href="https://github.com/automationhacks/grasp-ai/blob/2540e4b1d4fe59828665b5f7f45d63cdb6c5f4e9/prompting">this</a> GitHub repo</p><h3>Clear, detailed, and specific prompts</h3><p>LLMs are great at parsing prompts written in <a href="https://www.markdownguide.org/">markdown</a> format.</p><p>Below is an example format suggested <a href="https://automationhacks.io/2024-07-14-tribe-qonf-2024-debrief#ai-augmented-testing-how-generative-ai-and-prompt-engineering-turn-testers-into-superheroes-not-replace-them---jonathon-wright">by a few testers</a> wherein you specify a goal/mission/task upfront, provide context in the input section, and specify what response format you want the answer in</p><p>For e.g. csv format for test cases or JSON for test data that you can feed into your automated tests.</p><p>Below is a canonical test plan for the Google search page.</p><p>&#128580;Yeah, I know, you would have seen this ton of times already but the beauty lies in its widespread availability and simplicity. We all know intuitively how to test the Google homepage, don&#8217;t we?</p><pre><code># MISSION


1. Generate test cases to test Google homepage
2. Please Cover functional, and non-functional cases from web, mobile, and backend perspectives.


# INPUT


1. Google home page is an app that takes the following inputs:


* `Search box`
*  User can either click on the `Google search button` or the `I'm feeling lucky button`


# RESPONSE FORMAT


1. csv with columns as `Test ID`, `Title`, `Preconditions`, `Steps`, `Expected Result`</code></pre><p>You can see LLM here does a pretty good job in providing a high-level test plan covering web, mobile, and backend tests. You can find the prompt and output <a href="https://github.com/automationhacks/grasp-ai/tree/main/prompting/01_use_markdown">here</a></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wS2v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wS2v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png 424w, https://substackcdn.com/image/fetch/$s_!wS2v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png 848w, https://substackcdn.com/image/fetch/$s_!wS2v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png 1272w, https://substackcdn.com/image/fetch/$s_!wS2v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wS2v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png" width="1456" height="283" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:283,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wS2v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png 424w, https://substackcdn.com/image/fetch/$s_!wS2v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png 848w, https://substackcdn.com/image/fetch/$s_!wS2v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png 1272w, https://substackcdn.com/image/fetch/$s_!wS2v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6459bbe0-14dd-4b34-852f-3e13d6a9bffb_1600x311.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>With this context set, we can now go ahead and refine our prompts and then ask it to generate cases around a specific theme like focus on UI, usability, accessibility, or performance.</p><blockquote><p><strong>&#9889;</strong><em><strong>Tip:</strong> You can also add a section in the prompt above-called <strong>steps </strong>and provide a numbered list of tasks or approaches you want the LLM to follow while coming up with the response as well</em></p></blockquote><p>While this mode of formatting with markdown is quite precise, you can also chat in natural language.</p><p>LLM tools are now getting better day by day at ensuring your prompts are cleaned and enhanced before sending to the model.</p><p>As they improve further, even people not well versed with prompting would be able to get similar results at people who are quite creative, but there will still be some differences.</p><p>LLMs cannot read your minds so you need to provide all the details required to do the job well, just like you would mentor or coach an n00b engineer on your team. A good heuristic is, if you show your prompt to another human would they be able to infer what you are trying to get the LLM to do? If not, it is time to refine your prompt more</p><p>&#9889;<em>Tip: If you are confused, you can also ask the model itself for suggestions.</em></p><p>For e.g. I asked for suggestions from ChatGPT on improving my prompting</p><pre><code>How could I have improved this prompt itself in order to get better results and more test cases covering different aspects? Please explain it to me step by step.</code></pre><p>Below is what ChatGPT came up with apart from a pretty long explanation of why this works.</p><pre><code>Generate test cases for the Google homepage. Cover the following areas: functional, non-functional, security, accessibility, performance, and usability. Test the web (desktop and tablet), mobile (responsive and native), and backend services.

The homepage includes:

A search box with autocomplete.

'Google Search' and 'I'm Feeling Lucky' buttons.

Voice search (mobile-specific).

Test input variations like valid inputs, invalid inputs, edge cases, and security attempts. Non-functional aspects should include performance (load time), accessibility (WCAG 2.1 compliance), and compatibility (across devices and networks).

Output the test cases in CSV format with columns: Test ID, Title, Preconditions, Steps, Expected Result. Provide at least 5 test cases per type of testing</code></pre><p>It added specific areas to focus on:</p><blockquote><p><em>security, accessibility, performance, and usability.</em></p></blockquote><p>And also which platforms to consider</p><blockquote><p><em>Test the web (desktop and tablet), mobile (responsive and native), and backend services.</em></p></blockquote><p>Then it also added aspects or specific areas where we could focus the LLM on</p><blockquote><p><em>Test input variations like valid inputs, invalid inputs, edge cases, and security attempts. Non-functional aspects should include performance (load time), accessibility (WCAG 2.1 compliance), and compatibility (across devices and networks)</em></p></blockquote><p>You can see the prompt and its output <a href="https://github.com/automationhacks/grasp-ai/tree/main/prompting/02_specific_and_clear">here</a></p><p>And below is what the model returned.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4JUG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4JUG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png 424w, https://substackcdn.com/image/fetch/$s_!4JUG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png 848w, https://substackcdn.com/image/fetch/$s_!4JUG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png 1272w, https://substackcdn.com/image/fetch/$s_!4JUG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4JUG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png" width="1456" height="314" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:314,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:381919,&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_!4JUG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png 424w, https://substackcdn.com/image/fetch/$s_!4JUG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png 848w, https://substackcdn.com/image/fetch/$s_!4JUG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png 1272w, https://substackcdn.com/image/fetch/$s_!4JUG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f7c70f-923a-4173-99f4-d808fbf90808_3226x696.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>You can see with the above the test plan has more specific cases on security, and usability aspects that were previously missing.</p><p>In general, the below tips work well while prompting</p><ol><li><p>Use bullet points or numbered lists to call out specific actions you want the LLM to do</p></li><li><p>Be clear and specific, cut out any fluff context that is not relevant</p></li><li><p>Use markdown and bold or italics to put emphasis if you want the LLM to focus more on a specific aspect.</p></li><li><p>Specify how you will use this data and the format in which you need the output.</p></li></ol><p>You could read the anthropic prompt engineering guide for more examples</p><p><a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/be-clear-and-direct#example-anonymizing-customer-feedback">Be clear, direct, and detailed - Anthropic</a></p><h3>Provide clear examples</h3><p>Also referred to as multi-shot prompting</p><p>I liked this example <a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/be-clear-and-direct#example-incident-response">from the anthropic guide</a> wherein we can have a lot of control over the output by being detailed in our prompts and specifying some examples</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Mh_M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Mh_M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png 424w, https://substackcdn.com/image/fetch/$s_!Mh_M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png 848w, https://substackcdn.com/image/fetch/$s_!Mh_M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png 1272w, https://substackcdn.com/image/fetch/$s_!Mh_M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Mh_M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png" width="1456" height="1054" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1054,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Mh_M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png 424w, https://substackcdn.com/image/fetch/$s_!Mh_M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png 848w, https://substackcdn.com/image/fetch/$s_!Mh_M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.png 1272w, https://substackcdn.com/image/fetch/$s_!Mh_M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58085230-c1fb-44b3-81a6-5f4de59127f0_1600x1158.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>We can follow the same example while trying to generate more targetted functional tests by using <a href="https://github.com/automationhacks/grasp-ai/blob/main/prompting/inputs/google-test-prompt-3.md">prompt</a></p><pre><code># MISSION


- Generate test cases to test google homepage
- Please cover the following areas
 - Functional cases for the web (desktop and tablet), mobile (responsive and native), and backend services.
 - Test input variations like valid inputs, invalid inputs, edge cases


# INPUT


1. Google home page is an app that takes the following inputs:


* `Search box`
*  User can either click on `Google search button` or `I'm feeling lucky button`


# STEPS


You can follow below examples while preparing the test case in csv format


- Test ID: FT-WEB-01
- Title: Test google search for valid search params
- Preconditions
 - Given google search page is loaded
- Steps:
 - When user types a valid search query in the search box
 - And clicks search button
- Expected Result
 - Then google search results page should show relevant results


# RESPONSE FORMAT


- CSV with columns as `Test ID`, `Title`, `Preconditions`, `Steps`, `Expected Result`
- If there are multiple steps ensure there is proper line break between them
</code></pre><p>This produces a slightly better-formatted test case focussing on functional cases. You can see the prompt and tests <a href="https://github.com/automationhacks/grasp-ai/tree/main/prompting/03_steps_examples">here</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a1HC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a1HC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png 424w, https://substackcdn.com/image/fetch/$s_!a1HC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png 848w, https://substackcdn.com/image/fetch/$s_!a1HC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png 1272w, https://substackcdn.com/image/fetch/$s_!a1HC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a1HC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png" width="1456" height="372" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:372,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:393264,&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_!a1HC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png 424w, https://substackcdn.com/image/fetch/$s_!a1HC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png 848w, https://substackcdn.com/image/fetch/$s_!a1HC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.png 1272w, https://substackcdn.com/image/fetch/$s_!a1HC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb37e57d6-4627-4e10-a485-721ede97f3d6_3016x770.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><h3>Chain of thought (COT)</h3><p>For complex reasoning, you can increase accuracy by asking LLMs to explain their reasoning by adding the phrase <strong>&#8220;Think step by step&#8221;</strong></p><p>This can be useful while you are learning about a topic or thinking of test cases.</p><p>You can leverage this to get an insight into how LLM arrived at a certain test case and also force them to be more rigorous, thereby reducing the error rate.</p><p>By this time, this chats context window already has some preloaded context that we are trying to design test cases for the Google homepage</p><p>Let&#8217;s use this technique to get LLM to explain its reasoning behind focussing on nonfunctional cases <a href="https://github.com/automationhacks/grasp-ai/blob/2540e4b1d4fe59828665b5f7f45d63cdb6c5f4e9/prompting/inputs/google-test-prompt-4.md">specifically on resiliency testing</a></p><pre><code>Your task now is to focus exclusively on resilience testing for the backend

Please output the result in CSV format like before and also think step-by-step</code></pre><p>LLM provides a good mental model around resilience testing</p><p><em><strong>Understand Resilience Testing Goals</strong>:<br>Resilience tests aim to assess how a system behaves under abnormal or stressful conditions, ensuring it recovers gracefully or minimizes service disruption</em></p><p><em><strong>Identify Key Failure Scenarios</strong>:</em></p><ul><li><p><em>Backend unavailability (e.g., server downtime).</em></p></li><li><p><em>Network-related delays or high latency.</em></p></li><li><p><em>Failures in Dependent Systems (e.g., database or autocomplete services).</em></p></li><li><p><em>Sudden spikes in load or malformed requests.</em></p></li></ul><p><em><strong>Simulate Real-World Failures</strong>:</em></p><p><em>Use common failure scenarios such as API unavailability or service crashes.</em></p><p><em>Incorporate tests for handling unexpected input like malformed requests or excessive data loads.</em></p><p><em><strong>Define Recovery and Graceful Degradation</strong>:<br>For each scenario, ensure the system can recover quickly or degrade functionality without crashing.</em></p><p><em><strong>Specify Observations and Outcomes</strong>:</em></p><p><em>Each test includes clear conditions (e.g., simulated failure or delay).</em></p><p><em>Expected results focus on user-friendly error messages, stable service performance, or appropriate system logs.</em></p><p>And we get below cases which seem quite reasonable to me as a starting point to build on top of. You can read the prompt and see tests <a href="https://github.com/automationhacks/grasp-ai/tree/main/prompting/04_chain_of_thought">here</a></p><blockquote><p>&#9889;<em>Tip: What would have been better is to provide the cURL of the given search API and its downstream as additional context to get some targetted tests, but I&#8217;ll let you explore that on your own</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tgGz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tgGz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png 424w, https://substackcdn.com/image/fetch/$s_!tgGz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png 848w, https://substackcdn.com/image/fetch/$s_!tgGz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png 1272w, https://substackcdn.com/image/fetch/$s_!tgGz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tgGz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png" width="1456" height="418" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:418,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:417523,&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_!tgGz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png 424w, https://substackcdn.com/image/fetch/$s_!tgGz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png 848w, https://substackcdn.com/image/fetch/$s_!tgGz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png 1272w, https://substackcdn.com/image/fetch/$s_!tgGz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2874e5-234b-4c71-855b-0f51a0207dc9_2846x818.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Role-based prompting</h3><p>This tip has been mentioned so many times that I&#8217;ll just drop a one-liner and you can see full prompt and tests <a href="https://github.com/automationhacks/grasp-ai/tree/main/prompting/05_role_based">here</a></p><p>Generally adding a line to instruct the role you want the LLM to play works out better as it helps reduce the solution space</p><blockquote><p><em>You are a world-class experienced staff software development engineer in test at Google</em></p></blockquote><p>By adding the above, I can observe the LLM suggested a few additional cases that probably an experienced staff engineer may think of.</p><ol><li><p><strong>Network partition scenarios</strong>: Focus on the system&#8217;s ability to maintain partial functionality.</p></li><li><p><strong>Stale cache handling</strong>: Ensures resilience when dealing with outdated or corrupt cache entries.</p></li><li><p><strong>Incorrect data from dependencies</strong>: Verifies robustness against unexpected or incorrect responses from dependent services.</p></li></ol><p>New cases:</p><blockquote><p><em><strong>Test ID</strong>: RT-BACK-08<br><strong>Title</strong>: Verify API response under network partition scenarios (New)<br><strong>Preconditions</strong>: Simulate a network partition between the API and dependent services<br><strong>Steps</strong>:</em></p></blockquote><ol><li><p><em>Disconnect the network to one or more dependent services.</em></p></li><li><p><em>Send a valid search request.<br><strong>Expected Result</strong>: The API continues to serve partial responses with a clear error or warning about degraded functionality.</em></p></li></ol><blockquote></blockquote><div><hr></div><blockquote><p><em><strong>Test ID</strong>: RT-BACK-09<br><strong>Title</strong>: Verify API's handling of stale cache scenarios (New)<br><strong>Preconditions</strong>: Introduce stale or corrupted cache data for API responses<br><strong>Steps</strong>:</em></p></blockquote><ol><li><p><em>Trigger a cached query by sending a previously searched term.</em></p></li><li><p><em>Monitor if the API detects and refreshes stale cache data.<br><strong>Expected Result</strong>: The system refreshes or invalidates stale cache entries, ensuring accurate responses.</em></p></li></ol><blockquote></blockquote><div><hr></div><blockquote><p><em><strong>Test ID</strong>: RT-BACK-10<br><strong>Title</strong>: Test response when dependent services return incorrect data (New)<br><strong>Preconditions</strong>: Simulate incorrect or unexpected data from a dependent service (e.g., malformed suggestions).<br><strong>Steps</strong>:</em></p></blockquote><ol><li><p><em>Send a search query dependent on the failing service.</em></p></li><li><p><em>Observe API behavior and logs.<br><strong>Expected Result</strong>: The API filters out invalid data, logging the anomaly while maintaining functional responses.</em></p></li></ol><h2>Summary</h2><p>Hope this introduction was helpful</p><p>To summarise in this blog you learned</p><ol><li><p>What is Gen AI?</p></li><li><p>What does the current landscape look like in terms of interfaces, input, outputs, vendors, and major models?</p></li><li><p>How to leverage Gen AI to design cases</p></li><li><p>Efficient prompting techniques such as being specific, providing examples, using markdown, using chain of thought, and role-based prompting</p></li></ol><h2>References</h2><ol><li><p><a href="https://martinfowler.com/articles/exploring-gen-ai.html#memo-11">Exploring Generative AI</a></p></li><li><p><a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview">Prompt engineering overview - Anthropic</a></p></li><li><p><a href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/">What Is ChatGPT Doing &#8230; and Why Does It Work?&#8212;Stephen Wolfram Writings</a></p></li></ol><h2>Coming soon!</h2><p>In the next vol, we will focus on code assistance and inline chat with Github copilot. Subscribe to the newsletter to not miss out on that.</p><p>If you found this helpful, &#127793; Subscribe to my <a href="https://newsletter.automationhacks.io/">newsletter</a> and <a href="https://www.youtube.com/@automationhacks">YouTube channel (@automationhacks)</a> for more &#9889;<strong>insights</strong> into <strong>software testing</strong> and <strong>automation,</strong> or connect on <a href="https://topmate.io/automationhacks/">topmate</a> for a personalized 1:1 session.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>]]></content:encoded></item><item><title><![CDATA[⚡️ SDET career roadmap: from entry level to staff engineer]]></title><description><![CDATA[In this post, I break down expectations at entry/mid, senior, and staff levels and then help you form an intuition about what you can learn and share an approach that worked for me]]></description><link>https://newsletter.automationhacks.io/p/sdet-roadmap</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/sdet-roadmap</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Sun, 22 Dec 2024 02:28:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KdXq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_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_!KdXq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KdXq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!KdXq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!KdXq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!KdXq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KdXq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png" width="528" height="528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73e6eb61-02a6-4e10-9715-3ba8ab61e00d_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;:528,&quot;bytes&quot;:132566,&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_!KdXq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!KdXq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!KdXq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!KdXq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73e6eb61-02a6-4e10-9715-3ba8ab61e00d_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><figcaption class="image-caption">Generated by Gen AI from Microsoft Copilot using DALL.E</figcaption></figure></div><p></p><p>Recently, a bright, up-and-coming SDET at work asked me:</p><p><em>How can I <a href="https://newsletter.automationhacks.io/p/is-there-growth-in-testing">grow</a> in my career?</em></p><p><em>How can I become a better engineer?</em></p><p>These are timeless questions. All high-growth engineers keep asking this often of themselves and their mentors or managers</p><p>It was wonderful to see them have self-awareness in their early career and the drive to improve themselves. I wish I had started asking about this earlier. &#128578;</p><p>I&#8217;ve pondered on this question myself and often do self-reflection from time to time on this, and while I probably cannot give you a magic formula of success that would catapult you to the next level</p><p>I can share my take on it.</p><p><strong>Disclaimer:</strong></p><ol><li><p>Please take it with a grain of salt &#129474; as this contains my unconscious biases.</p></li><li><p>When in doubt, do what feels is the best course of action <strong>for yourself</strong> in <strong>your unique life situation</strong>. There are no black and white answers here and anyone who says otherwise has something else on their agenda &#128521;</p></li></ol><p>Phew! With that ominous disclaimer out of the way. Let&#8217;s dive in</p><p>Progression in your career realistically can be a combination of many factors -</p><ol><li><p>sometimes it is a raw skill, talent, and execution</p></li><li><p>sometimes it&#8217;s the relationships you&#8217;ve built that <strong>work for you</strong></p></li><li><p>often it's being at the right place at the right time and showing up with the right attitude</p></li><li><p>Most often it is luck or foresight to work on high-impact projects</p></li><li><p>a favorable sponsor, mentor, or manager</p></li></ol><p>and what have you?</p><p>Surely you may be thinking, These do not seem very deterministic, do they?</p><p>Since there are only a few aspects that you have personal control over.</p><p>I&#8217;ll suggest we start from there.</p><h2>&#129692; Level Expectations</h2><p>Before we look at skills that an SDET should master, let's set some broad behaviors and expectations that leaders reasonably expect from engineers at different stages of their career journey.</p><p>This is not an exhaustive list by any stretch, but it is meant to give you a ballpark idea and some high-level intuition</p><p>At each stage of your journey</p><p>You should assume the person has demonstrated performance indicators on the previous level and has the potential to reliably and consistently demonstrate at least 30% of next-level skills.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p><h3>Entry/mid-level - <em>A new hope; solid executor</em></h3><p><strong>Project impact:</strong></p><ul><li><p>Strong execution on one team and ownership of shipping tasks on time</p></li><li><p>Can design and execute test plans for independent features with guidance from senior engineers</p></li><li><p>Can add incremental features to framework and tools for well-defined problem spaces and domains</p></li></ul><p><strong>Engineering excellence:</strong></p><ul><li><p>Expert in one area (web, mobile, backend)</p></li><li><p>Can code fluently in one programming language</p></li><li><p>Has a solid understanding of testing fundamentals and techniques e.g. boundary value analysis, equivalence partitioning, decision tables, state transition tests mind mapping</p></li></ul><p><strong>People impact:</strong></p><ul><li><p>Can communicate clearly with stakeholders and help drive bug fixes</p></li></ul><p><strong>Direction:</strong></p><ul><li><p>Limited to a small/medium problem space</p></li></ul><h3>Senior - <em>An independent, reliable, and seasoned engineer</em></h3><p><strong>Project impact</strong></p><ul><li><p>Leads execution for a functional area in a group</p></li><li><p>Deliver outcomes on medium complexity features with minimal or directional guidance</p></li><li><p>Proactively takes ownership, designs, and builds scalable and efficient test frameworks and tools to solve testing problems</p></li></ul><p><strong>Engineering excellence</strong></p><ul><li><p>Expert in more than one area (web, mobile or backend)</p></li><li><p>A polyglot programmer and can code fluently in more than one language, with a good understanding of design patterns and approaches, refactoring techniques</p></li><li><p>Understand sophisticated testing techniques and approaches like mocking, stubbing, integration testing, mutation, etc</p></li><li><p>Good understanding of associated technology stacks: test runners, code coverage, CI/CD, reporting</p></li></ul><p><strong>People impact:</strong></p><ul><li><p>Mentor early career engineers to grow into senior role</p></li></ul><p><strong>Direction:</strong></p><ul><li><p>Influences technical direction for one area</p></li><li><p>Effectively communicates technical concepts to both technical and non-technical audiences, and influences technical decisions.</p></li></ul><h3>Staff/Principal - <em>A deep expert, who sets technical direction, large functional area influence, or industry impact</em></h3><p><strong>Project impact</strong></p><ul><li><p>Leads execution of complex projects across multiple cross-functional teams</p></li><li><p>Aligns testing efforts with broader organizational goals anticipates future challenges, and drives strategic initiatives.</p></li><li><p>Able to deliver complex projects involving either deep technical skills or cross-team collaborations with no supervision and occasional directional feedback</p></li><li><p>Able to build a robust, scalable, and comprehensive test strategy covering different app stacks</p></li></ul><p><strong>Engineering excellence</strong></p><ul><li><p>Expert across domains (web, mobile, backend)</p></li><li><p>Solid hands-on grasp on nonfunctional testing (resilience, chaos, load, security)</p></li></ul><p><strong>People Impact</strong></p><ul><li><p>Motivated to mentor and teach senior engineers to grow into staff and guide peer managers on nuances in the technical domain</p></li><li><p>Able to handle ambiguity and navigate organizational dynamics to drive progress</p></li><li><p>Inspires and motivates others, builds high-performing teams, and fosters a culture of excellence</p></li></ul><p><strong>Direction</strong></p><ul><li><p>Influences technical direction and identifies opportunities for innovation</p></li><li><p>Leads the development and implementation of new testing methodologies and tools across teams and multiple areas</p></li></ul><p>There are levels further than this in large companies like a Senior principal engineer, or distinguished engineer</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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></p>
      <p>
          <a href="https://newsletter.automationhacks.io/p/sdet-roadmap">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Upgrading ReportPortal with backup/restore of Postgres and binary data]]></title><description><![CDATA[In this blog, learn how to take Postgres db, binary data backup, make upgrades in docker-compose.yml file, and then restore the DB data and binary data safely without losing launches and dashboards]]></description><link>https://newsletter.automationhacks.io/p/upgrading-report-portal-with-backup-restore-of-postgres-and-binary-data</link><guid isPermaLink="false">https://newsletter.automationhacks.io/p/upgrading-report-portal-with-backup-restore-of-postgres-and-binary-data</guid><dc:creator><![CDATA[Gaurav Singh]]></dc:creator><pubDate>Mon, 09 Dec 2024 16:49:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!O_BM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.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_!O_BM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O_BM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!O_BM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!O_BM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!O_BM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O_BM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg" width="1456" height="974" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:974,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:850707,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!O_BM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!O_BM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!O_BM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!O_BM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e34d937-1d64-4d1f-913e-fb4e3fe928be_3888x2600.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Nothing speaks backup louder than a CD &#128191; | Photo by <a href="https://unsplash.com/@chrjy?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Chris Yates</a> on <a href="https://unsplash.com/photos/white-disc-on-laptop-computer-disc-player-iqELIpzpARI?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><h2>Why?</h2><p>Once you have a running instance of ReportPortal with one or more teams using it successfully, it becomes important to keep patching it with upgrades and ensuring you get the benefits of bug fixes and new features.</p><p>But, If not done carefully, you can risk losing data (launches, logs, and dashboards) and setting up integration again.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>Trust me, You would not want to be the one who loses data for the company, especially when people depend on previous analysis, widgets, and dashboards for their day-to-day operations. &#129318;</p><p>In this blog, I&#8217;ll help provide clear steps to achieve the below workflow:</p><ol><li><p>Take a backup of Postgres db</p></li><li><p>Take a backup of binary data from Minio</p></li><li><p>Make changes in docker-compose.yml files (e.g. opening up ports, and adding new components like OpenSearch)</p></li><li><p>Ensure existing containers are updated.</p></li><li><p>Restore data into Postgres and binary</p></li></ol><p>This blog is inspired by the guides published by the ReportPortal team.</p><p>I intend to explain nuances to someone new to Docker, Postgres, and Minio. If you are curious you can use them as additional resources</p><ol><li><p><a href="https://reportportal.io/docs/installation-steps-advanced/BackupRestoreGuide">Backup &amp; Restore Guide | ReportPortal Documentation</a> for steps on how to backup and restore binary data</p></li><li><p>Follow <a href="https://reportportal.io/docs/installation-steps-advanced/UpgradingPostgreSQLForReportPortalV24.2AndLater">Upgrading PostgreSQL for ReportPortal v24.2 and later</a> for steps on how to backup and restore Postgres</p></li></ol><p>Let&#8217;s go &#127939;</p><h2>Backup postgres</h2><p>ReportPortal keeps most of the data in a Postgres instance including launches, filters, widgets, and dashboards. We can execute the&nbsp;<a href="https://www.postgresql.org/docs/current/app-pgdump.html">pg_dump</a>&nbsp;command inside the docker container to backup Postgres. This generates an SQL file with all the information needed to restore data after the upgrade.</p><pre><code>DB_USER=rpuser
DB_NAME=reportportal
DB_PASSWORD=rppass
DB_CONTAINER=postgres

docker exec -e PGPASSWORD=$DB_PASSWORD $DB_CONTAINER pg_dump -U $DB_USER -d $DB_NAME &gt; reportportal_docker_db_backup.sql</code></pre><p>Explanation:</p><ul><li><p>We first export required parameters like <code>DB_USER, DB_PASSWORD, DB_NAME, and DB_CONTAINER</code> to ensure what can vary is captured upfront and we have an easy-to-read command. In this example, I&#8217;m using the default values that you can see from the docker-compose.yml file here. You may want to change these and maintain another docker-compose.yml file</p></li><li><p><code>docker exec -e PGPASSWORD=$DB_PASSWORD $DB_CONTAINER</code>: Executes a command inside the specified Docker container while setting the Postgres database password upfront as an environment variable (using <code>-e</code>)</p></li><li><p><code>pg_dump -U $DB_USER -d $DB_NAME</code>: This command initiates a PostgreSQL dump, specifying the username and database name.</p></li><li><p><code>&gt; reportportal_db_backup.sql</code>: Redirects the output sql to a file named reportportal_docker_db_backup.sql.</p></li></ul><p>&#9889;Tip: This command may take time if the database has lots of data. Please be patient as that completes. <strong>Do not exit out early </strong>as you may have incomplete backup. Once this is completed, it would be a good idea to make a copy of this file by executing something like this:</p><pre><code>cp reportportal_docker_db_backup.sql YYYY_MM_DD_reportportal_docker_db_backup.sql</code></pre><p>This will help avoid surprises if you somehow corrupt or delete the primary backup.</p><h2>Backup binary data</h2><p>Next, we take a backup of binary data. ReportPortal uses <a href="https://min.io/">minIO</a> as the <strong>object store</strong> to store additional data similar to how a file system would.</p><pre><code>VOLUME_NAME=reportportal_storage

docker run --rm -v "$VOLUME_NAME":/data -v "$(pwd)":/backup busybox tar -zcvf /backup/reportportal_storage_backup.tar.gz /data</code></pre><p>Explanation:</p><ul><li><p><code>docker run</code>: This command runs a Docker container.</p></li><li><p><code>--rm</code>: This flag removes the container once it completes its execution. This is useful for temporary containers, such as when performing a one-off task like creating a backup.</p></li><li><p><code>-v "$VOLUME_NAME":/storage_backup</code>: <a href="https://docs.docker.com/engine/storage/bind-mounts/">This option creates a volume mount</a> between the host machine and the container. It mounts the Docker volume named by the VOLUME_NAME variable to the path /storage_backup inside the container.</p></li><li><p><code>-v "$(pwd)":/backup</code>: This option mounts the current working directory ($(pwd)) on the host machine to the path /backup inside the container. This is where the backup file will be stored.</p></li><li><p><code>busybox</code>: This specifies the Docker image to be used for the container. In this case, it uses the BusyBox image, which is a lightweight and minimalistic Linux distribution often used for simple tasks.</p></li><li><p><code>tar -zcvf /backup/reportportal_storage_backup.tar.gz /data</code>: This part of the command runs the tar command inside the container to create a compressed tar archive (reportportal_storage_backup.tar.gz).</p></li></ul><h2>Remove all containers</h2><p>We will now use docker-compose to<strong> bring down</strong> all existing containers. If any container is already running when you try to upgrade it, you must stop and manually remove it (using docker stop &lt;container_name&gt; &amp;&amp; docker rm &lt;container_name&gt;)</p><p>This can be a tedious process to do one by one, as there could be dependencies between containers. Docker Compose simplifies this process for us</p><pre><code>docker compose -p reportportal down</code></pre><h2>Remove Postgres volume</h2><p>This step is optional, you should run this only if you want a clean slate in your DB. This would remove the existing Postgres volume.</p><pre><code>docker volume rm reportportal_postgres</code></pre><h2>Make changes in your docker-compose.yml file</h2><p>Now that everything has been torn down, you can change the docker-compose.yml file.</p><p>For example, below are a few use cases when this may be relevant</p><h3>Upgrade versions</h3><p>You may want to pull a new version of ReportPortal</p><pre><code>curl -LO https://raw.githubusercontent.com/reportportal/reportportal/master/docker-compose.yml</code></pre><h3>Expose Postgres db</h3><p>You may want to expose Postgres running in the container to the host machine to allow engineers to connect to it and make use of stored data for their purposes</p><pre><code>## Uncomment to expose Database
ports:
   - "5432:5432"

## PostgreSQL as the main database for ReportPortal
postgres:
 image: bitnami/postgresql:16.4.0-debian-12-r7
 container_name: *db_host
 logging:
   &lt;&lt;: *logging
 shm_size: '512m'
 environment:
   POSTGRES_USER: *db_user
   POSTGRES_PASSWORD: *db_password
   POSTGRES_DB: *db_name
   POSTGRESQL_CHECKPOINT_COMPLETION_TARGET: 0.9
   WORK_MEM: 96M
   WAL_WRITER_DELAY: 20ms
   SYNCHRONOUS_COMMIT: off
   WAL_BUFFERS: 32MB
   MIN_WAL_SIZE: 2GB
   MAX_WAL_SIZE: 4GB
 volumes:
   - postgres:/bitnami/postgresql
 ## Uncomment to expose Database
 ports:
   - "5432:5432"
 healthcheck:
   test: [ "CMD-SHELL", "pg_isready -d $$POSTGRES_DB -U $$POSTGRES_USER" ]
   interval: 10s
   timeout: 120s
   retries: 10
 networks:
   - reportportal
 restart: always</code></pre><h3>Add OpenSearch dashboards</h3><p>You may want to add the capability also to serve open search dashboards so that I can add custom <strong>search/visualization</strong> capabilities on top of what ReportPortal provides out of the box</p><pre><code>opensearch:
 image: opensearchproject/opensearch:2.16.0
 container_name: *opensearch_host
 logging:
   &lt;&lt;: *logging
 environment:
   discovery.type: single-node
   plugins.security.disabled: "true"
   bootstrap.memory_lock: "true"
   OPENSEARCH_JAVA_OPTS: -Xms512m -Xmx512m
   DISABLE_INSTALL_DEMO_CONFIG: "true"
 ulimits:
   memlock:
     soft: -1
     hard: -1
 ## Uncomment the following lines to expose OpenSearch on ports 9200 and 9600
 ports:
   - "9200:9200"  # OpenSearch HTTP API
   - "9600:9600"  # OpenSearch Performance Analyzer
 volumes:
   - opensearch:/usr/share/opensearch/data
 healthcheck:
   test: [ "CMD", "curl","-s" ,"-f", "http://0.0.0.0:9200/_cat/health" ]
 networks:
   - reportportal
 restart: always


opensearch-dashboards:
 image: opensearchproject/opensearch-dashboards:2.16.0
 container_name: opensearch-dashboards
 ports:
   - "5601:5601"  # Dashboard UI
 environment:
   OPENSEARCH_HOSTS: http://opensearch:9200
   DISABLE_SECURITY_DASHBOARDS_PLUGIN: "true"  # Add this line to disable security
   OPENSEARCH_ALLOW_INSECURE: "true"          # Add this line to allow insecure connections
 depends_on:
   - opensearch
 networks:
   - reportportal
 restart: always
</code></pre><h2>Start only postgres</h2><p>After your changes are done, we&#8217;ll first only bring up the database</p><pre><code>docker compose -p reportportal up -d postgres</code></pre><h2>Restore Postgres</h2><p>Next, let&#8217;s restore the data. To restore the data we use psql</p><pre><code>DB_USER=rpuser
DB_PASSWORD=rppass
DB_NAME=reportportal
DB_CONTAINER=postgres

docker exec -i -e PGPASSWORD=$DB_PASSWORD $DB_CONTAINER psql -U $DB_USER -d $DB_NAME &lt; reportportal_docker_db_backup.sql &gt; upgrade_db.log 2&gt;&amp;1</code></pre><p>Explanation</p><ol><li><p><code>docker exec</code> This runs a command inside a running Docker container.</p><ol><li><p><code>-i</code>: Keeps the input stream open so the SQL script can be passed to the psql command.</p></li><li><p><code>-e PGPASSWORD=$DB_PASSWORD</code>: Sets the PGPASSWORD environment variable inside the container. PostgreSQL uses this variable for authentication, so you don&#8217;t need to type the password interactively.</p></li><li><p><code>$DB_CONTAINER</code>: Refers to the name of the container (postgres).</p></li></ol></li><li><p><code>psql</code> is the <a href="https://www.postgresql.org/docs/current/app-psql.html">PostgreSQL command-line tool</a>. It connects to the database and executes SQL commands.</p><ol><li><p><code>-U $DB_USER</code>: Specifies the database username (rpuser).</p></li><li><p><code>-d $DB_NAME</code>: Specifies the database name to connect to (reportportal).</p></li><li><p><code>&lt; reportportal_docker_db_backup.sql</code>: Redirects the contents of the SQL backup file (reportportal_docker_db_backup.sql) as input to psql. This restores the database from the backup file.</p></li></ol></li><li><p>Redirect Output with <code>&gt; upgrade_db.log 2&gt;&amp;1</code></p><ol><li><p><code>&gt;</code>: Redirects the standard output of the command (success messages, etc.) to a file called upgrade_db.log.</p></li><li><p><code>2&gt;&amp;1</code>: Redirects the standard error (error messages) to the same file (upgrade_db.log) as the standard output. This captures all logs (success and errors) into a single file.</p></li></ol></li></ol><p>To verify the data is indeed restored, we should check the contents of the upgrade_db.log file</p><p>Also, you can connect to the postgres db server</p><p>Connect to the docker container</p><pre><code>docker exec -it postgres bash</code></pre><p>Open psql</p><pre><code>psql -U rpuser -d reportportal</code></pre><p>When prompted for the password, enter the postgres password from the docker-compose.yml file or the new one if you have reset it</p><p>Check if the below tables have values:</p><pre><code>SELECT * FROM test_item limit 20;

SELECT * FROM test_item_results limit 20;</code></pre><h2>Start all other services</h2><p>Next, we should bring up all the other containers</p><pre><code>docker compose -p reportportal up -d</code></pre><h2>Restore binary data</h2><p>Finally, let's restore binary data as well</p><pre><code>VOLUME_NAME=reportportal_storage

docker run --rm -v $VOLUME_NAME:/data -v $(pwd):/backup busybox tar -xzvf /backup/reportportal_storage_backup.tar.gz -C /</code></pre><p>We follow a similar process as the above to restore the gzip tar backup that we had taken back into minIO</p><p>Explanation</p><ol><li><p><code>docker run</code></p><ul><li><p>This command runs a temporary container from a specified image (busybox).</p></li></ul></li><li><p><code>--rm</code></p><ul><li><p>Automatically removes the container after it finishes running. This prevents leftover containers from cluttering the system.</p></li></ul></li><li><p><code>-v $VOLUME_NAME:/data</code></p><ul><li><p>Mounts a Docker volume named $VOLUME_NAME to the /data directory inside the container.</p></li><li><p>This allows the container to interact with the Docker volume's data.</p></li></ul></li><li><p><code>-v $(pwd):/backup</code></p><ul><li><p>Mounts the current working directory (represented by $(pwd)) to the /backup directory inside the container.</p></li><li><p>This makes files in the current directory, like the backup file, accessible to the container.</p></li></ul></li><li><p><code>busybox</code></p><ul><li><p>Specifies the Docker image to use for the container.</p></li><li><p>busybox is a lightweight image commonly used for basic utilities like file operations.</p></li></ul></li><li><p><code>tar -xzvf /backup/reportportal_storage_backup.tar.gz</code></p><ul><li><p>tar is a command-line tool used to extract files from archives.</p><ul><li><p><strong>-x</strong>: Extracts the files.</p></li><li><p><strong>-z</strong>: Handles .gz (gzip-compressed) files.</p></li><li><p><strong>-v</strong>: Enables verbose mode, showing the files being extracted.</p></li><li><p><strong>-f</strong>: Specifies the input file, in this case, /backup/reportportal_storage_backup.tar.gz.</p></li></ul></li></ul></li><li><p><code>-C /</code></p><ul><li><p>Changes the target directory for extraction to / (the root directory inside the container).</p></li><li><p>Files from the archive are extracted to their corresponding locations in /.</p></li></ul></li></ol><p>And you are done! &#127881;</p><p>Congratulation! You have successfully managed to take a backup, upgrade the instance, and restore it all back now.</p><p>To verify login to ReportPortal <a href="http://localhost:8080/ui/">http://localhost:8080/ui/</a> and check your launches, filters, and dashboards are all available</p><h2>Connect to Postgres from the host machine</h2><p>To verify if we can connect to <a href="https://www.postgresql.org/download/macosx/">Postgres</a> running inside the docker container, you will need postgres on your local machine, on mac you can use homebrew to install</p><pre><code>brew install postgresql@16</code></pre><pre><code># Postgresql
export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/postgresql@16/lib"
export CPPFLAGS="-I/opt/homebrew/opt/postgresql@16/include"</code></pre><p>Then start the postgres service</p><pre><code>brew services start postgresql@16</code></pre><p>You can connect to Postgres from any client (like <a href="https://dbeaver.io/">DBeaver</a>) by using the below details</p><pre><code>jdbc:postgresql://192.168.29.131:5432/reportportal
User name: rpuser
Password: rppass</code></pre><p>Or, from the host machine, you can also connect to the PostgreSQL instance using psql to ensure the port is accessible:</p><pre><code>psql -h localhost -p 5432 -U rpuser -d reportportal</code></pre><h2>OpenSearch dashboards</h2><p>To test access to OpenSearch, you can hit <code>http://&lt;host_ip&gt;:9200</code></p><p>This should print details about the OpenSearch cluster</p><pre><code>{
  "name": "0fdbaba7ac12",
  "cluster_name": "docker-cluster",
  "cluster_uuid": "R0DM_scOSRuB0kba7Q6rGw",
  "version": {
    "distribution": "opensearch",
    "number": "2.16.0",
    "build_type": "tar",
    "build_hash": "f84a26e76807ea67a69822c37b1a1d89e7177d9b",
    "build_date": "2024-08-06T20:32:34.547531562Z",
    "build_snapshot": false,
    "lucene_version": "9.11.1",
    "minimum_wire_compatibility_version": "7.10.0",
    "minimum_index_compatibility_version": "7.0.0"
  },
  "tagline": "The OpenSearch Project: https://opensearch.org/"
}</code></pre><p>Finally, you can open OpenSearch Dashboards via <code>http://&lt;host_ip&gt;:5601</code></p><h2>Summary</h2><p>Let&#8217;s conclude on the workflow we learned today</p><ol><li><p><strong>Backup Postgres:</strong> Use the pg_dump command inside the Docker container to create an SQL file of your database.</p></li><li><p><strong>Backup Binary Data:</strong> Create a compressed tar archive of your Minio data using the Docker run command.</p></li><li><p><strong>Remove Existing Containers:</strong> Use docker-compose down to stop and remove all running containers. (Optional: Remove Postgres volume for a clean database.)</p></li><li><p><strong>Modify docker-compose.yml:</strong> Update versions, expose ports, or add new components like OpenSearch.</p></li><li><p><strong>Start Postgres:</strong> Use docker-compose up to start the Postgres container.</p></li><li><p><strong>Restore Postgres Data:</strong> Use the psql command to restore data from the backup SQL file.</p></li><li><p><strong>Start Remaining Services:</strong> Bring up all other containers with docker-compose up.</p></li><li><p><strong>Restore Binary Data:</strong> Extract the tar archive into the Minio volume using the Docker run command.</p></li><li><p><strong>Verify</strong>: Check ReportPortal, Postgres, and OpenSearch to ensure data and functionality are restored.</p></li></ol><p>Thanks for the time you spent reading this &#128588;. If you found this post helpful, please subscribe to the <a href="https://newsletter.automationhacks.io/">newsletter</a> and follow my YouTube channel (@automationhacks) for more insights into software testing and automation. Until next time &#128075;, Happy Testing &#128373;&#127995; and Learning! &#127793;| <a href="https://newsletter.automationhacks.io/">Substack</a> | <a href="https://www.youtube.com/@automationhacks">YouTube</a> | <a href="https://automationhacks.io/">Blog</a> | <a href="https://www.linkedin.com/in/automationhacks/">LinkedIn</a> | <a href="https://twitter.com/automationhacks">X</a> | <a href="https://bsky.app/profile/automationhacks.bsky.social">BlueSky</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.automationhacks.io/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">automation hacks is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>