<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Rohan Ranade</title>
    <link>https://rohanranade.me/</link>
    <description>My very own thoughts on technology and engineering management</description>
    <pubDate>Wed, 08 Apr 2026 23:11:26 +0000</pubDate>
    <image>
      <url>https://i.snap.as/a1PQs9vf.png</url>
      <title>Rohan Ranade</title>
      <link>https://rohanranade.me/</link>
    </image>
    <item>
      <title>Three metrics for tracking sprint execution</title>
      <link>https://rohanranade.me/three-metrics-for-tracking-sprint-execution?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[&#xA;&#xA;For the longest time, I’ve been looking for a lightweight but meaningful way to gauge how my team is doing when it comes to execution. Over the years, I’ve tried many approaches, but one framework has stuck with me because of how much signal it gives for how a team is really operating. I was introduced to this framework at Marqeta by Kim Stroeger (thanks, Kim!) and I have been using it ever since.&#xA;&#xA;!--more--&#xA;&#xA;The metrics&#xA;&#xA;Every sprint, I track three simple metrics for my team:&#xA;&#xA;Say/Do&#xA;&#xA;This one’s about reliability. It’s the ratio of the number of tasks completed in the sprint to the number of tasks the team committed to when planning it.&#xA;&#xA;  Say/Do = (# of committed tasks completed) / (# of committed tasks at sprint start)&#xA;&#xA;For example, if we start a sprint with 10 committed tasks and complete 6 of them, our Say/Do is 60%. A high Say/Do over time usually means the team understands its capacity well and follows through on its commitments. A low Say/Do can flag problems with estimation, unexpected churn, or unclear priorities.&#xA;&#xA;Churn&#xA;&#xA;Churn measures how much the plan changes after the sprint starts. If we added 2 tasks mid-sprint and removed 1 from the original plan of 10, our churn would be 30%.&#xA;&#xA;  Churn = ( (# of tasks added after sprint start) + (# of tasks removed after sprint start) ) / (# of committed tasks at sprint start)&#xA;&#xA;Churn helps assess how stable the sprint plan was. If it’s consistently high, that might mean we’re discovering too much work after we start, or our sprint planning isn’t sufficiently informed.&#xA;&#xA;Total Done&#xA;&#xA;This one’s all about capacity understanding. It looks at the total work completed in the sprint — original tasks plus any added — relative to the original sprint plan.&#xA;&#xA;  *Total Done = (# of tasks completed\\\) / (# of committed tasks at sprint start)*&#xA;    \\\ includes tasks that were originally committed at sprint start and those added after&#xA;&#xA;If we start with 10 tasks, add 5, remove 1, and finish all 14, our total done is 140%. That might look great, but if it happens all the time, it could point to sandbagging or chronic under-commitment.&#xA;&#xA;Tracking and Usage&#xA;&#xA;I’ve written a small Google Apps Script that computes these metrics automatically based on our JIRA data (I’ll share that in a future post). But honestly, you can just as easily calculate these by looking at your sprint report in JIRA and doing the math by hand or in a spreadsheet.&#xA;&#xA;These metrics aren’t something I share with upper leadership. Not because they aren’t useful, but because numbers like these can be misused. It’s tempting to reduce a team’s performance to a percentage, and that’s almost always misleading.&#xA;&#xA;Instead, I use them for:&#xA;&#xA;Team retrospectives, to spark reflection.&#xA;My own sense of team health, so I can look for signs of overload, uncertainty, or process dysfunction.&#xA;&#xA;What they have revealed&#xA;&#xA;Here are some real patterns I’ve seen:&#xA;&#xA;Low Say/Do + High Churn: We’re committing to one thing and then getting pulled in other directions. Usually a signal that product owners and scrum masters need to prep better or that the team is in a reactive mode (like IT support). In the latter case, I’ve even recommended switching from Scrum to Kanban.&#xA;Low Say/Do + Low Churn: Our scope/capacity estimates are off. This is fixable with better estimation and planning.&#xA;High Total Done (  100%) regularly: We might be sandbagging — either under-committing or inflating estimates. Seen this more than once.&#xA;&#xA;A pinch of salt…&#xA;&#xA;If you’re an engineering manager or a scrum master, I encourage you to try tracking these and, more importantly, share the data with your team. Done right, this kind of reflection can massively improve how responsibly and confidently a team commits to work.&#xA;&#xA;But, please don’t make these mistakes:&#xA;&#xA;Don’t use numbers to judge: These metrics start conversations. They don’t tell the full story. I’ve seen teams with perfect Say/Do ratios that were gaming the system by hiding work on secret JIRA boards or backlogs. And I’ve seen teams with “bad” metrics absolutely crushing critical customer deliverables. Context matters more than percentages.&#xA;&#xA;Look for patterns, not one-offs: A low sprint Say/Do once? Probably fine. Three times in a row with a corresponding trend in churn? That’s something to dig into.&#xA;&#xA;Don’t let metrics override agility: It’s okay to change course mid-sprint if something high-impact comes up. Don’t reject that just to protect your churn number. The point of scrum is being agile, not being rigidly predictable.&#xA;&#xA;---&#xA;&#xA;These metrics are easy to track, simple to understand, and incredibly powerful when used with care. Just remember: they’re a mirror, not a scoreboard. Use them to see what’s really going on and to help your team get better every sprint.]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://i.snap.as/3FHgVpQC.png" alt=""/></p>

<p>For the longest time, I’ve been looking for a lightweight but meaningful way to gauge how my team is doing when it comes to execution. Over the years, I’ve tried many approaches, but one framework has stuck with me because of how much signal it gives for how a team is really operating. I was introduced to this framework at Marqeta by <a href="https://www.linkedin.com/in/stroeger/">Kim Stroeger</a> (thanks, Kim!) and I have been using it ever since.</p>



<h2 id="the-metrics" id="the-metrics">The metrics</h2>

<p>Every sprint, I track three simple metrics for my team:</p>

<h3 id="say-do" id="say-do">Say/Do</h3>

<p>This one’s about reliability. It’s the ratio of the number of tasks completed in the sprint to the number of tasks the team committed to when planning it.</p>

<blockquote><p><strong>Say/Do = (# of committed tasks completed) / (# of committed tasks at sprint start)</strong></p></blockquote>

<p>For example, if we start a sprint with 10 committed tasks and complete 6 of them, our Say/Do is 60%. A high Say/Do over time usually means the team understands its capacity well and follows through on its commitments. A low Say/Do can flag problems with estimation, unexpected churn, or unclear priorities.</p>

<h3 id="churn" id="churn">Churn</h3>

<p>Churn measures how much the plan changes after the sprint starts. If we added 2 tasks mid-sprint and removed 1 from the original plan of 10, our churn would be 30%.</p>

<blockquote><p><strong>Churn = ( (# of tasks added after sprint start) + (# of tasks removed after sprint start) ) / (# of committed tasks at sprint start)</strong></p></blockquote>

<p>Churn helps assess how stable the sprint plan was. If it’s consistently high, that might mean we’re discovering too much work after we start, or our sprint planning isn’t sufficiently informed.</p>

<h3 id="total-done" id="total-done">Total Done</h3>

<p>This one’s all about capacity understanding. It looks at the total work completed in the sprint — original tasks plus any added — relative to the original sprint plan.</p>

<blockquote><p><strong>Total Done = (# of tasks completed***) / (# of committed tasks at sprint start)</strong></p>

<p>*** includes tasks that were originally committed at sprint start and those added after</p></blockquote>

<p>If we start with 10 tasks, add 5, remove 1, and finish all 14, our total done is 140%. That might look great, but if it happens all the time, it could point to sandbagging or chronic under-commitment.</p>

<h2 id="tracking-and-usage" id="tracking-and-usage">Tracking and Usage</h2>

<p>I’ve written a small Google Apps Script that computes these metrics automatically based on our JIRA data (I’ll share that in a future post). But honestly, you can just as easily calculate these by looking at your sprint report in JIRA and doing the math by hand or in a spreadsheet.</p>

<p>These metrics aren’t something I share with upper leadership. Not because they aren’t useful, but because numbers like these can be <em>misused</em>. It’s tempting to reduce a team’s performance to a percentage, and that’s almost always misleading.</p>

<p>Instead, I use them for:</p>
<ul><li>Team retrospectives, to spark reflection.</li>
<li>My own sense of team health, so I can look for signs of overload, uncertainty, or process dysfunction.</li></ul>

<h2 id="what-they-have-revealed" id="what-they-have-revealed">What they have revealed</h2>

<p>Here are some real patterns I’ve seen:</p>
<ul><li><strong>Low Say/Do + High Churn</strong>: We’re committing to one thing and then getting pulled in other directions. Usually a signal that product owners and scrum masters need to prep better or that the team is in a reactive mode (like IT support). In the latter case, I’ve even recommended switching from Scrum to Kanban.</li>
<li><strong>Low Say/Do + Low Churn:</strong> Our scope/capacity estimates are off. This is fixable with better estimation and planning.</li>
<li><strong>High Total Done (&gt;100%) regularly:</strong> We might be sandbagging — either under-committing or inflating estimates. Seen this more than once.</li></ul>

<h2 id="a-pinch-of-salt" id="a-pinch-of-salt">A <em>pinch</em> of salt…</h2>

<p>If you’re an engineering manager or a scrum master, I encourage you to try tracking these and, more importantly, share the data with your team. Done right, this kind of reflection can massively improve how responsibly and confidently a team commits to work.</p>

<p>But, please don’t make these mistakes:</p>
<ol><li><p><strong>Don’t use numbers to judge:</strong> These metrics start conversations. They don’t tell the full story. I’ve seen teams with perfect Say/Do ratios that were gaming the system by hiding work on secret JIRA boards or backlogs. And I’ve seen teams with “bad” metrics absolutely crushing critical customer deliverables. Context matters more than percentages.</p></li>

<li><p><strong>Look for patterns, not one-offs:</strong> A low sprint Say/Do once? Probably fine. Three times in a row with a corresponding trend in churn? That’s something to dig into.</p></li>

<li><p><strong>Don’t let metrics override agility:</strong> It’s okay to change course mid-sprint if something high-impact comes up. Don’t reject that just to protect your churn number. The point of scrum is being agile, not being rigidly predictable.</p></li></ol>

<hr/>

<p>These metrics are easy to track, simple to understand, and incredibly powerful when used with care. Just remember: they’re a mirror, not a scoreboard. Use them to see what’s really going on and to help your team get better every sprint.</p>
]]></content:encoded>
      <guid>https://rohanranade.me/three-metrics-for-tracking-sprint-execution</guid>
      <pubDate>Sun, 08 Jun 2025 04:48:18 +0000</pubDate>
    </item>
    <item>
      <title>The Missteps That Undermine Senior Engineers at New Companies</title>
      <link>https://rohanranade.me/the-missteps-that-undermine-senior-engineers-at-new-companies?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[&#xA;&#xA;When a senior software engineer joins a new company, there’s often an unspoken expectation, sometimes even a belief, that they will hit the ground running, level up the team, and become an influential voice from day one.&#xA;&#xA;But in reality, many senior engineers end up torpedoing their own success within the first few months.&#xA;&#xA;Despite having deep experience and strong resumes, some struggle to adapt to their new environment. They unintentionally alienate their teammates, push ideas that don’t land, or adopt a work style that doesn’t fit the culture. And by the time the damage becomes visible, their long-term trajectory may already be off course.&#xA;&#xA;After watching this play out a few too many times, I’ve started recognizing a few common missteps that tend to sink reputations before they’ve had a chance to rise.&#xA;&#xA;!--more--&#xA;&#xA;Mistake 1: Expecting influence without earning trust&#xA;&#xA;At their previous companies, these engineers were trusted voices. Their suggestions carried weight. Their designs shaped systems. Their decisions often set direction.&#xA;&#xA;But when they join a new team, none of that past trust comes with them. And yet, some act as if it should.&#xA;&#xA;They challenge decisions without fully understanding the context behind them. They’re surprised when a junior engineer pushes back. In 1:1s, they vent about “not being accepted by the team” or “being met with resistance”. Meanwhile, existing team members quietly share their own frustrations: “They don’t understand how things work here!” or “They’re pushing ideas without really listening”.&#xA;&#xA;At the heart of it is a simple disconnect: influence isn’t granted. It’s earned. And trust takes time. The senior engineers who succeed are the ones who listen first, ask questions, and show respect for the team&#39;s context before offering their own perspective.&#xA;&#xA;Mistake 2: Copy-pasting solutions from past lives&#xA;&#xA;Another common misstep is trying to replicate technical patterns from previous jobs, without asking whether they make sense in this new context.&#xA;&#xA;I once worked with a senior engineer who had come from one of the FAANG companies. Early on, they proposed restructuring part of our Spring Boot app to make it more extensible for hypothetical use cases. While the design wasn’t inherently flawed, it introduced a lot of abstraction and complexity, for needs we weren’t even sure we had.&#xA;&#xA;It’s a classic example of prematurely optimizing for scale or flexibility because “that’s how we did it at ABC”. But what works at a 10,000 person company doesn’t always work at a 50 person one. B2B vs. B2C, early-stage vs. mature platform — all of those differences matter.&#xA;&#xA;A telltale sign is when suggestions begin with:&#xA;&#xA;“At my PREVIOUSCOMPANY, we used to …”&#xA;&#xA;That phrase alone isn’t persuasive. And if not backed by a thoughtful discussion of tradeoffs, it can quickly start to erode credibility.&#xA;&#xA;Mistake 3: Clinging to old work habits&#xA;&#xA;Sometimes the problem isn’t technical — it’s behavioral.&#xA;&#xA;In large companies, senior engineers often operate in narrower lanes. Architects may spend their time designing systems, not necessarily writing production code. On-call may be managed by a separate escalations or support team.&#xA;&#xA;But smaller companies, startups, or mission-oriented teams are different. Everyone codes. Everyone debugs. Everyone joins the on-call rotation. And participation in the culture is part of building trust.&#xA;&#xA;I’ve seen senior engineers show up, stay passive during incidents, and skip fun team rituals, all while acting like their heads are down on “real work.” But what their teammates see is someone who isn’t showing up for the team. Over time, this creates distance and that distance becomes career-limiting.&#xA;&#xA;What should managers do?&#xA;&#xA;As engineering managers, we’re often the first to spot the signs: mounting friction in meetings, rants about the new teammates in 1:1s.&#xA;&#xA;The instinct is often to step back and let things settle. But early intervention. done with care, can make all the difference.&#xA;&#xA;Here’s what I’ve found helpful:&#xA;&#xA;Set expectations explicitly. Don’t assume a senior engineer will automatically grasp what “being hands-on” means at your company. Be clear about expectations — from contributing to the codebase to engaging in the team culture.&#xA;Talk about these anti-patterns openly. Don’t tiptoe around it. It’s often helpful to have a candid conversation during onboarding about common traps that senior engineers fall into when switching jobs. Most appreciate the clarity. I have an explicit principle that I lay out for senior engineers in one of our initial 1:1s after they join — “The responsibility of adapting falls on the senior-most person in the situation”._ Whether it’s a meeting, a team, or a new org, seniority isn’t about being the loudest voice in the room. It’s about being the one who reads the room, adapts their style, and leads by example.&#xA;Facilitate trust-building, not just onboarding. Intros and documents are not enough. Pair the new engineers up on projects with existing team members. Encourage collaboration. Help them earn credibility through shared work.&#xA;Coach them on business and cultural context. Especially when engineers come from different industries or company stages, help them understand what’s different here. Business models shape engineering tradeoffs. Show them that lens.&#xA;Identify a “first win”. One of the best tools you have as a manager is shaping a 30-60-90 day plan that includes an early, achievable win. This gives the new hire momentum, helps them build trust quickly, and boosts their own sense of belonging.&#xA;Mediate early when there’s friction. If you’re hearing mismatched perspectives in your 1:1s, don’t ignore them. Get both sides talking — directly to each other. Translate intentions. Often, both parties are acting in good faith but speaking past each other.&#xA;&#xA;---&#xA;&#xA;It’s interesting to see that none of these missteps come from a place of bad intent. In fact, they usually come from a desire to help. But the habits and instincts that served someone well in their previous role don’t always carry over.&#xA;&#xA;The most successful senior engineers I’ve worked with are the ones who treat a new job not as a continuation of their last one, but as a clean slate. They join a new team with an eagerness to learn and contribute, rather than question and judge.&#xA;&#xA;No matter how much experience you bring to the table, a new role is a reputation reset and how you handle that reset makes all the difference.]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://i.snap.as/GM3t4J1j.png" alt=""/></p>

<p>When a senior software engineer joins a new company, there’s often an unspoken expectation, sometimes even a belief, that they will hit the ground running, level up the team, and become an influential voice from day one.</p>

<p>But in reality, many senior engineers end up torpedoing their own success within the first few months.</p>

<p>Despite having deep experience and strong resumes, some struggle to adapt to their new environment. They unintentionally alienate their teammates, push ideas that don’t land, or adopt a work style that doesn’t fit the culture. And by the time the damage becomes visible, their long-term trajectory may already be off course.</p>

<p>After watching this play out a few too many times, I’ve started recognizing a few common missteps that tend to sink reputations before they’ve had a chance to rise.</p>



<h2 id="mistake-1-expecting-influence-without-earning-trust" id="mistake-1-expecting-influence-without-earning-trust">Mistake 1: Expecting influence without earning trust</h2>

<p>At their previous companies, these engineers were trusted voices. Their suggestions carried weight. Their designs shaped systems. Their decisions often set direction.</p>

<p>But when they join a new team, none of that past trust comes with them. And yet, some act as if it should.</p>

<p>They challenge decisions without fully understanding the context behind them. They’re surprised when a junior engineer pushes back. In 1:1s, they vent about <em>“not being accepted by the team”</em> or <em>“being met with resistance”</em>. Meanwhile, existing team members quietly share their own frustrations: <em>“They don’t understand how things work here!”</em> or <em>“They’re pushing ideas without really listening”</em>.</p>

<p>At the heart of it is a simple disconnect: influence isn’t granted. It’s earned. And trust takes time. The senior engineers who succeed are the ones who listen first, ask questions, and show respect for the team&#39;s context before offering their own perspective.</p>

<h2 id="mistake-2-copy-pasting-solutions-from-past-lives" id="mistake-2-copy-pasting-solutions-from-past-lives">Mistake 2: Copy-pasting solutions from past lives</h2>

<p>Another common misstep is trying to replicate technical patterns from previous jobs, without asking whether they make sense in this new context.</p>

<p>I once worked with a senior engineer who had come from one of the FAANG companies. Early on, they proposed restructuring part of our Spring Boot app to make it more extensible for hypothetical use cases. While the design wasn’t inherently flawed, it introduced a lot of abstraction and complexity, for needs we weren’t even sure we had.</p>

<p>It’s a classic example of prematurely optimizing for scale or flexibility because <em>“that’s how we did it at ABC”</em>. But what works at a 10,000 person company doesn’t always work at a 50 person one. B2B vs. B2C, early-stage vs. mature platform — all of those differences matter.</p>

<p>A telltale sign is when suggestions begin with:</p>

<p><em>“At my PREVIOUS</em>COMPANY, we used to …”_</p>

<p>That phrase alone isn’t persuasive. And if not backed by a thoughtful discussion of tradeoffs, it can quickly start to erode credibility.</p>

<h2 id="mistake-3-clinging-to-old-work-habits" id="mistake-3-clinging-to-old-work-habits">Mistake 3: Clinging to old work habits</h2>

<p>Sometimes the problem isn’t technical — it’s behavioral.</p>

<p>In large companies, senior engineers often operate in narrower lanes. Architects may spend their time designing systems, not necessarily writing production code. On-call may be managed by a separate escalations or support team.</p>

<p>But smaller companies, startups, or mission-oriented teams are different. Everyone codes. Everyone debugs. Everyone joins the on-call rotation. And participation in the culture is part of building trust.</p>

<p>I’ve seen senior engineers show up, stay passive during incidents, and skip fun team rituals, all while acting like their heads are down on “real work.” But what their teammates see is someone who isn’t showing up for the team. Over time, this creates distance and that distance becomes career-limiting.</p>

<h2 id="what-should-managers-do" id="what-should-managers-do">What should managers do?</h2>

<p>As engineering managers, we’re often the first to spot the signs: mounting friction in meetings, rants about the new teammates in 1:1s.</p>

<p>The instinct is often to step back and let things settle. But early intervention. done with care, can make all the difference.</p>

<p>Here’s what I’ve found helpful:</p>
<ul><li><strong>Set expectations explicitly.</strong> Don’t assume a senior engineer will automatically grasp what <em>“being hands-on”</em> means at your company. Be clear about expectations — from contributing to the codebase to engaging in the team culture.</li>
<li><strong>Talk about these anti-patterns openly.</strong> Don’t tiptoe around it. It’s often helpful to have a candid conversation during onboarding about common traps that senior engineers fall into when switching jobs. Most appreciate the clarity. I have an explicit principle that I lay out for senior engineers in one of our initial 1:1s after they join — <em>“The responsibility of adapting falls on the senior-most person in the situation”.</em> Whether it’s a meeting, a team, or a new org, seniority isn’t about being the loudest voice in the room. It’s about being the one who reads the room, adapts their style, and leads by example.</li>
<li><strong>Facilitate trust-building</strong>, not just onboarding. Intros and documents are not enough. Pair the new engineers up on projects with existing team members. Encourage collaboration. Help them earn credibility through shared work.</li>
<li><strong>Coach them on business and cultural context</strong>. Especially when engineers come from different industries or company stages, help them understand what’s different here. Business models shape engineering tradeoffs. Show them that lens.</li>
<li><strong>Identify a “first win”</strong>. One of the best tools you have as a manager is shaping a 30-60-90 day plan that includes an early, achievable win. This gives the new hire momentum, helps them build trust quickly, and boosts their own sense of belonging.</li>
<li><strong>Mediate early</strong> when there’s friction. If you’re hearing mismatched perspectives in your 1:1s, don’t ignore them. Get both sides talking — directly to each other. Translate intentions. Often, both parties are acting in good faith but speaking past each other.</li></ul>

<hr/>

<p>It’s interesting to see that none of these missteps come from a place of bad intent. In fact, they usually come from a desire to help. But the habits and instincts that served someone well in their previous role don’t always carry over.</p>

<p>The most successful senior engineers I’ve worked with are the ones who treat a new job not as a continuation of their last one, but as a clean slate. They join a new team with an eagerness to learn and contribute, rather than question and judge.</p>

<p>No matter how much experience you bring to the table, a new role is a reputation reset and how you handle that reset makes all the difference.</p>
]]></content:encoded>
      <guid>https://rohanranade.me/the-missteps-that-undermine-senior-engineers-at-new-companies</guid>
      <pubDate>Mon, 19 May 2025 06:04:25 +0000</pubDate>
    </item>
    <item>
      <title>Last Impressions Are Everlasting!</title>
      <link>https://rohanranade.me/last-impressions-are-everlasting?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[&#xA;&#xA;There’s a lot of advice out there about how to make a great first impression. But not enough people talk about the last impression. How you leave a team or a company can often define how you’re remembered, far more than you think.&#xA;&#xA;When engineers are on their way out, whether it&#39;s for a better opportunity or just time for a change, there&#39;s a temptation to mentally check out. “I’m done here” they think. But your reputation doesn’t stop the day you resign. In fact, the way you handle those last few days or weeks can either seal the good reputation you’ve built, or destroy it in a flash.&#xA;&#xA;!--more--&#xA;&#xA;A while back, an engineer reporting to me gave notice. Totally fair. People move on. But from the moment they resigned, they switched off. No-shows in daily standups. Hours to respond to Slack messages, if at all. The rest of the team picked up the slack while they coasted, thinking no one would notice. People did notice. What could’ve been a respected send-off turned into a silent goodbye, and a reputation that took a hit.&#xA;&#xA;Now, contrast that with something from my own journey. Back in 2005, I was wrapping up my time at Philips Semiconductors in Bangalore. Three days before my last day, I was up till 1 AM in the lab, determined to fix a tricky bug in the MOV file decoder I had been working on for the past several days. I wasn’t chasing praise or some final reward. I just wanted to hand off something complete and solid. The next day, I passed it along proudly to my teammate. To this day, that’s one of my proudest exits.&#xA;&#xA;Break your reputation or leave like a pro!&#xA;&#xA;If you’re ever thinking of leaving, here’s what not to do if you care about the name you leave behind:&#xA;&#xA;Slacking Off: Disengaging, missing meetings, being hard to reach.&#xA;Negative Talk: Complaining about the team, product, or leadership on your way out.&#xA;Withholding Knowledge: Leaving gaps in documentation, not sharing important context.&#xA;&#xA;These behaviors not only make life harder for your team, but they can also follow you. Tech is a small world, you never know when you’ll cross paths with former teammates again.&#xA;&#xA;Now, here’s how to leave with your head high:&#xA;&#xA;Stay Engaged: Show up, contribute, help the team move forward, even if you&#39;re leaving.&#xA;Help Out: Offer to assist in the transition, answer questions, and support your teammates.&#xA;Document Thoroughly: Write down everything someone will need to pick up where you left off.&#xA;Be Professional: Keep your tone positive, avoid gossip, and end on a respectful note.&#xA;&#xA;Leaving gracefully isn’t just about your current team. It’s about the reputation that follows you to your next role.&#xA;&#xA;If you’re a manager who’s moving on, the stakes are even higher. You’re not just handing off your own work, you’re responsible for setting your team up for success after you’re gone.&#xA;&#xA;Here are a few things you must consider:&#xA;&#xA;Prioritize Your Team’s Future: Try to complete or at least contribute to performance reviews for your direct reports before you leave. It’s a small effort that shows big care.&#xA;Leave a Strong Context Trail: Thoroughly document ongoing initiatives, challenges, team dynamics, and key technical or strategic decisions. Your replacement will thank you.&#xA;Don’t Rush the Exit: Give plenty of time for the handoff. A thoughtful, deliberate transition makes your departure feel like a professional move, not an escape.&#xA;&#xA;How you exit as a manager reflects not just on you, but on your leadership style. Take the time to close out your chapter with care.&#xA;&#xA;---&#xA;&#xA;I’ve seen both kinds of exits as a manager, and I can tell you, those who leave like professionals are remembered fondly. Their contributions live on, and they’re the ones I’d gladly work with again in the future. Those who burn bridges? Well, it’s hard to forget those, too.&#xA;&#xA;Your last impression might just be the one people remember the most. Make it count.]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://i.snap.as/kOIUSI6r.png" alt=""/></p>

<p>There’s a lot of advice out there about how to make a great <em>first</em> impression. But not enough people talk about the <em>last</em> impression. How you leave a team or a company can often define how you’re remembered, far more than you think.</p>

<p>When engineers are on their way out, whether it&#39;s for a better opportunity or just time for a change, there&#39;s a temptation to mentally check out. <em>“I’m done here”</em> they think. But your reputation doesn’t stop the day you resign. In fact, the way you handle those last few days or weeks can either seal the good reputation you’ve built, or destroy it in a flash.</p>



<p>A while back, an engineer reporting to me gave notice. Totally fair. People move on. But from the moment they resigned, they switched off. No-shows in daily standups. Hours to respond to Slack messages, if at all. The rest of the team picked up the slack while they coasted, thinking no one would notice. People <em>did</em> notice. What could’ve been a respected send-off turned into a silent goodbye, and a reputation that took a hit.</p>

<p>Now, contrast that with something from my own journey. Back in 2005, I was wrapping up my time at Philips Semiconductors in Bangalore. Three days before my last day, I was up till 1 AM in the lab, determined to fix a tricky bug in the MOV file decoder I had been working on for the past several days. I wasn’t chasing praise or some final reward. I just wanted to hand off something complete and solid. The next day, I passed it along proudly to my teammate. To this day, that’s one of my proudest exits.</p>

<h2 id="break-your-reputation-or-leave-like-a-pro" id="break-your-reputation-or-leave-like-a-pro">Break your reputation <em>or</em> leave like a pro!</h2>

<p>If you’re ever thinking of leaving, here’s what <em>not</em> to do if you care about the name you leave behind:</p>
<ul><li><strong>Slacking Off</strong>: Disengaging, missing meetings, being hard to reach.</li>
<li><strong>Negative Talk</strong>: Complaining about the team, product, or leadership on your way out.</li>
<li><strong>Withholding Knowledge</strong>: Leaving gaps in documentation, not sharing important context.</li></ul>

<p>These behaviors not only make life harder for your team, but they can also follow you. Tech is a small world, you never know when you’ll cross paths with former teammates again.</p>

<p>Now, here’s how to leave with your head high:</p>
<ul><li><strong>Stay Engaged</strong>: Show up, contribute, help the team move forward, even if you&#39;re leaving.</li>
<li><strong>Help Out</strong>: Offer to assist in the transition, answer questions, and support your teammates.</li>
<li><strong>Document Thoroughly</strong>: Write down everything someone will need to pick up where you left off.</li>
<li><strong>Be Professional</strong>: Keep your tone positive, avoid gossip, and end on a respectful note.</li></ul>

<p>Leaving gracefully isn’t just about your current team. It’s about the reputation that follows you to your next role.</p>

<p>If you’re a manager who’s moving on, the stakes are even higher. You’re not just handing off your own work, you’re responsible for setting your team up for success after you’re gone.</p>

<p>Here are a few things you <em><strong>must</strong></em> consider:</p>
<ul><li><strong>Prioritize Your Team’s Future</strong>: Try to complete or at least contribute to performance reviews for your direct reports before you leave. It’s a small effort that shows big care.</li>
<li><strong>Leave a Strong Context Trail</strong>: Thoroughly document ongoing initiatives, challenges, team dynamics, and key technical or strategic decisions. Your replacement will thank you.</li>
<li><strong>Don’t Rush the Exit</strong>: Give plenty of time for the handoff. A thoughtful, deliberate transition makes your departure feel like a professional move, not an escape.</li></ul>

<p>How you exit as a manager reflects not just on you, but on your leadership style. Take the time to close out your chapter with care.</p>

<hr/>

<p>I’ve seen both kinds of exits as a manager, and I can tell you, those who leave like professionals are remembered fondly. Their contributions live on, and they’re the ones I’d gladly work with again in the future. Those who burn bridges? Well, it’s hard to forget those, too.</p>

<p>Your last impression might just be the one people remember the most. <em><strong>Make it count.</strong></em></p>
]]></content:encoded>
      <guid>https://rohanranade.me/last-impressions-are-everlasting</guid>
      <pubDate>Sun, 27 Apr 2025 23:34:52 +0000</pubDate>
    </item>
    <item>
      <title>Tiny Slips, Lasting Stains: How Bad Code Hygiene Dents Your Reputation</title>
      <link>https://rohanranade.me/tiny-slips-lasting-stains-how-bad-code-hygiene-dents-your-reputation?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[&#xA;&#xA;Today, I want to talk about a silent killer of software engineer reputations — bad coding hygiene.&#xA;&#xA;I’ve seen it happen over and over again. A new engineer joins the team, eager to start strong. They dive into the code, push a few commits, open their first pull request… and then it hits. Reviewers look at the code and find a mess: test cases that don’t follow naming conventions, i and j used as variable names, dead code hanging around like forgotten leftovers, unformatted blocks of logic, and the classic — TODOs that scream “I didn’t finish this but please merge anyway.”&#xA;&#xA;!--more--&#xA;&#xA;Now here’s the thing: none of these issues are rocket science. They’re not even “hard” problems. These are the little things. The basics. And yet, they leave a big impression. Not a good one.&#xA;&#xA;Why does this happen?&#xA;&#xA;Sometimes it’s because the engineer came from a place where no one cared (surprisingly I have observed a pattern here — early stage startups where founders over emphasized “moving fast”). They weren’t used to teams that hold high bars, so they think these “little things” are just unnecessary ceremony.&#xA;&#xA;Other times, they just don’t bother reading the docs or understanding the conventions already in place. They get their task, write code in a vacuum, and call it a day — not realizing that the team sees more than just functionality. They see craft.&#xA;&#xA;And then there are the “I only care about my task” types. These engineers slap their changes into the codebase with zero awareness of what’s around them. Their PRs not only break hygiene — they break cohesion. And if you look deeper, their work often shows bigger problems: poor design choices, fragile abstractions, and code that doesn&#39;t feel like it belongs.&#xA;&#xA;And finally, some folks just think, “That’s what reviewers are for, right?” Nope. Reviewers aren’t your personal quality assurance team. They’re collaborators, not cleanup crew.&#xA;&#xA;How does the team respond?&#xA;&#xA;On healthy teams, this kind of behavior gets flagged right away. It comes up in PR comments, in 1:1s, maybe even escalates if needed. And that’s a good thing — teams that care about quality should hold the bar.&#xA;&#xA;But on teams where management is distracted, overly political, or simply doesn’t want to rock the boat? It gets brushed aside. That’s when the rot sets in. Quality slips. Trust erodes. Morale drops. And soon, the team starts normalizing mediocrity.&#xA;&#xA;Why it matters&#xA;&#xA;If you’re a new engineer, here’s the real talk: you are building your personal brand from day one (HT to Adan Amarillas who introduced me to this concept of an engineer’s personal brand). Your teammates are watching — not because they’re judging, but because they’re learning whether they can count on you. Can they trust your code? Will you leave things better than you found them? Do you care?&#xA;&#xA;If your first impression is “I don’t bother with the basics,” then don’t be surprised when you don’t get the meaty projects, or when feedback about your work is lukewarm. You’re not just writing code — you’re telling your team how seriously you take your craft.&#xA;&#xA;And if you’re a manager, here’s your part: don’t ignore this. If someone’s not willing to do the little things right, why would you trust them with the big things? Protecting them, excusing them, or just staying silent doesn’t help them — and it definitely doesn’t help your team.&#xA;&#xA;Clean code isn’t about perfection. It’s about respect — for the craft, the team, and the product. And it’s one of the easiest ways to show that you give a damn.&#xA;&#xA;Ultimately, you are what you ship.]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://i.snap.as/lsDPCcO2.png" alt=""/></p>

<p>Today, I want to talk about a silent killer of software engineer reputations — <strong>bad coding hygiene</strong>.</p>

<p>I’ve seen it happen over and over again. A new engineer joins the team, eager to start strong. They dive into the code, push a few commits, open their first pull request… and then it hits. Reviewers look at the code and find a mess: test cases that don’t follow naming conventions, <em>i</em> and <em>j</em> used as variable names, dead code hanging around like forgotten leftovers, unformatted blocks of logic, and the classic — TODOs that scream “I didn’t finish this but please merge anyway.”</p>



<p>Now here’s the thing: none of these issues are rocket science. They’re not even “hard” problems. These are the little things. The basics. And yet, they leave a big impression. Not a good one.</p>

<h3 id="why-does-this-happen" id="why-does-this-happen">Why does this happen?</h3>

<p>Sometimes it’s because the engineer came from a place where no one cared <em>(surprisingly I have observed a pattern here — early stage startups where founders over emphasized “moving fast”)</em>. They weren’t used to teams that hold high bars, so they think these “little things” are just unnecessary ceremony.</p>

<p>Other times, they just don’t bother reading the docs or understanding the conventions already in place. They get their task, write code in a vacuum, and call it a day — not realizing that the team sees more than just functionality. They see <em>craft</em>.</p>

<p>And then there are the <em>“I only care about my task”</em> types. These engineers slap their changes into the codebase with zero awareness of what’s around them. Their PRs not only break hygiene — they break cohesion. And if you look deeper, their work often shows bigger problems: poor design choices, fragile abstractions, and code that doesn&#39;t feel like it belongs.</p>

<p>And finally, some folks just think, <em>“That’s what reviewers are for, right?”</em> Nope. Reviewers aren’t your personal quality assurance team. They’re collaborators, not cleanup crew.</p>

<h3 id="how-does-the-team-respond" id="how-does-the-team-respond">How does the team respond?</h3>

<p>On healthy teams, this kind of behavior gets flagged right away. It comes up in PR comments, in 1:1s, maybe even escalates if needed. And that’s a good thing — teams that care about quality <em>should</em> hold the bar.</p>

<p>But on teams where management is distracted, overly political, or simply doesn’t want to rock the boat? It gets brushed aside. That’s when the rot sets in. Quality slips. Trust erodes. Morale drops. And soon, the team starts normalizing mediocrity.</p>

<h3 id="why-it-matters" id="why-it-matters">Why it matters</h3>

<p>If you’re a new engineer, here’s the real talk: <em>**you are building your personal brand from day one **</em>(HT to <a href="https://www.linkedin.com/in/adan-amarillas/">Adan Amarillas</a> who introduced me to this concept of an engineer’s personal brand)<em>.</em> Your teammates are watching — not because they’re judging, but because they’re learning whether they can count on you. Can they trust your code? Will you leave things better than you found them? <em><strong>Do you</strong></em> <em><strong>care</strong></em>?</p>

<p>If your first impression is “I don’t bother with the basics,” then don’t be surprised when you don’t get the meaty projects, or when feedback about your work is lukewarm. You’re not just writing code — you’re telling your team how seriously you take your craft.</p>

<p>And if you’re a manager, here’s your part: don’t ignore this. If someone’s not willing to do the little things right, why would you trust them with the big things? Protecting them, excusing them, or just staying silent doesn’t help them — and it definitely doesn’t help your team.</p>

<p>Clean code isn’t about perfection. It’s about respect — for the craft, the team, and the product. And it’s one of the easiest ways to show that you give a damn.</p>

<p>Ultimately, <em>you are what you ship</em>.</p>
]]></content:encoded>
      <guid>https://rohanranade.me/tiny-slips-lasting-stains-how-bad-code-hygiene-dents-your-reputation</guid>
      <pubDate>Sat, 12 Apr 2025 19:07:52 +0000</pubDate>
    </item>
    <item>
      <title>Tracking knowledge spread to strengthen engineering teams</title>
      <link>https://rohanranade.me/tracking-knowledge-spread-to-strengthen-engineering-teams?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[&#xA;&#xA;When I take on managing a new engineering team, whether by inheriting an existing one or hiring from scratch, one of the first things I do is create a Team Knowledge Density document. This document helps me understand how knowledge is distributed across the team, identify areas where expertise is siloed, and take action to mitigate risks. Over the years, it has proven to be one of my most effective tools for setting up teams for success.&#xA;&#xA;!--more--&#xA;&#xA;Why I Created This Document&#xA;&#xA;I started using this approach after a key engineer left one of my teams shortly after I joined. Their departure left behind a knowledge gap that was difficult to identify and address in real time. Since then, I’ve made it a practice to proactively map out the team’s knowledge areas early on, so that I can take action before such gaps become critical issues.&#xA;&#xA;What the Document Captures&#xA;&#xA;The Team Knowledge Density document is a structured record of:&#xA;&#xA;Key knowledge areas in the team’s primary domain that the team needs to deliver.&#xA;&#xA;Individual knowledge levels in each area, categorized as:&#xA;&#xA;   Newcomer – No prior experience in the area&#xA;   Competent – Some familiarity but needs support for larger tasks&#xA;   Expert – Deep knowledge, capable of handling tasks independently and strategically&#xA;&#xA;Connected domains – Areas owned by other teams but important for cross-team collaboration (e.g., APIs, services, or dependencies that the team relies on)&#xA;&#xA;This document is typically maintained as a shared table where each row represents a knowledge area, and each engineer self-assesses their proficiency level.&#xA;&#xA;---&#xA;&#xA;An Example: The Knowledge Density Document in Action&#xA;&#xA;To illustrate, let’s consider a hypothetical Payments Engineering Team responsible for payment processing, fraud detection, and transaction reconciliation.&#xA;&#xA;Primary Knowledge Areas&#xA;&#xA;Connected Knowledge Areas&#xA;&#xA;---&#xA;&#xA;Looking at the example above, a few key insights stand out:&#xA;&#xA;Knowledge Silos – Alice is the only expert in Payment Gateway integration and Refund &amp; Dispute Handling. This presents a risk—if Alice is unavailable, the team may struggle to maintain these critical systems.&#xA;&#xA;Gaps in Connected Domains – Bank Compliance is a key area that the team interacts with, yet multiple engineers are newcomers in this space. This could slow down work that interfaces with this area.&#xA;&#xA;Opportunities for Knowledge Sharing – Diana has expert knowledge in ledger reconciliation. This is a great opportunity for them to mentor others and spread knowledge in this space.&#xA;&#xA;With this information, I can now take action to close these gaps.&#xA;&#xA;How I Build and Maintain This Document&#xA;&#xA;Interviewing Engineers – When I join a new team, I first interview engineers to identify key knowledge areas based on the team’s charter.&#xA;&#xA;Self-Assessments – Each engineer assesses their knowledge level for these areas.&#xA;&#xA;Quarterly Updates – I revisit the document every quarter, updating it based on my observations and validating changes in 1:1s.&#xA;&#xA;Once the document is in place, it becomes an actionable tool rather than just a static reference. I use it to:&#xA;&#xA;Close Knowledge Silos – If only one person is an expert in a critical area, I find opportunities for others to work on projects in that space or arrange knowledge-sharing sessions.&#xA;Create Development Goals – New team members can use this document to identify areas to ramp up on.&#xA;Advocate for Team Growth – In one case, the document revealed that the team was responsible for too many knowledge areas, helping me make a case for additional headcount and splitting the team into two.&#xA;Prioritize Learning Investments – When I discovered that no one on the team had expertise in certain parts of the codebase, I used this document to align with my product counterpart and carve out roadmap time for engineers to learn and build knowledge.&#xA;&#xA;A document like this requires careful communication. I always clarify upfront that this is not a performance review tool — it’s a way to help the team succeed, which in turn supports each individual’s success. I also keep the document public within the team, so engineers know who to reach out to when they need help on specific topics, especially in urgent situations.&#xA;&#xA;If you want to do this in your team…&#xA;&#xA;If you want to implement a similar approach for your team, here’s what I recommend:&#xA;&#xA;Involve the team in building it – Let engineers contribute to defining knowledge areas and self-assessing their expertise.&#xA;&#xA;Frame it as a tool for team success – Set clear expectations that this is not a performance evaluation, but rather a way to identify opportunities for growth and reduce risk.&#xA;&#xA;Use it to drive meaningful action – Don’t just create the document — use it to plan knowledge sharing, advocate for team resources, and ensure resilience in critical areas.&#xA;&#xA;By consistently using this document, I’ve been able to proactively strengthen teams, improve collaboration, and create a more resilient engineering organization. I hope this tool helps you achieve the same for your teams!]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://i.snap.as/3f8Gusgr.jpeg" alt=""/></p>

<p>When I take on managing a new engineering team, whether by inheriting an existing one or hiring from scratch, one of the first things I do is create a <strong>Team Knowledge Density</strong> document. This document helps me understand how knowledge is distributed across the team, identify areas where expertise is siloed, and take action to mitigate risks. Over the years, it has proven to be one of my most effective tools for setting up teams for success.</p>



<h2 id="why-i-created-this-document" id="why-i-created-this-document">Why I Created This Document</h2>

<p>I started using this approach after a key engineer left one of my teams shortly after I joined. Their departure left behind a knowledge gap that was difficult to identify and address in real time. Since then, I’ve made it a practice to proactively map out the team’s knowledge areas early on, so that I can take action before such gaps become critical issues.</p>

<h2 id="what-the-document-captures" id="what-the-document-captures">What the Document Captures</h2>

<p>The Team Knowledge Density document is a structured record of:</p>
<ol><li><p><strong>Key knowledge areas</strong> in the team’s primary domain that the team needs to deliver.</p></li>

<li><p><strong>Individual knowledge levels</strong> in each area, categorized as:</p>
<ul><li><strong>Newcomer</strong> – No prior experience in the area</li>
<li><strong>Competent</strong> – Some familiarity but needs support for larger tasks</li>
<li><strong>Expert</strong> – Deep knowledge, capable of handling tasks independently and strategically</li></ul></li>

<li><p><strong>Connected domains</strong> – Areas owned by other teams but important for cross-team collaboration (e.g., APIs, services, or dependencies that the team relies on)</p></li></ol>

<p>This document is typically maintained as a shared table where each row represents a knowledge area, and each engineer self-assesses their proficiency level.</p>

<hr/>

<h2 id="an-example-the-knowledge-density-document-in-action" id="an-example-the-knowledge-density-document-in-action">An Example: The Knowledge Density Document in Action</h2>

<p>To illustrate, let’s consider a hypothetical Payments Engineering Team responsible for payment processing, fraud detection, and transaction reconciliation.</p>

<h3 id="primary-knowledge-areas" id="primary-knowledge-areas">Primary Knowledge Areas</h3>

<p><img src="https://i.snap.as/GyAUuvr3.png" alt=""/></p>

<h3 id="connected-knowledge-areas" id="connected-knowledge-areas">Connected Knowledge Areas</h3>

<p><img src="https://i.snap.as/QLQ8zGlJ.png" alt=""/></p>

<hr/>

<p>Looking at the example above, a few key insights stand out:</p>
<ol><li><p><strong>Knowledge Silos</strong> – Alice is the only <em><strong>expert</strong></em> in Payment Gateway integration and Refund &amp; Dispute Handling. This presents a risk—if Alice is unavailable, the team may struggle to maintain these critical systems.</p></li>

<li><p><strong>Gaps in Connected Domains</strong> – Bank Compliance is a key area that the team interacts with, yet multiple engineers are newcomers in this space. This could slow down work that interfaces with this area.</p></li>

<li><p><strong>Opportunities for Knowledge Sharing</strong> – Diana has <em><strong>expert</strong></em> knowledge in ledger reconciliation. This is a great opportunity for them to mentor others and spread knowledge in this space.</p></li></ol>

<p>With this information, I can now take action to close these gaps.</p>

<h2 id="how-i-build-and-maintain-this-document" id="how-i-build-and-maintain-this-document">How I Build and Maintain This Document</h2>
<ol><li><p><strong>Interviewing Engineers</strong> – When I join a new team, I first interview engineers to identify key knowledge areas based on the team’s charter.</p></li>

<li><p><strong>Self-Assessments</strong> – Each engineer assesses their knowledge level for these areas.</p></li>

<li><p><strong>Quarterly Updates</strong> – I revisit the document every quarter, updating it based on my observations and validating changes in 1:1s.</p></li></ol>

<p>Once the document is in place, it becomes an actionable tool rather than just a static reference. I use it to:</p>
<ul><li><strong>Close Knowledge Silos</strong> – If only one person is an expert in a critical area, I find opportunities for others to work on projects in that space or arrange knowledge-sharing sessions.</li>
<li><strong>Create Development Goals</strong> – New team members can use this document to identify areas to ramp up on.</li>
<li><strong>Advocate for Team Growth</strong> – In one case, the document revealed that the team was responsible for too many knowledge areas, helping me make a case for additional headcount and splitting the team into two.</li>
<li><strong>Prioritize Learning Investments</strong> – When I discovered that no one on the team had expertise in certain parts of the codebase, I used this document to align with my product counterpart and carve out roadmap time for engineers to learn and build knowledge.</li></ul>

<p>A document like this requires careful communication. I always clarify upfront that this is <em><strong>not</strong></em> <em><strong>a performance review tool</strong></em> — it’s a way to help the team succeed, which in turn supports each individual’s success. I also keep the document public within the team, so engineers know who to reach out to when they need help on specific topics, especially in urgent situations.</p>

<h2 id="if-you-want-to-do-this-in-your-team" id="if-you-want-to-do-this-in-your-team">If you want to do this in your team…</h2>

<p>If you want to implement a similar approach for your team, here’s what I recommend:</p>
<ol><li><p><strong>Involve the team in building it</strong> – Let engineers contribute to defining knowledge areas and self-assessing their expertise.</p></li>

<li><p><strong>Frame it as a tool for team success</strong> – Set clear expectations that this is not a performance evaluation, but rather a way to identify opportunities for growth and reduce risk.</p></li>

<li><p><strong>Use it to drive meaningful action</strong> – Don’t just create the document — use it to plan knowledge sharing, advocate for team resources, and ensure resilience in critical areas.</p></li></ol>

<p>By consistently using this document, I’ve been able to proactively strengthen teams, improve collaboration, and create a more resilient engineering organization. I hope this tool helps you achieve the same for your teams!</p>
]]></content:encoded>
      <guid>https://rohanranade.me/tracking-knowledge-spread-to-strengthen-engineering-teams</guid>
      <pubDate>Sun, 23 Mar 2025 22:46:13 +0000</pubDate>
    </item>
    <item>
      <title>Randomizing Standup Order with Google Apps Script and Slack</title>
      <link>https://rohanranade.me/randomizing-standup-order-with-google-apps-script-and-slack?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[&#xA;&#xA;In my engineering team, we hold daily standups, and to keep things engaging, we wanted to randomize the order of speakers each day. However, we quickly realized that while randomizing keeps things fresh, it also catches people off guard if they don&#39;t know when they will be called upon. To solve this, I built an automation using Google Apps Script that:&#xA;&#xA;Randomizes the standup order while grouping people from the same workstream together.&#xA;Sends a Slack message every weekday morning at 9 AM with the order.&#xA;Pulls the attendee list from a Google Spreadsheet, allowing easy updates.&#xA;&#xA;This post walks through the entire setup, including code snippets, Slack integration, and lessons learned.&#xA;&#xA;!--more--&#xA;&#xA;How the Automation Works&#xA;&#xA;Attendee List in Google Sheets&#xA;&#xA;The list of standup attendees is stored in a Google Sheet named &#34;Attendees&#34;. Each row contains:&#xA;&#xA;Active Column: Allows marking people as inactive (e.g. on vacation) to exclude them from the daily order.&#xA;Workstream Column: Ensures that people from the same workstream appear together in the randomized order.&#xA;&#xA;Google Apps Script Code&#xA;&#xA;Step 1: Triggering the Script Daily&#xA;&#xA;I set up a Google Apps Script time-based trigger to execute this script every day at 9 AM. However, my script contains a method called isWeekend() that checks if today is a weekend (Saturday or Sunday). If it is a weekend, the script exits without performing any further steps.&#xA;&#xA;function isWeekend(date = new Date()) {&#xA;  return date.getDay() === 6 || date.getDay() === 0;&#xA;}&#xA;&#xA;Step 2: Reading Data from Google Sheets&#xA;&#xA;The script reads the attendee list and filters out inactive members:&#xA;&#xA;function getTableDataFromSheet(sheetName, mapperFunc) {&#xA;  let sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);&#xA;  let rawData = sheet.getDataRange().getValues();&#xA;  return rawData&#xA;    .filter((dataRow, idx) =  idx   0)&#xA;    .map(dataRow =  mapperFunc(dataRow));&#xA;}&#xA;&#xA;function loadPeople(sheetName) {&#xA;  const allFolks = getTableDataFromSheet(sheetName, (dataRow) =  {&#xA;    return {&#xA;      name: dataRow[0],&#xA;      active: dataRow[1] === &#34;Y&#34;,&#xA;      group: dataRow[2]  // Workstream grouping&#xA;    };&#xA;  });&#xA;  return allFolks.filter(person =  person.active);&#xA;}&#xA;&#xA;Step 3: Randomizing the Order&#xA;&#xA;The script first groups attendees by workstream, then shuffles each group, and finally shuffles the group order:&#xA;&#xA;function processOrderingFor(sheetName) {&#xA;  const people = loadPeople(sheetName);&#xA;  const groupedPeople = groupByWorkstream(people);&#xA;  const randomizedGroups = randomize(Object.keys(groupedPeople));&#xA;  &#xA;  const finalPeople = randomizedGroups.flatMap(group =  randomize(groupedPeople[group]));&#xA;  sendNotice(finalPeople.join(&#34;, &#34;));&#xA;}&#xA;&#xA;function groupByWorkstream(people) {&#xA;  return people.reduce((accumulator, currentValue) =  {&#xA;    if (!accumulator[currentValue.group]) {&#xA;      accumulator[currentValue.group] = [];&#xA;    }&#xA;    accumulator[currentValue.group].push(currentValue.name);&#xA;    return accumulator;&#xA;  }, {});&#xA;}&#xA;&#xA;function randomize(list) {&#xA;  return list&#xA;    .map(item =  ({ sort: Math.random(), value: item }))&#xA;    .sort((a, b) =  a.sort - b.sort)&#xA;    .map(item =  item.value);&#xA;}&#xA;&#xA;Step 4: Sending to Slack via Webhook&#xA;&#xA;I use a Slack automation triggered by a webhook that listens for a POST request and posts a message in the standup channel. (See instructions below on how to set this up in Slack)&#xA;&#xA;function sendNotice(messageBody) {&#xA;  let slackUrl = &#39;https://hooks.slack.com/triggers/YOUR-WEBHOOK-URL&#39;;&#xA;  let options = {&#xA;    method: &#34;POST&#34;,&#xA;    contentType: &#39;application/json&#39;,&#xA;    payload: JSON.stringify({&#xA;      order: messageBody&#xA;    })&#xA;  };&#xA;&#xA;  try {&#xA;    UrlFetchApp.fetch(slackUrl, options);&#xA;  } catch (ex) {&#xA;    Logger.log(ex);&#xA;  }&#xA;}&#xA;&#xA;Setting Up the Slack Integration&#xA;&#xA;I used Slack Automations to handle the webhook request. The purpose of this integration is to receive the message from the Google Apps Script and post it in a Slack channel that the team uses for standup updates. You can also refer to Slack&#39;s official documentation on working with automations and triggering automations via webhooks for more details.&#xA;&#xA;Here’s how:&#xA;&#xA;Go to Slack Workflow Builder and create a new workflow.&#xA;&#xA;Select &#34;Starts with a Webhook&#34; as the trigger.&#xA;&#xA;Configure the webhook to accept a JSON payload with an order field.&#xA;&#xA;Add a step to post the order field into the team’s Slack channel.&#xA;&#xA;---&#xA;&#xA;Edge Cases and Lessons Learned&#xA;&#xA;While this automation works well, I encountered some challenges. Sometimes, people go on vacation but forget to update their status in the spreadsheet, meaning they still appear in the order. Similarly, new team members are not included until I manually add them. Another issue is that there are no failure alerts—if the Slack message fails due to network issues, I have to manually check and investigate why it didn’t show up.&#xA;&#xA;Future Improvements&#xA;&#xA;To improve accuracy and reduce manual maintenance, I plan to integrate the script with Google Calendar instead of relying on a Google Sheet. This would ensure the invite list is always up-to-date. Additionally, I will add logging and alerts to notify me if the script fails, helping with debugging and reliability.]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://i.snap.as/QsP5cShC.png" alt=""/></p>

<p>In my engineering team, we hold daily standups, and to keep things engaging, we wanted to randomize the order of speakers each day. However, we quickly realized that while randomizing keeps things fresh, it also catches people off guard if they don&#39;t know when they will be called upon. To solve this, I built an automation using <strong><a href="https://developers.google.com/apps-script">Google Apps Script</a></strong> that:</p>
<ul><li>Randomizes the standup order while <strong>grouping people from the same workstream together</strong>.</li>
<li>Sends a <strong>Slack message</strong> every weekday morning at 9 AM with the order.</li>
<li>Pulls the attendee list from a <strong>Google Spreadsheet</strong>, allowing easy updates.</li></ul>

<p>This post walks through the entire setup, including <strong>code snippets</strong>, <strong>Slack integration</strong>, and <strong>lessons learned</strong>.</p>



<h1 id="how-the-automation-works" id="how-the-automation-works">How the Automation Works</h1>

<h3 id="attendee-list-in-google-sheets" id="attendee-list-in-google-sheets">Attendee List in Google Sheets</h3>

<p>The list of standup attendees is stored in a Google Sheet named <strong>“Attendees”</strong>. Each row contains:</p>

<p><img src="https://i.snap.as/jfTf69k1.png" alt=""/></p>
<ul><li><strong>Active Column:</strong> Allows marking people as inactive (e.g. on vacation) to exclude them from the daily order.</li>
<li><strong>Workstream Column:</strong> Ensures that people from the same workstream appear <strong>together</strong> in the randomized order.</li></ul>

<h3 id="google-apps-script-code" id="google-apps-script-code">Google Apps Script Code</h3>

<h4 id="step-1-triggering-the-script-daily" id="step-1-triggering-the-script-daily"><strong>Step 1: Triggering the Script Daily</strong></h4>

<p>I set up a <strong>Google Apps Script time-based trigger</strong> to execute this script every day at 9 AM. However, my script contains a method called <code>isWeekend()</code> that checks if today is a weekend (Saturday or Sunday). If it is a weekend, the script exits without performing any further steps.</p>

<pre><code>function isWeekend(date = new Date()) {
  return date.getDay() === 6 || date.getDay() === 0;
}
</code></pre>

<h4 id="step-2-reading-data-from-google-sheets" id="step-2-reading-data-from-google-sheets"><strong>Step 2: Reading Data from Google Sheets</strong></h4>

<p>The script reads the attendee list and filters out inactive members:</p>

<pre><code>function getTableDataFromSheet(sheetName, mapperFunc) {
  let sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  let rawData = sheet.getDataRange().getValues();
  return rawData
    .filter((dataRow, idx) =&gt; idx &gt; 0)
    .map(dataRow =&gt; mapperFunc(dataRow));
}

function loadPeople(sheetName) {
  const allFolks = getTableDataFromSheet(sheetName, (dataRow) =&gt; {
    return {
      name: dataRow[0],
      active: dataRow[1] === &#34;Y&#34;,
      group: dataRow[2]  // Workstream grouping
    };
  });
  return allFolks.filter(person =&gt; person.active);
}
</code></pre>

<h4 id="step-3-randomizing-the-order" id="step-3-randomizing-the-order"><strong>Step 3: Randomizing the Order</strong></h4>

<p>The script first <strong>groups attendees by workstream</strong>, then <strong>shuffles each group</strong>, and finally <strong>shuffles the group order</strong>:</p>

<pre><code>function processOrderingFor(sheetName) {
  const people = loadPeople(sheetName);
  const groupedPeople = groupByWorkstream(people);
  const randomizedGroups = randomize(Object.keys(groupedPeople));
  
  const finalPeople = randomizedGroups.flatMap(group =&gt; randomize(groupedPeople[group]));
  sendNotice(finalPeople.join(&#34;, &#34;));
}

function groupByWorkstream(people) {
  return people.reduce((accumulator, currentValue) =&gt; {
    if (!accumulator[currentValue.group]) {
      accumulator[currentValue.group] = [];
    }
    accumulator[currentValue.group].push(currentValue.name);
    return accumulator;
  }, {});
}

function randomize(list) {
  return list
    .map(item =&gt; ({ sort: Math.random(), value: item }))
    .sort((a, b) =&gt; a.sort - b.sort)
    .map(item =&gt; item.value);
}
</code></pre>

<h4 id="step-4-sending-to-slack-via-webhook" id="step-4-sending-to-slack-via-webhook"><strong>Step 4: Sending to Slack via Webhook</strong></h4>

<p>I use a <strong>Slack automation triggered by a webhook</strong> that listens for a POST request and posts a message in the standup channel. (See instructions below on how to set this up in Slack)</p>

<pre><code>function sendNotice(messageBody) {
  let slackUrl = &#39;https://hooks.slack.com/triggers/YOUR-WEBHOOK-URL&#39;;
  let options = {
    method: &#34;POST&#34;,
    contentType: &#39;application/json&#39;,
    payload: JSON.stringify({
      order: messageBody
    })
  };

  try {
    UrlFetchApp.fetch(slackUrl, options);
  } catch (ex) {
    Logger.log(ex);
  }
}
</code></pre>

<h2 id="setting-up-the-slack-integration" id="setting-up-the-slack-integration">Setting Up the Slack Integration</h2>

<p>I used <strong>Slack Automations</strong> to handle the webhook request. The purpose of this integration is to receive the message from the Google Apps Script and post it in a Slack channel that the team uses for standup updates. You can also refer to <a href="https://slack.com/features/workflow-automation">Slack&#39;s official documentation</a> on working with automations and triggering automations via webhooks for more details.</p>

<p>Here’s how:</p>
<ol><li><p><strong>Go to Slack Workflow Builder</strong> and create a new workflow.</p></li>

<li><p>Select <strong>“Starts with a Webhook”</strong> as the trigger.</p></li>

<li><p>Configure the webhook to accept a JSON payload with an <code>order</code> field.</p></li>

<li><p>Add a step to <strong>post the <code>order</code> field</strong> into the team’s Slack channel.</p></li></ol>

<hr/>

<h1 id="edge-cases-and-lessons-learned" id="edge-cases-and-lessons-learned">Edge Cases and Lessons Learned</h1>

<p>While this automation works well, I encountered some challenges. Sometimes, people go on vacation but forget to update their status in the spreadsheet, meaning they still appear in the order. Similarly, new team members are not included until I manually add them. Another issue is that there are no failure alerts—if the Slack message fails due to network issues, I have to manually check and investigate why it didn’t show up.</p>

<h1 id="future-improvements" id="future-improvements">Future Improvements</h1>

<p>To improve accuracy and reduce manual maintenance, I plan to integrate the script with Google Calendar instead of relying on a Google Sheet. This would ensure the invite list is always up-to-date. Additionally, I will add logging and alerts to notify me if the script fails, helping with debugging and reliability.</p>
]]></content:encoded>
      <guid>https://rohanranade.me/randomizing-standup-order-with-google-apps-script-and-slack</guid>
      <pubDate>Sat, 08 Mar 2025 22:05:59 +0000</pubDate>
    </item>
    <item>
      <title>While you were out...</title>
      <link>https://rohanranade.me/while-you-were-out?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[&#xA;&#xA;From time to time, your direct report or colleague will take extended time away from work. It could be a parental leave or a sabbatical or an extended time off to take care of personal things. Whatever the reason, when they come back, they are going to be overwhelmed by the thousands of Slack and email notifications that they have missed while they were away.&#xA;&#xA;!--more--&#xA;&#xA;  I will be spending the next 2-3 days catching up on all the messages that I missed while I was out, so I will be slow to respond.&#xA;&#xA;It’s common to find a Slack message like this from someone who has just returned. 2-3 days is a long time for getting all the context back, and almost always starts from not knowing where to start.&#xA;&#xA;It doesn’t have to be like this. Do your returning colleague or direct report a huge favor, reduce their anxiety and get them caught up and productive again quickly. When they come back from their time away, have a short While You Were Out report ready for them. This report should capture all the important stuff that happened while they were out. They will gain all the relevant context quickly and will thank you from the bottom of their heart.&#xA;&#xA;Here are some tips for writing such a report:&#xA;&#xA;Only write it for someone who is out for an extended period of time (which for me is 2 weeks or more). This effort isn’t worth it for anything less than 2 weeks of away time.&#xA;Bullets are better than paragraphs of text.&#xA;Not more than one page, please. Remember, it’s a tool to reduce time needed to gather relevant context. The report should only have stuff that matters, not everything that happened while the person was out.&#xA;Don’t forget to include links to additional information/reference for each noteworthy item. An important organizational change that you are mentioning in the report? Make sure to add a link to the announcement that was sent to your engineering Slack channel.&#xA;Gather notes while the person for whom you are writing is out. Don’t leave the compilation for one sitting, you aren’t going to remember every relevant detail. I make it a point to spend 5 mins every day adding noteworthy things that happened that day to a rough version. A day or so before the person comes back, I spend 10-15 mins to edit and polish the report.&#xA;Co-create the report with someone else on the team. If that isn’t possible, at least have someone else review what you have compiled in the report.&#xA;🏆 Bonus tip: Once you have the report ready, use the schedule messages feature in Slack to ensure that the report is the first thing your colleague or direct see on their first day back at work.&#xA;&#xA;While I have seen multiple formats, I use the 3Ps (People, Projects, Processes) format when I am compiling such a report for someone. Each P is a section with bullets with each bullet capturing something relevant/noteworthy.&#xA;&#xA;Tags: #tips, #management]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://i.snap.as/vrBb0Hg8.png" alt=""/></p>

<p>From time to time, your direct report or colleague will take extended time away from work. It could be a parental leave or a sabbatical or an extended time off to take care of personal things. Whatever the reason, when they come back, they are going to be overwhelmed by the thousands of Slack and email notifications that they have missed while they were away.</p>



<blockquote><p>I will be spending the next 2-3 days catching up on all the messages that I missed while I was out, so I will be slow to respond.</p></blockquote>

<p>It’s common to find a Slack message like this from someone who has just returned. 2-3 days is a long time for getting all the context back, and almost always starts from not knowing where to start.</p>

<p>It doesn’t have to be like this. Do your returning colleague or direct report a huge favor, reduce their anxiety and get them caught up and productive again quickly. When they come back from their time away, have a short <strong>While You Were Out</strong> report ready for them. This report should capture all the important stuff that happened while they were out. They will gain all the <em>relevant</em> <em>context</em> quickly and will thank you from the bottom of their heart.</p>

<p>Here are some tips for writing such a report:</p>
<ul><li>Only write it for someone who is out for an <em>extended</em> period of time (which for me is 2 weeks or more). This effort isn’t worth it for anything less than 2 weeks of away time.</li>
<li>Bullets are better than paragraphs of text.</li>
<li>Not more than one page, please. Remember, it’s a tool to reduce time needed to gather <em>relevant</em> context. The report should only have stuff that matters, not everything that happened while the person was out.</li>
<li>Don’t forget to include links to additional information/reference for each noteworthy item. An important organizational change that you are mentioning in the report? Make sure to add a link to the announcement that was sent to your engineering Slack channel.</li>
<li>Gather notes while the person for whom you are writing is out. Don’t leave the compilation for one sitting, you aren’t going to remember every relevant detail. I make it a point to spend 5 mins every day adding noteworthy things that happened that day to a rough version. A day or so before the person comes back, I spend 10-15 mins to edit and polish the report.</li>
<li>Co-create the report with someone else on the team. If that isn’t possible, at least have someone else review what you have compiled in the report.</li>
<li>🏆 <em>Bonus tip: Once you have the report ready, use the <a href="https://slack.com/help/articles/201457107-Send-and-read-messages#send-or-schedule-messages">schedule messages feature</a> in Slack to ensure that the report is the first thing your colleague or direct see on their first day back at work.</em></li></ul>

<p>While I have seen multiple formats, I use the <strong>3Ps (People, Projects, Processes)</strong> format when I am compiling such a report for someone. Each <strong>P</strong> is a section with bullets with each bullet capturing something relevant/noteworthy.</p>

<p>Tags: <a href="https://rohanranade.me/tag:tips" class="hashtag"><span>#</span><span class="p-category">tips</span></a>, <a href="https://rohanranade.me/tag:management" class="hashtag"><span>#</span><span class="p-category">management</span></a></p>
]]></content:encoded>
      <guid>https://rohanranade.me/while-you-were-out</guid>
      <pubDate>Sat, 23 Dec 2023 09:04:02 +0000</pubDate>
    </item>
  </channel>
</rss>